智能樓宇專案總結
模塊
節點板(STM32F103R8T6):DHT11、MQ2、MQ135、熱釋電、光敏電阻、0.96oled、外部flash模塊,
中控板(STM32F407ZET6):ESP8266、3.5寸TFTLCD屏、外部flash模塊,
重要技術
RS485通信、MQTT通信協議、Modbus通信協議、GUI界面設計、SPI協議、單總線協議(1-wire),
相關介紹(節點板一些相關的資料)
單總線協議(1-wire):
微處理器與 DHT11之間的通訊采用單總線通信,一次通訊時間4ms左右,資料分小數部分和整數部分,具體格式在下面說明,當前小數
部分用于以后擴展,現讀出為零.操作流程如下:
一次完整的資料傳輸為40bit,高位先出,
資料格式:
8bit濕度整數資料+8bit濕度小數資料
+8bi溫度整數資料+8bit溫度小數資料
+8bit校驗和
資料傳送正確時校驗和資料等于
“8bit濕度整數資料+8bit濕度小數資料+8bi溫度整數資料+8bit溫度小數資料”
所得結果的末8位,
通訊程序:
流程如下

產生起始信號(空閑的時候要把總線拉高):
1)總線空閑狀態為“高電平”,主機把總線拉低等待DHT11回應,主機把總線拉低必須大于18毫秒,保證DHT11能檢測到起始信號,之后需要把總線變為空閑狀態,讓DHT11可以通知你,(電平的跳變通知DHT11,給DHT11一定的反應時間讓它知道你要和它通信了)
2)DHT11接收到主機的開始信號后,等待主機開始信號結束,然后發送80us“低電平回應信號”,(DHT11知道你要和它通信,它告訴你它收到你的請求,可以和你通信了)
3)主機發送開始信號結束后,延時等待20-40us后, 讀取DHT11的回應信號(你接收它告訴你的訊息,看它是否可以和你通信(總線為低電平,說明DHT11發送回應信號,如果讀取回應信號為高電平,則DHT11沒有回應,請檢查線路是否連接正常),并等待它就緒)
4)等待DHT11釋放總線(釋放之后你就可以給它發訊息了,DHT11發送回應信號后,再把總線
拉高80us,準備發送資料)
主機發送開始信號后,可以切換到輸入模式,或者輸出高電平均可, 總線由上拉電阻拉高,
//產生起始信號
u8 DHT11_Stat(void)
{
u8 time = 0;
//1)產生起始信號
DHT11_OUT(1);
Delay_us(10);
DHT11_OUT(0);
Delay_ms(20);
DHT11_OUT(1);
time = 0;
// 2)、3)等待應答
while(DHT11_IN != 0){
Delay_us(1);
time++;
if(time ==100)
return 1;
}
time = 0;
// 4)等待DHT11釋放總線
while(DHT11_IN != 1){
Delay_us(1);
time++;
if(time ==100)
return 1;
}
return 0;
}
發送資料:
1)每一bit資料都以50us低電平時隙開始
2)高電平的長短定了資料位是0還是1.
3)當最后一bit資料傳送完畢后,DHT11拉低總線50us,隨后總線由上拉電阻拉高進入空閑狀態,
格式見下面圖示.
數字0信號表示方法:

數字1信號表示方法:

```bash
//讀取并處理資料
u8 DHT11_ReadData(float *temp,float *hum)
{
u8 time = 0;
u8 i, j;
u8 data[5] = {0};
if(DHT11_Stat())
return 1;
for(i = 0;i<=4;i++)
for(j = 0;j<8;j++){
time = 0;
while(DHT11_IN != 0){// 3) 最后一bit資料傳送完畢后
Delay_us(1);
time ++;
if(time == 100)
return 1;
}
time = 0;
while(DHT11_IN != 1){// 1) 等待本次資料開始發送
Delay_us(1);
time ++;
if(time == 100)
return 1;
}
// 2) 判斷數字信號為0還是1
Delay_us(30); //26-28us為0,大于70us為1
if(DHT11_IN)//判斷資料位0/1
data[i] |= 1<<(7-j);
else
data[i] &= ~(0x01<<(7-j));
}
//校驗
if(data[4] == data[0]+data[1]+data[2]+data[3]){
*hum = data[0]+data[1]/10.0;
*temp = data[2]+data[3]/10.0;
}
else
printf("Check the error\r\n");
return 0;
}
RS485通信
Modbus和RS485在兩個板之間都需要
RS485:
RS485多用于長距離傳輸的應用場景,大多數是在工業場景中,RS485電平邏輯采用差分電平,即傳輸資料至少需要兩根信號線,根據兩根信號線電壓的差值來確定電平邏輯,發送端電平:
>+2V ~ +6V 代表邏輯1
<-2V ~ -6V 代表邏輯0
其他 無意義
接收端電平:
> +200mv 代表邏輯1
< -200mv 代表邏輯0
其他 無意義
RS485是半雙工通信(485通信時用兩根線進項通信,兩根線的壓差表示信號為高電平還是低電平,所以485為半雙工通信,用兩個線的壓差來表示的0/1,其抗干擾能力會變強(差分信號抗干擾能力強))
TTL電平(數電有介紹):
目前我們熟知的單片機基本上都是使用的TTL電平的信號系統,這是計算機處理器控制的設備內部各部分之間通信的通信標準,
電平標準為:
輸出:
大于2.4V 代表邏輯1
小于0.4V 代表邏輯0
輸入:
小于0.8V 代表邏輯0
大于2V 代表邏輯1
其他 無意義
TTL電平輸入腳懸空時是內部認為是高電平,要下拉的話應用1k以下電阻下拉,
TTL電平無法進行長距離傳輸,抗干擾能力弱,信號衰減較大,
TTL電平為邏輯電平而設計,基本用于板級通信,單片機基本上都使用TTL信號系統,
本專案選擇RS485通信愿意之一就是為了增強抗干擾能力,
ModBus(簡述):
MODBUS 是 OSI 模型第 7 層上的應用層報文傳輸協議,
ModBus大致分為以下幾種:
Modbus-RTU 本專案用的時這個協議(需要crc校驗)
Modbus-ASCII
Modbus-TCP
modbus幀結構
幀結構 = 地址 + 功能碼+ 資料 + 校驗
地址: 占用一個位元組,范圍0-255,其中有效范圍是1-247,其他有特殊用途,比如255是廣播地址(廣播地址就是應答所有地址,正常的需要兩個設備的地址一樣才能進行查詢和回復),
功能碼:占用一個位元組,功能碼的意義就是,告訴從機主機想干啥

資料:它因不同的功能碼及不同的從機而不同,資料區可以是實際資料、狀態值、參考地址、資料長度等等,
校驗:為了保證資料不錯誤,增加這個,然后再把前面的資料進行計算看資料是否一致,如果一致,就說明這幀資料是正確的,我再回復;如果不一樣,說明你這個資料在傳輸的時候出了問題,資料不對的,所以就拋棄了,
其他模塊
MQ2、MQ135、光敏電阻用的是ADC模數轉換,此處會用到DMA,
熱釋電通過一系列電路將信號轉換為0/1來判斷是否有人,
oled通信方式有6800、 8080 兩種并行通信、SPI 、IIC 通信,這里選用的是SPI通信,
外部flash(W25Q64):選用的是SPI通信,flash用來存盤oled所需要的字庫,
上面主要介紹了一些不常見和比較重要的,常見的沒詳細介紹
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/325883.html
標籤:其他
