# 檔案下載(雲端硬碟連結) **實驗室測試版(lab_test_flag true/lab_test_false 各燒一次 + 改IP) +港務現場改裝版(改IP直接燒) + 兩張ca** **檔案上次更新時間 : 2023/06/29 10:40** https://drive.google.com/drive/folders/1s9dN06BQ9HqT0MXw12XTBYbBAxttf2oA?usp=drive_link # 如果在港務直接改裝 **如果用實驗室筆電燒錄時Arduino顯示COM port busy** **---> 把WatchPower關掉(在電腦右下角時間左邊顯示隱藏的圖示那邊)** ![](https://hackmd.io/_uploads/S1-1M-k9On.png) **燒 Emergency_Light_final_version_harbor 這個版本** 請直接改固定IP ---> **IPAddress local_IP(10, 22, 24, 102)** **港務現場版序列埠 : MAC、IP、測試時間、隨機時間、照度、電池電壓提前印出** ![](https://hackmd.io/_uploads/HJ7KXAFu3.jpg) # 要做的事情 * **燒程式看序列埠確定ESP32會動(看mqtt-spy)** * **改裝緊急照明燈** * **有接電源線的時候小心被110V電到** # 動作說明 **接上市電時** : 電池充電,緊急照明燈關閉 **市電斷開時** : 緊急照明燈打開(需將按鈕推到ON),由電池供電 ![](https://i.imgur.com/un6CpVh.jpg) * **MQTT payload :** **電池電壓(Voltage), 照度計照度(Intensity), 時間戳(UTCstamp), ESP32 MAC6(UID), ESP32狀態(Status)** * 每天固定時間測試 : 透過Relay切斷市電,緊急照明燈亮起,由電池供電 * 測試時間持續 **test_last** 分鐘 * 醒來時間為預設測試時間+隨機時間 ---> **test_time + random_time** * 醒來回報一次,睡前回報一次 ## 透過MQTT_spy 修改ESP32預設測試時間 ![](https://hackmd.io/_uploads/SkiEy-Nuh.png) * **對ESP32修改測試時間的topic :** **---> Emergency_Light/MAC6/COMMAND** * **COMMAND JSON格式 :** {"test_time_hour":"19","test_time_min":"20"} * **COMMAND須為標準JSON格式(直接複製上面那串)** **只能填數字,不能有中文、符號、英文,否則回error** **test_time_hour :** 0~23 **test_time_min :** 0~59 * **修改成功則寫入EEPROM ---> 序列埠顯示 Update、write EEPROM vlaue,COMMAND_RE 回修改成功的時間** * **輸入空白 : {"test_time_hour":"","test_time_min":""}** **則在COMMAND_RE 回應ESP32內預設測試時間** # 環境安裝 ## 安裝Arduino 1.8.19版 ![](https://hackmd.io/_uploads/r1vF0RpD2.png) ## 安裝燒錄ESP32用CH340驅動程式(USB-TTL) **進去下載 解ZIP點SETUP** https://www.wch.cn/download/CH341SER_ZIP.html ## 安裝Arduino ESP32開發板 * ESP32 ----- Espressif Systems * **選用開發板** : NodeMCU-32S * **Arduino ESP32開發板 安裝教學** https://shop.mirotek.com.tw/iot/esp32-start-2/ **//--------------------------------------------------------------------------** * **檔案 ---> 偏好設定 ---> 額外的開發板管理員網址,加入** https://dl.espressif.com/dl/package_esp32_index.json ![](https://hackmd.io/_uploads/By7bZeV_3.jpg) * **工具 ---> 開發板 ---> 開發板管理員 ---> 下載 ESP32 1.0.6** ![](https://hackmd.io/_uploads/SkTfzl4dn.jpg) * **工具 ---> 開發板 ---> ESP32 Arduino ---> NodeMCU-32S** ## 安裝Arduino額外程式庫 ![](https://i.imgur.com/BR5579M.jpg) * **ArduinoJson --- 版本 : 6.20.0** ----- **作者** : Benoit Blanchon * **BH1750 --- 版本 : 1.3.0** ----- **作者** : Christopher Laws * **PubSubClient --- 版本 : 2.8.0** ----- **作者** : Nick O' Leary ## mqtt-spy **mqtt-spy要有JAVA才能用** **mqtt-spy 1.0.0版下載頁面,載mqtt-spy-1.0.0.jar** https://github.com/eclipse/paho.mqtt-spy/releases/tag/1.0.0 ### 建立一個空的設定檔 ![](https://hackmd.io/_uploads/B1d45bNd3.png) ### 建立新的連線設定 ![](https://hackmd.io/_uploads/BkaEqZV_2.png) ### 連線設定 * **Server URL(s) ---> 192.168.1.174:8883** * **Connection name/Client ID隨便** ![](https://hackmd.io/_uploads/B1htiW4d3.png) * **Username : ESP32_test** * **Password : 123456** ![](https://hackmd.io/_uploads/SJnFoW4u2.png) * **選實驗室測試用ca** ![](https://hackmd.io/_uploads/SJnKsZVd3.png) * **Add topic ---> Emergency_Light/#** **#是全部都聽的意思** ![](https://hackmd.io/_uploads/BJnYi-NOh.png) ![](https://hackmd.io/_uploads/S1g2Yj-4dh.png) * **設定好了按Apply 再按Close and re-open exsisting connection** ### mqtt-spy操作 ![](https://hackmd.io/_uploads/r1F7HkDdh.jpg) #### Publish message * **Topic : Emergency_Light/MAC6/COMMAND** **---> 推送頻道** * **Data : {"test_time_hour":"17","test_time_min":"50"}** **---> 推送內容** #### Subscription and received message * **Topic : Emergency_Light/MAC6/COMMAND_RE** **---> 接收訊息的頻道** * **{"test_time_hour":"17","test_time_min":"50"}** **---> 訊息內容** # Arduino程式部分 ## Arduino操作 * **工具 ---> 開發板:NodeMCU - 32S** * **Upload Speed ---> 921600** * **序列埠 ---> 裝置管理員 ---> 連接埠 : USB-SERIAL CH340** ## 程式流程 **開機後先連WIFI,印MAC6,連ntp伺服器拿現在時間,印預設測試時間,判斷是否進入測試流程-->** * **不進入測試流程 :** 直接睡覺,不推送mqtt訊息 * **進入測試流程 :** 連線mqtt伺服器推送第一次mqtt訊息(Awake),透過Relay切斷市電(模擬按下開關),緊急照明燈亮起,2分鐘後推送第二次mqtt訊息(Sleep),此時Intensity需大於1000,完成後睡覺 * **睡到預設測試時間(現版本為10:00 ~ 10:30)後醒來**(10:00為預設測試時間,隨機往後推30分鐘起床) ![](https://hackmd.io/_uploads/B10pwVO_n.jpg) ![](https://hackmd.io/_uploads/Sk0aDNdO3.jpg) ### 序列埠監控視窗 * **工具--->序列埠監控視窗** * **請先開啟序列埠監控視窗再按上傳** --->先按燒錄再開視窗會燒不進去 * **實驗室測試序列埠,燒錄情況&按背後按鈕情況** ![](https://hackmd.io/_uploads/rJU13eVOn.png) * **實驗室測試序列埠,睡醒情況** ![](https://hackmd.io/_uploads/r19_hlNd2.png) ## variable.h ### #define變數與會修改到的內容 * **#define lab_test_flag true/false** **---> 實驗室測試時填 true, 測完前填false後再燒一次** * **#define** static_ip_flag true/false ---> true : 設定固定IP、Gateway、子網路遮罩、DNS ---> false : 自動取得(DHCP) * **#define** random_time_flag true/false ---> true : 於預設測試時間往後推random_time_min(分)內測試(隨機) ---> false : 於預設測試時間直接醒來測試 * **const char*** wifi_ssid = ""; ---> wifi名稱 * **const char*** wifi_pass = ""; ---> wifi密碼 * **const char*** ntp_server = ""; ---> ntp伺服器網址 * **const char*** mqtt_server = ""; ---> mqtt伺服器網址 * **const char*** mqtt_username = ""; ---> mqtt伺服器登入帳號 * **const char*** mqtt_password = ""; ---> mqtt伺服器登入密碼 ### 設定固定IP、Gateway、子網路遮罩、DNS * **固定ip請參考能管環控設備IP規劃表,記得填excel表的MAC** * IPAddress local_IP(192, 168, 1, 189); * IPAddress gateway(192, 168, 1, 1); * IPAddress subnet(255, 255, 255, 0); * IPAddress primaryDNS(8, 8, 8, 8); // optional * IPAddress secondaryDNS(8, 8, 4, 4); // optional ### 其他設定 * **#define** random_time_min 30 ---> 於預設測試時間往後推15分鐘內測試(隨機) * **#define** tls true ---> 使用加密 * **int** test_hour = 10; ---> 測試開始時間_小時 * **int** test_min = 00; ---> 測試開始時間_分鐘 * **int** test_last = 2; ---> 測試持續時間(分鐘) * **int** test_interval = 40; ---> 測試區間(測試時間往後__分鐘內醒來都會進行測試與publish MQTT訊息) * **#define** mqtt_port 1883 ---> 非加密頻道 * **#define** mqtt_port_tls 8883 ---> 加密頻道 ### 預設變數(基本上不用修改) * **const char*** mqtt_server = ""; ---> mqtt伺服器網址 * **String** clientID; ---> mqtt設備名稱(自動獲得) * **String** pub_pre = ""; ---> mqtt推送主題名稱前綴 * **String** pub_post = ""; ---> mqtt推送主題名稱後綴 * **String** pubtopic; ---> **pubtopic = pub_pre + "/" + MAC6 + "/" + pub_post** * **String** sub_pre = ""; ---> mqtt訂閱(接收)主題名稱前綴 * **String** sub_post = ""; ---> mqtt訂閱(接收)主題名稱後綴 * **String** subtopic; ---> **subtopic = sub_pre + "/" + MAC6 + "/" + sub_post** * **String** command_re_pre = ""; ---> mqtt回遠端命令(推送)主題前綴 * **String** command_re_post = ""; ---> mqtt回遠端命令(推送)主題後綴 * **String** command_re_topic; ---> **command_re_topic = command_re_pre + "/" + MAC6 + "/" + command_re_post;** * **int** relay_pin = 12; ---> relay IO腳 * **const int** ADCpin = 34; ---> ADC IO腳 * **int** wifi_error_sec = 90; ---> wifi連線失敗時間(秒) (timeout) * **int** wifi_error_sleep_hour = 20; ---> wifi連線失敗後睡眠時間(小時) * **int** mqtt_error_sec = 90; ---> mqtt連線失敗時間(秒) (timeout) * **int** mqtt_error_sleep_hour = 1; ---> mqtt連線失敗後睡眠時間(小時) * **int** ntp_error_sec = 90; ---> ntp連線失敗時間(秒) (timeout) * **int** ntp_error_sleep_hour = 1; ---> ntp連線失敗後睡眠時間(小時) # 燒程式 要做的事情 * **改裝好之後板子擺個大概的位置,電源接上,測試開關推到ON,#define lab_test_flag 改true燒程式,看序列埠+用mqtt-spy攔資料看對不對** * **動作正確後 #define lab_test_flag 改false + 對Excel表改固定IP(LocalIP) + 填Excel表MAC然後再燒一次 然後板子黏死+鎖上(測試開關推到OFF)** * **看mqtt-spy的時候要注意第一次推送時(Status:Awake)還沒進入測試環節,電燈還沒點亮,此時Intensity數值很低** * **第二次推送時(Status:Sleep)電燈是亮的,此時Intensity需超過1000,沒超過就是照度計沒朝向燈管,橋一下位置再黏好** ![](https://hackmd.io/_uploads/r1Tur4uOh.jpg) ![](https://hackmd.io/_uploads/rJXYSV_u3.jpg) # 緊急照明燈改裝 ## 要做的事情 * **板子背面電源測短路(焊接、看下面)** * **Relay接到測試開關(焊接、壁掛並接NO、崁頂串接NC、看下面)** * **板子正面電池接點拉到電池(焊接、看下面)** * **照度計固定(熱熔膠黏)** * **板子固定(測試按鈕挖洞、熱熔膠黏)** * **崁頂小盒子挖洞(背面測試按鈕+側面兩組線出來)** ## 龍哥lay的板子 **!!!改線時先把測試開關關掉、110插頭拔掉、電池接頭拔掉,免得被電到!!!** * **先把板子C2下面兩點短路** ![](https://hackmd.io/_uploads/Hy7meHN_h.jpg) ## 板子BAT+/BAT-接到電池(焊接) **線焊在圖上的紅色圈圈比較好焊** ![](https://hackmd.io/_uploads/r1IQH08u3.jpg) ![](https://hackmd.io/_uploads/Hk5PHAId2.jpg) ## 壁掛式 ![](https://hackmd.io/_uploads/rkYEhm_O2.jpg) ### 壁掛式按鈕為常開(NO),Relay與測試按鈕並接,接在版子NO * **焊在外側兩點,裡面兩點是外殼** ![](https://hackmd.io/_uploads/S1rQ6VNO3.jpg) ![](https://hackmd.io/_uploads/SkWIHALuh.jpg) ## 崁頂式 * **崁頂式按鈕為常閉(NC),Relay與測試按鈕兩條線串接,接在版子NC** * **露在外面的那條用絕緣膠帶包起來** ![](https://hackmd.io/_uploads/HJCikr4d2.jpg) ![](https://hackmd.io/_uploads/HJZ31r4On.jpg) # 參考資料 ## ESP32模組 ![](https://hackmd.io/_uploads/rkASXZEO2.jpg) ## 緊急照明燈 **電源上開關需推到 ON** ![](https://i.imgur.com/uTBgFU0.jpg) ## BH1750 照度感測器 **GND** --> GND(接到旁邊的GND) **AD0** --> 不用接 **SDA** --> GPIO21(右上6) **SCL** --> GPIO22(右上3) **VCC** --> VIN 3.3V(左上1) ## Relay **IN** --> GPIO12(左下7) **GND** --> GND(接到旁邊的GND) **VCC** --> 5V(接到旁邊的VCC) * **掛壁式** **NO(Normal Open)** --> 跟測試按鈕線並聯 **COM** --> 跟測試按鈕線並聯 **NC(Normal Close)** --> 不用接 * **崁頂式** **NO** --> 不用接 **COM** --> 跟測試按鈕線**並聯** **NC** --> 跟測試按鈕線**串聯** ![](https://i.imgur.com/pIrOMHA.png) ## 電池 **正端** --> 接到旁邊的GND **負端** --> 接到旁邊的VCC ## ESP32 **GPIO34(ADC6)(左上5)** --> 3k/1.5k兩電阻中間 **VIN 5V(左下1)** --> 接到旁邊的VCC **GND** -->接到旁邊的GND # Harbor Bureau WiFi/MQTT settings * **WiFi ssid** : KPCT-OT * **WiFi password** : Kpct-oT1 * **MQTT server ip** : 10.22.16.10 * **MQTT server username** : iotdev * **MQTT server password** : gigaiotkuofu0121 * **ntp server ip** : 10.22.16.10 # WiFiSecure ESP32 Arduino library doesn't support SHA1 Algorithm ![](https://i.imgur.com/yKfRMjz.jpg)