

項目簡介
本項目是基于啟明6M5開發板完成了空氣質量檢測系統,傳感器M702采集甲醛、二氧化碳、PM2.5、PM10、TVOC的濃度和溫濕度;甲醛、二氧化碳、PM2.5、PM10、TVOC的濃度和溫濕度通過wifi模塊周期性上傳到阿里云物聯網平臺,能夠實時更新數據;1.77寸TFT彩屏提供顯示功能,能夠顯示甲醛、二氧化碳等濃度和溫濕度。源碼獲取方式請在文末查看。

項目說明
調試環境:
開發環境:windows10;
IDE:MDK5.38a;
RASC:V4.0.0;
調試器:PWLINK2;
空氣質量檢測系統的核心功能如下:
環境信息可通過WIFI上傳至阿里云物聯網平臺顯示。

方案設計
空氣質量檢測系統以R7FA6M5主控芯片組為核心,由M702七合一空氣質量檢測模塊、TFT顯示模塊、ESP8266WIFI構成。
硬件架構圖實現如下:

2.模塊介紹
M702七合一傳感器模塊是一款高性價比的數字串口輸出傳感器模塊,采用UART串口電平輸出模式,集CO2,甲醛,TVOC,激光粉塵PM2.5,PM10顆粒物,溫度,濕度于一體。它可對所處環境進行實時全面的檢測,具有良好的穩定性非常方便客戶使用。

應用領域:
● 酒店房間空氣質量監控
● 農業大棚,戶外養殖場所環境監控? ?? ???
● 新風換氣系統
● 空氣凈化器,空調
● 空氣質量監測設備
● 廚衛換氣控制系統
● 智能家居設備
特點:
● 同時輸出二氧化碳.甲醛.TVOC.PM2.5. PM10.溫度.濕度共七組數據
● 靈敏度高,數據穩定
● UART 輸出模式
● 溫度精確到0.1℃,濕度精確到0.1%
● 每2秒自動通過UART信號輸出七組傳感器監測數據
規格參數:
類別
測量分辨率
測量范圍
測量精度
CO2
1ppm
400ppm~5000ppm
±25%
CH2O
1ug/m3
0ug~1000ug/m3
±25%
TVOC
1ug/m3
0ug~2000ug/m3
±25%
PM2.5
1ug/m3
0ug/m3~999ug/m3? ?
±10%
Temperature
0.01℃??
-40℃~100℃
±0.3℃
Humidity
0.04%
0~100%
±3%RH
物理接口
XH2.54母座
輸出數據
UART
工作電壓
5.0±0.2VDC
工作電流
≤80mA? ??
預熱時間
2分鐘(只有CO2,CH2O和TVOC需要預熱,其它參數上電即顯示)
工作溫度
0℃~50℃
工作濕度
≤95%RH
外形尺寸
62*49*15mm(L×W×H)? ??
使用壽命
5年(空氣中)
注意:模塊輸出的CO2值和CH2O值均為TVOC的等效值,客戶購買和使用時請注意。
UART接口定義:
?接口
名稱
功能
1
5V
接電源5V
2
GND
電源地
3
N/A
懸空
4
TXD
UART數據輸出腳
串口數據流格式:
波特率
9600bps
數據位
8位
校驗位
無
停止位
無
通信協議:
字節
名稱
說明
B1
幀頭1
固定值 3Ch
B2
幀頭2
固定值 02h
B3
數據
eCO2 高字節
B4
數據
eCO2 低字節
B5
數據
eCH2O 高字節
B6
數據
eCH2O 低字節
B7
數據
TVOC 高字節
B8
數據
TVOC 低字節
B9
數據
PM2.5 高字節
B10
數據
PM2.5 低字節
B11
數據
PM10 高字節
B12
數據
PM10 低字節
B13
數據
Temperature 整數部分
B14
數據
Temperature 小數部分
B15
數據
Humidity 整數部分
B16
數據
Humidity 小數部分
B17
校驗和
校驗和
說明:校驗和B17等于:B1+B2+······B16的值,取低8位。
當溫度的數據 B13 的bit7=1 時, 代表是負溫度,B13 的bit7=0 時,是正溫度。例如,當 B13=9Bh 時,此時 bit7=1, 表示是負溫度,此時實際溫度就是-27℃;如果 B13=1Bh,此時bit7=0,代表是正溫度,此時實際溫度就是 27℃。
3. 1.77寸TFT彩屏

