Use NeoPixel led for wifi status

This commit is contained in:
Admar Schoonen 2024-09-01 16:50:16 +02:00
parent 5cba98368f
commit 8dc11493aa
5 changed files with 52 additions and 24 deletions

View file

@ -17,7 +17,8 @@ class Display {
void setPrecipitationForecastLeds(uint32_t p_current_time, ArduinoJson::V710PB22::JsonArray p_precipitation);
void setUVIForecastLed(uint32_t p_current_time, ArduinoJson::V710PB22::JsonArray p_uvi);
void setLocalAirQualityLed();
void setWifiStatusLed(bool p_enable);
void setWifiStatusLed(bool p_is_connected);
void setErrorLed(bool p_is_error);
void setPixelColor(uint32_t p_index, uint8_t p_red, uint8_t p_green, uint8_t p_blue, uint8_t p_white);
void clear();
void show();

View file

@ -3,12 +3,10 @@
#include <WiFiManager-esp32.h> // https://github.com/admarschoonen/WiFiManager
#include "display.hpp"
class WifiHandler {
public:
// Constructor
WifiHandler(uint8_t p_led_pin, Display p_display);
WifiHandler(std::function<void(WiFiManager::Status p_wifi_status)> p_tickerCb);
public:
// Public static methods
@ -30,7 +28,6 @@ class WifiHandler {
private:
// Private objects
WiFiManager m_wifiManager;
Display& m_display;
};
#endif // __WIFIHANDLER_HPP__

View file

@ -74,7 +74,21 @@ void Display::setUVIForecastLed(uint32_t p_current_time, ArduinoJson::V710PB22::
void Display::setLocalAirQualityLed() {}
void Display::setWifiStatusLed(bool p_enable) {}
void Display::setWifiStatusLed(bool p_is_connected) {
if (p_is_connected) {
m_leds.setPixelColor(m_wifi_status_map, m_leds.Color(0U, 0U, 255U, 255U));
} else {
m_leds.setPixelColor(m_wifi_status_map, m_leds.Color(0U, 0U, 0U, 0U));
}
}
void Display::setErrorLed(bool p_is_error) {
if (p_is_error) {
m_leds.setPixelColor(m_wifi_status_map, m_leds.Color(255U, 0U, 0U, 0U));
} else {
m_leds.setPixelColor(m_wifi_status_map, m_leds.Color(0U, 0U, 0U, 0U));
}
}
void Display::setPixelColor(uint32_t p_index, uint8_t p_red, uint8_t p_green, uint8_t p_blue, uint8_t p_white) {
m_leds.setPixelColor(p_index, m_leds.Color(p_red, p_green, p_blue, p_white));

View file

@ -15,15 +15,34 @@
#define CONNECT_BUTTON BUTTON_BUILTIN
// Forward function declarations
void wifiHandlerFeedbackCb(WiFiManager::Status p_wifi_status);
// Global objects
DESPatch dESPatch;
Adafruit_NeoPixel leds = Adafruit_NeoPixel(29, 14, NEO_GRBW + NEO_KHZ800);
Display display(leds);
WifiHandler wifi_handler(LED_BUILTIN, display);
WifiHandler wifi_handler(wifiHandlerFeedbackCb);
BackendCommunication backend_communication(wifi_handler);
void wifiHandlerFeedbackCb(WiFiManager::Status p_wifi_status) {
static bool state = false;
if (p_wifi_status.mode == WiFiManager::Mode::CONNECTED) {
state = true;
} else if (p_wifi_status.mode == WiFiManager::Mode::DISCONNECTED) {
state = false;
} else {
state = !state;
}
display.setWifiStatusLed(state);
display.show();
}
void setup() {
display.clear();
display.show();
@ -64,7 +83,8 @@ void loop(void) {
backend_communication.getConfig();
if (not backend_communication.m_is_config_valid) {
Serial.println(String("Uptime: " + String(millis())) + " Invalid config");
display.setErrorLed(true);
Serial.println(String("Uptime: " + String(millis())) + ". Error: invalid config");
} else {
backend_communication.getWeatherData();
@ -79,9 +99,10 @@ void loop(void) {
display.setUVIForecastLed(utc_time, backend_communication.m_weather_data["UVI"].as<JsonArray>());
display.show();
display.setWifiStatusLed(false);
}
display.show();
dESPatch.checkForUpdate(true);
uint32_t time_end = millis();

View file

@ -2,20 +2,18 @@
#include "../include/wifi_handler.hpp"
static uint8_t g_led_pin;
static Ticker g_ticker;
static WiFiManager::Status g_wifi_status;
static std::function<void(WiFiManager::Status p_wifi_status)> g_tickerCb = nullptr;
WifiHandler::WifiHandler(uint8_t p_led_pin, Display p_display) : m_display(p_display) {
g_led_pin = p_led_pin;
WifiHandler::WifiHandler(std::function<void(WiFiManager::Status p_wifi_status)> p_tickerCb) {
g_tickerCb = p_tickerCb;
return;
}
static void tick() {
int state = 0;
if (g_led_pin >= 0) {
state = digitalRead(g_led_pin);
digitalWrite(g_led_pin, !state);
if (g_tickerCb != nullptr) {
g_tickerCb(g_wifi_status);
}
}
@ -30,6 +28,8 @@ void WifiHandler::setBlinkRate(float p_interval) {
}
void WifiHandler::wifiManagerCb(WiFiManager::Status p_status) {
g_wifi_status = p_status;
if (p_status.mode == WiFiManager::Mode::CONNECTING) {
WifiHandler::setBlinkRate(WifiHandler::BLINK_RATE_CONNECTING);
} else if (p_status.mode == WiFiManager::Mode::SCANNING) {
@ -40,10 +40,10 @@ void WifiHandler::wifiManagerCb(WiFiManager::Status p_status) {
WifiHandler::setBlinkRate(WifiHandler::BLINK_RATE_ERASE);
} else if (p_status.mode == WiFiManager::Mode::CONNECTED) {
WifiHandler::setBlinkRate(0.0f);
digitalWrite(g_led_pin, HIGH);
g_tickerCb(g_wifi_status);
} else if (p_status.mode == WiFiManager::Mode::DISCONNECTED) {
WifiHandler::setBlinkRate(0.0f);
digitalWrite(g_led_pin, LOW);
g_tickerCb(g_wifi_status);
}
}
@ -65,9 +65,6 @@ void WifiHandler::connect() {
// if you get here you have connected to the WiFi
Serial.print(String(millis()) + " Connected with address: ");
Serial.println(WiFi.localIP());
// keep LED on
digitalWrite(g_led_pin, HIGH);
}
void WifiHandler::resetSettings() {
@ -80,8 +77,6 @@ void WifiHandler::resetSettings() {
delay(1000);
status.mode = WiFiManager::Mode::DISCONNECTED;
wifiManagerCb(status);
return;
}
String WifiHandler::getMac(bool p_insertColons) {