• 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: Pi5 Fan ESP32 0.85inch LCD Raspberry Pi 3.5 inch e-Paper link (G) RYBW 384x184 For Arduino / Jetson Nano / STM32 Luckfox Pico SPI LCD NVIDIA Jetson Orin Nano Developer Kit Official Original 8GB AI 40Tops For Embedded and Edge Systems Core3566004000 ESP32 C3 LCD EchoEar 1.85 inch Round TouchScreen 1.85inch QSPI LCD 360*360 CST816T ST77916 Pi5-Active-Cooler-C Milk-V Duo Raspberry Pi Camera ESP32-S3 1.28 Serial Bus Servo ESP32 S3 4inch LCD Development Board 480x480 TouchScreen Display TVBOX LVGL HMI Sensor CAN RS485 BG95-M3-Zero QuecPython EVB development support LTE/EGPRS and GNSS 1.54 inch Passive NFC e-Paper ink (G) RYBW Display Screen No Need Battery Wireless Power &amp; Data Transfer Raspberry Pi 5 LIR2032 0.49inch OLED Screen Display 64&amp;amp;amp;times;32 SSD1315 Arduino Raspberry Pi ESP32 Pico STM32 i5-1135G7 Core3566104000