arduino uno 软串口读取Co2传感器并输出至串口HMI屏显示

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+ 模块图

 利用mind+的现成模块即可完成传感器的数据读取、解析和传输至串口屏。其中:

  1. 初始化单片机2、4针脚为软串口2的Rx和Tx,设置波特率为9600;
  2. 变量pmlen的值是传感器返回帧减掉帧头的长度;
  3. 读取软串口数据的思路是:首先判断串口是否有数据可读,如果有则先连续读取两位,转换为ascii串后,判断是否为帧头(帧头是连续两个空格),如果不是则继续再读两位进行判断。如果帧头判断为真,则重复读取pmlen长度数据,并加入back_data;
  4. 这里的back_data是mind+提供的列表模块(没有数组模块,可以通过字符串转换类型的办法利用列表模块实现数组功能);
  5.  在得到了返回帧的所有数据后,就可以将需要的Co2浓度值从数组中取出,加工成需要的格式传输给串口屏;
  6. HMI串口屏通过字符串指令形式向屏幕传输数据进行显示,可以很快速的设计出非常专业美观的屏幕界面。例如:向屏幕中的t4文本控件赋值的指令为: t4.txt=“32”0xff0xff0xff ,其中32是要显示的值,0xff是命令结束符;
  7. 按照整个格式要求,即可将返回帧数据中的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

生成海报
点赞 0

皮皮鲁的鲁鲁西

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

Arduino 水滴检测

实物连接图: 电路图: 代码: void setup() {pinMode(3, OUTPUT);pinMode(2, INPUT); }void loop() {bool va2 digitalR

Esp8266多功能点阵时钟(开源)

原文地址 多功能点阵时钟 更新 点阵时钟立创PCB工程已经完成,开源地址为: ESP8266多功能点阵时钟 - PCB制作分享 简介 很早就了解ESP8266了,当时也用这个搞过一些小demo,一直也没有想

【Arduino实验15 红外遥控电风扇】

目录 一、设计目的 二、设计要求 三、设计原理 1.舵机 2.直流电机 3.ULN2003驱动 四、硬件设计 1.舵机 2.直流电机 3.ULN2003驱动 4.红外遥控电风扇 五、软件设计 1.舵机控制程序 2.电