From cafe9311628009317e2f8667a3837f3e3cc05b99 Mon Sep 17 00:00:00 2001 From: Splatink <103926418+Splatink@users.noreply.github.com> Date: Mon, 8 Jul 2024 09:03:20 +0300 Subject: [PATCH] Add files via upload --- readme.md | 8 +--- src/main.cpp | 105 ++++++++++++++++++++++++++++++++++++++++++++------- updates.md | 5 +++ 3 files changed, 97 insertions(+), 21 deletions(-) diff --git a/readme.md b/readme.md index 388dd96..7bf3370 100644 --- a/readme.md +++ b/readme.md @@ -1,9 +1,3 @@ A digital clock and thermomter/hydrometer written in Arduino for the Raspberry Pi Pico using an SH1106 OLED dispaly and a BME280 environment sensor -Pin definitions and display drivers (as long as the display is 128x64) can easily be changed in the code - -Theoretical battery life is ~153 hours (6 days 9 hours) with a standard 2000mAh 18650 Li-Ion battery, power draw is around 12.5-13.5 mA - -The battery level is read by the battery going into a simple 10k resistor voltage divider into ADC1 - -The OLED display and BME280 share the same I2C lines into the Pico +Pin definitions and display drivers (as long as the display is 128x64) can easily be changed in the code \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 8e2f133..4cbcd1b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -19,12 +19,63 @@ U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE); const char* ssid = "Limbo"; const char* password = "95H2O862U235@#"; -bool lpmode; +bool lpmode, debugmode; WiFiUDP ntpUDP; NTPClient timeClient(ntpUDP, "gr.pool.ntp.org", 0, 1296000000); Adafruit_BME280 bme; +void serialDebugInfo(float batteryVoltage, float batteryPrecentage, int wifiRSSI, int wifiStatus, const char* day, bool brightness, float temperature, float humidity, float pressure, bool disconnected) +{ + Serial1.print("Battery Voltage: "); + Serial1.println(batteryVoltage, 1); + Serial1.print("Battery Precentage: "); + Serial1.println(batteryPrecentage, 0); + Serial1.print("WiFi RSSI: "); + Serial1.println(wifiRSSI); + Serial1.print("WiFi Status: "); + Serial1.println(wifiStatus); + Serial1.print("Day: "); + Serial1.println(day); + Serial1.print("Brightness: "); + if (brightness == true) + { + Serial1.println("LOW"); + } + else + { + Serial1.println("HIGH"); + } + Serial1.print("Manually Disconnected WiFi: "); + if (disconnected == false) + { + Serial1.println("NO"); + } + else + { + Serial1.println("YES"); + } + Serial1.print("Low Power Mode: "); + if (lpmode == false) + { + Serial1.println("INACTIVE"); + } + else + { + Serial1.println("ACTIVE"); + } + Serial1.print("Temperature: "); + Serial1.print(temperature, 1); + Serial1.println(" C"); + Serial1.print("Humidity: "); + Serial1.print(humidity, 1); + Serial1.println(" %"); + Serial1.print("Pressure: "); + Serial1.print((pressure * 0.01), 1); + Serial1.println(" hPa"); + Serial1.println(""); +} + int batteryReader() { static int battery, readings, batterya; @@ -40,15 +91,15 @@ int batteryReader() return battery; } -float getBatteryVoltage() +float getBatteryVoltage(int battery) { - float battv = (batteryReader() * 3.3 / 4095) * 2; + float battv = (battery * 3.3 / 4095) * 2; return battv; } -float getBatteryPrecentage() +float getBatteryPrecentage(float battv) { - float battp = (getBatteryVoltage() - 2.5) / (4.2 - 2.5) * 100; + float battp = (battv - 2.5) / (4.2 - 2.5) * 100; if (battp <= 0) { battp = 1; @@ -79,8 +130,7 @@ int getWifiRSSI() return RSSI; } -int getWifiStatus(){ - int RSSI = getWifiRSSI(); +int getWifiStatus(int RSSI){ int wifiStatus; if (RSSI >= -55 && WiFi.status() == WL_CONNECTED) { @@ -106,10 +156,10 @@ int getWifiStatus(){ return wifiStatus; } -const char* getDay() +const char* getDay(int dayInt) { const char* day; - switch (timeClient.getDay()) + switch (dayInt) { case 0: day = "Sun"; @@ -298,7 +348,7 @@ void setup() Wire.setSCL(SCK); Wire.setSDA(SDA); WiFi.mode(WIFI_STA); - WiFi.hostname("pico-clock"); + WiFi.hostname("pico-clock"); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { @@ -318,21 +368,48 @@ void setup() } for (int i = 0; i < 10; i++) { - getBatteryPrecentage(); + getBatteryPrecentage(getBatteryVoltage(batteryReader())); getWifiRSSI(); } + if (digitalRead(BUTTON) == true) + { + Serial1.setTX(0); + Serial1.setRX(1); + Serial1.begin(9600); + debugmode = true; + } } void loop() { - bool disconnected; + static bool disconnected = false; + static int counter = 0; timeClient.update(); - displayClock(getDay(), getBatteryPrecentage(), getWifiStatus(), timeClient.getHours(), timeClient.getMinutes(), checkBrightness(), readTemperature(), readHumidity()); + + const char* day = getDay(timeClient.getDay()); + float batteryVoltage = getBatteryVoltage(batteryReader()); + float batteryPrecentage = getBatteryPrecentage(batteryVoltage); + int wifiRSSI = getWifiRSSI(); + int wifiStatus = getWifiStatus(wifiRSSI); + int hours = timeClient.getHours(); + int minutes = timeClient.getMinutes(); + bool brightness = checkBrightness(); + float temperature = readTemperature(); + float humidity = readHumidity(); + + displayClock(day, batteryPrecentage, wifiStatus, hours, minutes, brightness, temperature, humidity); + if (debugmode == true && counter >= 30) + { + float pressure = bme.readPressure(); + serialDebugInfo(batteryVoltage, batteryPrecentage, wifiRSSI, wifiStatus, day, brightness, temperature, humidity, pressure, disconnected); + counter = 0; + } + counter++; sleep_ms(1000); if (lpmode == true && disconnected == false) { WiFi.disconnect(); set_sys_clock_khz(20000, true); disconnected = true; - } + } } diff --git a/updates.md b/updates.md index a841bf9..158aca3 100644 --- a/updates.md +++ b/updates.md @@ -1,5 +1,10 @@ **CHANGELOG:** +2.1: +* Added a serial debugging mode. This mode is activated if the BUTTON is held at bootup. Serial debugging info (variables) are output on GPIO0(TX) at 9600 baud every 30 seconds. +* All functions are now called seperately and their return values placed in variables to be given to displayClocl() and serialDebugInfo() +* Removed functions calling other functions by themselves + 2.0: * Removed DHT reading capabilities, second core is now unused * Added BME280 sensor reading, displayClock() now requires the temperature and humidity to be provided instead of being global variables