• 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: ESP32 P4 Development Board 7inch Display 7 inch TouchScreen Onboard ESP32-C6 Camera 1024×600 Raspberry Pi 5 Audio hat Banana Pi ESP32 S3 Development Board 1.5 inch Round Rotary OLED TouchScreen Smart Knob Display 1.5inch Display 466x466 LVGL for Arduino RP2040 Raspberry Pi 3.97 inch e-Paper link BW 800x480 For Arduino / Jetson / STM32 /ESP32 ESP32-S3 Development Board 4 inch LCD TouchScreen Display 480x480 RS485 /SHT20 /Relay For Arduino LVGL 86 TVbox Type-C Power Adapter Robotic Arm Control X1202 Raspberry Pi 5 UPS Board Uninterruptible Power Supply For 18650-Li-Battery (NOT includ) 4-Ports SIM8260G M2 3G/4G/5G/GNSS/GPS Sub-6G PCIe M.2 Moudle For LTE-A/NSA/SA For DFOTA /VoLTE For SIMCOM Raspberry Pi 10.1 inch QLED Quantum Dot Display 1280x720 Capacitive Touchscreen For Computer PC/Jetson/Game NVIDIA Jetson Xavier NX AI 21TOPS Supercomputer Edge Computing eMMC-16GB RAM 8/16GB Omni-Directional Lidar RP2040 Electronic EYE 0.71 inch Round Double LCD Display Dual Screen For Arduino Raspberry Pi ESP32 Pico STM32 ESP32 P4 Development Board 7inch Display 7 inch TouchScreen Onboard ESP32-C6/Camera-Port/Speaker-Port ESP32 S3 AI 1.85 inch Development Board with 1.85inch LCD Touchscreen Round Screen Electronic Badge Deepseek Milk-V Duo S Usage of USB Type A interface Raspberry Pi Compute Module 5 CM5 Cortex A76 BCM2712 With/Without Wi-Fi RAM 2/4/8/16GB eMMC Lite/8/16/32/64GB