給合繼電器,Blynk 遠端監測及控制家電。
Datastreams 是 Device 裝置與 Blynk 雲端之間資料傳輸的通道
Device 裝置向 Blynk 雲端傳送數據:
Blynk.virtualWrite(虛擬腳位 vPin, 數據 value) 函數將感測數據 value 傳送至 Blynk 之虛擬腳位 vPin
Blynk 雲端向 Device 裝置傳送數據:
BLYNK_WRITE(虛擬腳位 vPin) // 當虛擬腳位 vPin 有改變時,便會觸發執行
{
int pinValue = param.asInt(); // param.asInt() 函數:以整數型態讀取虛擬腳位 vPin 的值
}
- 溼度數據傳送到 Blynk 虛擬腳位 V5
- 溫度數據傳送到 Blynk 虛擬腳位 V6
- 光照度數據傳送到 Blynk 虛擬腳位 V7
- Blynk 虛擬腳位 V1 控制風扇開關
- Blynk 虛擬腳位 V2 控制風燈開關
// Template ID、Template Name、Auth Token 一定要放在程式的最前面
#define BLYNK_TEMPLATE_ID "TMPLoKYO0Ki-"
#define BLYNK_TEMPLATE_NAME "Quickstart Template"
#define BLYNK_AUTH_TOKEN "JW2j1JiRW1br2gR6JdwIPk9bo8NGSRyb"
#include "ESP8266WiFi.h"
#include "BlynkSimpleEsp8266.h"
char ssid[] = "TCGS-IOT"; //無線基地台SSID名稱
char pass[] = "22205108"; //無線基地台密碼
#include "SSD1306.h" //匯入OLED程式庫
#include "DHTesp.h" //匯入DHT程式庫
#include "BH1750.h"//匯入光照度感測器程式庫
SSD1306 display(0x3C, D2, D1); //宣告使用OLED螢幕物件(位址,SDA,SCL)==SDA>D2,SCL>D1
DHTesp dht; //宣告dht物件
BH1750 lightMeter; //宣告光照度BH1750物件,物件名稱為lightMeter
BlynkTimer timer; //宣告BlynkTimer計時器物件
float humidity = 0; //宣告一個資料型態為float的全域變數humidity
float temperature = 0; //宣告一個資料型態為float的全域變數temperature
float lux; //宣告一個資料型態為float的全域變數lux
String message1 = "", message2 = "";
void setup()
{
display.init(); //螢幕初始化
display.setFont(ArialMT_Plain_16); //使用16字體
display.flipScreenVertically(); //螢幕垂直翻轉
dht.setup(D3, DHTesp::DHT22); // 設定DHT的接腳位置及DHT的型號DHT11或DHT22
Wire.begin(D2, D1); //Wire.begin(SDA,SCL) //宣告光照度感測器I2C SDA及SCL接腳
lightMeter.begin(); //啟用光照度感測器
pinMode(D0, OUTPUT); //設定D0的接腳狀態為OUTPUT
pinMode(D4, OUTPUT); //設定D4的接腳狀態為OUTPUT
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass); // 連接到Blynk伺服器
timer.setInterval(2000L, sendSensor); // 每2秒呼叫sendSensor()傳送資料至Blynk伺服器
}
void loop()
{
Blynk.run(); //執行Blynk
timer.run(); //執行BlynkTimer計時器
}
BLYNK_CONNECTED() // 當設備成功連接至 Blynk 伺服器後執行
{
Blynk.syncVirtual(V1, V2); // 同步虛擬腳位 V1, V2 風扇及電燈的狀態,會觸發執行 BLYNK_WRITE(V1)、BLYNK_WRITE(V2)
}
void sendSensor() // 傳送感測數值至 Blynk
{
humidity = dht.getHumidity(); //讀取濕度值儲存於humidity變數內
temperature = dht.getTemperature(); //讀取溫度值儲存於temperature變數內
lux = lightMeter.readLightLevel(); //宣告lux變數,並將讀取到的光照度儲存於lux變數
Blynk.virtualWrite(V5, humidity); // 濕度資料傳送到虛擬腳位 V5
Blynk.virtualWrite(V6, temperature); // 溫度資料傳送到虛擬腳位 V6
Blynk.virtualWrite(V7, lux); // 光照度資料傳送到虛擬腳位 V7
Display_Message();
}
BLYNK_WRITE(V1) // 當 Blynk 風扇虛擬腳位 V1 有改變時便觸發
{
int pinValue = param.asInt(); // 以整數型態讀取 pin V1 value
if (pinValue == 1) // pin V1 value 1(ON)、0(OFF)
{
digitalWrite(D0, LOW); // Fan ON:0(LOW)
message1 = "Fan ON";
}
else
{
digitalWrite(D0, HIGH); // Fan OFF:1(HIGH)
message1 = "Fan OFF";
}
Display_Message();
}
BLYNK_WRITE(V2) // 當 Blynk 電燈虛擬腳位 V2 有改變時便觸發
{
int pinValue = param.asInt(); // 以整數型態讀取 pin V2 value
if (pinValue == 1) // pin V2 value 1(ON)、0(OFF)
{
digitalWrite(D4, LOW); // Light ON:0(LOW)
message2 = "Light ON";
}
else
{
digitalWrite(D4, HIGH); // Light OFF:1(HIGH)
message2 = "Light OFF";
}
Display_Message();
}
void Display_Message()
{
char value_str[20];
display.clear(); //清除螢幕
dtostrf(temperature, 4, 1, value_str);
display.drawString(0, 0, "T:" + String(value_str) + "°C"); //x=0,y=0位置顯示溫度的值
dtostrf(humidity, 4, 1, value_str);
display.drawString(68, 0, "H:" + String(value_str) + "%"); //x=0,y=68位置顯示濕度的值
display.drawString(0, 16, "Light : " + String(lux) + " LUX"); //x=0,y=16位置顯示光照度數據
display.drawString(0, 32, message1); //x=0,y=32位置顯示 Fan 的狀態
display.drawString(0, 48, message2); //x=0,y=48位置顯示 Light 的狀態
display.display(); //OLED螢幕顯示畫面
}