From c8f96c4b69a5383a63b951e24533b4d9217882db Mon Sep 17 00:00:00 2001 From: henne Date: Mon, 25 Jul 2022 10:04:51 +0200 Subject: [PATCH] feat: fluroclock, espnow remote, improvements and 11404 --- blitzercontroller/platformio.ini | 2 + blitzercontroller/src/fluroclock.cpp | 32 ++++++++ blitzercontroller/src/fluroclock.h | 5 ++ blitzercontroller/src/index.html | 11 ++- blitzercontroller/src/main.cpp | 5 +- blitzercontroller/src/main.h | 1 + blitzercontroller/src/remote.cpp | 31 ++++++++ blitzercontroller/src/remote.h | 13 ++++ blitzercontroller/src/site.h | 12 ++- blitzercontroller/src/speed.cpp | 109 +++++++++++++++------------ blitzercontroller/src/speed.h | 5 +- blitzercontroller/src/webserver.cpp | 7 ++ 12 files changed, 176 insertions(+), 57 deletions(-) create mode 100644 blitzercontroller/src/fluroclock.cpp create mode 100644 blitzercontroller/src/fluroclock.h create mode 100644 blitzercontroller/src/remote.cpp create mode 100644 blitzercontroller/src/remote.h diff --git a/blitzercontroller/platformio.ini b/blitzercontroller/platformio.ini index f620857..f6a04aa 100644 --- a/blitzercontroller/platformio.ini +++ b/blitzercontroller/platformio.ini @@ -14,3 +14,5 @@ board = d1_mini framework = arduino monitor_speed = 115200 lib_deps = me-no-dev/ESP Async WebServer@^1.2.3 +upload_port=/dev/tty.usbserial-1320 +monitor_port=/dev/tty.usbserial-1320 diff --git a/blitzercontroller/src/fluroclock.cpp b/blitzercontroller/src/fluroclock.cpp new file mode 100644 index 0000000..09afb47 --- /dev/null +++ b/blitzercontroller/src/fluroclock.cpp @@ -0,0 +1,32 @@ +#include +#include +#include +#include + +String url = "http://151.217.19.22/api/panel/numeric"; +WiFiClient client; +HTTPClient http; + +void setPanel(int, char); + +void displaySpeed(float speed) { + char buffer[6]; + dtostrf(speed, 6, 2, buffer); + setPanel(4, buffer[1]); + setPanel(3, buffer[2]); + setPanel(2, buffer[4]); + setPanel(1, buffer[5]); +} + +void setPanel(int panel_id, char value) { + http.begin(client, url.c_str()); + http.addHeader("Content-Type", "application/json"); + String request = "{\"panel_id\":\""; + request.concat(panel_id); + request.concat("\", \"value\": \""); + request.concat(value); + request.concat("\"}"); + Serial.println(request); + http.POST(request); + http.end(); +} \ No newline at end of file diff --git a/blitzercontroller/src/fluroclock.h b/blitzercontroller/src/fluroclock.h new file mode 100644 index 0000000..1cd9605 --- /dev/null +++ b/blitzercontroller/src/fluroclock.h @@ -0,0 +1,5 @@ +#ifndef fluroclock_h +#define fluroclock_h + +void displaySpeed(float speed); +#endif \ No newline at end of file diff --git a/blitzercontroller/src/index.html b/blitzercontroller/src/index.html index 5ce2ed0..b2513c7 100644 --- a/blitzercontroller/src/index.html +++ b/blitzercontroller/src/index.html @@ -22,6 +22,7 @@

Blitzercontrol

+

Highscore

23km/h

Letzte Messungen

