物聯網系列④——基于ESP8266與點燈科技平臺的加濕器設計(接入小愛同學)
- 一、設計目標
- 二、電路設計
- 三、思路介紹
- 四、ESP8266代碼
一、設計目標
- 使用點燈科技平臺接入物聯網,可通過手機點燈APP控制加濕器的開關
- 接入小愛同學,通過語音控制加濕器的開關
- 通過外接TTL串口下載模塊給ESP8266程式燒寫,通過跳線帽手動拉低GPIO0電平,手動RST
- 供電使用LM1117 5V轉3V設計,可選擇使用Mico USB和DC 5.5*2.5mm介面進行5V供電
- 引腳使用通用設計,方便外設擴展
- LED指示燈指示系統運行狀態
二、電路設計
在上一個版本電路的基礎上進行優化,為節省成本去除CH340下載電路,板子噴黑色油漆提高科技感,輸出引腳采用一般外設模塊較為通用引腳設計,提高電路板通用性,



三個電路板通過銅柱共地并固定,通過一根黑色5V電源線進行板間供電,組成塔式結構,外觀充滿科技感,不同層數的電路板執行不同的功能,第一層為點燈科技+小愛對加濕器開關控制,第二層為點燈科技+小愛控制WS2812B燈帶,第三層為ESP8266作為網路服務器,感興趣的小伙伴可以去看看!
三、思路介紹
關于加濕器模塊是本人于某寶以10元左右的價格購入的,該模塊本身是通過USB供電并通過模塊自身的按鍵進行開關的,所以我們要通過ESP8266去控制它開關便需要對該模塊進行改造,最簡單的方法便是通過GPIO口來替代加濕器模塊上的按鍵實作遠程控制加濕器模塊的開關,并從電路板上將5V電源線和地線接入加濕器模塊的供電端即可實作物聯網電路板對加濕器供電,經過測驗,該加濕器模塊的控制機制為按鍵輸入引腳檢測到低電平后一段時間內,要檢測到高電平,才能識別為開關,關于哪個引腳是按鍵輸入引腳,通過萬用表對加濕器按鍵引腳進行測量即可得知,懂得這個機制以后就容易多了,我們讓ESP8266的D1連接到加濕器模塊的按鍵輸入引腳,D1默認為輸出高電平,我們先將D1電平拉低,延遲一段時間以后,再將電平拉高,這時候會發現加濕器開啟了,同理,該方法也可以使開啟時的加濕器模塊關閉,所以為了防止將原本處于開啟狀態的加濕器誤關或將原本處于關閉狀態的加濕器誤開,需對當前加濕器運行狀態進行判斷,否則會產生bug,感興趣的小伙伴可以買入加濕器模塊然后跟著我的解決思路去改造嘗試,
四、ESP8266代碼
#define BLINKER_PRINT Serial
#define BLINKER_WIFI
#define BLINKER_MIOT_OUTLET
#include <Blinker.h>
char auth[] = "*********";//設備號
char ssid[] = "*********";//無線賬號
char pswd[] = "*********";//無線密碼
// 新建組件物件
BlinkerButton Button1("HUM_Button");
int count = 0;//加濕器計數器
int count1 = 0;//led翻轉計數器
int HUM_OPEN=0;//加濕器標志位
int HUM_State=0;//加濕器開關狀態標志位,0關,1開
#define HUM_Button D1
#define LED1 16
#define LED2 14
// 按下按鍵即會執行該函式
void button1_callback(const String & state) {
BLINKER_LOG("get button state: ", state);
digitalWrite(LED2, !digitalRead(LED2));
HUM_OPEN=1;//標志位開啟
if(digitalRead(LED2)==0)
{
Button1.print("off");
}
else
{
Button1.print("on");
}
}
// 如果未系結的組件被觸發,則會執行其中內容
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
}
//小愛同學處理函式
void miotPowerState(const String & state)
{
BLINKER_LOG("need set power state: ", state);
if (state == BLINKER_CMD_ON) {
BlinkerMIOT.powerState("on");
BlinkerMIOT.print();
if(HUM_State==0)//處于關閉狀態開啟
{
digitalWrite(LED2, HIGH);
HUM_OPEN=1;
HUM_State=1;//開啟
}
}
else if (state == BLINKER_CMD_OFF) {
BlinkerMIOT.powerState("off");
BlinkerMIOT.print();
if(HUM_State==1)//處于開啟狀態關閉
{
digitalWrite(LED2, LOW);
HUM_OPEN=1;
HUM_State=0;//關閉
}
}
}
void setup() {
// 初始化串口
Serial.begin(115200);
#if defined(BLINKER_PRINT)
BLINKER_DEBUG.stream(BLINKER_PRINT);
#endif
// 初始化有LED的IO
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
pinMode(LED1, OUTPUT);
digitalWrite(LED1, HIGH);
pinMode(LED2, OUTPUT);
digitalWrite(LED2, LOW);
//初始化加濕器引腳
pinMode(HUM_Button, OUTPUT);
digitalWrite(HUM_Button, HIGH);//上電關閉
// 初始化blinker
Blinker.begin(auth, ssid, pswd);
Blinker.attachData(dataRead);
Button1.attach(button1_callback);//按鍵
//小愛回呼函式
BlinkerMIOT.attachPowerState(miotPowerState);
}
void loop() {
Blinker.run();
count1++;//led翻轉計數器
if(HUM_OPEN==1)
{
digitalWrite(HUM_Button, LOW);
count++;
if(count==30)
{
digitalWrite(HUM_Button, HIGH);
count=0;
HUM_OPEN=0;
}
}
if(count1==100)
{
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
digitalWrite(LED1, !digitalRead(LED1));
count1=0;
}
}

不足之處還望各位大佬不吝賜教!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/261450.html
標籤:其他
上一篇:STM32-ADC配置詳解及應用。實體:《中斷單通道讀取ADC》、《DMA多通道讀取ADC》
下一篇:51單片機:靜態數碼管詳細教程
