基本说明:
PCF8591是一个单片集成、单独供电、低功耗、8-bit CMOS 数据获取器件。PCF8591具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。PCF8591的3个地址引脚A0, A1和A2可用于硬件地址编程,允许在同个I2C总线上接入8个PCF8591器件,而无需额外的硬件。在PCF8591器件上输入输出的地址、控制和数据信号都是通过双线双向I2C总线以串行的方式进行传输。
![](https://i-blog.csdnimg.cn/blog_migrate/160aeedfaf0aec29d58f19a96d7b9992.jpeg)
接口连接:
左边
AOUT 芯片DA输出接口
AIN0 芯片模拟输入接口0
AIN1 芯片模拟输入接口1
AIN2 芯片模拟输入接口2
AIN3 芯片模拟输入接口3
右边
SCL IIC 时钟接口 接树莓派SCL口
SDA IIC 数字接口 接树莓派SDA口
GND 模块地 外接地
VCC 电源接口 外接 3.3v-5v
模块共有 3 个红色短路帽,分别作用如下:
P4 接上P4短路帽,选择热敏电阻接入电路
P5 接上P5短路帽,选择光敏电阻接入电路
P6 接上P6短路帽,选择0-5V可调电压接入电路
如需外接,则取下跳帽
代码实现:
import smbus #在程序中导入“smbus”模块(系统管理总线模块)
import time
# 0 代表 /dev/i2c-0, 1 代表 /dev/i2c-1 ,具体看使用的树莓派那个I2C来决定
bus = smbus.SMBus(1) #创建一个smbus实例
#在树莓派上查询PCF8591的地址:“sudo i2cdetect -y 1”
def setup(Addr):
global address
address = Addr
def read(chn): #channel
if chn == 0:
bus.write_byte(address,0x40) #发送一个控制字节到设备
if chn == 1:
bus.write_byte(address,0x41)
if chn == 2:
bus.write_byte(address,0x42)
if chn == 3:
bus.write_byte(address,0x43)
bus.read_byte(address) #从设备读取单个字节,而不指定设备寄存器。
return bus.read_byte(address) #返回某通道输入的模拟值A/D转换后的数字值
def write(val):
temp = val # 将字符串值移动到temp
temp = int(temp) # 将字符串改为整数类型
# print temp to see on terminal else comment out
bus.write_byte_data(address, 0x40, temp)
#写入字节数据,将数字值转化成模拟值从AOUT输出
if __name__ == "__main__":
setup(0x48)
#在树莓派终端上使用命令“sudo i2cdetect -y 1”,查询出PCF8591的地址为0x48
while True:
print '电位计 AIN0 = ', read(0) #电位计模拟信号转化的数字值
print '光敏电阻 AIN1 = ', read(1) #光敏电阻模拟信号转化的数字
print '热敏电阻 AIN2 = ', read(2) #热敏电阻模拟信号转化的数字值
tmp = read(0)
tmp = tmp*(255-125)/255+125
# 125以下LED不会亮,所以将“0-255”转换为“125-255”,调节亮度时灯不会熄灭
write(tmp)
time.sleep(2)