72 lines
1.5 KiB
C
72 lines
1.5 KiB
C
/*
|
||
*
|
||
* MH-Z14B CO2 Sensor
|
||
* Based on Raspberry Pi wiringPi library
|
||
* Time: 20240109
|
||
*
|
||
*/
|
||
|
||
#include <stdio.h>
|
||
#include <wiringPi.h>
|
||
#include <wiringSerial.h>
|
||
#include <unistd.h>
|
||
|
||
// 校准
|
||
static void calibration(int fd)
|
||
{
|
||
// 校准传感器零点(ZERO)
|
||
char zero[9] = { 0XFF, 0X01, 0X87, 0X00, 0X00, 0X00, 0X00, 0X00, 0X78 };
|
||
|
||
write(fd, zero, 9);
|
||
delay(200);
|
||
|
||
return;
|
||
}
|
||
|
||
int main()
|
||
{
|
||
int fd = 0;
|
||
char checksum = 0;
|
||
int High = 0;
|
||
int Low = 0;
|
||
int ppm = 0;
|
||
char read_command[9] = { 0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79 };
|
||
char data[9] = { 0 };
|
||
|
||
if ((fd = serialOpen("/dev/serial0", 9600)) < 0) {
|
||
printf("Unable to open device\n");
|
||
return 1;
|
||
} else {
|
||
printf("ttyAMA0 initialised ok\n");
|
||
}
|
||
|
||
while (1) {
|
||
// 写入读取命令
|
||
write(fd, read_command, 9);
|
||
delay(100);
|
||
|
||
// 读取
|
||
read(fd, data, 9);
|
||
|
||
checksum = (0xFF - (data[1] + data[2] + data[3] + data[4] + data[5] + data[6] + data[7])) + 1;
|
||
High = (int)data[2];
|
||
Low = (int)data[3];
|
||
ppm = (256 * High) + Low;
|
||
|
||
if (data[8] == checksum) {
|
||
for (int loop = 0; loop <= 8; loop++) {
|
||
printf("data%d: %X\n", loop, data[loop]);
|
||
}
|
||
printf("checksum: %X = %X\n", data[8], checksum);
|
||
printf("CO2 Concentration: %d ppm\n\r\n", ppm);
|
||
} else {
|
||
calibration(fd);
|
||
continue;
|
||
}
|
||
|
||
delay(3000);
|
||
}
|
||
|
||
return 0;
|
||
}
|