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 setPrecipitationForecastLeds(uint32_t p_current_time, ArduinoJson::V710PB22::JsonArray p_precipitation);
void setUVIForecastLed(uint32_t p_current_time, ArduinoJson::V710PB22::JsonArray p_uvi); void setUVIForecastLed(uint32_t p_current_time, ArduinoJson::V710PB22::JsonArray p_uvi);
void setLocalAirQualityLed(); 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 setPixelColor(uint32_t p_index, uint8_t p_red, uint8_t p_green, uint8_t p_blue, uint8_t p_white);
void clear(); void clear();
void show(); void show();

View file

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

View file

@ -74,7 +74,21 @@ void Display::setUVIForecastLed(uint32_t p_current_time, ArduinoJson::V710PB22::
void Display::setLocalAirQualityLed() {} 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) { 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)); 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 #define CONNECT_BUTTON BUTTON_BUILTIN
// Forward function declarations
void wifiHandlerFeedbackCb(WiFiManager::Status p_wifi_status);
// Global objects
DESPatch dESPatch; DESPatch dESPatch;
Adafruit_NeoPixel leds = Adafruit_NeoPixel(29, 14, NEO_GRBW + NEO_KHZ800); Adafruit_NeoPixel leds = Adafruit_NeoPixel(29, 14, NEO_GRBW + NEO_KHZ800);
Display display(leds); Display display(leds);
WifiHandler wifi_handler(LED_BUILTIN, display); WifiHandler wifi_handler(wifiHandlerFeedbackCb);
BackendCommunication backend_communication(wifi_handler); 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() { void setup() {
display.clear(); display.clear();
display.show(); display.show();
@ -64,7 +83,8 @@ void loop(void) {
backend_communication.getConfig(); backend_communication.getConfig();
if (not backend_communication.m_is_config_valid) { 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 { } else {
backend_communication.getWeatherData(); backend_communication.getWeatherData();
@ -79,9 +99,10 @@ void loop(void) {
display.setUVIForecastLed(utc_time, backend_communication.m_weather_data["UVI"].as<JsonArray>()); display.setUVIForecastLed(utc_time, backend_communication.m_weather_data["UVI"].as<JsonArray>());
display.show(); display.setWifiStatusLed(false);
} }
display.show();
dESPatch.checkForUpdate(true); dESPatch.checkForUpdate(true);
uint32_t time_end = millis(); uint32_t time_end = millis();

View file

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