# 檔案下載(雲端硬碟連結)
**實驗室測試版(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關掉(在電腦右下角時間左邊顯示隱藏的圖示那邊)**

**燒 Emergency_Light_final_version_harbor 這個版本**
請直接改固定IP ---> **IPAddress local_IP(10, 22, 24, 102)**
**港務現場版序列埠 : MAC、IP、測試時間、隨機時間、照度、電池電壓提前印出**

# 要做的事情
* **燒程式看序列埠確定ESP32會動(看mqtt-spy)**
* **改裝緊急照明燈**
* **有接電源線的時候小心被110V電到**
# 動作說明
**接上市電時** : 電池充電,緊急照明燈關閉
**市電斷開時** : 緊急照明燈打開(需將按鈕推到ON),由電池供電

* **MQTT payload :**
**電池電壓(Voltage), 照度計照度(Intensity), 時間戳(UTCstamp), ESP32 MAC6(UID), ESP32狀態(Status)**
* 每天固定時間測試 : 透過Relay切斷市電,緊急照明燈亮起,由電池供電
* 測試時間持續 **test_last** 分鐘
* 醒來時間為預設測試時間+隨機時間 ---> **test_time + random_time**
* 醒來回報一次,睡前回報一次
## 透過MQTT_spy 修改ESP32預設測試時間

* **對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版

## 安裝燒錄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

* **工具 ---> 開發板 ---> 開發板管理員 ---> 下載 ESP32 1.0.6**

* **工具 ---> 開發板 ---> ESP32 Arduino ---> NodeMCU-32S**
## 安裝Arduino額外程式庫

* **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
### 建立一個空的設定檔

### 建立新的連線設定

### 連線設定
* **Server URL(s) ---> 192.168.1.174:8883**
* **Connection name/Client ID隨便**

* **Username : ESP32_test**
* **Password : 123456**

* **選實驗室測試用ca**

* **Add topic ---> Emergency_Light/#**
**#是全部都聽的意思**


* **設定好了按Apply 再按Close and re-open exsisting connection**
### mqtt-spy操作

#### 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分鐘起床)


### 序列埠監控視窗
* **工具--->序列埠監控視窗**
* **請先開啟序列埠監控視窗再按上傳**
--->先按燒錄再開視窗會燒不進去
* **實驗室測試序列埠,燒錄情況&按背後按鈕情況**

* **實驗室測試序列埠,睡醒情況**

## 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,沒超過就是照度計沒朝向燈管,橋一下位置再黏好**


# 緊急照明燈改裝
## 要做的事情
* **板子背面電源測短路(焊接、看下面)**
* **Relay接到測試開關(焊接、壁掛並接NO、崁頂串接NC、看下面)**
* **板子正面電池接點拉到電池(焊接、看下面)**
* **照度計固定(熱熔膠黏)**
* **板子固定(測試按鈕挖洞、熱熔膠黏)**
* **崁頂小盒子挖洞(背面測試按鈕+側面兩組線出來)**
## 龍哥lay的板子
**!!!改線時先把測試開關關掉、110插頭拔掉、電池接頭拔掉,免得被電到!!!**
* **先把板子C2下面兩點短路**

## 板子BAT+/BAT-接到電池(焊接)
**線焊在圖上的紅色圈圈比較好焊**


## 壁掛式

### 壁掛式按鈕為常開(NO),Relay與測試按鈕並接,接在版子NO
* **焊在外側兩點,裡面兩點是外殼**


## 崁頂式
* **崁頂式按鈕為常閉(NC),Relay與測試按鈕兩條線串接,接在版子NC**
* **露在外面的那條用絕緣膠帶包起來**


# 參考資料
## ESP32模組

## 緊急照明燈
**電源上開關需推到 ON**

## 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** --> 跟測試按鈕線**串聯**

## 電池
**正端** --> 接到旁邊的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
