溫濕度採集與控制
# Smart之溫濕度採集與控制
# 1. 說明
範例使用ModbusTCP通訊協議,讀取連線至Arduino的溫濕度感測器數據,同時可通過ModbusTCP來控制LED燈以及繼電器開關。可通過視訊直播流檢視正在播放的設備運行情況。
範例除使用常規的Arduino硬體外,還需要使用到用於進行直播錄像的攝像機,該攝像機錄製的視訊將以視訊直播流的形式發送至指定的RTMP伺服器中,範例從該地址中接收視訊流播放視訊錄像。在使用該範例前需要讀者對視訊直播的流程有一定的瞭解,並使用自行搭建的流媒體伺服器或者第三方的視訊直播服務進行推流直播。自行搭建的流媒體伺服器可使用SRS (opens new window)。
通過範例學習,可以掌握ModbusTCP的基本通訊原理,實現Arduino設備的綜合控制。
# 2. 零件連線圖
零件連線如下圖所示,其中電動機的部分為製冷與風扇的外圍電路,製冷器與溫濕度感測器緊貼。
# 3. 使用零件
序 | 零件名稱 | 數量 |
---|---|---|
1 | Arduino UNO R3 開發板 | 1 |
2 | W5100網路擴充套件板 | 1 |
3 | USB數據線 | 1 |
4 | 麵包板 | 1 |
5 | 杜邦線 | 若干 |
6 | LED燈 | 1 |
7 | 220歐姆電阻 | 1 |
8 | LCD1602液晶顯示屏(I2C介面) | 1 |
9 | DHT11溫濕度感測器 | 1 |
10 | 繼電器 | 1 |
11 | 半導體制冷片 | 1 |
12 | 電動機 | 1 |
# 4. Arduino流程圖
# 5. Arduino程式
使用Arduino IDE 編譯並上傳以下Arduino程式。
// 使用溫濕度感測器之鏈接庫 https://github.com/adafruit/DHT-sensor-library
// 採用 MyArduinoProjects Modbus TCP 鏈接庫 http://myarduinoprojects.com/modbus.html
// 讀取溫濕度 因為modbus 無法傳遞小數字 所以先乘100 到客戶端取用時要除 100
#include <DHT.h>
#include <SPI.h>
#include <Ethernet.h>
#include <MgsModbus.h> // 引入Modbus TCP 鏈接庫
#include <LiquidCrystal_I2C.h> //引用I2C庫
MgsModbus Mb;
//設定LCD1602設備地址,一般是0x20,或者0x27,具體看模組手冊
LiquidCrystal_I2C lcd(0x27,16,2);
#define dhtPin 8 //讀取DHT11 Data
#define dhtType DHT11 //選用DHT11
DHT dht(dhtPin, dhtType); // Initialize DHT sensor
#define LED_PIN 9 //定義LED PIN為 9
#define COOLER_PIN 7 //定義製冷器PIN為 7
// 設定網路IP地址 (網路擴充卡 MAC 可自行修改 +1 避免衝突)
byte mac[] = {0x90, 0xA2, 0xDA, 0x0E, 0x94, 0xB8 };
IPAddress ip(192, 168, 0, 183);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);
void setup() {
Serial.begin(9600); //設定鮑率9600
Ethernet.begin(mac, ip, gateway, subnet); // 啟動網路
Serial.println("網路已經開通");
pinMode(LED_PIN, OUTPUT);
pinMode(COOLER_PIN, OUTPUT);
lcd.init(); // 初始化LCD
lcd.backlight(); //設定LCD背景等亮
lcd.setCursor(0,0); //設定顯示指針
lcd.print("IsoFace LiveDemo");
//設定要使用的快取器地址
//0 1 2 3 4 是 Holding 快取器的順序,其地址分別是10000,10001,10002,10003,10004
// 新增快取器 mb.MbData(i);
Mb.MbData[0] = 0; // 地址 0 存放所測得之溫度
Mb.MbData[1] = 0; // 地址 1 存放所測得之濕度
Mb.MbData[2] = 0; // 地址 2 存放LED燈的狀態
Mb.MbData[3] = 0; // 地址 3 存放製冷器的狀態
dht.begin();//啟動DHT
}
void loop() {
// LED燈狀態指示
if (Mb.MbData[2]!=0){
digitalWrite(LED_PIN, HIGH); //PIN 9輸出為HIGH,LED點亮
}
else {
digitalWrite(LED_PIN, LOW); //PIN 9輸出為LOW,LED熄滅
}
// 製冷器狀態指示
if (Mb.MbData[3]!= 0){
digitalWrite(COOLER_PIN, HIGH);
}
else{
digitalWrite(COOLER_PIN, LOW);
}
float h = dht.readHumidity()*100; //讀取濕度 因為modbus 無法傳遞小數字 所以先乘100 到客戶端取用時要除 100
float t = dht.readTemperature()*100; //讀取攝氏溫度
if (isnan(h) || isnan(t)) {
Serial.println("無法從DHT感測器讀取!");
return;
}
Mb.MbData[0] = t; // 地址 0 存放所測得之溫度
Mb.MbData[1] = h; // 地址 1 存放所測得之濕度
//輸出顯示狀態
lcd.clear();
lcd.setCursor(0, 0);
if (Mb.MbData[2] != 0){
lcd.print("LED:ON ");
}
else{
lcd.print("LED:OFF ");
}
if (Mb.MbData[3] != 0){
lcd.print("FAN:ON ");
}
else{
lcd.print("FAN:OFF ");
}
lcd.setCursor(0, 1);
lcd.print("T:" + String(t*0.01)+ " " + "H:" + String(h*0.01));
delay(500); //延時 0.5 秒
Mb.MbsRun(); //呼叫 Modbus
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# 6. 設計明細
開啟Smart智慧控制平臺,分別加入下插圖之控制元件。或者通過點選功能表欄[檔案]
-[打開專案]
選擇專案打開該範例。
①:TModbusTCP元件,控制元件名稱為ModbusTCP
。
②:TTimer元件,控制元件名稱為Timer1
。
③:TFSPlayer元件,控制元件名稱為FSPlayer1
。
④:TPanel元件,控制元件名稱為pnVideoPanel
。
⑤:TiSevenSegmentAnalog元件,控制元件名稱為LCDTem
。
⑥:TiSevenSegmentAnalog元件,控制元件名稱為LCDHum
。
⑦:TSwitchButton元件,控制元件名稱為sbLED
。
⑧:TSwitchButton元件,控制元件名稱為sbFan
。
Main窗體屬性設定
Caption
:主窗體標題,設定為溫濕度採集與控制
。ClientHeight
:窗體客戶區高度=562
。ClientWidth
:窗體客戶區寬度=566
。
①ModbusTCP屬性設定
Host
:設定其連線的客戶端的IP地址。AutoConnect
:設定控制元件是否自動連線至客戶端,此處設定為True
。
②Timer屬性設定
Interval
:設定計時器觸發的時間間隔,單位為毫秒(ms),設定為2000
。
③FSPlayer1屬性設定
Saturation
:設定視訊色彩的飽和度,設定為10
。VideoPanel
:設定視訊顯示在哪個控制元件上,設定為pnVideoPanel
。
④pnVideoPanel屬性設定
Caption
:設定面板顯示的標籤內容,設定為視訊播放區域
。
⑤LCDTem屬性設定
使用滑鼠右鍵點選該控制元件,在選項中選擇[Edit]
,其中的選項修改如圖所示,設定完成後,點選[OK]
按鈕儲存設定。
- ⑥LCDHum屬性設定
使用滑鼠右鍵點選該控制元件,在選項中選擇[Edit]
,其中的選項修改如圖所示,設定完成後,點選[OK]
按鈕儲存設定。
⑦sbLED屬性設定
SwitchOff
:設定IsChecked
=False
時顯示的圖片。點選屬性右側的[...]
按鈕,打開檔案上傳界面,點選[Load...]
從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]
載入圖片。
SwitchOn
:設定IsChecked
=True
時顯示的圖片。點選屬性右側的[...]
按鈕,打開檔案上傳界面,點選[Load...]
從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]
載入圖片。
Height
:設定控制元件顯示的高度,設定為68
。Width
:設定控制元件顯示的寬度,設定為68
。
⑧sbFan屬性設定
SwitchOff
:設定IsChecked
=False
時顯示的圖片。點選屬性右側的[...]
按鈕,打開檔案上傳界面,點選[Load...]
從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]
載入圖片。
SwitchOn
:設定IsChecked
=True
時顯示的圖片。點選屬性右側的[...]
按鈕,打開檔案上傳界面,點選[Load...]
從檔案瀏覽器中選擇對應的圖片檔案上傳,返回該界面下,待顯示出圖片後點擊[OK]
載入圖片。
Height
:設定控制元件顯示的高度,設定為68
。Width
:設定控制元件顯示的寬度,設定為68
。
# 7. 程式設計
# 7.1. 程式初始設定
程式啟動時,讀取ModbusTCP設備的相關數據資訊,載入視訊直播地址,開始直播視訊的播放。
constructor TMyHandler.Create(AOwner: TComponent);
var
hum,tmp,LED,Fan: Word;
begin
FThis :=TBaseForm(AOwner);
FThis.FSPlayer1.Open('http://192.168.0.113:8080/live/001.flv',False);
FThis.ModbusTCP.ReadHoldingRegister(1,tmp);
FThis.ModbusTCP.ReadHoldingRegister(2,hum);
FThis.ModbusTCP.ReadHoldingRegister(3,LED);
FThis.ModbusTCP.ReadHoldingRegister(4,Fan);
FThis.LCDTem.Value := tmp * 0.01;
FThis.LCDHum.Value := hum * 0.01;
if LED = 1 then
FThis.sbLED.IsChecked := True
else
FThis.sbLED.IsChecked := False;
if Fan = 1 then
FThis.sbFan.IsChecked := True
else
FThis.sbFan.IsChecked := False;
end;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 7.2. 事件設定
- ②Timer1-OnTimer事件
計時器的定時觸發時間,讀取數據並顯示
procedure TMyHandler.TimerTimer;
var
hum,tmp,LED,Fan: Word;
begin
FThis.ModbusTCP.ReadHoldingRegister(1,tmp);
FThis.ModbusTCP.ReadHoldingRegister(2,hum);
FThis.LCDTem.Value := tmp * 0.01;
FThis.LCDHum.Value := hum * 0.01;
end;
2
3
4
5
6
7
8
9
- ⑦sbLED-OnSwitch事件
點選以切換LED的開關狀態。
procedure TMyHandler.sbLEDSwitch;
begin
if FThis.sbLED.IsChecked then
FThis.ModbusTCP.WriteRegister(3,1)
else
FThis.ModbusTCP.WriteRegister(3,0);
end;
2
3
4
5
6
7
- ⑧sbFan-OnSwitch事件
點選以切換製冷器的開關狀態。
procedure TMyHandler.sbFanSwitch;
begin
if FThis.sbFan.IsChecked then
FThis.ModbusTCP.WriteRegister(4,1)
else
FThis.ModbusTCP.WriteRegister(4,0);
end;
2
3
4
5
6
7
# 8. 運行結果
使用滑鼠點選工具欄運行(Run),測試運行結果。
通過工具欄儲存,將程式儲存為 sdb 專案檔案。
程式運行后,顯示Arduino的直播畫面,其中包含了LCD顯示屏,LED燈以及製冷器的散熱風扇等的狀態顯示。
點選LED燈
或者散熱器
的開關按鈕,對應的元件開啟或關閉,可在直播畫面中看到狀態的顯示。