parent
0c59652222
commit
6071534a72
3 changed files with 232 additions and 85 deletions
@ -1,90 +1,232 @@ |
||||
#include <Arduino.h> |
||||
#include <ArduinoJson.h> |
||||
|
||||
#include <ESP8266WiFi.h> |
||||
#include <ESP8266WiFiMulti.h> |
||||
|
||||
#include <ESP8266HTTPClient.h> |
||||
|
||||
#define USE_SERIAL Serial |
||||
|
||||
ESP8266WiFiMulti WiFiMulti; |
||||
char macAddr[18]; |
||||
const char* WIFI_SSID = "Protospace"; |
||||
const char* WIFI_PASS = "yycmakers"; |
||||
char wifiMACAddr[18]; |
||||
const String API_ROUTE = String("http://tools.protospace.ca:8080/api/lockout/"); |
||||
|
||||
// Generated with: https://arduinojson.org/assistant/
|
||||
const size_t bufferSize = JSON_OBJECT_SIZE(3) + 50; |
||||
DynamicJsonBuffer jsonBuffer(bufferSize); |
||||
#define RELAY_PIN D1 |
||||
#define ON_BUTTON_PIN D3 |
||||
#define OFF_BUTTON_PIN D4 |
||||
#define ARMED_LED_PIN D5 |
||||
#define ON_LED_PIN D6 |
||||
#define OFF_LED_PIN D7 |
||||
|
||||
void setup() { |
||||
#define RELAY_CLOSED LOW |
||||
#define RELAY_OPEN !RELAY_CLOSED |
||||
#define BUTTON_CLOSED LOW |
||||
#define BUTTON_OPEN !BUTTON_CLOSED |
||||
#define LED_ON HIGH |
||||
#define LED_OFF !LED_ON |
||||
|
||||
pinMode(D2, OUTPUT); |
||||
digitalWrite(D2, HIGH); |
||||
#define LOGGING true |
||||
|
||||
USE_SERIAL.begin(115200); |
||||
// USE_SERIAL.setDebugOutput(true);
|
||||
#define DELAY_TIME 10 |
||||
#define COMM_IDLE_TIME 500 / DELAY_TIME |
||||
|
||||
USE_SERIAL.println(); |
||||
USE_SERIAL.println(); |
||||
USE_SERIAL.println(); |
||||
|
||||
for(uint8_t t = 4; t > 0; t--) { |
||||
USE_SERIAL.printf("[SETUP] WAIT %d...\n", t); |
||||
USE_SERIAL.flush(); |
||||
delay(1000); |
||||
} |
||||
|
||||
WiFi.mode(WIFI_STA); |
||||
WiFiMulti.addAP("Protospace", "yycmakers"); |
||||
|
||||
byte ar[6]; |
||||
WiFi.macAddress(ar); |
||||
sprintf(macAddr, "%02X%02X%02X%02X%02X%02X", ar[0], ar[1], ar[2], ar[3], ar[4], ar[5]); |
||||
USE_SERIAL.println(macAddr); |
||||
// Generated with: https://arduinojson.org/assistant/
|
||||
const size_t bufferSize = JSON_OBJECT_SIZE(3) + 50; |
||||
DynamicJsonBuffer jsonBuffer(bufferSize); |
||||
|
||||
enum wifiStates |
||||
{ |
||||
WIFI_DISCONNECTED, |
||||
WIFI_CONNECTING, |
||||
WIFI_CONNECTED, |
||||
} wifiState = WIFI_DISCONNECTED; |
||||
|
||||
enum lockStates |
||||
{ |
||||
LOCK_OFF, |
||||
LOCK_ARMED, |
||||
LOCK_ON_PRESSED, |
||||
LOCK_ON, |
||||
LOCK_OFF_PRESSED, |
||||
} lockState = LOCK_OFF; |
||||
|
||||
enum commStates |
||||
{ |
||||
COMM_INIT, |
||||
COMM_IDLE, |
||||
COMM_SEND, |
||||
} commState = COMM_INIT; |
||||
|
||||
void setup() |
||||
{ |
||||
if (LOGGING) Serial.begin(115200); |
||||
if (LOGGING) Serial.println("[INFO] Serial started."); |
||||
|
||||
pinMode(RELAY_PIN, OUTPUT); |
||||
pinMode(ON_BUTTON_PIN, INPUT_PULLUP); |
||||
pinMode(OFF_BUTTON_PIN, INPUT_PULLUP); |
||||
pinMode(ARMED_LED_PIN, OUTPUT); |
||||
pinMode(ON_LED_PIN, OUTPUT); |
||||
pinMode(OFF_LED_PIN, OUTPUT); |
||||
} |
||||
|
||||
void loop() { |
||||
// wait for WiFi connection
|
||||
if((WiFiMulti.run() == WL_CONNECTED)) { |
||||
|
||||
HTTPClient http; |
||||
|
||||
USE_SERIAL.print("[HTTP] begin...\n"); |
||||
// configure traged server and url
|
||||
//http.begin("https://192.168.1.12/test.html", "7a 9c f4 db 40 d3 62 5a 6e 21 bc 5c cc 66 c8 3e a1 45 59 38"); //HTTPS
|
||||
http.begin(String("http://172.17.32.164:3000/api/tool/") + macAddr); //HTTP
|
||||
|
||||
USE_SERIAL.print("[HTTP] GET...\n"); |
||||
// start connection and send HTTP header
|
||||
int httpCode = http.GET(); |
||||
|
||||
// httpCode will be negative on error
|
||||
if(httpCode > 0) { |
||||
// HTTP header has been send and Server response header has been handled
|
||||
USE_SERIAL.printf("[HTTP] GET... code: %d\n", httpCode); |
||||
|
||||
// file found at server
|
||||
if(httpCode == HTTP_CODE_OK) { |
||||
String payload = http.getString(); |
||||
USE_SERIAL.println(payload); |
||||
JsonObject& root = jsonBuffer.parseObject(payload); |
||||
void loop() |
||||
{ |
||||
processWifiState(); |
||||
processLockState(); |
||||
processCommState(); |
||||
|
||||
bool relayOn = root["relayOn"]; // true
|
||||
bool ledOn = root["ledOn"]; // true
|
||||
const char* date = root["date"]; // "2018-02-01"
|
||||
|
||||
USE_SERIAL.println(String("relayOn: ") + relayOn + String(" ledOn: ") + ledOn + String(" Date: ") + date);
|
||||
|
||||
digitalWrite(D2, !relayOn); |
||||
|
||||
} |
||||
} else { |
||||
USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str()); |
||||
} |
||||
delay(DELAY_TIME); |
||||
} |
||||
|
||||
http.end(); |
||||
} |
||||
void processWifiState() |
||||
{ |
||||
switch(wifiState) { |
||||
case WIFI_DISCONNECTED: |
||||
lockState = LOCK_OFF; |
||||
commState = COMM_INIT; |
||||
|
||||
if (LOGGING) Serial.println("[INFO] Wifi is disconnected. Attempting to connect..."); |
||||
WiFi.begin(WIFI_SSID, WIFI_PASS); |
||||
|
||||
wifiState = WIFI_CONNECTING; |
||||
break; |
||||
case WIFI_CONNECTING: |
||||
lockState = LOCK_OFF; |
||||
commState = COMM_INIT; |
||||
|
||||
if (WiFi.status() == WL_CONNECTED) { |
||||
if (LOGGING) Serial.println("[INFO] Wifi is connected."); |
||||
|
||||
if (LOGGING) Serial.print("[INFO] Wifi IP Address:"); |
||||
if (LOGGING) Serial.println(WiFi.localIP()); |
||||
byte ar[6]; |
||||
WiFi.macAddress(ar); |
||||
sprintf(wifiMACAddr, "%02X%02X%02X%02X%02X%02X", ar[0], ar[1], ar[2], ar[3], ar[4], ar[5]); |
||||
if (LOGGING) Serial.print("[INFO] Wifi MAC Address:"); |
||||
if (LOGGING) Serial.println(wifiMACAddr); |
||||
|
||||
wifiState = WIFI_CONNECTED; |
||||
} |
||||
break; |
||||
case WIFI_CONNECTED: |
||||
if (WiFi.status() != WL_CONNECTED) { |
||||
wifiState = WIFI_DISCONNECTED; |
||||
} |
||||
break; |
||||
default: |
||||
if (LOGGING) Serial.println("[ERROR] Invalid wifi state."); |
||||
wifiState = WIFI_DISCONNECTED; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
delay(10000); |
||||
void processLockState() |
||||
{ |
||||
switch (lockState) { |
||||
case LOCK_OFF: |
||||
digitalWrite(ARMED_LED_PIN, LED_OFF); |
||||
digitalWrite(ON_LED_PIN, LED_OFF); |
||||
digitalWrite(OFF_LED_PIN, LED_ON); |
||||
|
||||
digitalWrite(RELAY_PIN, RELAY_OPEN); |
||||
break; |
||||
case LOCK_ARMED: |
||||
digitalWrite(ARMED_LED_PIN, LED_ON); |
||||
digitalWrite(ON_LED_PIN, LED_OFF); |
||||
digitalWrite(OFF_LED_PIN, LED_ON); |
||||
|
||||
digitalWrite(RELAY_PIN, RELAY_OPEN); |
||||
|
||||
if (digitalRead(OFF_BUTTON_PIN) == BUTTON_CLOSED) { |
||||
if (LOGGING) Serial.println("[INFO] Unarming interlock."); |
||||
lockState = LOCK_OFF_PRESSED; |
||||
} else if (digitalRead(ON_BUTTON_PIN) == BUTTON_CLOSED) { |
||||
if (LOGGING) Serial.println("[INFO] On button pressed."); |
||||
lockState = LOCK_ON_PRESSED; |
||||
} |
||||
break; |
||||
case LOCK_ON_PRESSED: |
||||
if (digitalRead(OFF_BUTTON_PIN) == BUTTON_CLOSED) { |
||||
if (LOGGING) Serial.println("[ERROR] Both buttons pressed, aborting."); |
||||
lockState = LOCK_OFF_PRESSED; |
||||
} else if (digitalRead(ON_BUTTON_PIN) == BUTTON_OPEN) { |
||||
if (LOGGING) Serial.println("[INFO] Turning machine on."); |
||||
lockState = LOCK_ON; |
||||
} |
||||
break; |
||||
case LOCK_ON: |
||||
digitalWrite(ARMED_LED_PIN, LED_ON); |
||||
digitalWrite(ON_LED_PIN, LED_ON); |
||||
digitalWrite(OFF_LED_PIN, LED_OFF); |
||||
|
||||
digitalWrite(RELAY_PIN, RELAY_CLOSED); |
||||
|
||||
if (digitalRead(OFF_BUTTON_PIN) == BUTTON_CLOSED) { |
||||
if (LOGGING) Serial.println("[INFO] Off button pressed."); |
||||
lockState = LOCK_OFF_PRESSED; |
||||
} |
||||
break; |
||||
case LOCK_OFF_PRESSED: |
||||
if (digitalRead(OFF_BUTTON_PIN) == BUTTON_OPEN) { |
||||
if (LOGGING) Serial.println("[INFO] Turning machine off."); |
||||
lockState = LOCK_OFF; |
||||
} |
||||
break; |
||||
default: |
||||
if (LOGGING) Serial.println("[ERROR] Invalid lock state."); |
||||
lockState = LOCK_OFF; |
||||
break; |
||||
} |
||||
} |
||||
|
||||
void processCommState() |
||||
{ |
||||
static int commIdleCount = 0; |
||||
|
||||
switch (commState) { |
||||
case COMM_INIT: |
||||
commIdleCount = 0; |
||||
commState = COMM_IDLE; |
||||
break; |
||||
case COMM_IDLE: |
||||
commIdleCount++; |
||||
if (commIdleCount >= COMM_IDLE_TIME) { |
||||
commState = COMM_SEND; |
||||
} |
||||
break; |
||||
case COMM_SEND: |
||||
if (LOGGING) Serial.println("[INFO] HTTP begin."); |
||||
HTTPClient http; |
||||
//http.begin("https://url", "7a 9c f4 db 40 d3 62 5a 6e 21 bc 5c cc 66 c8 3e a1 45 59 38"); //HTTPS
|
||||
http.begin(API_ROUTE + wifiMACAddr); |
||||
http.addHeader("Content-Type", "application/json"); |
||||
|
||||
if (LOGGING) Serial.print("[INFO] HTTP POST: "); |
||||
JsonObject& rootSerializer = jsonBuffer.createObject(); |
||||
rootSerializer["lockState"] = lockState; |
||||
String postData = String(); |
||||
rootSerializer.printTo(postData); |
||||
if (LOGGING) Serial.println(postData); |
||||
int httpCode = http.POST(postData); |
||||
|
||||
if (httpCode > 0) { |
||||
if (LOGGING) Serial.printf("[INFO] POST success, code: %d\n", httpCode); |
||||
|
||||
if (httpCode == HTTP_CODE_OK) { |
||||
if (LOGGING) Serial.print("[INFO] Resource found, parsing response: "); |
||||
String payload = http.getString(); |
||||
if (LOGGING) Serial.println(payload); |
||||
JsonObject& rootDeserializer = jsonBuffer.parseObject(payload); |
||||
|
||||
bool armable = rootDeserializer["armable"]; |
||||
|
||||
if (LOGGING) Serial.println("[INFO] Armable: " + String(armable)); |
||||
} else { |
||||
if (LOGGING) Serial.println("[ERROR] Resource not found."); |
||||
} |
||||
} else { |
||||
if (LOGGING) Serial.printf("[ERROR] POST failed, error: %s\n", http.errorToString(httpCode).c_str()); |
||||
} |
||||
|
||||
commState = COMM_INIT; |
||||
break; |
||||
} |
||||
} |
||||
|
Loading…
Reference in new issue