前言:
我看到许多有关于树莓派获取烟雾浓度的文章内容,但是自己去运行代码的时候总是差强人意,所以便自己利用树莓派,外接MQ-2烟雾传感器去获取烟雾浓度。
1.硬件准备如下
1.树莓派3B+
2.MQ-2烟雾传感器
3.PCF8591(读取烟雾值关键adc)
4.诺干杜邦线
2.连线情况
首先是树莓派的40pin引脚图如下:
MQ-2的实物图:
PCF8591的实物图:
注意:pcf8591在连接使用前,要将图上图黄线圈起来的J4,J5跳线帽给拔掉(我是拔掉了的)。
以下就是三者的连线使用了:
MQ-2的VCC和GND连接树莓派的5V和GND,
PCF8591的VCC和GND也连接树莓派的5V和GND,
然后是PCF8591的SCL和SDA分别连接树莓派的SCL(GPIO 3)和SDA(GPIO 2),
最后就是MQ-2的AO口连接PCF8591的AINT0口。
3.启动树莓派的II2C协议
登陆上树莓派后,输入命令:sudo raspi-config后回车;选择Interfacing Options后回车,选择I2C回车, 选择 YES回车,最后就设置成功啦!如图所示:
如果想要查看你的传感器有没有成功连接树莓派,输入命令 i2cdetect -y 1(如果不行在命令前面加个sudo);(因为不同的传感器地址不一定相同,所以做好分辨,因为我连接有其它的传感器,图中的48是pcf8591的地址)如图:
4.C语言实现烟雾浓度的采集
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/i2c-dev.h>
#include <unistd.h>
#define PCF8591_ADDRESS 0x48
#define PCF8591_AIN0 0x40
#define VOLTAGE_REF 5 // 电压参考值为5V
int main() {
int file;
char filename[20];
int adapter_nr = 1; /* 根据树莓派的I2C适配器编号进行设置 */
snprintf(filename, 19, "/dev/i2c-%d", adapter_nr);
file = open(filename, O_RDWR);
if (file < 0) {
perror("Failed to open the i2c bus");
exit(1);
}
if (ioctl(file, I2C_SLAVE, PCF8591_ADDRESS) < 0) {
perror("Failed to acquire bus access and/or talk to slave");
exit(1);
}
while (1) {
// 选择AIN0通道
char config[2] = {0};
config[0] = PCF8591_AIN0;
write(file, config, 1);
usleep(10000); // 等待转换完成
// 读取AIN0通道的值
char data[1] = {0};
read(file, data, 1);
int value = data[0];
// 计算电压值
float voltage = (value / 255.0) * VOLTAGE_REF;
float sum = voltage / VOLTAGE_REF;
float result = sum * 100;
printf("PCF8591 AIN0 value: %d, Voltage: %.2fV , 烟雾浓度是: %.2f%\n", value, voltage, result);
usleep(1000000); // 每1秒读取一次
}
close(file);
return 0;
}
在Linux下运行如图(图中突然飙升的原因是我用打火机在烟雾传感器旁释放丁烷,然后关闭打火机了烟雾浓度也慢慢下降了):