diff --git a/FW/leo_muziekdoos_esp32/data/tagconfig.json b/FW/leo_muziekdoos_esp32/data/settings.json similarity index 59% rename from FW/leo_muziekdoos_esp32/data/tagconfig.json rename to FW/leo_muziekdoos_esp32/data/settings.json index 02f5065..089314d 100644 --- a/FW/leo_muziekdoos_esp32/data/tagconfig.json +++ b/FW/leo_muziekdoos_esp32/data/settings.json @@ -10,5 +10,15 @@ { "TagUID" : "23 0E 2C 19", "audiofile" : "/ringoffire.mp3" - }] + }], + "WiFi": [ + { + "ssid": "poes", + "psk": "Rijnstraat214" + }, + { + "ssid": "wifi2", + "psk": "pass2" + } +] } \ No newline at end of file diff --git a/FW/leo_muziekdoos_esp32/lib/BatterySense b/FW/leo_muziekdoos_esp32/lib/BatterySense index bc76604..b03ad5d 160000 --- a/FW/leo_muziekdoos_esp32/lib/BatterySense +++ b/FW/leo_muziekdoos_esp32/lib/BatterySense @@ -1 +1 @@ -Subproject commit bc76604d6871ab2f69ae3c096c5d911b5a4d1b25 +Subproject commit b03ad5dbb5ba9532d23cfdd8dcd80c28027f7787 diff --git a/FW/leo_muziekdoos_esp32/platformio.ini b/FW/leo_muziekdoos_esp32/platformio.ini index 2f9f4ce..a44fa88 100644 --- a/FW/leo_muziekdoos_esp32/platformio.ini +++ b/FW/leo_muziekdoos_esp32/platformio.ini @@ -21,4 +21,6 @@ extra_scripts = ./littlefsbuilder.py build_flags = -DHARDWARE=2 -DCORE_DEBUG_LEVEL=4 - -DNDEF_DEBUG=1 \ No newline at end of file + -DNDEF_DEBUG=1 +#upload_protocol = espota +#upload_port = muziekdoos.local \ No newline at end of file diff --git a/FW/leo_muziekdoos_esp32/src/config.cpp b/FW/leo_muziekdoos_esp32/src/config.cpp index d938608..8eaaf0d 100644 --- a/FW/leo_muziekdoos_esp32/src/config.cpp +++ b/FW/leo_muziekdoos_esp32/src/config.cpp @@ -4,8 +4,8 @@ #include "LITTLEFS.h" #include "ArduinoJson.h" -const char *tagConfigfile = "/tagconfig.json"; -DynamicJsonDocument tagDoc(512); +const char *tagConfigfile = "/settings.json"; +DynamicJsonDocument settingsDoc(512); bool configInitOK = false; struct tagConfig @@ -16,21 +16,53 @@ struct tagConfig std::vector tags; +bool checkTagConfig(void) +{ + + JsonArray array = settingsDoc["tags"].as(); + log_i("JsonArray size = %d", array.size()); + bool hasError = checkTagConfig(); + return hasError; +} + +String GetWifiPassword(String ssid) +{ + + log_i("Get wifi password for ssid=%s", ssid); + if(ssid == "") return ""; + JsonArray array = settingsDoc["WiFi"].as(); + for (JsonVariant v : array) + { + String netname((const char*)v["ssid"]); + uint16_t result = ssid.compareTo(netname); + + log_v("compare %s(config) with %s(read) = %d",netname.c_str(), ssid.c_str(), result); + if (!result) + { + String password((const char*)v["psk"]); + log_i("ssid found in config", password.c_str()); + return password; + } + } + log_e("password for %s not found",ssid.c_str() ); + return ""; +} + void loadConfig(const char *fname) { log_i("config: load"); File file = LITTLEFS.open(fname); - DeserializationError error = deserializeJson(tagDoc, file); + DeserializationError error = deserializeJson(settingsDoc, file); if (error) { log_e("Failed to deserialize err=%s", error.c_str()); } else { - serializeJsonPretty(tagDoc, Serial); + serializeJsonPretty(settingsDoc, Serial); - JsonArray array = tagDoc["tags"].as(); + JsonArray array = settingsDoc["tags"].as(); log_i("JsonArray size = %d", array.size()); bool hasError = false; for (JsonVariant v : array) @@ -65,7 +97,7 @@ void handleConfig(void) String getConfigSong(String uid) { - JsonArray array = tagDoc["tags"].as(); + JsonArray array = settingsDoc["tags"].as(); for (JsonVariant v : array) { String taguid((const char*)v["TagUID"]); diff --git a/FW/leo_muziekdoos_esp32/src/config.h b/FW/leo_muziekdoos_esp32/src/config.h index 1b98046..a0a83ef 100644 --- a/FW/leo_muziekdoos_esp32/src/config.h +++ b/FW/leo_muziekdoos_esp32/src/config.h @@ -3,6 +3,8 @@ #include "Arduino.h" String getConfigSong(String uid); +String GetWifiPassword(String ssid); + void initConfig(void); void handleConfig(void); \ No newline at end of file diff --git a/FW/leo_muziekdoos_esp32/src/led.cpp b/FW/leo_muziekdoos_esp32/src/led.cpp index a5d85bc..d096abd 100644 --- a/FW/leo_muziekdoos_esp32/src/led.cpp +++ b/FW/leo_muziekdoos_esp32/src/led.cpp @@ -28,7 +28,7 @@ void SetLedColor(CRGB color, bool blink) void initLed(void) { FastLED.addLeds(leds, NUM_LEDS); // GRB ordering is typical - FastLED.setBrightness(80); + FastLED.setBrightness(40); } void handleLed(void) diff --git a/FW/leo_muziekdoos_esp32/src/ota.cpp b/FW/leo_muziekdoos_esp32/src/ota.cpp index 8963c95..d316fc0 100644 --- a/FW/leo_muziekdoos_esp32/src/ota.cpp +++ b/FW/leo_muziekdoos_esp32/src/ota.cpp @@ -2,37 +2,84 @@ OtaProcess_class ota(100); - bool OtaProcess_class::initialize(void) { if (m_newState) { log_i("Otastate = initialize"); m_newState = false; - m_otaState = otaInit; + m_otaState = otaScan; } switch (m_otaState) { - case otaInit: - log_i("Otastate = initialize(init)"); - WiFi.mode(WIFI_STA); - WiFi.begin(SECRET_SSID, SECRET_PASS); - m_otaState = otaConnect; - break; - case otaConnect: - log_i("Otastate = initialize(connect)"); + case otaScan: + { + log_i("Otastate = initialize(scan)"); - if (WiFi.waitForConnectResult() != WL_CONNECTED) + int n = WiFi.scanNetworks(); + if (n == 0) { - log_e("Connection Failed! Retry..."); + log_e("no networks found"); + m_otaState = otaError; } else { - m_otaState = otaSetup; + log_i(" %d wifi networks found", n); + String tmppsk = ""; + for (int i = 0; i < n; ++i) + { + tmppsk = GetWifiPassword(WiFi.SSID(i)); + if(tmppsk != "" && m_ssid == "") + { + m_ssid = WiFi.SSID(i); + m_psk = tmppsk; + } + log_i("[%d] %s %s (%d) [%s]", i, WiFi.SSID(i), (WiFi.encryptionType(i) == WIFI_AUTH_OPEN) ? " " : "*", WiFi.RSSI(i), (tmppsk != "")? "OK": "Not congigured"); + } } - break; + if(m_ssid != "") + { + m_otaState = otaInit; + log_i("Otastate = initialize(scan): done"); + } + else + { + m_otaState = otaError; + log_e("Otastate = initialize(scan): NOT CONFIGURED"); + } + + } + break; + + case otaInit: + { + log_i("Otastate = initialize(init)"); + WiFi.begin(m_ssid.c_str(), m_psk.c_str()); + m_otaState = otaConnect; + log_i("Otastate = initialize(init):done"); + } + break; + + case otaConnect: + { + log_i("Otastate = initialize(connect)"); + uint32_t timeTemp = millis(); + if (m_lastconnectTime - timeTemp > WIFICONNECTINTERVAL) + { + if (WiFi.status() != WL_CONNECTED) + { + log_e("Connection Failed! Retry..."); + } + else + { + m_otaState = otaSetup; + } + m_lastconnectTime = timeTemp; + } + } + break; case otaSetup: { @@ -111,7 +158,6 @@ void OtaProcess_class::idle(void) } } - void OtaProcess_class::active(void) { if (m_newState) @@ -122,7 +168,6 @@ void OtaProcess_class::active(void) idle(); } - void OtaProcess_class::disabled(void) { if (m_newState) @@ -168,7 +213,7 @@ void otaDisable(void) void initOta(void) { - /* noting */ + /* noting */ } OTASTATES getOtaState(void) diff --git a/FW/leo_muziekdoos_esp32/src/ota.h b/FW/leo_muziekdoos_esp32/src/ota.h index 671fd4a..969dd52 100644 --- a/FW/leo_muziekdoos_esp32/src/ota.h +++ b/FW/leo_muziekdoos_esp32/src/ota.h @@ -3,11 +3,15 @@ #include "secrets.h" #include "defines.h" #include "process.h" +#include "config.h" #include "LITTLEFS.h" +#define WIFICONNECTINTERVAL 1000 + typedef enum{ otaInit, + otaScan, otaConnect, otaSetup, otaInitDone, @@ -18,8 +22,9 @@ }OTASTATES; class OtaProcess_class : public processClass { - - + uint32_t m_lastconnectTime; + String m_psk = ""; + String m_ssid = ""; void active(void); bool initialize(void); diff --git a/FW/leo_muziekdoos_esp32/src/power.cpp b/FW/leo_muziekdoos_esp32/src/power.cpp index fb28f41..2fdd154 100644 --- a/FW/leo_muziekdoos_esp32/src/power.cpp +++ b/FW/leo_muziekdoos_esp32/src/power.cpp @@ -7,6 +7,7 @@ uint32_t PowerOtaLongPressTime = 0; uint64_t measure_timer = 0; POWERSTATES powerstate = off; +POWERSTATES lastState = off; Button buttonPower(PWR_BTN, 250UL, 1U, 0); extern OtaProcess_class ota; @@ -116,14 +117,14 @@ void handlePowerState(void) break; case poweringOn2: { - if (!buttonread) + if (buttonPower.releasedFor(200)) { powerstate = powerinit; powerOn(); // if (measureBattery()) // { // log_w("poweringOn: Lowbat"); - // powerstate = lowBatt; + // //powerstate = lowBatt; // } } else @@ -148,13 +149,14 @@ void handlePowerState(void) { if (buttonPower.pressedFor(100)) { + lastState = on; powerstate = poweringOff; break; } // if (handleBattery()) // { // log_w("on: Lowbat"); - // powerstate = lowBatt; + // //powerstate = lowBatt; // break; // } } @@ -181,13 +183,13 @@ void handlePowerState(void) } else { - powerstate = on; + powerstate = lastState; } } break; case poweringOff2: { - if (!buttonread) + if (!buttonPower.releasedFor(200)) { powerstate = off; SetLedColor(CRGB::Red, true); @@ -211,19 +213,32 @@ void handlePowerState(void) log_w("lowbatt"); } } + break; case overTheAir: { - if (!buttonread) + if (buttonPower.releasedFor(200)) { powerstate = overTheAir2; otaEnable(); - SetLedColor(CRGB::Blue); + SetLedColor(CRGB::Blue, true); powerOn(); } - log_i("ota state active, release powerbutton"); + else + { + SetLedColor(CRGB::Blue, false); + log_i("ota state active, release powerbutton"); + } + } + break; case overTheAir2: { + if(buttonPower.pressedFor(200)) + { + log_i("ota poweroff"); + lastState = overTheAir2; + powerstate = poweringOff; + } if (getOtaState() == OTASTATES::otaBusy) { SetLedColor(CRGB::Blue, true); @@ -234,9 +249,14 @@ void handlePowerState(void) { log_i("ota state active, ota Done ==> On"); - powerstate = POWERSTATES::on; + powerstate = POWERSTATES::off; SetLedColor(CRGB::Green, true); } + if (getOtaState() == OTASTATES::otaError) + { + powerstate = POWERSTATES::off; + SetLedColor(CRGB::Red, true); + } } break; } diff --git a/FW/leo_muziekdoos_esp32/src/power.h b/FW/leo_muziekdoos_esp32/src/power.h index a88e258..6790755 100644 --- a/FW/leo_muziekdoos_esp32/src/power.h +++ b/FW/leo_muziekdoos_esp32/src/power.h @@ -13,7 +13,7 @@ #define TIMEOUT_POWER (5 * 1000 * 60) //5minutes timeout #define POWERBUTTONDELAY 1000 #define BATTERYMEASUREDELAY 60000 -#define POWERBUTTONOTADELAY 10000 +#define POWERBUTTONOTADELAY 7000 typedef enum { diff --git a/FW/leo_muziekdoos_esp32/src/sensor.cpp b/FW/leo_muziekdoos_esp32/src/sensor.cpp index 59f13bf..d85d14a 100644 --- a/FW/leo_muziekdoos_esp32/src/sensor.cpp +++ b/FW/leo_muziekdoos_esp32/src/sensor.cpp @@ -40,16 +40,17 @@ void handleSensor(void) { uint32_t timeNow = millis(); - if (lastVbatt - timeNow > VBATTINTERVALL - VBATTMEASPRECHARGE) + if (timeNow - lastVbatt > (VBATTINTERVALL - VBATTMEASPRECHARGE)) { - digitalWrite(MEAS_EN, HIGH); + digitalWrite(MEAS_EN, LOW); log_v("precharge vbatt measurement"); } - if (lastVbatt - timeNow > VBATTINTERVALL) + if (timeNow - lastVbatt > VBATTINTERVALL) { BatterySensor = ADS.readADC(MEAS_ADC); - digitalWrite(MEAS_EN, LOW); + digitalWrite(MEAS_EN, HIGH); + log_i("read vbatt %4.2f",ADS.toVoltage(BatterySensor)); lastVbatt = timeNow; } @@ -88,6 +89,11 @@ void handleHallSensor(void) last_hall_Delta = hall_delta; if(skipfirstSample) { + log_v("First sample skipped"); + if(hall_idle_count) + { + hall_idle_count --; + } return; } if (hall_delta > HALLIDLETHRESHOLD) diff --git a/FW/leo_muziekdoos_esp32/src/sensor.h b/FW/leo_muziekdoos_esp32/src/sensor.h index c16ebab..3c10c51 100644 --- a/FW/leo_muziekdoos_esp32/src/sensor.h +++ b/FW/leo_muziekdoos_esp32/src/sensor.h @@ -4,13 +4,13 @@ #include "board.h" #define ADSINTERVAL 100 -#define VBATTINTERVALL 1000 -#define VBATTMEASPRECHARGE 250 +#define VBATTINTERVALL 6000 +#define VBATTMEASPRECHARGE 240 #define HALLINTERVAL 100 -#define HALLIDLETHRESHOLD 5 -#define HALLIDLESAMPLES 4 -#define HALLPLAYSAMPLES 8 +#define HALLIDLETHRESHOLD 20 +#define HALLIDLESAMPLES 8 +#define HALLPLAYSAMPLES 16 void initSensor(void);