前言:
我看到许多有关于树莓派获取烟雾浓度的文章内容,但是自己去运行代码的时候总是差强人意,所以便自己利用树莓派,外接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;
- }
bash
在Linux下运行如图(图中突然飙升的原因是我用打火机在烟雾传感器旁释放丁烷,然后关闭打火机了烟雾浓度也慢慢下降了):