2021-09-04 10:39:46 索煒達電子 714
項目編號:E781
文件大?。?8M
源碼說明:帶中文注釋
開發(fā)環(huán)境:C編譯器
簡要概述:
項目簡介:stm32項目,時間片論詢結(jié)構(gòu),驅(qū)動OLED顯示溫度歷史曲線,具備物聯(lián)網(wǎng)功能發(fā)送數(shù)據(jù)至手機APP,可PI計算輸出控制溫度方案
項目起因: 大學(xué)專業(yè)課程設(shè)計,需設(shè)計一款基于DS18B20 的數(shù)字溫度計
項目要求:
1.實現(xiàn)測溫范圍 -5~125℃,誤差+-0.1℃
2.實時采集溫度數(shù)據(jù),并實時顯示記錄溫度曲線
3.設(shè)置控制的期望值范圍,超出范圍則聲光報警
擴展要求:
4. 可與計算機進行通訊 ,可上傳溫度數(shù)據(jù)
5. 具有PI控制算法,可計算輸出值
6. 具有物聯(lián)網(wǎng)功能,將數(shù)據(jù)傳遞至服務(wù)器,手機顯示溫度曲線 基于ESP8266-01S
7. 位式或連續(xù)溫度調(diào)節(jié)
項目器件:
-STM32F103C8T6 主控芯片*1
-DS18B20 測溫*1
-OLED_IIC 屏幕*1
-ESP8266-01S WIFI模塊*1
-LED燈
-蜂鳴器
-etc..
項目實現(xiàn)
1. 原理圖設(shè)計:
首先進行原理圖設(shè)計,基于最基礎(chǔ)的STM32F103C8T6芯片,將需要用到的元器件模塊等等,連接至主控。 具體可以參考以下原理圖。(如有錯誤請指正 謝謝)
2. PCB設(shè)計:
將原理圖畫成PCB文件,并找一個商家發(fā)板。 每次發(fā)板子,等待都是漫長的過程。但是還好,嘉立創(chuàng)每月可以發(fā)兩次5元的板子,算是對學(xué)生和工程師的優(yōu)惠了 PCB設(shè)計如下:(如有錯誤請指正 謝謝)
3. Code 代碼部分
板子到手后,就急急忙忙的焊完了,通電測試正常后,開始編寫程序。
程序部分分為兩塊:主控STM32的程序和ESP8266-01S的固件 主控采用Keil編寫,ESP采用Arduino編寫,因為Arduino的Wifi庫真的很好用。
STM32F103主控部分:
主控的思路基本就是,一個循環(huán)里做各任務(wù)的調(diào)用,如按鍵掃描鍵值處理,屏幕的動態(tài)更新,等等 每個任務(wù)都是采用Void形式,不返回數(shù)值,全部使用全局變量的標志來實現(xiàn)各函數(shù)間的通訊信息傳遞。 這樣的好處就是不會阻塞程序的運行,使得程序的每一個部分都會被執(zhí)行到。與RTOS等時間片論相比 就有那味兒了??! 主控部分我的大部分精力都花在了OLED的刷新速率優(yōu)化和按鍵處理上
OLED最后采用硬件IIC + DMA 的行為傳送,在主控RAM里模擬一個1024B的顯存,每次顯存有變化則刷新至OLED,以O(shè)LED-IIC 400Kpbs的速率下,刷新整屏幕只需要 0.02332s 理論上刷新率可以達到42幀,而采用DMA傳輸,還不浪費CPU的資源。
主循環(huán)中的進程主要有下面四個
//while(1)主循環(huán)里 順序執(zhí)行以下進程,進程基本無阻礙,使用全局變量消息傳遞機制,可保證實時性。
myKey_GetKeyValue();//獲取鍵值
app_Handle_KeyState();//鍵值處理
app_Updata_Interface();//界面更新
app_Dynamic_Display();//動態(tài)顯示
先硬件層上,中斷處理按鍵,是否有按鍵按下,然后調(diào)用
myKey_GetKeyValue();//獲取鍵值
根據(jù)按下的時間更新按鍵消息。再根據(jù)按鍵消息來執(zhí)行各個函數(shù)功能。 具體按鍵處理機制,可以參考我的另一篇博客 STM32按鍵處理機制
之后是界面更新函數(shù)進程和動態(tài)更新函數(shù)進程。 界面更新函數(shù)進程主要根據(jù)當前頁面序號與上次頁面序號是否相同,來決定是不是要更新界面,具體定義如下:
//界面顯示
typedef enum
{
No_Interface = 256,
Main_Interface = 0,
Menu_Interface = 1,
Menu_ENTER_Interface = 2,
Input_Interface = 3
}Interface_Num_enumTypedef;//頁面序號定義
Interface_Num_enumTypedef now_Interface_Num = No_Interface ; //當前的頁面序號
Interface_Num_enumTypedef next_Interface_Num = Main_Interface; //下次需要更新到的頁面序號
頁面靜態(tài)更新函數(shù):
//靜態(tài)顯示 aka 靜態(tài)頁面更新進程
void app_Updata_Interface()
{
if(now_Interface_Num != next_Interface_Num)
{
OLED_RamClear();
switch (next_Interface_Num)
{
case Main_Interface:
OLED_ShowBMP(0,0,127,63, (u8 *)Interface_Main);
now_Interface_Num = Main_Interface;
break;
case Menu_Interface:
OLED_ShowBMP(0,0,127,63, (u8 *)Interface_Menu);
now_Interface_Num = Menu_Interface;
break;
case Menu_ENTER_Interface:
OLED_ShowBMP(0,0,127,63, (u8 *)MENU_ENTER_INTERFACE);
············省略
動態(tài)更新每一個主循環(huán)進行一次,就會動態(tài)更新一次,以便于顯示按鍵動畫,溫度曲線等動態(tài)效果。當處于哪個頁面就會更新相應(yīng)的效果,具體應(yīng)用具體設(shè)計。篇幅過大就不貼出來了。源碼已上傳至Github
那么界面顯示最主要的還是OLED的驅(qū)動顯示,OLED驅(qū)動好了,更新速率上去了,動畫才會更加流暢??梢詤⒖?STM32 DMA-IIC刷新OLED屏(理論可達42+幀率)
ESP8266-01S部分:
ESP的程序相對來說簡單了很多,需要做的只是連接WIFI然后串口接受溫度數(shù)據(jù),并HTTP-POST請求上傳數(shù)據(jù)置服務(wù)器即可。(其實可以做的復(fù)雜點,就是自己設(shè)計一個通訊協(xié)議,這樣通訊更嚴謹,但由于時間問題,就草草的設(shè)計了簡單的通訊,無幀頭幀尾和校驗位)
//本來打算加個選擇連接WIFI的功能,并且增加軟鍵盤輸入密碼等功能,但是學(xué)期末了,時間不太夠了,想想覺得很麻煩,就算了,直接將WIFI名和密碼寫在了程序里。
ESP的程序編寫用到了Arduino的ESP8266的庫,網(wǎng)上可以下載到,也可以到我的GitHub上下載。
思路:先連接WIFI 然后一直循環(huán)在串口接收的函數(shù)里,判斷是否有正確的溫度數(shù)據(jù)被接受,有則POST請求至服務(wù)器
char* getValue()
{
while (true)
{
if (Serial.available() > 0)
{
inByte = Serial.read();
//Serial.print(inByte);
if (inByte == '[')
{
isCommand = true;
rxBuffer_tail = 0;
//rxBuffer[0] = 0;
}
else if (inByte == ']')
{
isCommand = false;
rxBuffer[rxBuffer_tail] = '\0';
return rxBuffer;
}
else if (isCommand)
{
rxBuffer[rxBuffer_tail++] = inByte;
}
}
}
}
目錄│文件列表:
│ ShaoBing-No.1.rar
│ 不繞彎路,獲取海量資源.jpg
└ ShaoBing-No.1
└ ShaoBing-No.1
└ ShaoBing-No.1
│ 程序流程圖.png
├ Code
│ ├ ESP8266_01S_UART_HTTP
│ │ │ ESP8266_01S_UART_HTTP.ino
│ │ ├ DOC
│ │ │ └ readme.txt
│ │ └ Lib
│ │ └ 8266_package_2.5.0.exe
│ └ ShaoBing_No_1_F103C8T6
│ ├ Doc
│ │ │ 1.h
│ │ │ 1.h.bak
│ │ │ OLED 刷新全屏幕速度.txt
│ │ │ Readme.txt
│ │ │ 主界面.bmp
│ │ │ 右.h
│ │ │ 右.h.bak
│ │ │ 右箭頭10x11.bmp
│ │ │ 左.h
│ │ │ 左.h.bak
│ │ │ 左箭頭10x11.bmp
│ │ │ 菜單.bmp
│ │ │ 菜單進入選項.bmp
│ │ │ 菜單進入選項.h
│ │ │ 規(guī)劃.txt
│ │ ├ lcd漢字取模軟件
│ │ │ │ 1.h
│ │ │ │ 1.h.bak