diff --git a/.pio/build/esp32/firmware.elf b/.pio/build/esp32/firmware.elf index 6e36308..bc0dfe5 100644 Binary files a/.pio/build/esp32/firmware.elf and b/.pio/build/esp32/firmware.elf differ diff --git a/include/info.h b/include/info.h index 96384c8..6a23c2b 100644 --- a/include/info.h +++ b/include/info.h @@ -50,15 +50,14 @@ const char HTTP_INFO[] PROGMEM = R"rawliteral(
Firmware Version
%FW_VER%
-
IDF SDK
+
Arduino version
%SDK_VER%
Build Date
%ABOUT_DATE%




-

-

Github https://github.com/tzapu/WiFiManager.

+

diff --git a/include/js.h b/include/js.h index af2eb66..330105d 100644 --- a/include/js.h +++ b/include/js.h @@ -102,6 +102,11 @@ if (!!window.EventSource) { plotTemperature(parseFloat(e.data)); }, false); + source.addEventListener('KW', function(e) { + // console.log("KW", e.data); + document.getElementById("KW").innerHTML = e.data; + }, false); + source.addEventListener('display', function(e) { document.getElementById("display").innerHTML = e.data; }, false); diff --git a/pcb/esp32_din_rail.csv b/pcb/esp32_din_rail.csv new file mode 100644 index 0000000..ea44c76 --- /dev/null +++ b/pcb/esp32_din_rail.csv @@ -0,0 +1,73 @@ +"Source:","C:\PERSONAL\kiln\pcb\esp32_din_rail.kicad_sch" +"Date:","2022-04-26 16:50:59" +"Tool:","Eeschema (6.0.1)" +"Generator:","C:\Program Files\KiCad\6.0\bin\scripting\plugins/bom_csv_grouped_by_value.py" +"Component Count:","38" + +"Individual Components:" + +"Item","Qty","Reference(s)","Value","LibPart","Footprint","Datasheet","LCSC","MANUFACTURER","Mouser","PARTREV","PN","STANDARD" +"","","C1","10u","Device:C_Small","Capacitor_SMD:C_0603_1608Metric","~","","","","","JMK107BJ106MA-T","" +"","","C2","100n","Device:C_Small","Capacitor_SMD:C_0603_1608Metric","~","","","","","","" +"","","C3","10u","Device:C_Small","Capacitor_SMD:C_0603_1608Metric","~","","","","","JMK107BJ106MA-T","" +"","","C4","10u","Device:C_Small","Capacitor_SMD:C_0603_1608Metric","~","","","","","","" +"","","C5","100u","Device:C_Small","Capacitor_SMD:C_1206_3216Metric","~","C77085","","","","","" +"","","C6","100n","Device:C_Small","Capacitor_SMD:C_0603_1608Metric","~","","","","","","" +"","","C7","100n","Device:C_Small","Capacitor_SMD:C_0603_1608Metric","~","","","","","","" +"","","C8","100n","Device:C_Small","Capacitor_SMD:C_0603_1608Metric","~","","","","","","" +"","","D1","LED_RBAG","Device:LED_RBAG","LED_SMD:LED_Cree-PLCC4_2x2mm_CW","~","C108793","","","","","" +"","","H1","MountingHole","Mechanical:MountingHole","MountingHole:MountingHole_2.7mm_M2.5","~","","","","","","" +"","","H2","MountingHole","Mechanical:MountingHole","MountingHole:MountingHole_2.7mm_M2.5","~","","","","","","" +"","","J1","Screw_Terminal_01x02","Connector:Screw_Terminal_01x02","TerminalBlock_RND:TerminalBlock_RND_205-00067_1x02_P7.50mm_Horizontal","~","","","691216910002 ","","","" +"","","J2","Conn_01x03","Connector:Conn_01x03_Male","Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical","~","","","","","","" +"","","J3","DNP","Connector:Conn_01x02_Male","Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical","~","","","","","DNP","" +"","","J4","Screw_Terminal_01x06","Connector:Screw_Terminal_01x06","TerminalBlock_Phoenix:TerminalBlock_Phoenix_PT-1,5-6-5.0-H_1x06_P5.00mm_Horizontal","~","","","1935200 ","","","" +"","","JP1","SolderJumper_2_Open","Jumper:SolderJumper_2_Open","Jumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm","~","","","","","","" +"","","L1","L_Small","Device:L_Small","Inductor_SMD:L_0402_1005Metric","~","","","","","BLM15HD102SN1D","" +"","","L2","L_Small","Device:L_Small","Inductor_SMD:L_0402_1005Metric","~","","","","","BLM15HD102SN1D","" +"","","L3","4.7u","Device:L_Small","Inductor_SMD:L_1210_3225Metric","~","","","","","","" +"","","Q1"," PMV60ENEAR ","Transistor_FET:NTR2101P","Package_TO_SOT_SMD:SOT-23","http://www.onsemi.com/pub/Collateral/NTR2101P-D.PDF","",""," 771-PMV60ENEAR ","","","" +"","","R1","10K","Device:R_Small","Resistor_SMD:R_0603_1608Metric","~","","","","","","" +"","","R2","1K","Device:R_Small","Resistor_SMD:R_0603_1608Metric","~","C384295","","","","","" +"","","R3","1K","Device:R_Small","Resistor_SMD:R_0603_1608Metric","~","C384295","","","","","" +"","","R4","1K","Device:R_Small","Resistor_SMD:R_0603_1608Metric","~","C384295","","","","","" +"","","R5","1K","Device:R_Small","Resistor_SMD:R_0603_1608Metric","~","C384295","","","","","" +"","","R6","10K","Device:R_Small","Resistor_SMD:R_0603_1608Metric","~","","","","","","" +"","","R7","10K","Device:R_Small","Resistor_SMD:R_0603_1608Metric","~","","","","","","" +"","","R8","10K","Device:R_Small","Resistor_SMD:R_0603_1608Metric","~","","","","","","" +"","","R9","10K","Device:R_Small","Resistor_SMD:R_0603_1608Metric","~","","","","","","" +"","","R10","10K","Device:R_Small","Resistor_SMD:R_0603_1608Metric","~","","","","","DNP","" +"","","R11","10K","Device:R_Small","Resistor_SMD:R_0603_1608Metric","~","","","","","DNP","" +"","","R12","1K","Device:R_Small","Resistor_SMD:R_0603_1608Metric","~","C384295","","","","","" +"","","R13","10K","Device:R_Small","Resistor_SMD:R_0603_1608Metric","~","","","","","","" +"","","SW1","SW_Push","Switch:SW_Push","Button_Switch_THT:SW_PUSH_6mm","~","","","","","","" +"","","U1","ESP32-WROOM-32","RF_Module:ESP32-WROOM-32","RF_Module:ESP32-WROOM-32","https://www.espressif.com/sites/default/files/documentation/esp32-wroom-32_datasheet_en.pdf","","","","","","" +"","","U2","PDM2-S12-S3-S","PDM2-S12-S3-S:PDM2-S12-S3-S","PDM2-S12-S3-S:CONV_PDM2-S12-S3-S","","","CUI INC","","1.03","","MANUFACTURER RECOMMENDATIONS" +"","","U3","MAX31855KASA","Sensor_Temperature:MAX31855KASA","Package_SO:SOIC-8_3.9x4.9mm_P1.27mm","http://datasheets.maximintegrated.com/en/ds/MAX31855.pdf","","","","","","" +"","","U4","AP62201WU-7","Regulator_Switching:DIO6970","Package_TO_SOT_SMD:SOT-23-6","http://www.dioo.com/uploads/product/20190313/7a4d03690a9be004035eb1035a429f24.pdf","","","","","","" + + + +"Collated Components:" + +"Item","Qty","Reference(s)","Value","LibPart","Footprint","Datasheet","LCSC","MANUFACTURER","Mouser","PARTREV","PN","STANDARD" +"1","3","C1, C3, C4","10u","Device:C_Small","Capacitor_SMD:C_0603_1608Metric","~","","","","","JMK107BJ106MA-T","" +"2","4","C2, C6, C7, C8","100n","Device:C_Small","Capacitor_SMD:C_0603_1608Metric","~","","","","","","" +"3","1","C5","100u","Device:C_Small","Capacitor_SMD:C_1206_3216Metric","~","C77085","","","","","" +"4","1","D1","LED_RBAG","Device:LED_RBAG","LED_SMD:LED_Cree-PLCC4_2x2mm_CW","~","C108793","","","","","" +"5","2","H1, H2","MountingHole","Mechanical:MountingHole","MountingHole:MountingHole_2.7mm_M2.5","~","","","","","","" +"6","1","J1","Screw_Terminal_01x02","Connector:Screw_Terminal_01x02","TerminalBlock_RND:TerminalBlock_RND_205-00067_1x02_P7.50mm_Horizontal","~","","","691216910002 ","","","" +"7","1","J2","Conn_01x03","Connector:Conn_01x03_Male","Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical","~","","","","","","" +"8","1","J3","DNP","Connector:Conn_01x02_Male","Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical","~","","","","","DNP","" +"9","1","J4","Screw_Terminal_01x06","Connector:Screw_Terminal_01x06","TerminalBlock_Phoenix:TerminalBlock_Phoenix_PT-1,5-6-5.0-H_1x06_P5.00mm_Horizontal","~","","","1935200 ","","","" +"10","1","JP1","SolderJumper_2_Open","Jumper:SolderJumper_2_Open","Jumper:SolderJumper-2_P1.3mm_Open_RoundedPad1.0x1.5mm","~","","","","","","" +"11","2","L1, L2","L_Small","Device:L_Small","Inductor_SMD:L_0402_1005Metric","~","","","","","BLM15HD102SN1D","" +"12","1","L3","4.7u","Device:L_Small","Inductor_SMD:L_1210_3225Metric","~","","","","","","" +"13","1","Q1"," PMV60ENEAR ","Transistor_FET:NTR2101P","Package_TO_SOT_SMD:SOT-23","http://www.onsemi.com/pub/Collateral/NTR2101P-D.PDF","",""," 771-PMV60ENEAR ","","","" +"14","8","R1, R6, R7, R8, R9, R10, R11, R13","10K","Device:R_Small","Resistor_SMD:R_0603_1608Metric","~","","","","","DNP","" +"15","5","R2, R3, R4, R5, R12","1K","Device:R_Small","Resistor_SMD:R_0603_1608Metric","~","C384295","","","","","" +"16","1","SW1","SW_Push","Switch:SW_Push","Button_Switch_THT:SW_PUSH_6mm","~","","","","","","" +"17","1","U1","ESP32-WROOM-32","RF_Module:ESP32-WROOM-32","RF_Module:ESP32-WROOM-32","https://www.espressif.com/sites/default/files/documentation/esp32-wroom-32_datasheet_en.pdf","","","","","","" +"18","1","U2","PDM2-S12-S3-S","PDM2-S12-S3-S:PDM2-S12-S3-S","PDM2-S12-S3-S:CONV_PDM2-S12-S3-S","","","CUI INC","","1.03","","MANUFACTURER RECOMMENDATIONS" +"19","1","U3","MAX31855KASA","Sensor_Temperature:MAX31855KASA","Package_SO:SOIC-8_3.9x4.9mm_P1.27mm","http://datasheets.maximintegrated.com/en/ds/MAX31855.pdf","","","","","","" +"20","1","U4","AP62201WU-7","Regulator_Switching:DIO6970","Package_TO_SOT_SMD:SOT-23-6","http://www.dioo.com/uploads/product/20190313/7a4d03690a9be004035eb1035a429f24.pdf","","","","","","" diff --git a/pcb/esp32_din_rail.xls b/pcb/esp32_din_rail.xls new file mode 100644 index 0000000..d43dbb4 Binary files /dev/null and b/pcb/esp32_din_rail.xls differ diff --git a/platformio.ini b/platformio.ini index 342ba1f..cbcfb27 100644 --- a/platformio.ini +++ b/platformio.ini @@ -13,7 +13,7 @@ default_envs = esp32 build_flags = - '-D FIRMWARE_VERSION="1.0.0"' + '-D FIRMWARE_VERSION="2.0.0"' -D VERBOSE ; -DCORE_DEBUG_LEVEL=3 @@ -23,13 +23,15 @@ lib_deps_external = # Using a library name marvinroger/AsyncMqttClient @ 0.9.0 ;Adafruit MAX31855 library@1.2.1 // It is added locally ./lib as NAN is returned upon error - adafruit/Adafruit BusIO @ 1.10.0 - me-no-dev/AsyncTCP@1.1.1 - me-no-dev/ESP Async WebServer@1.2.3 - bblanchon/ArduinoJson @ 6.19.3 + adafruit/Adafruit BusIO @ 1.11.4 + me-no-dev/AsyncTCP @ 1.1.1 + ; me-no-dev/ESP Async WebServer + https://github.com/me-no-dev/ESPAsyncWebServer.git#f71e3d427b5be9791a8a2c93cf8079792c3a9a26 + bblanchon/ArduinoJson @ 6.19.4 + Wire @ 2.0.0 [env:esp32] -platform = espressif32@3.5.0 # IDF 4.3.2 +platform = espressif32@4.1.0 board = pico32 framework = arduino diff --git a/src/main.cpp b/src/main.cpp index e92d2c7..a911f4a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -107,9 +107,10 @@ float tInt; float currentSetpoint = -9999; std::vector readings; std::vector epocTime; -volatile float instPower; -volatile float energy = 0; volatile float current; +volatile uint32_t instPower; +volatile uint32_t energy = 0; +volatile uint32_t pulseInterval; // Control variables volatile uint32_t energyMillis = 0; @@ -150,6 +151,16 @@ String processor(const String &var); String readFile(fs::FS &fs, const char *path); void writeFile(fs::FS &fs, const char *path, const char *message); +typedef enum { + RED, + GREEN, + BLUE, + YELLOW, + WHITE, + PURPLE, + CYAN, +} led_color_t; + class CaptiveRequestHandler : public AsyncWebHandler { public: @@ -170,6 +181,49 @@ class CaptiveRequestHandler : public AsyncWebHandler void espRestart() { ESP.restart(); } +void ledOff() +{ + digitalWrite(LED_R, HIGH); + digitalWrite(LED_G, HIGH); + digitalWrite(LED_B, HIGH); +} + +void led(led_color_t color) +{ + ledOff(); + switch (color) { + case RED: + digitalWrite(LED_R, LOW); + break; + case GREEN: + digitalWrite(LED_G, LOW); + break; + case BLUE: + digitalWrite(LED_B, LOW); + break; + case YELLOW: + digitalWrite(LED_R, LOW); + digitalWrite(LED_G, LOW); + break; + case WHITE: + digitalWrite(LED_R, LOW); + digitalWrite(LED_G, LOW); + digitalWrite(LED_B, LOW); + break; + case PURPLE: + digitalWrite(LED_R, LOW); + digitalWrite(LED_B, LOW); + break; + case CYAN: + digitalWrite(LED_G, LOW); + digitalWrite(LED_B, LOW); + break; + + default: + break; + } +} + // Send notification to HA, max 32 bytes void notify(char *msg, size_t length) { @@ -275,7 +329,9 @@ String processor(const String &var) if (var == "FW_VER") return String(FIRMWARE_VERSION); if (var == "SDK_VER") - return String(esp_get_idf_version()); + return String(ESP_ARDUINO_VERSION_MAJOR) + "." + + String(ESP_ARDUINO_VERSION_MINOR) + "." + + String(ESP_ARDUINO_VERSION_PATCH); if (var == "ABOUT_DATE") { String ret = String(__DATE__) + " " + String(__TIME__); return ret; @@ -482,6 +538,7 @@ void onFire(AsyncWebServerRequest *request) DBG("tTotal %dmin\n", tTotal); info = "Firing 🔥 @" + String(segments[step][0]) + "°C"; + led(PURPLE); printSegments(); rampRate(); @@ -540,12 +597,14 @@ void sendData() StaticJsonDocument<192> doc; char payload[192]; + current = (instPower / 1000.0f) / 230.0f; + JsonObject feeds = doc.createNestedObject("feeds"); feeds["T"] = temp; feeds["I"] = current; - feeds["P"] = instPower; + feeds["P"] = instPower / 1000.0f; feeds["E"] = energy; - feeds["$"] = energy * COSTKWH; + feeds["$"] = energy / 1000.0f * COSTKWH; feeds["Tint"] = tInt; feeds["St"] = currentSetpoint; feeds["Step"] = step; @@ -620,40 +679,33 @@ void IRAM_ATTR readPower() if (energy == 0) { // We don't know the time difference between pulse, reset // TODO get from cloud in case MCU reset - energy = 1 / 1000.0f; + energy = 1; current = 0; instPower = 0; energyMillis = millis(); } else { - volatile uint32_t pulseInterval = millis() - energyMillis; + pulseInterval = millis() - energyMillis; if (pulseInterval < 100) { // 10*sqrt(2) Amps =~ 1106.8ms // DBG("DEBOUNCE"); return; } - energy += 1 / 1000.0f; // each pulse is 1Wh - instPower = (3600) / (pulseInterval / 1000.0f); // 1Wh = 3600J - current = instPower / 230.0f; + energy++; // each pulse is 0,5Wh + instPower = 7200 * pulseInterval; // 1Wh = 3600J calculate in mW avoid float energyMillis = millis(); } volatile static bool problem = false; - if (!digitalRead(RELAY)) { + if (digitalRead(RELAY)) { if (problem == true) { - char shortError[32]; - sprintf(shortError, "I = %.1fA P = %.1fW", current, instPower); - notify(shortError, strlen(shortError)); + // notify((char *)"shortError", strlen("shortError")); } - problem = true; } else problem = false; - - DBG("Current: %.1fA, Power: %.1fW, Energy: %.1fKWh\n", current, instPower, - energy); } void getTemp() @@ -691,13 +743,12 @@ void getTemp() } else { static uint32_t log = millis(); tErr = false; - DBG("T: %.02fdegC\n", temp); - char msg[8]; sprintf(msg, "%.01f", temp); struct tm timeinfo; - if ((millis() - log) > (60 * 1000) && getLocalTime(&timeinfo)) { + if (((millis() - log) > (60 * 1000) || readings.size() == 0) && + getLocalTime(&timeinfo)) { time_t epoc = mktime(&timeinfo); epocTime.push_back((long)epoc); readings.push_back(temp); @@ -706,9 +757,10 @@ void getTemp() } char instPowerString[8]; - sprintf(instPowerString, "%.01f", instPower); + sprintf(instPowerString, "%.01f", instPower / 1000.0f); events.send(msg, "temperature"); events.send(instPowerString, "KW"); + DBG("T: %sdegC P: %sW\n", msg, instPowerString); } } @@ -814,7 +866,7 @@ void rampRate() void pinInit() { pinMode(POWER, INPUT); - // attachInterrupt(POWER, readPower, FALLING); //internal SPI on PICO + attachInterrupt(POWER, readPower, FALLING); // internal SPI on PICO pinMode(RELAY, OUTPUT); digitalWrite(RELAY, LOW); @@ -822,9 +874,7 @@ void pinInit() pinMode(LED_R, OUTPUT); pinMode(LED_G, OUTPUT); pinMode(LED_B, OUTPUT); - digitalWrite(LED_R, HIGH); - digitalWrite(LED_G, HIGH); - digitalWrite(LED_B, HIGH); + ledOff(); } void onMqttConnect(bool sessionPresent) { DBG("Connected to MQTT.\n"); } @@ -916,6 +966,7 @@ void setup() #endif pinInit(); + led(RED); mqttReconnectTimer = xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void *)0, @@ -1017,6 +1068,11 @@ void setup() request->send_P(200, "text/html", HTTP_INFO, processor); }); + server.on("/reset", HTTP_GET, [](AsyncWebServerRequest *request) { + request->redirect("/"); + restart.once_ms(1000, espRestart); + }); + server.on("/update", HTTP_GET, [](AsyncWebServerRequest *request) { request->send_P(200, "text/html", HTTP_UPDATE, processor); }); @@ -1055,6 +1111,8 @@ void setup() tempTimer.attach(2, getTemp); sendTimer.attach_ms(10000L, sendData); + led(GREEN); + // https://github.com/espressif/arduino-esp32/blob/master/libraries/ESP32/examples/ResetReason/ResetReason.ino esp_reset_reason_t reset_reason = esp_reset_reason(); if (reset_reason == ESP_RST_PANIC || reset_reason == ESP_RST_INT_WDT ||