SPI通訊,采用中景園電子代碼。
4.WIFI

采用板載ESP8266燒錄MQTT透傳AT固件。

具體功能介紹
1.M702模塊的數據讀取
M702連接示意圖

串口通道采用:UART4 ?P511 P512

代碼實現:
讀取M702發送的數據保存到數組中,再讀取出來。
左右滑動查看更多
/* 串口中斷回調 */void debug_uart4_callback (uart_callback_args_t * p_args){? ? ? ? ? ? ? ? ? ? ? ? if(p_args->event == UART_EVENT_TX_COMPLETE)? ? {? ? ? ? uart_send_complete_flag = true;? ? }? ?if(p_args->event == UART_EVENT_RX_CHAR)? ?{? ? ? ?RxBuff[0] =p_args->data;? ? ? ?RxLine++; ? ? ? ? ? ? ? ? ? ? ?//每接收到一個數據,進入回調數據長度加1? ? ? ?DataBuff[RxLine-1]=RxBuff[0]; ?//把每次接收到的數據保存到緩存數組? ? ? ?Rx_flag=1; ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//接收結束標志位,這個數據可以自定義,根據實際需求,這里只做示例使用,不一定是0xff// ? ? ? ? ? ? ? ? ? ? ? ? if(RxBuff[0]==)// ? ? ? ?{// ? ? ? ? ? ?Rx_flag_finish=1;// ? ? ? ?}? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Rx_flag_finish=1;? ? ? ?RxBuff[0]=0;// ? ? ? ?err = R_GPT_Reset(&g_timer0_ctrl);// ? ? ? ?assert(FSP_SUCCESS == err);? ?}}//接受數據void printf_usart(void){? ? ? ? // printf("length=%d\r\n",RxLine);//接收到的長度? ?for(int i=0;i? ? ? ? ? ? ? ?{};? ? ? ? ? ? ? ?//printf("data:[%d] = 0x%x\r\n",i,DataBuff);//接收到的數據? ? ? ? ? ? ? ?//處理數據? ? ? ? ? ? ? ? ? ? ? ?co2= ? ? ? ?(DataBuff[2]*256 + DataBuff[3]);//co2濃度? ? ? ? ? ? ? ? ? ? ? ?ch2o=(DataBuff[4]*256 + DataBuff[5]);//甲醛? ? ? ? ? ? ? ? ? ? ? ?tvoc=(DataBuff[6]*256 + DataBuff[7]);? ? ? ? ? ? ? ? ? ? ? ?pm2_5=(DataBuff[8]*256 + DataBuff[9]);? ? ? ? ? ? ? ? ? ? ? ?pm10=(DataBuff[10]*256 + DataBuff[11]); ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ?temp1=DataBuff[12];? ? ? ? ? ? ? ? ? ? ? ?temp2=(DataBuff[12]+DataBuff[13]*0.1); ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ?hud1=DataBuff[14];? ? ? ? ? ? ? ? ? ? ? ?hud2=(DataBuff[14]+DataBuff[15]*0.1); ? ? ? ? ? ? ? ? ? ?// ? ? ? ? ? ? ? ?printf("CO2濃度= %d ppm\r\n",co2);// ? ? ? ? ? ? ? ?printf("甲醛濃度= %d μg/m3\r\n",ch2o);// ? ? ? ? ? ? ? ?printf("tvoc= %dμg/m3\r\n",tvoc);// ? ? ? ? ? ? ? ?printf("pm2.5= %dμg/m3\r\n",pm2_5);// ? ? ? ? ? ? ? ?printf("pm10= %dμg/m3\r\n",pm10);// ? ? ? ? ? ? ? ?printf("溫度= %f ℃\r\n",temp2);// ? ? ? ? ? ? ? ?printf("濕度= %f %RH \r\n",hud2);? ?memset(DataBuff,0,sizeof(DataBuff)); ?//清空緩存數組? ?//memset()作用:可以方便的清空一個結構類型的變量或數組。? ?//例句:memset(aTxbuffer,0,sizeof(aTxbuffer)) ?用memset清空aTxbuffer。? ?RxLine=0; ?//清空接收長度? ?Rx_flag_finish=0;? ?Rx_flag = 0;}
2.MQTT
※MQTT協議簡介
MQTT協議全稱是Message Queuing Telemetry Transport,翻譯過來就是消息隊列遙測傳輸協議,它是物聯網常用的應用層協議,運行在TCP/IP中的應用層中,依賴TCP協議,因此它具有非常高的可靠性,同時它是基于TCP協議的<客戶端-服務器>模型發布/訂閱主題消息的輕量級協議,也是我們常說的發送與接收數據,下面我們來初步了解一下mqtt相關的名稱與功能。
※MQTT通信模型
MQTT協議提供一對多的消息發布,可以降低應用程序的耦合性,用戶只需要編寫極少量的應用代碼就能完成一對多的消息發布與訂閱,該協議是基于<客戶端-服務器>模型,在協議中主要有三種身份:發布者(Publisher)、服務器(Broker)以及訂閱者(Subscriber)。其中,MQTT消息的發布者和訂閱者都是客戶端,服務器只是作為一個中轉的存在,將發布者發布的消息進行轉發給所有訂閱該主題的訂閱者;發布者可以發布在其權限之內的所有主題,并且消息發布者可以同時是訂閱者,實現了生產者與消費者的脫耦,發布的消息可以同時被多個訂閱者訂閱。

※MQTT客戶端的功能:
1.發布消息給其它相關的客戶端。
2.訂閱主題請求接收相關的應用消息。
3.取消訂閱主題請求移除接收應用消息。
4.從服務端終止連接。
MQTT 服務器常被稱為 Broker(消息代理),以是一個應用程序或一臺設備,它一般為云服務器,比如BTA三巨頭的一些物聯網平臺就是常使用MQTT協議,它是位于消息發布者和訂閱者之間,以便用于接收消息并發送到訂閱者之中,它的功能有:
1.接受來自客戶端的網絡連接請求。
2.接受客戶端發布的應用消息。
3.處理客戶端的訂閱和取消訂閱請求。4.轉發應用消息給符合條件的已訂閱客戶端(包括發布者自身)。
※阿里云配置
具體阿里云的注冊設置參照:
http://t.csdn.cn/L8SWn
AT指令讓 ESP8266 連接阿里云
第一步 AT+RST
第二步 AT+CWMODE=1
第三步 AT+CIPSNTPCFG=1.8"ntp1.alivun.com"
第四步 AT+CWJAP="WiFi 名字""WiFi 密碼"
第五步 AT+MQTTUSERCFG=0,1,"NULL","用戶名","密碼",0,0,"
第六步 AT+MQTTCLIENTID=0,"Clienld" //clientld 第二個參數注意每個逗號前加分隔符
第七步 AT+MQTTCONN=0,"連接域名",1883,1
AT+MQTTSUB=0,"topic",1 //訂閱指令
AT+MQTTPUB=0,"topic","Json格式內容",1,0 //發布指令AT+MQTTCLEAN=O //斷開連接
代碼實現
左右滑動查看更多
static char* ssid = "MI";//wifi名static char* pswd = "147258369";//密碼static char* aliyun = "ntp1.aliyun.com";//連接WiFi和阿里云void AT_Init(void){// ? ? ? ? ? ? ? ?printf("AT\r\n");// ? ?R_BSP_SoftwareDelay(2000, BSP_DELAY_UNITS_MILLISECONDS); ? ? ? ?? ?printf("AT+RST\r\n");? ?R_BSP_SoftwareDelay(4500, BSP_DELAY_UNITS_MILLISECONDS);? ?printf("AT+CWMODE=1\r\n");? ?R_BSP_SoftwareDelay(2000, BSP_DELAY_UNITS_MILLISECONDS);? ?printf("AT+CWJAP=\"%s\",\"%s\"\r\n",ssid,pswd);? ? ? ? ? ? ? ?LED1_ON;//點亮LED1? ?R_BSP_SoftwareDelay(2000, BSP_DELAY_UNITS_MILLISECONDS);? ? ? ? ? ? ? ?printf("AT+CIPSNTPCFG=1,8,\"%s\"\r\n",aliyun);? ? ? ? ? ? ? ?LED2_ON;//點亮LED2? ? ? ? ? ? ? ?LED1_OFF;//熄滅LED1? ?R_BSP_SoftwareDelay(2000, BSP_DELAY_UNITS_MILLISECONDS);? ?printf("AT+MQTTUSERCFG=0,1,\"NULL\",\"Air-quality-detection-system&ivs8zZPrvfk\",\"33e40cee05fce2fbbca52cf939a2e12843c860d02ec5b2175ba80d73a3b25507\",0,0,\"\"\r\n");? ?R_BSP_SoftwareDelay(2000, BSP_DELAY_UNITS_MILLISECONDS);? ? ? ? ? ? ? ?LED3_ON;//點亮LED3? ? ? ? ? ? ? ?LED2_OFF;//熄滅LED2? ?printf("AT+MQTTCLIENTID=0,\"ivs8zZPrvfk.Air-quality-detection-system|securemode=2\\,signmethod=hmacsha256\\,timestamp=1686987060303|\"\r\n");? ?R_BSP_SoftwareDelay(2000, BSP_DELAY_UNITS_MILLISECONDS);? ?printf("AT+MQTTCONN=0,\"iot-06z009xfy86rf3c.mqtt.iothub.aliyuncs.com\",%d,%d\r\n",1883,1);? ?R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);? ? ? ? ? ? ? ?LED1_ON;//點亮LED1? ? ? ? ? ? ? ?LED3_OFF;//熄滅LED3? ? ? ? ?R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);? ? ? ? ? ? ? ?LED1_OFF;//熄滅LED1}

3.TFT顯示
使用中景園電子SPI例程移植。
引腳連接如下:
左右滑動查看更多
具體函數功能如下:
void LCD_Fill(uint16_t xsta,uint16_t ysta,uint16_t xend,uint16_t yend,uint16_t color);//指定區域填充顏色void LCD_DrawPoint(uint16_t x,uint16_t y,uint16_t color);//在指定位置畫一個點void LCD_DrawLine(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2,uint16_t color);//在指定位置畫一條線void LCD_DrawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2,uint16_t color);//在指定位置畫一個矩形void Draw_Circle(uint16_t x0,uint16_t y0,uint8_t r,uint16_t color);//在指定位置畫一個圓void LCD_ShowChar(uint16_t x,uint16_t y,uint8_t num,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode);//顯示一個字符void LCD_ShowString(uint16_t x,uint16_t y,const uint8_t *p,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode);//顯示字符串uint32_t mypow(uint8_t m,uint8_t n);//求冪void LCD_ShowIntNum(uint16_t x,uint16_t y,uint16_t num,uint8_t len,uint16_t fc,uint16_t bc,uint8_t sizey);//顯示整數變量void LCD_ShowFloatNum1(uint16_t x,uint16_t y,float num,uint8_t len,uint16_t fc,uint16_t bc,uint8_t sizey);//顯示兩位小數變量void LCD_ShowChinese(uint16_t x,uint16_t y,uint8_t *s,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode);//顯示漢字串void LCD_ShowChinese12x12(uint16_t x,uint16_t y,uint8_t *s,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode);//顯示單個12x12漢字void LCD_ShowChinese16x16(uint16_t x,uint16_t y,uint8_t *s,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode);//顯示單個16x16漢字void LCD_ShowChinese24x24(uint16_t x,uint16_t y,uint8_t *s,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode);//顯示單個24x24漢字void LCD_ShowChinese32x32(uint16_t x,uint16_t y,uint8_t *s,uint16_t fc,uint16_t bc,uint8_t sizey,uint8_t mode);//顯示單個32x32漢字void LCD_ShowPicture(uint16_t x,uint16_t y,uint16_t length,uint16_t width,const uint8_t pic[]);//顯示圖片
顯示結果:


實物展示



視頻演示

總結
首先非常感謝野火舉辦的瑞薩RA MCU創意氛圍賽,能讓我入圍獲得這次參賽的機會。本次創意氛圍賽學習到了很多東西,對云平臺的連接有了更深入的了解,同時對RA6M5單片機的內核以及控制有了充足的認知,RA6M5上手快速,對新手很友好,可以用來開發強大功能的設計作品。野火官方提供的手冊例程使用起來也很方便,能夠快速上手,便于開發使用。在開發過程,遇到了很多問題,大多在網上搜索答案,從而提高自己的解決問題的能力。
源碼參考請識別下方二維碼或點擊文末閱讀原文查看更多內容:

復制下方網址到瀏覽器中打開進入瑞薩中文論壇查看:
https://community-ja.renesas.com/zh/forums-groups/mcu-mpu/
1
END
1
推薦閱讀
【瑞薩RA MCU創意氛圍賽作品賞析】項目3——簡易智能養花系統設計
【瑞薩RA MCU創意氛圍賽作品賞析】項目4——基于優先級的RTOS內核(下)
【瑞薩RA MCU創意氛圍賽作品賞析】項目5——二選一的四路USB HUB