@@ -54,17 +55,23 @@ fetch('/set?speed=' + thresholdFieldElem.value); } function getData() { - fetch('/data.json') + const controller = new AbortController(); + const id = setTimeout(() => controller.abort(), 1500); + fetch('/data.json', { + signal: controller.signal + }) .then(response => response.json()) .then(data => { + clearTimeout(id); highscoreElem.innerText = data.highscore + ' km/h'; let c = lastSpeeds.children; for(let i=0; i diff --git a/blitzercontroller/src/main.cpp b/blitzercontroller/src/main.cpp index 216a916..526540b 100644 --- a/blitzercontroller/src/main.cpp +++ b/blitzercontroller/src/main.cpp @@ -1,11 +1,12 @@ #include void setup() { - handleSetup(); + handleSpeedSetup(); + handleRemoteSetup(); Serial.begin(115200); beginWiFi(); } void loop() { - handleLoop(); + handleSpeedLoop(); } \ No newline at end of file diff --git a/blitzercontroller/src/main.h b/blitzercontroller/src/main.h index 3bbf14b..0f88346 100644 --- a/blitzercontroller/src/main.h +++ b/blitzercontroller/src/main.h @@ -3,4 +3,5 @@ #include #include #include +#include #endif \ No newline at end of file diff --git a/blitzercontroller/src/remote.cpp b/blitzercontroller/src/remote.cpp new file mode 100644 index 0000000..19e76ea --- /dev/null +++ b/blitzercontroller/src/remote.cpp @@ -0,0 +1,31 @@ +#include + +// Create a struct_message called myData +struct_message recvRemoteData; + +// callback function that will be executed when data is received +void OnDataRecv(uint8_t *mac, uint8_t *incomingData, uint8_t len) +{ + Serial.println("received data"); + String data = String((char *)incomingData); + if (data.equals("flash")) + { + flash(); + } +} + +void handleRemoteSetup() +{ + + // Init ESP-NOW + if (esp_now_init() != 0) + { + Serial.println("Error initializing ESP-NOW"); + return; + } + + // Once ESPNow is successfully Init, we will register for recv CB to + // get recv packer info + esp_now_set_self_role(ESP_NOW_ROLE_SLAVE); + esp_now_register_recv_cb(OnDataRecv); +} \ No newline at end of file diff --git a/blitzercontroller/src/remote.h b/blitzercontroller/src/remote.h new file mode 100644 index 0000000..5c1e336 --- /dev/null +++ b/blitzercontroller/src/remote.h @@ -0,0 +1,13 @@ +#ifndef remote_h +#define remote_h +#include +#include +#include + +typedef struct struct_message { + int action; +} struct_message; + + +void handleRemoteSetup(); +#endif \ No newline at end of file diff --git a/blitzercontroller/src/site.h b/blitzercontroller/src/site.h index 5d070ac..9ea647f 100644 --- a/blitzercontroller/src/site.h +++ b/blitzercontroller/src/site.h @@ -1,7 +1,7 @@ #include const char index_html[] PROGMEM = R"rawliteral( - + @@ -25,6 +25,7 @@ const char index_html[] PROGMEM = R"rawliteral(

Blitzercontrol

+

Highscore

23km/h

Letzte Messungen

@@ -57,17 +58,22 @@ const char index_html[] PROGMEM = R"rawliteral( fetch('/set?speed=' + thresholdFieldElem.value); } function getData() { - fetch('/data.json') + const controller = new AbortController(); + const id = setTimeout(() => controller.abort(), 1500); + fetch('/data.json', { + signal: controller.signal + }) .then(response => response.json()) .then(data => { + clearTimeout(id); highscoreElem.innerText = data.highscore + ' km/h'; let c = lastSpeeds.children; for(let i=0; i diff --git a/blitzercontroller/src/speed.cpp b/blitzercontroller/src/speed.cpp index 12a5b7f..6b1f138 100644 --- a/blitzercontroller/src/speed.cpp +++ b/blitzercontroller/src/speed.cpp @@ -3,94 +3,100 @@ #define PIN_SW1 D6 #define PIN_SW2 D5 #define PIN_TRIGGER D7 -volatile boolean sw1_flag = false; -volatile boolean sw2_flag = false; unsigned long sw1_lastTime = 0; unsigned long sw2_lastTime = 0; +unsigned long sw1_lastTime_e = 0; +unsigned long sw2_lastTime_e = 0; float flashspeed = 20; // in kmh unsigned long flashdeadtime = 1000; // in ms -float calib_distance = 0.062; // distance of sensors in meters +float calib_distance = 0.1; // distance of sensors in meters float lastMeasuredSpeeds[10]; float highscore = 0; unsigned long last_flash = 0; +bool flashNext = false; -#define SWDEBOUNCE 100000 +#define SWDEBOUNCE 1000000 ICACHE_RAM_ATTR void interrupt_sw1(); ICACHE_RAM_ATTR void interrupt_sw2(); -float getLastSpeed1(); -float getLastSpeed2(); +float getLastSpeed(); -void handleSetup() +void handleSpeedSetup() { pinMode(PIN_SW1, INPUT_PULLUP); pinMode(PIN_SW2, INPUT_PULLUP); pinMode(PIN_TRIGGER, OUTPUT); - attachInterrupt(digitalPinToInterrupt(PIN_SW1), interrupt_sw1, FALLING); attachInterrupt(digitalPinToInterrupt(PIN_SW2), interrupt_sw2, FALLING); + attachInterrupt(digitalPinToInterrupt(PIN_SW1), interrupt_sw1, FALLING); digitalWrite(PIN_TRIGGER, HIGH); // active low } -void handleLoop() +void handleSpeedLoop() { // reset micros within the first half second to care for overflowing micros - if (micros() < 500000) { - sw1_flag = false; + if (micros() < 500000) + { sw1_lastTime = 0; - sw2_flag = false; sw2_lastTime = 0; + sw1_lastTime_e = 0; + sw2_lastTime_e = 0; + } - if (millis() < 500) { + if (millis() < 500) + { last_flash = 0; } - if (sw1_flag) + if (sw1_lastTime > 0 && sw2_lastTime > 0 && sw2_lastTime - sw1_lastTime > 1200 && sw2_lastTime - sw1_lastTime < 10000000) { - sw1_flag = false; - sw1_lastTime = micros(); - Serial.println("SW1"); - doTrigger(getLastSpeed1()); + // 0,036 km/h - 300 km/h und sw2 nach sw1 ausgelöst + doTrigger(getLastSpeed()); + sw2_lastTime = 0; + sw1_lastTime = 0; } - if (sw2_flag) { - sw2_flag = false; - sw2_lastTime = micros(); - Serial.println("SW2"); - doTrigger(getLastSpeed2()); + /* code */ + } + + if (flashNext) + { + flashNext = false; + Serial.print("Flashing"); + pinMode(PIN_TRIGGER, INPUT); // high impedance + delay(100); + pinMode(PIN_TRIGGER, OUTPUT); + digitalWrite(PIN_TRIGGER, LOW); + Serial.println(".."); } } void doTrigger(float speed) { - - if (speed < 0.1) - { - return; - } - if (millis() - last_flash > flashdeadtime) { // deadtime last_flash = millis(); - if (speed >= flashspeed) { addLastSpeed(speed); Serial.print("> Speed="); Serial.print(speed); - Serial.println(" km/h"); + Serial.println(" km/h - FLASH"); flash(); } + else + { + Serial.print(">> Speed="); + Serial.print(speed); + Serial.println(" km/h"); + } } } -void flash() { - Serial.println("Flash"); - pinMode(PIN_TRIGGER, INPUT); // high impedance - delay(100); - pinMode(PIN_TRIGGER, OUTPUT); - digitalWrite(PIN_TRIGGER, LOW); +void flash() +{ + flashNext = true; } void addLastSpeed(float speed) @@ -100,32 +106,39 @@ void addLastSpeed(float speed) lastMeasuredSpeeds[i] = lastMeasuredSpeeds[i + 1]; } lastMeasuredSpeeds[9] = speed; - if (highscore < speed) { + displaySpeed(speed); + if (highscore < speed) + { highscore = speed; } } ICACHE_RAM_ATTR void interrupt_sw1() { - if (sw1_lastTime + SWDEBOUNCE < micros()) + if (sw1_lastTime_e + SWDEBOUNCE < micros()) { - sw1_flag = true; + sw1_lastTime_e = micros(); + sw1_lastTime = micros(); + Serial.print("SW1 - "); + Serial.println(micros()); } } ICACHE_RAM_ATTR void interrupt_sw2() { - if (sw2_lastTime + SWDEBOUNCE < micros()) + if (sw2_lastTime_e + SWDEBOUNCE < micros()) { - sw2_flag = true; + sw2_lastTime_e = micros(); + Serial.print("SW2 - "); + Serial.println(micros()); + if (sw1_lastTime > 0) + { + sw2_lastTime = micros(); + } } } -float getLastSpeed1() +float getLastSpeed() { - return calib_distance / ((sw1_lastTime - sw2_lastTime) / 1000000.0) * 3.6; -} -float getLastSpeed2() -{ - return calib_distance / ((sw2_lastTime - sw1_lastTime) / 1000000.0) * 3.6; + return calib_distance / ((sw2_lastTime - sw1_lastTime + 11404) / 1000000.0) * 3.6; // lichtschranke 1 kaputt, hat delay, brauchen 11404 microsekunden mehr, trust me. } diff --git a/blitzercontroller/src/speed.h b/blitzercontroller/src/speed.h index dd6e8dc..1f602a2 100644 --- a/blitzercontroller/src/speed.h +++ b/blitzercontroller/src/speed.h @@ -1,6 +1,7 @@ #ifndef speed_h #define speed_h #include +#include extern float flashspeed; extern float highscore; @@ -9,8 +10,8 @@ extern float calib_distance; extern float lastMeasuredSpeeds[10]; void flash(); -void handleLoop(); -void handleSetup(); +void handleSpeedLoop(); +void handleSpeedSetup(); void doTrigger(float speed); void addLastSpeed(float speed); #endif \ No newline at end of file diff --git a/blitzercontroller/src/webserver.cpp b/blitzercontroller/src/webserver.cpp index c916553..b8616b0 100644 --- a/blitzercontroller/src/webserver.cpp +++ b/blitzercontroller/src/webserver.cpp @@ -10,7 +10,12 @@ void beginWiFi() { Serial.print("."); } Serial.println(""); + Serial.print("ESP8266 Board MAC Address: "); + Serial.println(WiFi.macAddress()); + Serial.println(""); + Serial.print("ESP822 IP: "); Serial.println(WiFi.localIP()); + Serial.println(WiFi.channel()); server.on("/", HTTP_GET, [] (AsyncWebServerRequest *request) { request->send(200, "text/html", index_html); }); @@ -36,6 +41,8 @@ void beginWiFi() { server.on("/data.json", HTTP_GET, [] (AsyncWebServerRequest *request) { String response = "{\"highscore\":"; response.concat(highscore); + response.concat(", \"threshold\": "); + response.concat(flashspeed); response.concat(",\"lastSpeeds\": ["); for(int i=0;i<10;i++) { response.concat(lastMeasuredSpeeds[i]);