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