Skip to content

Commit

Permalink
Arduino 200 (#8)
Browse files Browse the repository at this point in the history
* port arduino 2.0.0

* reset button

* fix time to load graph

* led colors

* fix interrupt, no float on ISR
  • Loading branch information
ldab authored Apr 30, 2022
1 parent f7a9880 commit 9b743ac
Show file tree
Hide file tree
Showing 7 changed files with 172 additions and 35 deletions.
Binary file modified .pio/build/esp32/firmware.elf
Binary file not shown.
5 changes: 2 additions & 3 deletions include/info.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,15 +50,14 @@ const char HTTP_INFO[] PROGMEM = R"rawliteral(
<dl>
<dt>Firmware Version</dt>
<dd>%FW_VER%</dd>
<dt>IDF SDK</dt>
<dt>Arduino version</dt>
<dd>%SDK_VER%</dd>
<dt>Build Date</dt>
<dd>%ABOUT_DATE%</dd>
</dl>
<form action="/update" method="get"><button>Update</button></form><br>
<hr><br><br>
<form action="/erase" method="get"><button class="D">Erase WiFi Config</button></form><br>
<p>Github <a href="https://github.com/tzapu/WiFiManager">https://github.com/tzapu/WiFiManager</a>.</p>
<form action="/reset" method="get"><button class="D">Reset</button></form><br>
</div>
</body>

Expand Down
5 changes: 5 additions & 0 deletions include/js.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
73 changes: 73 additions & 0 deletions pcb/esp32_din_rail.csv
Original file line number Diff line number Diff line change
@@ -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","","","","","",""
Binary file added pcb/esp32_din_rail.xls
Binary file not shown.
14 changes: 8 additions & 6 deletions platformio.ini
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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

Expand Down
110 changes: 84 additions & 26 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,10 @@ float tInt;
float currentSetpoint = -9999;
std::vector<float> readings;
std::vector<long> 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;
Expand Down Expand Up @@ -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:
Expand All @@ -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)
{
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -482,6 +538,7 @@ void onFire(AsyncWebServerRequest *request)
DBG("tTotal %dmin\n", tTotal);

info = "Firing 🔥 @" + String(segments[step][0]) + "°C";
led(PURPLE);

printSegments();
rampRate();
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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);
Expand All @@ -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);
}
}

Expand Down Expand Up @@ -814,17 +866,15 @@ 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);

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"); }
Expand Down Expand Up @@ -916,6 +966,7 @@ void setup()
#endif

pinInit();
led(RED);

mqttReconnectTimer =
xTimerCreate("mqttTimer", pdMS_TO_TICKS(2000), pdFALSE, (void *)0,
Expand Down Expand Up @@ -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);
});
Expand Down Expand Up @@ -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 ||
Expand Down

0 comments on commit 9b743ac

Please sign in to comment.