add nerdy weather messages and display brightness
This commit is contained in:
parent
86d5bcc729
commit
215d412778
@ -11,6 +11,7 @@
|
||||
[env:d1_mini_lite]
|
||||
platform = espressif8266
|
||||
board = d1_mini_lite
|
||||
; board_build.f_cpu = 160000000L
|
||||
framework = arduino
|
||||
lib_deps =
|
||||
bblanchon/ArduinoJson@^7.2.0
|
||||
|
129
src/main.cpp
129
src/main.cpp
@ -23,12 +23,6 @@ NTPClient timeClient(ntpUDP, "pool.ntp.org", 3600, 43200000);
|
||||
const String Location = LOCATION;
|
||||
const String API_Key = API_KEY;
|
||||
|
||||
void capitalizeFirstLetter(char* str) {
|
||||
if (str != nullptr && *str != '\0') {
|
||||
str[0] = toupper(str[0]);
|
||||
}
|
||||
}
|
||||
|
||||
void beep(int buzz) {
|
||||
tone(PIN_BUZZER, buzz, 100);
|
||||
delay(100);
|
||||
@ -43,7 +37,7 @@ void initSystems() {
|
||||
pinMode(LED_BUILTIN, OUTPUT);
|
||||
digitalWrite(LED_BUILTIN, HIGH);
|
||||
Wire.begin(); // Initialize I2C
|
||||
Wire.setClock(400000); // Set I2C to Fast Mode (400 kHz)
|
||||
Wire.setClock(400000L); // Set I2C to Fast Mode (400 kHz)
|
||||
|
||||
// Initialize the SSD1306 display
|
||||
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Adjust I2C address if needed
|
||||
@ -64,8 +58,8 @@ void initSystems() {
|
||||
// Timers for dynamic updates
|
||||
unsigned long lastWeatherUpdate = 0;
|
||||
unsigned long lastDisplayOverride = 0;
|
||||
const unsigned long weatherUpdateInterval = 1800000; // 30 minutes in milliseconds
|
||||
const unsigned long displayOverrideTimeout = 60000; // 1 minute in milliseconds
|
||||
const unsigned long weatherUpdateInterval = 2700000; // 45 minutes in milliseconds
|
||||
const unsigned long displayOverrideTimeout = 1200000; // 2 minutes in milliseconds
|
||||
bool is_display_off = false;
|
||||
bool display_override = false;
|
||||
|
||||
@ -141,6 +135,7 @@ void commonButtonHandler() {
|
||||
if (!middleBeeped) {
|
||||
beep(1000); // Play beep sound
|
||||
middleBeeped = true; // Set beeped state
|
||||
lastWeatherUpdate += weatherUpdateInterval;
|
||||
// Handle middle long press action here
|
||||
}
|
||||
}
|
||||
@ -179,6 +174,11 @@ float wind_speed;
|
||||
int forecastIcons[3];
|
||||
int currentYear, currentMonth, currentDay;
|
||||
|
||||
// Function to get a random message from an array
|
||||
String getRandomMessage(const String messages[], int size) {
|
||||
return messages[random(size)];
|
||||
}
|
||||
|
||||
bool fetchWeatherData() {
|
||||
// Get current time
|
||||
time_t epochTime = timeClient.getEpochTime();
|
||||
@ -199,8 +199,110 @@ bool fetchWeatherData() {
|
||||
if (!deserializeJson(doc, payload)) {
|
||||
String mainWeather = doc["weather"][0]["main"].as<String>();
|
||||
String description = doc["weather"][0]["description"].as<String>();
|
||||
capitalizeFirstLetter(const_cast<char*>(description.c_str()));
|
||||
weatherState = mainWeather + " " + description;
|
||||
|
||||
// Define 10 messages for each weather condition
|
||||
if (mainWeather == "Clear") {
|
||||
String clearMessages[] = {
|
||||
"Solar intensity optimal. Prepare for a day of high visibility.",
|
||||
"Sky is clear, perfect for horizon scanning protocols.",
|
||||
"Bright skies detected. Enjoy the solar boost!",
|
||||
"All systems go. Solar power at full capacity.",
|
||||
"Clear skies engaged. Optimal light detected for maximum efficiency.",
|
||||
"Visibility: crystal-clear. Time to explore the open landscape.",
|
||||
"Atmospheric clarity confirmed. Solar shields inactive.",
|
||||
"The sky is pristine. Energy absorption at max.",
|
||||
"Clear skies overhead. Pathfinding ideal for visual systems.",
|
||||
"No obstructions above. Horizon detection is in prime mode."
|
||||
};
|
||||
weatherState = getRandomMessage(clearMessages, 10);
|
||||
} else if (mainWeather == "Clouds") {
|
||||
String cloudMessages[] = {
|
||||
"Cloud cover detected. Sky shield engaged for mild solar filtering.",
|
||||
"Overcast overhead. Perfect ambiance for low-light operations.",
|
||||
"Clouds in the atmosphere. System monitoring for breaks in cover.",
|
||||
"Skies are shaded - ideal for thermal conservation.",
|
||||
"Cloud barrier active. Solar input reduced for optimal temperature.",
|
||||
"Cloud density increasing. Adjusting light sensitivity.",
|
||||
"Partial shade above. Charging might be slower.",
|
||||
"A mild cover blankets the sky. Solar intake downscaled.",
|
||||
"Gray layers up high. Vision systems compensating.",
|
||||
"Cloudscape in progress. Ideal time for internal diagnostics."
|
||||
};
|
||||
weatherState = getRandomMessage(cloudMessages, 10);
|
||||
} else if (mainWeather == "Rain") {
|
||||
String rainMessages[] = {
|
||||
"Precipitation incoming. Deploy waterproof systems if venturing outside.",
|
||||
"Raindrops detected. External surfaces advised to stay dry.",
|
||||
"Rain detected. Surface moisture levels increasing rapidly.",
|
||||
"Incoming rainstorm - caution advised for all outdoor units.",
|
||||
"Prepare for water influx. Systems on standby for slippery terrain.",
|
||||
"Moisture levels spiking. External sensors on alert.",
|
||||
"Rainfall in progress. Hydration of external units possible.",
|
||||
"Drips from the sky. Activate surface protection measures.",
|
||||
"Rain warning: path may be slippery. Engage traction mode.",
|
||||
"Rain detected. Outdoor activity may face hydration challenges."
|
||||
};
|
||||
weatherState = getRandomMessage(rainMessages, 10);
|
||||
} else if (mainWeather == "Drizzle") {
|
||||
String drizzleMessages[] = {
|
||||
"Micro-droplets detected. Light atmospheric moisture active.",
|
||||
"Atmosphere in drizzle mode. Surface wetting minimal.",
|
||||
"Drizzle detected: gentle hydration for the surroundings.",
|
||||
"Light rain mode activated - atmospheric refresh in progress.",
|
||||
"Tiny droplets detected. Surroundings entering gentle wet mode.",
|
||||
"Drizzle overhead. Water levels rising at a slow pace.",
|
||||
"Mist-level rain. Surface dampness increasing slightly.",
|
||||
"Fine mist in the air. Slight hydration for surfaces detected.",
|
||||
"Low-intensity rain. Cooling effect minimal.",
|
||||
"Drizzle detected. Perfect time for a smooth power cycle."
|
||||
};
|
||||
weatherState = getRandomMessage(drizzleMessages, 10);
|
||||
} else if (mainWeather == "Thunderstorm") {
|
||||
String thunderstormMessages[] = {
|
||||
"Warning: Electrical storm approaching. Secure sensitive devices.",
|
||||
"Severe storm alert. Brace for lightning and thunder activity.",
|
||||
"System warning: Thunderstorm detected. High voltage hazard active.",
|
||||
"Thunderstorm detected. Power up shields and secure electronics.",
|
||||
"Electrical interference detected - storm protocol activated.",
|
||||
"Heavy storm active. Electrical currents elevated.",
|
||||
"Thunder and lightning detected. External energy sensors triggered.",
|
||||
"Storm intensity rising. Secure pathways advised.",
|
||||
"High-energy weather detected. Storm protection measures on.",
|
||||
"Electrical storm in progress. Surge protection engaged."
|
||||
};
|
||||
weatherState = getRandomMessage(thunderstormMessages, 10);
|
||||
} else if (mainWeather == "Snow") {
|
||||
String snowMessages[] = {
|
||||
"Cryo-precipitation alert: Snowfall active. Surface stability may be reduced.",
|
||||
"Snowfall detected. Thermal insulation advised for all systems.",
|
||||
"Cryogenic conditions active. Snow accumulation possible.",
|
||||
"System temperature cooling due to snowfall. Low-traction alert.",
|
||||
"External temperature dropping rapidly. Snow detected - proceed cautiously.",
|
||||
"Icy precipitation confirmed. Outdoor conditions less stable.",
|
||||
"Snow alert: Prepare for reduced surface traction.",
|
||||
"Snow detected. Temperature protocols active.",
|
||||
"Heavy snow warning: Surface coating likely.",
|
||||
"Snowfall registered. External mobility may be impacted."
|
||||
};
|
||||
weatherState = getRandomMessage(snowMessages, 10);
|
||||
} else if (mainWeather == "Mist" || mainWeather == "Fog") {
|
||||
String mistMessages[] = {
|
||||
"Low-visibility alert: Mist/fog detected. Navigation systems advised.",
|
||||
"Foggy conditions active - visibility restricted, adjust pathfinding.",
|
||||
"Atmospheric opacity high mist encountered. Slow travel recommended.",
|
||||
"Dense mist detected. Sensor accuracy may be affected.",
|
||||
"Atmosphere shrouded in mist. Low-visibility protocols recommended.",
|
||||
"Fog cover detected. Vision range significantly reduced.",
|
||||
"High density fog. Calibrate sensors for low-light conditions.",
|
||||
"Environmental opacity increased. Proceed with caution.",
|
||||
"Fog barrier detected. Slow-moving navigation optimal.",
|
||||
"Mist detected - navigating carefully for minimal interference."
|
||||
};
|
||||
weatherState = getRandomMessage(mistMessages, 10);
|
||||
} else {
|
||||
weatherState = "Atmospheric anomaly detected: " + description + ". Monitoring closely.";
|
||||
}
|
||||
|
||||
temperature = doc["main"]["temp"].as<float>() - 273.15;
|
||||
humidity = doc["main"]["humidity"];
|
||||
pressure = doc["main"]["pressure"].as<float>() / 1000;
|
||||
@ -245,7 +347,7 @@ bool fetchWeatherData() {
|
||||
|
||||
int scrollPos = SCREEN_WIDTH; // Global variable to keep track of the scroll position
|
||||
unsigned long lastScrollTime = 0; // To control the scroll speed
|
||||
const int scrollDelay = 30; // Delay in milliseconds between scroll updates
|
||||
const int scrollDelay = 100; // Delay in milliseconds between scroll updates
|
||||
|
||||
void displayWeatherData() {
|
||||
display.clearDisplay();
|
||||
@ -264,13 +366,14 @@ void displayWeatherData() {
|
||||
if (!is_display_off) {
|
||||
if (millis() - lastScrollTime > scrollDelay) {
|
||||
// Update scroll position
|
||||
scrollPos -= 1; // Move left by 1 pixel each time
|
||||
scrollPos -= 6; // Move left by 1 pixel each time
|
||||
|
||||
lastScrollTime = millis();
|
||||
|
||||
// If the text has completely scrolled off, reset scroll position to start from the right
|
||||
if (scrollPos < -stateWidth) {
|
||||
scrollPos = SCREEN_WIDTH;
|
||||
delay(3000);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user