• sales

    +86-0755-88291180

RPi Tutorial Series: PCF8591 AD/DA User Guide

Raspberry Pi doesn't embed any AD/DA converters, so if you want to use analog sensors on Raspberry Pi, an external AD expansion baord is required.

An AD/DA converter chip, PCF8591, is embedded within Pioneer600 expansion board, which may be helpful for AD sampling on Raspberry Pi. The PCF8591 features a 8-bit A/D converter and 4 D/A converters. Controlled by I2C interface.

Some examples are given in this section. You should install some specific libraries before trying these examples, see: Libraries Installation for RPi.

DAC

C program based on BCM library

#include <bcm2835.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    char Buf[]={0, 0};
    unsigned char value=0;

    if (!bcm2835_init()) return 1;
    bcm2835_i2c_begin();
    // The I2C address of PCF8591 is 0x48.
    bcm2835_i2c_setSlaveAddress(0x48);
    bcm2835_i2c_set_baudrate(10000);
    printf("start..........\n");

    while(1)
    {
        Buf[0] = 0x40;
        Buf[1] = value++;
        bcm2835_i2c_write(Buf, 2);
        printf("AOUT: %d\n", value);

        bcm2835_delay(20);
    }

    bcm2835_i2c_end();
    bcm2835_close();
    return 0;
}

Save the file as "pcf8591.c". Compile and run with:

gcc -Wall pcf8591.c -o pcf8591 -lbcm2835
sudo ./pcf8591

Python program based on smbus library

#!/usr/bin/python
# -*- coding:utf-8 -*-
import smbus
import time

address = 0x48
cmd = 0x40
value = 0

bus = smbus.SMBus(1)
while True:
    bus.write_byte_data(address,cmd,value)
    value += 1
    if value == 256:
        value =0
    print("AOUT:%3d" %value)
    time.sleep(0.01)

Save the file as "pcf8591.py" and execute it with:

sudo python pcf8591.py

C program based on WiringPi

#include <wiringPi.h>
#include <pcf8591.h>
#include <stdio.h>

#define Address 0x48
#define BASE 64
#define A0 BASE+0
#define A1 BASE+1
#define A2 BASE+2
#define A3 BASE+3

int main(void)
{
    unsigned char value;
    wiringPiSetup();
    pcf8591Setup(BASE,Address);

    while(1)
    {
        analogWrite(A0,value);
        printf("AOUT: %d\n",value++);
        delay(20);
    }
}

Save the file as "pcf8591.c". Compile and run with:

gcc -Wall pcf8591.c -o pcf8591 -lbcm2835 -lwiringPi
sudo ./pcf8591

ADC

C program based on BCM library

#include <bcm2835.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)
{
    char Buf[]={0};
    unsigned char i;

    if (!bcm2835_init())return 1;
    bcm2835_i2c_begin();
    bcm2835_i2c_setSlaveAddress(0x48);
    bcm2835_i2c_set_baudrate(10000);
    printf("start..........\n");

    while(1)
    {
        for(i = 0;i < 4;i++)
        {
            Buf[0] = i;
            bcm2835_i2c_write_read_rs(Buf,1,Buf,1);
            bcm2835_i2c_read (Buf,1);
            printf("AIN%d:%5.2f  ",i,(double)Buf[0]*3.3/255);
        }
        printf("\n");
        bcm2835_delay(100);
    }

    bcm2835_i2c_end();
    bcm2835_close();
    return 0;
}

Save the file as "pcf8591.c". Compile and run with:

gcc -Wall pcf8591.c -o pcf8591 -lbcm2835
sudo ./pcf8591

Python program based on smbus library

#!/usr/bin/python
# -*- coding:utf-8 -*-
import smbus
import time

address = 0x48
A0 = 0x40
A1 = 0x41
A2 = 0x42
A3 = 0x43
bus = smbus.SMBus(1)
while True:
    bus.write_byte(address,A0)
    value = bus.read_byte(address)
    print("AOUT:%1.3f  " %(value*3.3/255))
    time.sleep(0.1)

Save the file as "pcf8591.py" and execute it with:

sudo python pcf8591.py

C program based on WiringPi

#include <wiringPi.h>
#include <pcf8591.h>
#include <stdio.h>

#define Address 0x48
#define BASE 64
#define A0 BASE+0
#define A1 BASE+1
#define A2 BASE+2
#define A3 BASE+3

int main(void)
{
    int value;
    wiringPiSetup();
    pcf8591Setup(BASE,Address);

    while(1)
    {
        value = analogRead(A0);
        printf("Analoge: %dmv\n",value*3300/255);
        delay(1000);
    }
}

Save the file as "pcf8591.c". Compile and run with:

gcc -Wall pcf8591.c -o pcf8591 -lbcm2835 -lwiringPi
sudo ./pcf8591
TAG: Raspberry Pi 13.3 inch DSI MIPI Display 13.3inch LCD Capacitive TouchScreen 1920x1080 Raspberry Pi PICO Raspberry Pi 5 IMX219 1.69inch LCD TouchScreen Display 240&times;280 ST7789 Arduino Raspberry Pi ESP32S3 Pico STM32 Pico-DALI2 Expansion Board For ESP32 C6 S3 DALI communication control multiple LED Raspberry Pi Pico Screen ESP32-S3 USB Dongle ESP32-S3 LCD spotpear ESP32 S3 2.1 inch Round LCD Development Board 480x480 TouchScreen Display LVGL HMI With QMI8658C 6-Axis Sensor Raspberry Pi Pico rp2040 Display image 1.3inch LCD ST7789 change bmp to hex ESP32 C3 Raspberry Pi User Guide OPS Computer Raspberry Pi Pico 7inch DVI LCD AV to LVDS Industrial Isolation USB TO RS232/485/422/TTL FT232RNL Serial UART Converter TTL UART To CAN Mini Raspberry Pi 5 Active Cooler ESP32 IR Thermal Imaging Camera