ESP8266遠端控制電子門

2022-05-29 21:01:32

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檔案設定

以上介紹完畢,如果你還想動手試試,參照一下步驟

前提說明:

​ 如果要想將此教學跑起來,需要一些預備知識:

  1. 瞭解ESP8266 開發環境搭建,基礎的開發和上傳步驟

    需要修改引數,調整wifi資訊,伺服器地址

    在此推薦太極創客 的基礎教學,我看教學2個週末完成Esp部分。

    物聯網基礎教學ESP8266物聯網教學

  2. 瞭解Docker基礎,參照教學可以執行範例

    需要設定MySql地址和伺服器地址

    Docker教學參見B站教學

    FastAPI 部署教學

  3. AndroidStudio使用,可以執行Flutter專案,也可以下載打包好的專案

    專案原始碼包含使用者端原始碼,我執行過Android,未測試IOS,程式碼很簡單,瞭解Dart基礎語法就可以修改

    Flutter教學

如何使用

準備材料:

  • 無線遙控器,支援學習和對拷貝,
  • 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伺服器端部署

參見Docker部署FastAPI

使用者端打包

​ 使用者端採用Flutter方案,目前就1個介面請求,我不想些兩端程式碼(懶-_-!!)

​ 設定好AndroidStudio的Flutter開發環境,直接匯入就可以,設定教學可以參見搭建Flutter開發環境

​ 需要修改對應的伺服器地址:post('http://101.xxx.xxx.xxx:8000/addnasdaq',

測試:
  1. 先測試ESP8266連線WIFI是否正常
  2. 測試ESP8266單獨控制繼電器是否正常
  3. 本地部署伺服器,使用PostMan介面測試資料庫 增加,查詢是否正常
  4. 測試ESP8266 連線資料是否正常
  5. 如果到此測試正常,標識專案正常執行

專案宣告:此專案是學習練手專案,僅用於個人學習,

剛接觸物聯網硬體,專案中難免有不規範的地方,僅供學習,歡迎大家貢獻程式碼

目前已經實現的功能

TODO