ESP8266遠端控制電子門
最前面介紹:
這是一個使用ESP8266 聯網控制繼電器,實現手機遠端控制電子門,開啟關閉,開關一次的物聯網聯手小專案
附git地址:https://github.com/YaronWong/ESP8266RemoteControl
三個週末,學習了下ESP8266 基礎使用,做了個小玩具
實現手機端控制電子大門的開關,再也不用擔心沒帶鑰匙進不去大門了 (掩面)
使用場景:電子門支援紅外遙控器,有時忘記遙控或門禁卡,只能呼叫同事開門,遂想把遙控開關放到手機裡面
結構圖說明:
看不清可以右鍵存下來看大圖
軟硬說明:
硬體:ESP8266 主機板,控制繼電器,繼電器連線紅外遙控器
前端:Flutter 搭的Demo (前後用了半天,頁面太粗)
後端:介面使用 FastAPI +Python ,資料庫:MySql
邏輯說明:
ESP8266 主要功能在door.ino
檔案
setup() 主要做 連線wifi初始化
loop() 函式迴圈請求伺服器,查詢最新一條命令,如果命令狀態為1,表述需要執行,按照命令執行,執行完畢,更新資料狀態為0,
執行命令依賴欄位ACTION_NAME, 如A 則執行A 命令,A命令對應設定 A引腳低電平,等待200毫秒後,重置高電平
命令ABCD 和引腳的對應關係參見 ,
const uint8_t PORT_A = D1; // 對應引腳
const uint8_t PORT_B = D2; //
const uint8_t PORT_C = D6; //
const uint8_t PORT_D = D7; //`
服務端,使用FastApi 搭建三個介面,使用Docker部署
- addnasdaq 新建命令,客戶端呼叫,新增一條命令
- querylast 查詢最新一條命令,ESP8266查詢是否有命令指定呼叫
- updatenasdaq 更新指定命令狀態 ,ESP8266執行完畢命令呼叫
資料庫使用MySql,資料庫地址和引數在請 DbConfig.py檔案配置
以上介紹完畢,如果你還想動手試試,參照一下步驟
前提說明:
如果要想將此教程跑起來,需要一些預備知識:
-
瞭解ESP8266 開發環境搭建,基礎的開發和上傳步驟
需要修改引數,調整wifi資訊,伺服器地址
在此推薦太極創客 的基礎教程,我看教程2個週末完成Esp部分。
-
瞭解Docker基礎,參照教程可以執行例項
需要設定MySql地址和伺服器地址
Docker教程參見B站教程
-
AndroidStudio使用,可以執行Flutter專案,也可以下載打包好的專案
專案原始碼包含客戶端原始碼,我執行過Android,未測試IOS,程式碼很簡單,瞭解Dart基礎語法就可以修改
如何使用
準備材料:
- 無線遙控器,支援學習和對拷貝,
- ESP8266 主機板
- 3.3V四路繼電器
- 電源,這裡使用3節1.5V 電池替代
- 工具類,電烙鐵,萬能表,焊錫絲,熱熔槍,
- 伺服器(之前就有),如果使用三方服務,請跳過
- 耐心
遙控器改造
我是使用ESP8266控制遙控器,需要對遙控器改造
將 遙控器 ABCD 開關分別使用電烙鐵 ,焊接處四條引線,後續接入 繼電器
其中,負極接地是通用一根,參考圖:
如果接其他控制器,請參照類似方式,其實就是使用繼電器將原本開關短路
ESP8266環境搭建
esp8266端程式碼在muc目錄,door.ino
這裡我參考的太極創客教程,物聯網硬體開發0基礎,學了兩個週末,十分推薦,表示感謝
再次貼一下地址ESP8266開發環境搭建教程地址
準備好環境,跑一下示例中的Blink程式碼,正常執行就表述環境搭建成功
在ESP8266 可以執行Demo後,可以匯入door.ino
檔案,修改配置
注意需要修改的位置:
-
wifi賬號密碼
const char *ssid = "your_wifi_name"; // 需要連線到的WiFi名
const char *password = "88888888"; // 連線的WiFi密碼
-
伺服器地址和埠
const char *host = "101.xx.xxx.xxx";
const int httpPort = 8000;
補充1:
第一次解除物聯硬體開發,C++現學現賣,寫起來很慢,也不規範,
另外就是ESP8266的網路庫,我開始想使用HTTPClient庫,網路請求回來一直重啟,查資料說可能是電壓不穩,多次嘗試無法修復,改用了WiFiClient庫,
WiFiClient庫寫起來,需要拼接header和body,第一次差點崩潰,不知道哪裡缺少個空格或者回車,後來想到一個辦法
先把服務端搭起來,使用FastAPI的 測試介面進行測試,使用Charles抓包,Charles可以明顯的看出Header和body格式,方便拼接。
也可能是我使用不熟,有更好些GET和POST的方案,有的話歡迎告知,
補充2
編寫過程,開始使用Arduino,不支援連提示和格式化,對於用IDEA快捷鍵的人著實不習慣,後來配置了VS環境
ESP8266連線繼電器和紅外開關
使用麵包線用繼電器將ESP8266和紅外開關如圖連線
注意ESP8266開發期間使用USB供電,輸出3.3V給繼電器供電,繼電器接收到ESP8266的低電平會將兩個觸電短路,達到開關閉合的效果
將繼電器負極並聯,四路輸出如圖連線開關四個開關,注意連線是常閉的兩個介面,不確定哪兩個常閉就用萬能表測試下
注:連線完畢之後,可以使用door.ino程式碼進行測試,看是否可以實現繼電器的控制,如果控制正確,再使用網路請求
伺服器部署
服務端程式碼可以直接Docker部署到伺服器,也可以本地部署,區域網測試
服務端程式碼目錄在 services目錄
注意需要修改的地方:
MySql 地址和 埠,
ipname = "101.xxx.xxx.xxx"
duankou = 3306
DB_NAME = "db_name"
userName = "userName"
pwd = "pwd"
資料庫初始化檔案:nasdaq.sql
FastAPI本地部署:
專案services目錄匯入到Pycharm,直接執行,
FastAPI服務端部署
客戶端打包
客戶端採用Flutter方案,目前就1個介面請求,我不想些兩端程式碼(懶-_-!!)
配置好AndroidStudio的Flutter開發環境,直接匯入就可以,配置教程可以參見搭建Flutter開發環境
需要修改對應的伺服器地址:post('http://101.xxx.xxx.xxx:8000/addnasdaq',
測試:
- 先測試ESP8266連線WIFI是否正常
- 測試ESP8266單獨控制繼電器是否正常
- 本地部署伺服器,使用PostMan介面測試資料庫 增加,查詢是否正常
- 測試ESP8266 連線資料是否正常
- 如果到此測試正常,標識專案正常執行
專案宣告:此專案是學習練手專案,僅用於個人學習,
剛接觸物聯網硬體,專案中難免有不規範的地方,僅供學習,歡迎大家貢獻程式碼
目前已經實現的功能
TODO