物聯網-wemos D1 Mini (esp8266)實驗九 --- blynk APP遠程控制格力空調開機並顯示溫溼度
概述
這個實驗室在實驗八的基礎上增加了溫溼度數據的採集,需要在之前的Bylnk項目中新增加一個顯示控件。
實驗材料
- Wemos D1 Mini開發板 *1 (10元)
- KY-005紅外發射模塊 *1 (1元)
或者 5mm 940nm紅外發射管 (0.1元) - 170孔mini麪包板*1(可選)(1元)
- 可選:2N2222*1(或者2N3904)
- Wemos D 1Mini DHT22擴展板(19元)
/
DHT22模塊(14元)/
DHT11(5.5元)模塊 3選1
合計:16-31元
硬件
硬件連接圖
連線圖中使用的是DHT11模塊,DHT22的連接方式相同。擴展板的使用最爲簡單,之間插上即可(注意插的時候板子的缺口要在同一個方向
)。
引腳連接對照表
- KY-005引腳連接圖
KY-005 | Wemos D1 Mini |
---|---|
S | D3 |
5V |
5V |
Gnd | Gnd |
- DHT11引腳連接圖
DHT11 | Wemos D1 Mini |
---|---|
1 |
3.3V |
2 | D4 |
3 | 懸空 |
4 | Gnd |
- DHT22引腳連接圖
DHT22 | Wemos D1 Mini |
---|---|
+ |
3.3V |
OUT | D4 |
- | Gnd |
Arduino端軟件編寫
測試Wemos D1 Mini溫溼度採集程序
DHT庫的安裝
會安裝的這步可以略過
DHT庫下載地址
-
在頁面中第一步點擊Clone or download,第二步點擊Download ZIP
-
打開Arduino IDE,在項目->加載庫->添加一個.ZIP庫的對話框中選擇你剛剛下載的
.zip
文件即可。
-
注意:這個DHT庫依賴另外一個
Adafruit Unified Sensor Driver
庫,所以爲了正確運行還要裝一下這個庫。否則會報錯。提示找不到一個文件,名字我忘記了。我安裝的時候就報錯了,又加裝了這個好了。
Adafruit Unified Sensor Driver庫下載 -
github上有關於wemos D1 Mini非常豐富的示例程序
github上的關於wemos D1 Mini全部例程下載地址
打開上面的地址後,會顯示下圖的結構,examples->04.Shields->DHT_Shield->Simple目錄下有完整測試代碼。
-
上傳程序到開發板,打開arduino IDE自帶的串口軟件觀察是否正確的採集到了數據。
-
完整中文註釋代碼
/* DHT Shield - Simple
*
* Example testing sketch for various DHT humidity/temperature sensors
* Written by ladyada, public domain
*
* Depends on Adafruit DHT Arduino library
* 這個程序依賴Adafruit DHT Arduino library這個庫文件
* https://github.com/adafruit/DHT-sensor-library
* 庫文件的下載地址見上述連接
*/
#include "DHT.h"
#define DHTPIN D4 // what pin we're connected to 我們連
//接到傳感器信號引腳的接口
// Uncomment whatever type you're using!
//將你選用的器件型號前面的註釋去掉
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Connect pin 1 (on the left) of the sensor to +5V
// NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
// to 3.3V instead of 5V!
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
//引腳連接說明,特別提出如果板子是3.3v邏輯的dht電源就接3.3v而不要接5v,比如我們的wemos D1 MIni
// Initialize DHT sensor.
// Note that older versions of this library took an optional third parameter to
// tweak the timings for faster processors. This parameter is no longer needed
// as the current DHT reading algorithm adjusts itself to work on faster procs.
DHT dht(DHTPIN, DHTTYPE);//初始化一個dht示例
void setup() {
Serial.begin(9600);//開啓串口
Serial.println("DHTxx test!");
dht.begin();//開啓dht
}
void loop() {
// Wait a few seconds between measurements.
delay(2000);//延時2S
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();//讀溼度
// Read temperature as Celsius (the default)
float t = dht.readTemperature();//讀溫度
// Read temperature as Fahrenheit (isFahrenheit = true)
float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Compute heat index in Fahrenheit (the default)
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = dht.computeHeatIndex(t, h, false);
//串口輸出
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");
}
將DHT採集代碼整合到實驗八中
- 將獲取溫溼度的代碼寫成函數供Bylnk虛擬寫程序調用
int getTemperat() {
float h = _dht.readHumidity();//讀取溼度值放入h變量
float t = _dht.readTemperature();//讀取溫度值放入t變量
float f = _dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println(“Failed to read from DHT sensor!”);
return 0 ;
}
// Compute heat index in Fahrenheit (the default)
float hif = _dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = _dht.computeHeatIndex(t, h, false);
return int(t);
}
- 增加對虛擬引腳v5的操作函數
-
BLYNK_READ(V5) {//上傳溫溼度數據 Blynk.virtualWrite(V5,getTemperat());//虛擬引腳寫事件
} - 編譯上傳程序到開發板
Bylnk端軟件編寫
- 添加一個溼度顯示控件
- 設置它的參數,虛擬引腳V5
其中LABEL
部分要特別注意,你書寫中/pin/
位置就是你接收的溫溼度數據顯示位置。其他部分的文字你可以根據自己喜好設定。但是這個軟件貌似對中文不是很友好。。我卡bug了。。。切換到英文輸入法,起個英文顯示比較安全。
最終顯示效果
完整源代碼
#include <ESP8266WiFi.h>//ESP8266WiFi設置庫
#include <IRremoteESP8266.h>//ESP8266紅外控制庫
#include <IRsend.h>//紅外發送庫
#include <ir_Gree.h>//添加格力空調的庫
#include <BlynkSimpleEsp8266.h>
#include "DHT.h"//添加DHT的庫
#define DHTPIN D4 // 擴展板連接的是D4引腳
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302)//板載的溫溼度傳感器是DHT22款
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
IRGreeAC _ac(D3); //創建一個格力空調的控制實例
DHT _dht(DHTPIN, DHTTYPE);//創建一個DHT的實例
BLYNK_WRITE(V1)//Blynk端的按鈕按下
{
int pinValue = param.asInt(); //將按鈕控件上傳的值放入pinValue變量中
Serial.print("V1 Slider value is: ");
Serial.println(pinValue);//測試時方便串口進行監測
if(pinValue){//如果按鈕按下發送空調ON紅外碼 開:1 關:0
_ac.on();//生成空調“開”的紅外碼//-ac是格力空調實例
_ac.send();//發送紅外命令
}
}
BLYNK_READ(V5) {//上傳溫溼度數據
Serial.println("entered");
Blynk.virtualWrite(V5,getTemperat());//虛擬引腳寫事件
}
int getTemperat() {
float h = _dht.readHumidity();//讀取溼度值放入h變量
float t = _dht.readTemperature();//讀取溫度值放入t變量
float f = _dht.readTemperature(true);
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return 0 ;
}
// Compute heat index in Fahrenheit (the default)
float hif = _dht.computeHeatIndex(f, h);
// Compute heat index in Celsius (isFahreheit = false)
float hic = _dht.computeHeatIndex(t, h, false);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");
return int(t);
}
void setup() {
Serial.begin(115200);
_ac.begin();//開啓空調紅外
_dht.begin();//開啓DHT
Serial.print("dht ok");
Blynk.begin(u8"ce88b0934e6e425fbf9c99743f3cf2b8", u8"iPhone", u8"00000000");
Blynk.begin(u8"token值", u8"wifi名字", u8"wifi對應的密碼");
}
// the loop function runs over and over again forever
void loop() {
Blynk.run();
}