1. 程式人生 > >[原創]基於OneNET雲實現STM32+K型熱電偶溫度HTTP實時上報

[原創]基於OneNET雲實現STM32+K型熱電偶溫度HTTP實時上報

公司手頭有個專案,需要做溫控系統,溫度探頭引線長度至少10米,帶液晶顯示,還要無線上報,仔細研究下來,確定了
STM32+K型熱電偶+SIM800C方案

其實看著真的很簡單,完整做下來,真心。。。電路細節暫時不表,基本一路綠燈,軟體真心調的懷疑人生。記錄下來,以便有同仁指教

STM32F103C8T6作為主控晶片,靠timer排程整個邏輯狀態(以後還是上freertos和ucosiii吧。。。)
1. 完成掉電資料不丟失
2. 完成萬年曆
3. 完成HTTP上報
4. 完成K型熱電偶測溫
5. 完成鍵盤檢測
液晶模組用的是公司自研3.5寸液晶屏,採用STM32F103RBT6,128KB FLASH,也靠timer排程,沒跑作業系統
6. 完成UI設計
7. 引數掉電不丟失
8. 與主控板資料互動

大概就這些要求吧,每一項都不難,完成的也很快,下面看一下問題

S1. while維護UI狀態機,每次重新整理一下介面,將引數儲存到flash中,完成引數動態儲存
A1. 這樣做其實有些偷懶,應該是在引數變化時儲存。直到我用壞了兩個page的flash才意識到,flash頻繁擦除,會擦壞的。現象就是,當時調好的程式碼,掉電防丟失也沒問題,連續上電跑一天,回來再看,掉電功能就掛了。到處找問題,最後才發現。。。引數儲存機制改成引數變化,才儲存到flash,這樣擦寫次數明顯降低三四個數量級,問題解決

S2. 液晶板與主機板靠SPI完成通訊,看中的是SPI的簡潔,同時STM32的IIC有bug,硬體模擬速度也上不去
A2. SPI主從通訊,確切的說是主定時傳送,從中斷接收。先配置通訊起來,再定義幀格式,到這一步都很簡單。但是,穩定性真是弱。外界給些電源干擾什麼的,UI就在介面間亂切換。最後排查下來,幀編碼太弱,同時按鍵電路沒有floating態的固定電平(比如沒有按下時,應該直接保持低或者高,而我的電路直接浮空,這不是穩妥設計,容易受干擾)。電路已經做了,只能靠軟體來彌補了。幀編碼採用格雷碼,在按鍵消抖的基礎上,再加入按鍵狀態濾波演算法,最終測試通過。但是,電路終究是要改的。。。

S3. HTTP上報OneNET平臺,實現無線資料實時更新
A3. 其實我更傾向於MQTT,專案時間緊,且無線上報只是一個演示功能,並不是強制的,我便沒有深究。以後產品還是還是用MQTT,畢竟是IOT的主流協議。除錯HTTP上報,先通過串列埠報上去,找一個串列埠助手除錯起來

AT

AT+CGCLASS="B"

AT+CGDCONT=1,"IP","CMNET"

AT+CGATT=1

AT+CIPCSGP=1,"CMNET"

AT+CLPORT="TCP","2000"

AT+CIPSTART="TCP","183.230.40.33","80"

AT+CIPSEND=192

POST /devices/34603850
/datapoints HTTP/1.1 api-key: oLZ3r7tmbODO7nfEyYop1WBVGpM= Host:api.heclouds.com Content-Length:63 {“datastreams”:[{“id”:”sys_time”,”datapoints”:[{“value”:15}]}]}

注意帶回車,注意POST開始直到結束是一整條訊息(devices後面的34603850以及api-key後面的一串字元是我自己申請的,要換你的)。一切OK後,開始用STM32實現,其實核心的也就幾句話,其他程式碼就不貼了

uint8_t SIM900A_GPRS_SEND_DATA(uint16_t temp_data)
{           
    uint8_t strData[] = "00";
    if(sim900a_send_cmd("AT+CIPSEND = 192",">",100))
        return 1;

    strcpy(USART2_TX_BUF,"POST /devices/34603850/datapoints HTTP/1.1\r\n\
api-key: oLZ3r7tmbODO7nfEyYop1WBVGpM=\r\n\
Host:api.heclouds.com\r\n\
Content-Length:63\r\n\
\r\n\
{\"datastreams\":[{\"id\":\"sys_time\",\"datapoints\":[{\"value\":");

    strData[0] += (temp_data/100);
    strData[1] += ((temp_data%100)/10);


    strcat(USART2_TX_BUF,strData);
    strcat(USART2_TX_BUF,"}]}]}\r\n");

    while(DMA1_Channel7->CNDTR!=0);
    UART_DMA_Enable(DMA1_Channel7,192);     

    return 0;
}   

直接上圖吧,整個UI互動靠上下左右以及確認取消六鍵來完成,算是成熟設計了,也不細表了
這裡寫圖片描述
就看首屏吧,第二屏及以後都是一些引數設定,沒什麼特別
還有就是二維碼了:
這裡寫圖片描述
最後看一下,實時溫度資料HTTP上報
這裡寫圖片描述
關於這個介面設計,可以參考OneNET的官方文件
https://open.iot.10086.cn/app_editor/docs/#/