?前言
我們要制作一款能夠遠(yuǎn)程控制家里燈、風(fēng)扇的開關(guān),并采集溫濕度、光照傳輸?shù)绞謾CAPP上。正好看到了點燈Blinker的開源方案,blinker是一套跨硬件、跨平臺的物聯(lián)網(wǎng)解決方案,提供APP端、設(shè)備端、服務(wù)器端支持,使用公有云服務(wù)進行數(shù)據(jù)傳輸??捎糜谥悄芗揖?、數(shù)據(jù)監(jiān)測等領(lǐng)域,可以幫助用戶更好更快地搭建物聯(lián)網(wǎng)項目。APP通過拖動控件就可以進行DIY界面了,非常方便。話不多說,那么接下來我們就一起來試試吧。
整篇文章內(nèi)容較長,但全是精髓,末尾有源碼參考。(注意:硬件引腳不一定與我相同,請謹(jǐn)慎使用。)
目錄
前言
一、準(zhǔn)備工作
所用到的硬件:
軟件準(zhǔn)備:
1、電腦安裝-Arduino IDE
2、手機安裝-blinker APP
3、下載并安裝blinker Arduino庫
4、在手機app端中添加設(shè)備,獲取Secret Key
二、開始編程
1.控制部分
2.溫濕度采集部分
3.光照采集部分
4.項目完整源碼
一、準(zhǔn)備工作
所用到的硬件:
esp8266 MINI開發(fā)板
G5516光敏傳感器模塊
DHT11溫濕度傳感器模塊
一路5V繼電器
小風(fēng)扇(5V驅(qū)動)
LED發(fā)光二極管(直插) 2個
輕觸開關(guān)(用來做開關(guān)電路) 2個
1K電阻 2個
20K電阻 2個
電源準(zhǔn)備:充電寶或18650鋰電池
因為芯片的IO口肯定是帶不動小風(fēng)扇的,所以得上一路5V繼電器供電給風(fēng)扇外接。
?
整個板子的原理圖.以及板子的實物
軟件準(zhǔn)備:
1、電腦安裝-Arduino IDE
①.先安裝好ArduinoIDE(如果已安裝,直接跳到第二步,詳細(xì)安裝ArduinoIDE的方法本篇不再贅述)
下載Arduino IDE
②.打開Arduino IDE菜單 > 文件 >首選項,在?附加開發(fā)板管理器網(wǎng)址?輸入框中,填入以下網(wǎng)址:
Arduino中文社區(qū)
③.下載社區(qū)打包的esp32安裝包,直接運行并解壓即可。
下載地址:Arduino中文社區(qū)
雙擊運行即可解壓,解壓完成后,再打開Arduino IDE,即可在?菜單欄>工具>開發(fā)板?中找到你使用的esp8266開發(fā)板
PS:如果要添加多個開發(fā)板地址,請點后面的按鈕,然后一行一個
2、手機安裝-blinker APP
下載并安裝blinker APP
Android下載:
點擊下載?或 在android應(yīng)用商店搜索“blinker”下載安裝
IOS下載:
點擊下載?或 在app store中搜索“blinker”下載
3、下載并安裝blinker Arduino庫
? ? ①.下載地址:點燈科技-點燈物聯(lián)網(wǎng)解決方案
? ? ②.通過Arduino IDE?菜單>項目>加載庫>添加.ZIP庫?導(dǎo)入到庫,如圖:
4、在手機app端中添加設(shè)備,獲取Secret Key
- 進入App,點擊右上角的“+”號,然后選擇?添加設(shè)備
- 點擊選擇Arduino?>?WiFi接入
- 復(fù)制申請到的Secret Key(一會寫代碼會用到)
二、開始編程
1.控制部分
我們打開Arduino IDE,通過?文件>示例>Blinker>Blinker_Hello/Hello_WiFi?打開例程
打開例程 我們開始進行修改
首先要改的是這部分
Secret Key是在我們手機端blinker APP 上面獲取的
?
??
?獲取好了之后,我們就獲得了自己的Secret Key碼我們把復(fù)制好的key加進我們的代碼里面
char auth[] = "b62b9765dccf"; //APP上的key char ssid[] = "WIFI名稱"; //WIFI的名稱 char pswd[] = "WIFI密碼"; //WIFI的密碼
注意:這里的WIFI可以是家里的路由器等等都可以,我這里先用手機熱點進行演示,WIFI名稱和密碼盡量不要使用中文,不然可能會出現(xiàn)奇怪的錯誤(WIFI頻段目前只支持2.4Ghz)。
之后我們繼續(xù)打開我們的APP來添加兩個控件實現(xiàn)控制我們板子上面的風(fēng)扇還有LED燈
按照箭頭指示就可以創(chuàng)建出兩個控件,然后我們來對控件進行更改,我們這里選的是開關(guān)按鍵,控件的圖標(biāo)還有文本以及控件組名大家可以自行更改,按鍵類型也可以是普通按鍵,給兩個控件都修改好就是這樣,然后直接點右上角的小鎖圖標(biāo)就能保存了,接下來保存好之后,我們需要用到我們的控件組名,那么我們要在代碼上添加以下
// 新建組件對象 BlinkerButton Button1("btn-kd"); //控件定義 BlinkerButton Button2("btn-kfs"); //控件定義
這里BlinkerButton是庫里面的組件類型,blinker庫定義了多種組件類型,如?BlinkerSlider BlinkerRGB BlinkerNumber BlinkerText
這步完成之后要給組件寫要實現(xiàn)的功能,那么我們這兩個組件一個是控制板子上的兩個LED燈,一個是控制小風(fēng)扇,首先我們要給LED燈還有小風(fēng)扇定義管腳
管腳我們根據(jù)自己板子的接線來定義
const int LED1 =D0; //LED燈管腳定義 const int LED2 =D3; //LED燈管腳定義 const int FS = D2; //風(fēng)扇管腳定義
?管腳定義完成之后注冊我們組件的回調(diào)函數(shù),也就是當(dāng)我們組件按下去之后會實現(xiàn)什么功能
// 按下按鍵即會執(zhí)行該函數(shù) void button1_callback(const String & state) { BLINKER_LOG("get button state: ", state); if(state == BLINKER_CMD_ON){ //當(dāng)APP上的按鍵按下傳送過來的是ON LED燈高電平 digitalWrite(LED1,1); //高電平 digitalWrite(LED2,1); //高電平 Button1.print("on"); } else if(state == BLINKER_CMD_OFF){ //當(dāng)APP上的按鍵按下傳送過來的是Off LED燈低電平 digitalWrite(LED1,0); //低電平 digitalWrite(LED2,0); //低電平 Button1.print("off"); } } //---------------------------------- // 按下按鍵即會執(zhí)行該函數(shù) void button2_callback(const String & state) { BLINKER_LOG("get button state: ", state); if(state == BLINKER_CMD_ON){ //當(dāng)APP上的按鍵按下傳送過來的是ON 風(fēng)扇至高電平啟動 digitalWrite(FS,1); Button2.print("on"); } else if(state == BLINKER_CMD_OFF){//當(dāng)APP上的按鍵按下傳送過來的是Off 風(fēng)扇至低電平啟動 digitalWrite(FS,0); Button2.print("off"); } }
?那么回調(diào)函數(shù)大概就是這個樣子,接下來我們要在 void setup()初始函數(shù)里面給我們的LED還有風(fēng)扇的IO口初始化 還有調(diào)用我們的回調(diào)函數(shù)
void setup() { // 初始化串口 Serial.begin(115200); BLINKER_DEBUG.stream(Serial); BLINKER_DEBUG.debugAll(); //---------------------------------- // 初始化有LED燈的IO,以及風(fēng)扇的IO口 pinMode(LED1, OUTPUT); digitalWrite(LED1, 0); pinMode(LED2, OUTPUT); digitalWrite(LED2, 0); pinMode(FS, OUTPUT); digitalWrite(FS, 0); //---------------------------------- // 初始化blinker Blinker.begin(auth, ssid, pswd); //---------------------------------- Button1.attach(button1_callback); Button2.attach(button2_callback);//當(dāng)APP組件按下觸發(fā) 則 觸發(fā)button2_callback函數(shù) //當(dāng)app中組件觸發(fā)并發(fā)送到設(shè)備端時將觸發(fā)該組件注冊的回調(diào)函數(shù) } void loop() { Blinker.run(); }
?到這一步之后我們就可以來檢驗一下功能有沒有實現(xiàn),連接好我們的板子,在Arduino IDE 上傳我們的代碼到板子里面
上傳成功之后打開手機blinker APP 去到我們剛才創(chuàng)建的設(shè)備里面
可以看見我們的設(shè)備是在線的情況,就說明我們的板子已經(jīng)連接上了wifi熱點,然后我們進去看看
當(dāng)我們的組件開關(guān)點擊之后是呈現(xiàn)一個開啟狀態(tài),那么再看我們的板子發(fā)現(xiàn)兩個led燈已經(jīng)亮了,風(fēng)扇也轉(zhuǎn)動起來了,那么就成功了。
2.溫濕度采集部分
到這里我們的功能已經(jīng)實現(xiàn)一半了,接下來到我們的DHT11溫濕度傳感器,
我們要開始實現(xiàn)檢測溫度和濕度,開始之前我們首先要添加一個庫,打開Arduino IDE點擊工具>管理庫
把上面這個庫給安裝進來,安裝好之后我們繼續(xù)開始,首先添加頭文件宏定義還有傳感器的管腳定義
#define BLINKER_WIFI #define DHTTYPE DHT11 // DHT 11 #include <DHT.h> #include <Blinker.h> const int pinDHT11 = D1; //DHT11 管腳定義 DHT dht(pinDHT11, DHTTYPE); const int LED1 =D0; //LED燈管腳定義 const int LED2 =D3; //LED燈管腳定義 const int FS = D2; //風(fēng)扇管腳定義
?這邊傳感器是接在D1,所以定義D1根據(jù)接線來定義
// 新建組件對象 BlinkerButton Button1("btn-kd"); //控件定義 BlinkerButton Button2("btn-kfs"); //控件定義 BlinkerNumber HUMI("num-sd"); //檢測濕度組件 BlinkerNumber TEMP("num-wd"); //監(jiān)測溫度組件
新加入溫濕度兩個控件定義
在手機APP端添加一個數(shù)據(jù)組件,將其作為溫度數(shù)據(jù)顯示接口,點擊該數(shù)據(jù)組件,編輯數(shù)據(jù)的信息
將鍵名修改為程序里定義的“num-wd”(這里的num-wd和程序中的名稱相對應(yīng)),文本顯示“溫度”,數(shù)據(jù)單位為“℃”,最大值“100”
再添加一個數(shù)據(jù)組件,將其作為濕度數(shù)據(jù)顯示接口,點擊該數(shù)據(jù)組件,編輯數(shù)據(jù)的信息。
將鍵名修改為程序里定義的“num-sd”(這里的num-sd和程序中的名稱相對應(yīng)),文本顯示“濕度”,數(shù)據(jù)單位為“%”,最大值“100”
然后定義溫濕度存儲變量
const int pinDHT11 = D1; //DHT11 管腳定義 DHT dht(pinDHT11, DHTTYPE); const int LED1 =D0; //LED燈管腳定義 const int LED2 =D3; //LED燈管腳定義 const int FS = D2; //風(fēng)扇管腳定義 float humi_read = 0, temp_read = 0; //濕度 溫度 定義
新增加溫濕度變量的定義
?再添加回調(diào)函數(shù)
//把溫度濕度傳送給組件 void heartbeat() { HUMI.print(humi_read); TEMP.print(temp_read); }
?在void setup()添加加載函數(shù),就可以回傳溫濕度數(shù)據(jù)了
Blinker.attachHeartbeat(heartbeat); //加載函數(shù)heartbeat,回傳數(shù)據(jù) dht.begin(); //啟動DHT11
?還有啟動DHT11,最后在void loop()函數(shù)里添加以下代碼
void loop() { Blinker.run(); //Blinker.run()語句負(fù)責(zé)處理Blinker收到的數(shù)據(jù),每次運行都會將設(shè)備收到的數(shù)據(jù)進行一次解析。在使用WiFi接入時,該語句也負(fù)責(zé)保持網(wǎng)絡(luò)連接 float h = dht.readHumidity(); //讀濕度 float t = dht.readTemperature();//讀溫度,默認(rèn)為攝氏度 if (isnan(h) || isnan(t)) //判斷溫濕度有沒有讀取失敗 { BLINKER_LOG("Failed to read from DHT sensor!"); } else { BLINKER_LOG("Humidity: ", h, " %");//濕度 BLINKER_LOG("Temperature: ", t, " *C");//溫度 humi_read = h; //讀濕度 temp_read = t; //讀溫度,默認(rèn)為攝氏度 } Blinker.delay(2000); }
?最后燒錄程序到板子中試試,顯示上傳成功之后打開串口監(jiān)視器還有我們的手機blinker APP(串口波特率115200)
?
可以看到都能檢測到溫濕度,那么已經(jīng)是成功了的,到這里那么就剩我們最后一個光敏傳感器。
3.光照采集部分
我們在手機APP中新添加一個數(shù)據(jù)控件,用來收集光線強度的數(shù)據(jù)。
在blinker中添加一個數(shù)據(jù)控件,修改對應(yīng)的鍵名和顯示文本,設(shè)置最大值是1023
數(shù)據(jù)控件的數(shù)據(jù)單位可以要可以不要,傳感器的信號引腳連接在A0端口中
下面是代碼部分
volatile int light;//光照數(shù)據(jù)定義
變量定義
BlinkerNumber GUANG("num-gm");//光照組件
組件定義
//光照數(shù)據(jù)回傳 void dataStorage(){ Blinker.dataStorage("num-gm", light); }
回調(diào)函數(shù)編寫
light = 0;//賦初始值 Blinker.attachDataStorage(dataStorage);//訪問dataStorage函數(shù)
?void setup()初始函數(shù)中添加
void loop() { light = analogRead(A0);//讀取A0端口的數(shù)據(jù) delay(100); GUANG.print(light);//顯示數(shù)值 //----------------------------------
?void loop()主函數(shù)中添加
最后上傳,上傳成功,打開手機APP
?
?
等待重新上電之后,可以看到光照數(shù)據(jù)已經(jīng)上來了,如果實在沒有的可以打開串口工具看看是否有接收到。
那么我們本次的簡易《智能家居》可以說是大功告成了,對于物聯(lián)網(wǎng)開發(fā)來說,上手難度真的不是很高,有庫函數(shù)的支持下,簡單方便易懂,給小白來都能看懂開發(fā)。文章來源:http://www.zghlxwxcb.cn/news/detail-738014.html
4.項目完整源碼
?下面是整個項目的完整代碼參考:文章來源地址http://www.zghlxwxcb.cn/news/detail-738014.html
#define BLINKER_WIFI #define DHTTYPE DHT11 // DHT 11 #include <DHT.h> #include <Blinker.h> const int pinDHT11 = D1; //DHT11 管腳定義 DHT dht(pinDHT11, DHTTYPE); const int LED1 =D0; //LED燈管腳定義 const int LED2 =D3; //LED燈管腳定義 const int FS = D2; //風(fēng)扇管腳定義 float humi_read = 0, temp_read = 0; //濕度 溫度 定義 volatile int light;//光照數(shù)據(jù)定義 char auth[] = "b62b9765dccf"; //APP上的key char ssid[] = "wifi_name"; //wifi熱點的名稱 char pswd[] = "12345678"; //熱點密碼 // 新建組件對象 BlinkerButton Button1("btn-kd"); //控件定義 BlinkerButton Button2("btn-kfs"); //控件定義 BlinkerNumber HUMI("num-sd"); //檢測濕度組件 BlinkerNumber TEMP("num-wd"); //監(jiān)測溫度組件 BlinkerNumber GUANG("num-gm");//光照組件 // 按下按鍵即會執(zhí)行該函數(shù) void button1_callback(const String & state) { BLINKER_LOG("get button state: ", state); if(state == BLINKER_CMD_ON){ //當(dāng)APP上的按鍵按下傳送過來的是ON LED燈高電平 digitalWrite(LED1,1); //高電平 digitalWrite(LED2,1); //高電平 Button1.print("on"); } else if(state == BLINKER_CMD_OFF){ //當(dāng)APP上的按鍵按下傳送過來的是Off LED燈低電平 digitalWrite(LED1,0); //低電平 digitalWrite(LED2,0); //低電平 Button1.print("off"); } } //---------------------------------- // 按下按鍵即會執(zhí)行該函數(shù) void button2_callback(const String & state) { BLINKER_LOG("get button state: ", state); if(state == BLINKER_CMD_ON){ //當(dāng)APP上的按鍵按下傳送過來的是ON 風(fēng)扇至高電平啟動 digitalWrite(FS,1); Button2.print("on"); } else if(state == BLINKER_CMD_OFF){//當(dāng)APP上的按鍵按下傳送過來的是Off 風(fēng)扇至低電平啟動 digitalWrite(FS,0); Button2.print("off"); } } //---------------------------------- //把溫度濕度傳送給組件 void heartbeat() { HUMI.print(humi_read); TEMP.print(temp_read); } //---------------------------------- //光照數(shù)據(jù)回傳 void dataStorage(){ Blinker.dataStorage("num-gm", light); } //---------------------------------- void setup() { // 初始化串口 Serial.begin(115200); BLINKER_DEBUG.stream(Serial); BLINKER_DEBUG.debugAll(); //---------------------------------- // 初始化有LED燈的IO,以及風(fēng)扇的IO口 pinMode(LED1, OUTPUT); digitalWrite(LED1, 0); pinMode(LED2, OUTPUT); digitalWrite(LED2, 0); pinMode(FS, OUTPUT); digitalWrite(FS, 0); //---------------------------------- // 初始化blinker Blinker.begin(auth, ssid, pswd); Blinker.attachHeartbeat(heartbeat); //加載函數(shù)heartbeat,回傳數(shù)據(jù) dht.begin(); //啟動DHT11 light = 0;//賦初始值 Blinker.attachDataStorage(dataStorage);//訪問dataStorage函數(shù) //---------------------------------- Button1.attach(button1_callback); Button2.attach(button2_callback);//當(dāng)APP組件按下觸發(fā) 則 觸發(fā)button2_callback函數(shù) //當(dāng)app中組件觸發(fā)并發(fā)送到設(shè)備端時將觸發(fā)該組件注冊的回調(diào)函數(shù) } void loop() { light = analogRead(A0);//讀取A0端口的數(shù)據(jù) delay(100); GUANG.print(light);//顯示數(shù)值 //---------------------------------- Blinker.run(); //Blinker.run()語句負(fù)責(zé)處理Blinker收到的數(shù)據(jù),每次運行都會將設(shè)備收到的數(shù)據(jù)進行一次解析。在使用WiFi接入時,該語句也負(fù)責(zé)保持網(wǎng)絡(luò)連接 float h = dht.readHumidity(); //讀濕度 float t = dht.readTemperature();//讀溫度,默認(rèn)為攝氏度 if (isnan(h) || isnan(t)) //判斷溫濕度有沒有讀取失敗 { BLINKER_LOG("Failed to read from DHT sensor!"); } else { BLINKER_LOG("Humidity: ", h, " %");//濕度 BLINKER_LOG("Temperature: ", t, " *C");//溫度 humi_read = h; //讀濕度 temp_read = t; //讀溫度,默認(rèn)為攝氏度 } Blinker.delay(2000); }
到了這里,關(guān)于Arduino物聯(lián)網(wǎng)快速開發(fā):基于ESP8266與點燈Blinker制作小白都會的DIY《智能家居》系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!