本帖最后由 wo4fisher 于 2017-8-4 07:41 编辑
继上一篇帖子 【DFRobot FireBeetle ESP32微控制器试用体验】之三:uart驱动,之后,本篇介绍使用ESP32读取激光pm2.5/pm10传感器模块数据,并做数据转换。
ps:可怜的小三,被小编XX了。,
之前淘了一个激光pm2.5/pm10传感器模块,数据输出有uart模式和pwm波模式,两种模式同时输出。uart模式输出数据格式如下:串口通讯协议:96008N1;通讯周期:1+0.5 秒;报文格式:0 报文头 AA ,1 指令号 C0,2 数据 1 PM2.5低字节 ,3 数据 2 PM2.5高字节 ,4 数据 3 PM10低字节 ,5 数据 4 PM10高字节 ,6 数据 5 0(保留) ,7 数据 6 0(保留) ,8 校验和 校验和 ,9 报文尾 AB ,校验和:数据1到数据 6的字节加和。
pm2.5和pm10数据计算如下(输出数据为16进制,在进行下边的转换之前先单字节16进制转换为10进制):
主要代码如下:
uint8_t* data = (uint8_t*) malloc(BUF_SIZE);
uint16_t pm25_i=0,pm10_i=0;
char pm_str;
float pm25_f=0.0,pm10_f=0.0;
while(1) {
//Read data from UART
int len = uart_read_bytes(uart_num, data, BUF_SIZE, 20 / portTICK_RATE_MS);
if(len>=10)
{
if (data == 0xAA && data== 0xAB)
pm25_i= (uint16_t)(((data>>4)*16)+data%16)+(uint16_t)((((data>>4)*16)+data%16)*256);
pm10_i=(uint16_t)(((data>>4)*16)+data%16)+(uint16_t)((((data>>4)*16)+data%16)*256);
pm25_f=pm25_i/10.0;
pm10_f=pm10_i/10.0;
sprintf(pm_str,"pm2.5 is %.1f ug/m3,pm10 is %.1f ug/m3.\n",pm25_f,pm10_f);
uart_write_bytes(uart_num, pm_str, strlen(pm_str));
}
//Write data back to UART
// uart_write_bytes(uart_num, (const char*) data, len);
vTaskDelay(500 / portTICK_PERIOD_MS);
}
编译,下载,程序输出如下:
官方测试软件输出曲线:
本帖最后由 wo4fisher 于 2017-8-4 07:41 编辑
继上一篇帖子 【DFRobot FireBeetle ESP32微控制器试用体验】之三:uart驱动,之后,本篇介绍使用ESP32读取激光pm2.5/pm10传感器模块数据,并做数据转换。
ps:可怜的小三,被小编XX了。,
之前淘了一个激光pm2.5/pm10传感器模块,数据输出有uart模式和pwm波模式,两种模式同时输出。uart模式输出数据格式如下:串口通讯协议:96008N1;通讯周期:1+0.5 秒;报文格式:0 报文头 AA ,1 指令号 C0,2 数据 1 PM2.5低字节 ,3 数据 2 PM2.5高字节 ,4 数据 3 PM10低字节 ,5 数据 4 PM10高字节 ,6 数据 5 0(保留) ,7 数据 6 0(保留) ,8 校验和 校验和 ,9 报文尾 AB ,校验和:数据1到数据 6的字节加和。
pm2.5和pm10数据计算如下(输出数据为16进制,在进行下边的转换之前先单字节16进制转换为10进制):
主要代码如下:
uint8_t* data = (uint8_t*) malloc(BUF_SIZE);
uint16_t pm25_i=0,pm10_i=0;
char pm_str;
float pm25_f=0.0,pm10_f=0.0;
while(1) {
//Read data from UART
int len = uart_read_bytes(uart_num, data, BUF_SIZE, 20 / portTICK_RATE_MS);
if(len>=10)
{
if (data == 0xAA && data== 0xAB)
pm25_i= (uint16_t)(((data>>4)*16)+data%16)+(uint16_t)((((data>>4)*16)+data%16)*256);
pm10_i=(uint16_t)(((data>>4)*16)+data%16)+(uint16_t)((((data>>4)*16)+data%16)*256);
pm25_f=pm25_i/10.0;
pm10_f=pm10_i/10.0;
sprintf(pm_str,"pm2.5 is %.1f ug/m3,pm10 is %.1f ug/m3.\n",pm25_f,pm10_f);
uart_write_bytes(uart_num, pm_str, strlen(pm_str));
}
//Write data back to UART
// uart_write_bytes(uart_num, (const char*) data, len);
vTaskDelay(500 / portTICK_PERIOD_MS);
}
编译,下载,程序输出如下:
官方测试软件输出曲线: