Co2传感器是空气质量检测的一部分,本次测试采购的是精讯畅通的一款量程为0-5000ppm的Co2传感器,支持DA、PWM、TTL输出。
传感器外观如下:
本次测试针对TTL模式输出。传感器出厂默认为主动上报模式,连接usb转ttl模块,就可在串口助手调试窗口查看传感器实时上报的CO2浓度数值。格式如下:
与pm2.5传感器不同的是,Co2传感器输出的浓度数据是以16进制数据显示的ascii码,例如返回值前两位的帧头20 就是空格的ascii码,后面的31-35是12345,70 70 6d是ppm,整个返回帧的数据含义为:
空格 空格 1 2 3 4 5 空格 ppm 换行,即当前Co2的浓度为:12345ppm;
了解了传感器上报数据格式后,就可以开始设计程序读取并传输给串口屏进行显示了。
arduino uno上的代码采用Mind+工具设计,主要目的是理解单片机利用软串口读取传感器数据并用串口输出格式命令让串口屏正确显示出来。
利用mind+的现成模块即可完成传感器的数据读取、解析和传输至串口屏。其中:
- 初始化单片机2、4针脚为软串口2的Rx和Tx,设置波特率为9600;
- 变量pmlen的值是传感器返回帧减掉帧头的长度;
- 读取软串口数据的思路是:首先判断串口是否有数据可读,如果有则先连续读取两位,转换为ascii串后,判断是否为帧头(帧头是连续两个空格),如果不是则继续再读两位进行判断。如果帧头判断为真,则重复读取pmlen长度数据,并加入back_data;
- 这里的back_data是mind+提供的列表模块(没有数组模块,可以通过字符串转换类型的办法利用列表模块实现数组功能);
- 在得到了返回帧的所有数据后,就可以将需要的Co2浓度值从数组中取出,加工成需要的格式传输给串口屏;
- HMI串口屏通过字符串指令形式向屏幕传输数据进行显示,可以很快速的设计出非常专业美观的屏幕界面。例如:向屏幕中的t4文本控件赋值的指令为: t4.txt=“32”0xff0xff0xff ,其中32是要显示的值,0xff是命令结束符;
- 按照整个格式要求,即可将返回帧数据中的1-4项数据转换为ascii码,并赋值给t4,打印到串口;
刷机后,打开串口监视,即可看到串口持续输出���t4.txt="2378"���,其中���是连续3个0xff,转换为HEX就是FF FF FF 74 34 2E 74 78 74 3D 22 33 30 36 33 22 FF FF FF ;
接下来设计串口屏的显示界面,在界面中定义Co2显示控件t4,刷机后面包线连到uno串口上就可以完美显示实时的Co2数据啦。
mind+生成的代码如下:
#include <SimpleList.h>
#include <SoftwareSerial.h>
// 动态变量
volatile float mind_n_pmlen, mind_n_ggg1;
SimpleList<String> mind_l_zhentou, mind_l_back_data;
// 函数声明
void DF__30xff();
void DF_read_Soft_S1();
// 创建对象
SoftwareSerial softwareSerial2(2, 4);
SoftwareSerial softwareSerial1(3, 6);
// 主程序开始
void setup() {
mind_n_pmlen = 10;
Serial.begin(115200);
softwareSerial2.begin(9600);
delay(1000);
}
void loop() {
if (softwareSerial2.available()) {
mind_l_zhentou.clear();
mind_l_back_data.clear();
for (int index = 0; index < 2; index++) {
mind_n_ggg1 = softwareSerial2.read();
mind_l_zhentou.push_back((String(char(mind_n_ggg1))));
}
if (((String(mind_l_zhentou[1-1]) + String(mind_l_zhentou[2-1]))==" ")) {
Serial.println("");
DF__30xff();
for (int index = 0; index < mind_n_pmlen; index++) {
mind_n_ggg1 = softwareSerial2.read();
mind_l_back_data.push_back((String(char(mind_n_ggg1))));
}
Serial.print("t4.txt=\"");
Serial.write(mind_l_back_data[1-1].c_str());
Serial.write(mind_l_back_data[2-1].c_str());
Serial.write(mind_l_back_data[3-1].c_str());
Serial.write(mind_l_back_data[4-1].c_str());
Serial.print("\"");
DF__30xff();
mind_l_back_data.clear();
}
}
}
// 自定义函数,发送串口屏指令结束符
void DF__30xff() {
Serial.write(255);
Serial.write(255);
Serial.write(255);
}
ps:串口屏界面的设计涉及到美工工作,本人不擅长,所以是利用墨刀原型设计工具进行界面设计的,详细方法会在后续的笔记中进行描述。
版权声明:本文为CSDN博主「皮皮鲁的鲁鲁西」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_65491635/article/details/122767999
暂无评论