wemos D1 Mini (esp8266)實驗九 --- blynk APP遠程控制格力空調開機並顯示溫溼度DHT22

概述

這個實驗室在實驗八的基礎上增加了溫溼度數據的採集,需要在之前的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庫下載地址

  1. 在頁面中第一步點擊Clone or download,第二步點擊Download ZIP
    在這裏插入圖片描述

  2. 打開Arduino IDE,在項目->加載庫->添加一個.ZIP庫的對話框中選擇你剛剛下載的.zip文件即可。
    在這裏插入圖片描述

  3. 注意:這個DHT庫依賴另外一個Adafruit Unified Sensor Driver庫,所以爲了正確運行還要裝一下這個庫。否則會報錯。提示找不到一個文件,名字我忘記了。我安裝的時候就報錯了,又加裝了這個好了。
    Adafruit Unified Sensor Driver庫下載

  4. github上有關於wemos D1 Mini非常豐富的示例程序
    github上的關於wemos D1 Mini全部例程下載地址
    打開上面的地址後,會顯示下圖的結構,examples->04.Shields->DHT_Shield->Simple目錄下有完整測試代碼。
    在這裏插入圖片描述

  5. 上傳程序到開發板,打開arduino IDE自帶的串口軟件觀察是否正確的採集到了數據。
    在這裏插入圖片描述

  6. 完整中文註釋代碼

/* 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(); 
  
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章