diff --git a/ampel-firmware/ampel-firmware.ino b/ampel-firmware/ampel-firmware.ino index 2713e2dc76413d27a673f9ac1e63b29b3c3cdbe3..c5e82c868a13ce2eca3fd5365e9364c903a50d52 100644 --- a/ampel-firmware/ampel-firmware.ino +++ b/ampel-firmware/ampel-firmware.ino @@ -76,10 +76,9 @@ void setup() { Serial.println(BOARD); #ifdef AMPEL_WIFI - // Try to connect to Wi-Fi WiFiConnect(SENSOR_ID); - Serial.print(F("WiFi STATUS: ")); + Serial.print(F("WiFi - Status: ")); Serial.println(WiFi.status()); if (WiFi.status() == WL_CONNECTED) { @@ -126,7 +125,7 @@ void loop() { } #endif //NOTE: Loop should never take more than 1000ms. Split in smaller methods and logic if needed. - //TODO: Restart every day or week, in order to not let t0 overflow? + //NOTE: Only use millis() for duration comparison, not timestamps comparison. Otherwise, problems happen when millis roll over. uint32_t t0 = millis(); keepServicesAlive(); @@ -151,7 +150,7 @@ void loop() { uint32_t duration = millis() - t0; if (duration > max_loop_duration) { max_loop_duration = duration; - Serial.print("Max loop duration : "); + Serial.print(F("Debug - Max loop duration : ")); Serial.print(max_loop_duration); Serial.println(" ms."); } diff --git a/ampel-firmware/co2_sensor.cpp b/ampel-firmware/co2_sensor.cpp index e9c40c79c322383bd9f771203e33ef7abc02b14a..7110776f7ab9362e431917afa8ebc84cd8bcb653 100644 --- a/ampel-firmware/co2_sensor.cpp +++ b/ampel-firmware/co2_sensor.cpp @@ -116,8 +116,8 @@ namespace sensor { } void logToSerial() { - Serial.println(timestamp); - Serial.print(F("co2(ppm): ")); + Serial.print(timestamp); + Serial.print(F(" - co2(ppm): ")); Serial.print(co2); Serial.print(F(" temp(C): ")); Serial.print(temperature, 1); diff --git a/ampel-firmware/csv_writer.cpp b/ampel-firmware/csv_writer.cpp index 81b7278a3aa08819fee0474ef8af8c24cfdc0b96..653630335527800481fb4907025e494e2de3fd58 100644 --- a/ampel-firmware/csv_writer.cpp +++ b/ampel-firmware/csv_writer.cpp @@ -115,11 +115,7 @@ namespace csv_writer { // Open dir folder Serial.println("Filesystem content:"); showFilesystemContent(); - - if (FS_LIB.exists(filename)) { - Serial.print(filename); - Serial.println(" has been found."); - } + Serial.println(); } File openOrCreate() { @@ -145,7 +141,7 @@ namespace csv_writer { if (written_bytes == 0) { Serial.println(F("Nothing written. Disk full?")); } else { - Serial.println(F("Wrote file content:")); + Serial.print(F("CSV - Wrote : ")); Serial.print(csv_line); last_successful_write = ntp::getLocalTime(); } @@ -160,7 +156,6 @@ namespace csv_writer { void logIfTimeHasCome(const String &timeStamp, const int16_t &co2, const float &temperature, const float &humidity) { unsigned long now = seconds(); - //TODO: Write average since last CSV write? if (now - last_written_at > config::csv_interval) { last_written_at = now; log(timeStamp, co2, temperature, humidity); diff --git a/ampel-firmware/led_effects.cpp b/ampel-firmware/led_effects.cpp index 1410a1475ec6dbae0ef5912373555837636dedd9..4842e79a4b67b159ab88a47c17dfd06f9c8d682c 100644 --- a/ampel-firmware/led_effects.cpp +++ b/ampel-firmware/led_effects.cpp @@ -146,7 +146,7 @@ namespace led_effects { static uint16_t wheel_offset = 0; unsigned long t0 = millis(); pixels.setBrightness(config::max_brightness); - while (millis() < t0 + duration_ms) { + while (millis() - t0 < duration_ms) { for (int i = 0; i < NUMPIXELS; i++) { pixels.setPixelColor(i, pixels.ColorHSV(i * 65535 / NUMPIXELS + wheel_offset)); wheel_offset += hue_increment; diff --git a/ampel-firmware/lorawan.cpp b/ampel-firmware/lorawan.cpp index 75363a0337ce887c860d38fb7c5a940bed3e642f..7e027703ebd6505577005de734c3272beb785789 100644 --- a/ampel-firmware/lorawan.cpp +++ b/ampel-firmware/lorawan.cpp @@ -82,18 +82,18 @@ namespace lorawan { u1_t nwkKey[16]; u1_t artKey[16]; LMIC_getSessionKeys(&netid, &devaddr, nwkKey, artKey); - Serial.print(F("netid: ")); + Serial.print(F(" netid: ")); Serial.println(netid, DEC); - Serial.print(F("devaddr: ")); + Serial.print(F(" devaddr: ")); Serial.println(devaddr, HEX); - Serial.print(F("AppSKey: ")); + Serial.print(F(" AppSKey: ")); for (size_t i = 0; i < sizeof(artKey); ++i) { if (i != 0) Serial.print("-"); printHex2(artKey[i]); } - Serial.println(""); - Serial.print("NwkSKey: "); + Serial.println(); + Serial.print(" NwkSKey: "); for (size_t i = 0; i < sizeof(nwkKey); ++i) { if (i != 0) Serial.print("-"); @@ -184,7 +184,7 @@ namespace lorawan { void preparePayloadIfTimeHasCome(const int16_t &co2, const float &temperature, const float &humidity) { static unsigned long last_sent_at = 0; unsigned long now = seconds(); - if (connected && (now > last_sent_at + config::lorawan_sending_interval)) { + if (connected && (now - last_sent_at > config::lorawan_sending_interval)) { last_sent_at = now; preparePayload(co2, temperature, humidity); } diff --git a/ampel-firmware/mqtt.cpp b/ampel-firmware/mqtt.cpp index 29f609fdf0751bbcebcc0b501c08e12d7212b6a6..ebb4ad24182c9eeec721c44ca59e892c7056a54c 100644 --- a/ampel-firmware/mqtt.cpp +++ b/ampel-firmware/mqtt.cpp @@ -41,7 +41,7 @@ namespace mqtt { void publish(const String ×tamp, int16_t co2, float temperature, float humidity) { if (WiFi.status() == WL_CONNECTED && mqttClient.connected()) { led_effects::onBoardLEDOn(); - Serial.print(F("Publishing MQTT message ... ")); + Serial.print(F("MQTT - Publishing message ... ")); char payload[75]; // Should be enough for json... snprintf(payload, sizeof(payload), json_sensor_format, timestamp.c_str(), co2, temperature, humidity); @@ -177,7 +177,7 @@ namespace mqtt { } void reconnect() { - if (last_failed_at > 0 && seconds() - last_failed_at < config::wait_after_fail) { + if (last_failed_at > 0 && (seconds() - last_failed_at < config::wait_after_fail)) { // It failed less than wait_after_fail ago. Not even trying. return; } @@ -185,7 +185,7 @@ namespace mqtt { // No WIFI return; } - Serial.print(F("Attempting MQTT connection...")); + Serial.print(F("MQTT - Attempting connection...")); led_effects::onBoardLEDOn(); // Wait for connection, at most 15s (default) @@ -216,7 +216,6 @@ namespace mqtt { void publishIfTimeHasCome(const String &timeStamp, const int16_t &co2, const float &temp, const float &hum) { // Send message via MQTT according to sending interval unsigned long now = seconds(); - //TODO: Send average since last MQTT message? if (now - last_sent_at > config::sending_interval) { last_sent_at = now; publish(timeStamp, co2, temp, hum); diff --git a/ampel-firmware/util.h b/ampel-firmware/util.h index 0ffe5eb4d35d2243512035c07e09c1d44464fea8..2997933480b06db67b18a09bafa2d156d8b7e7b5 100644 --- a/ampel-firmware/util.h +++ b/ampel-firmware/util.h @@ -36,6 +36,7 @@ namespace util { } } +//NOTE: Only use seconds() for duration comparison, not timestamps comparison. Otherwise, problems happen when millis roll over. #define seconds() (millis() / 1000UL) extern uint32_t max_loop_duration; const extern String SENSOR_ID; diff --git a/ampel-firmware/web_server.cpp b/ampel-firmware/web_server.cpp index 7501263d6abebc3c0849726ecf65eb1cce6f28c9..9cba04f27e880890b72310241ab985f652cc1737 100644 --- a/ampel-firmware/web_server.cpp +++ b/ampel-firmware/web_server.cpp @@ -113,7 +113,7 @@ namespace web_server { "<tr><td>Free heap space</td><td>%6d bytes</td></tr>\n" "<tr><td>Max loop duration</td><td>%5d ms</td></tr>\n" "<tr><td>Board</td><td>%s</td></tr>\n" - "<tr><td>Uptime</td><td>%4d h %02d min %02d s</td></tr>\n" + "<tr><td>Uptime</td><td>%2d d %4d h %02d min %02d s</td></tr>\n" "</table>\n" "<div id='log' class='pure-u-1 pure-u-md-1-2'></div>\n" #ifdef AMPEL_CSV @@ -198,6 +198,8 @@ namespace web_server { } unsigned long ss = seconds(); + uint8_t dd = ss / 86400; + ss -= dd * 86400; unsigned int hh = ss / 3600; ss -= hh * 3600; uint8_t mm = ss / 60; @@ -232,7 +234,7 @@ namespace web_server { config::lorawan_sending_interval, #endif config::temperature_offset, SENSOR_ID.c_str(), SENSOR_ID.c_str(), WiFi.localIP().toString().c_str(), - WiFi.localIP().toString().c_str(), get_free_heap_size(), max_loop_duration, BOARD, hh, mm, ss); + WiFi.localIP().toString().c_str(), get_free_heap_size(), max_loop_duration, BOARD, dd, hh, mm, ss); http.sendContent(content); diff --git a/ampel-firmware/wifi_util.cpp b/ampel-firmware/wifi_util.cpp index 60fd8fa691c98a0db45c33aff73caff0194cf496..dc496293345f5b3f743e6ed369d5e792376514d9 100644 --- a/ampel-firmware/wifi_util.cpp +++ b/ampel-firmware/wifi_util.cpp @@ -23,7 +23,7 @@ void WiFiConnect(const String &hostname) { WiFi.setHostname(hostname.c_str()); #endif - Serial.print("\nConnecting to "); + Serial.print(F("WiFi - Connecting to ")); Serial.println(config::wifi_ssid); WiFi.begin(config::wifi_ssid, config::wifi_password); @@ -35,11 +35,11 @@ void WiFiConnect(const String &hostname) { if (WiFi.status() == WL_CONNECTED) { led_effects::showKITTWheel(color::green); Serial.println(); - Serial.print("\nWiFi connected, IP address: "); + Serial.print(F("WiFi - Connected! IP address: ")); Serial.println(WiFi.localIP()); } else { //TODO: Allow sensor to work as an Access Point, in order to define SSID & password? led_effects::showKITTWheel(color::red); - Serial.println("\nConnection to WiFi failed"); + Serial.println(F("Connection to WiFi failed")); } }