diff --git a/README.md b/README.md index 38948f4..be34a51 100644 --- a/README.md +++ b/README.md @@ -9,28 +9,43 @@ Since it was sometimes complicated to find the right parts I created a kit which https://blog.squix.org/product/esp8266-wifi-color-display-kit-2-4 By buying the kit from me you are supporting future development. Thank you! +[![Squix ESP8266 Color Display Kit](resources/ESP8266ColorDisplayKit.png)](https://blog.squix.org/product/esp8266-wifi-color-display-kit-2-4) + ## Software Requirements/ Libraries - -* Arduino IDE with ESP8266 platform installed -* [Weather Station Library](https://github.com/squix78/esp8266-weather-station) or through Library Manager -* [Adafruit ILI9341](https://github.com/adafruit/Adafruit_ILI9341) or through Library Manager -* [Adafruit GFX](https://github.com/adafruit/Adafruit-GFX-Library) or through Library Manager -* [WifiManager](https://github.com/tzapu/WiFiManager) + * Mini Grafx by Daniel Eichhorn + * ESP8266 WeatherStation by Daniel Eichhorn + * Json Streaming Parser by Daniel Eichhorn + * simpleDSTadjust by neptune2 You also need to get an API key for the Wunderground data: https://www.wunderground.com/ +## Settings +Please have a good look at the settings.h file. There you can: + * set your location for the weather information + * Set the clock mode: 12hour (am/pm) or 24hour mode + * Metric system for temperature + * Timezone and daytime saving options + * API key for the wunderground service + ## Wiring -| ILI9341 | NodeMCU | +![Wiring](resources/PlaneSpotterWiring.png) + +| Wemos D1 Mini | ILI9341 | | ------------- |:-------------:| -| MISO | - | -| LED | 3V3 | -| SCK | D5 | -| MOSI | D7 | -| DC/RS | D4 | -| RESET | RST | -| CS | D2 | +| D4 | T_IRQ | +| D6 | T_DO | +| D7 | T_DIN | +| D3 | T_CS | +| D5 | T_CLK | +| D6 | SDO | +| D8 | LED | +| D5 | SCK | +| D7 | SDI | +| D2 | D/C | +| RST | RESET | +| D1 | CS | | GND | GND | -| VCC | 3V3 | +| 3V3 | VCC | diff --git a/esp8266-weather-station-color.ino b/esp8266-weather-station-color.ino index 63194bb..55686b0 100644 --- a/esp8266-weather-station-color.ino +++ b/esp8266-weather-station-color.ino @@ -72,8 +72,9 @@ int BITS_PER_PIXEL = 2; // 2^2 = 4 colors ADC_MODE(ADC_VCC); -// HOSTNAME for OTA update -#define HOSTNAME "ESP8266-OTA-" +#include "ArialRounded.h" +#include "moonphases.h" +#include "weathericons.h" ILI9341_SPI tft = ILI9341_SPI(TFT_CS, TFT_DC); @@ -152,14 +153,14 @@ void setup() { } touchController.saveCalibration(); } - + gfx.fillBuffer(MINI_BLACK); gfx.setFont(ArialRoundedMTBold_14); gfx.setColor(MINI_YELLOW); gfx.setTextAlignment(TEXT_ALIGN_CENTER); gfx.drawString(120, 160, "Connecting to WiFi"); gfx.commit(); - + carousel.setFrames(frames, frameCount); carousel.disableAllIndicators(); @@ -185,7 +186,7 @@ void loop() { screen = (screen + 1) % screenCount; } } - + gfx.fillBuffer(MINI_BLACK); if (screen == 0) { drawTime(); @@ -209,9 +210,9 @@ void loop() { } gfx.commit(); - - + + // Check if we should update weather information if (millis() - lastDownloadUpdate > 1000 * UPDATE_INTERVAL_SECS) { updateData(); @@ -221,25 +222,25 @@ void loop() { // Update the internet based information and update screen void updateData() { - + gfx.fillBuffer(MINI_BLACK); gfx.setFont(ArialRoundedMTBold_14); - + drawProgress(10, "Updating time..."); configTime(UTC_OFFSET * 3600, 0, NTP_SERVERS); - + drawProgress(50, "Updating conditions..."); WundergroundConditions *conditionsClient = new WundergroundConditions(IS_METRIC); conditionsClient->updateConditions(&conditions, WUNDERGRROUND_API_KEY, WUNDERGRROUND_LANGUAGE, WUNDERGROUND_COUNTRY, WUNDERGROUND_CITY); delete conditionsClient; conditionsClient = nullptr; - + drawProgress(70, "Updating forecasts..."); WundergroundForecast *forecastClient = new WundergroundForecast(IS_METRIC); forecastClient->updateForecast(forecasts, MAX_FORECASTS, WUNDERGRROUND_API_KEY, WUNDERGRROUND_LANGUAGE, WUNDERGROUND_COUNTRY, WUNDERGROUND_CITY); delete forecastClient; forecastClient = nullptr; - + drawProgress(80, "Updating astronomy..."); WundergroundAstronomy *astronomyClient = new WundergroundAstronomy(IS_STYLE_12HR); astronomyClient->updateAstronomy(&astronomy, WUNDERGRROUND_API_KEY, WUNDERGRROUND_LANGUAGE, WUNDERGROUND_COUNTRY, WUNDERGROUND_CITY); @@ -252,7 +253,7 @@ void updateData() { alertClient->updateAlerts(alerts, MAX_ALERTS, WUNDERGRROUND_API_KEY, WUNDERGRROUND_LANGUAGE, WUNDERGROUND_COUNTRY, WUNDERGROUND_CITY); delete alertClient; alertClient = nullptr; - + delay(1000); } @@ -261,7 +262,7 @@ void updateData() { // Progress bar helper void drawProgress(uint8_t percentage, String text) { gfx.fillBuffer(MINI_BLACK); - gfx.drawPalettedBitmapFromPgm(23, 30, SquixLogo); + gfx.drawPalettedBitmapFromPgm(23, 30, SquixLogo); gfx.setFont(ArialRoundedMTBold_14); gfx.setTextAlignment(TEXT_ALIGN_CENTER); gfx.setColor(MINI_WHITE); @@ -284,16 +285,16 @@ void drawTime() { char time_str[11]; time_t now = dstAdjusted.time(&dstAbbrev); struct tm * timeinfo = localtime (&now); - + gfx.setTextAlignment(TEXT_ALIGN_CENTER); gfx.setFont(ArialRoundedMTBold_14); gfx.setColor(MINI_WHITE); String date = ctime(&now); date = date.substring(0,11) + String(1900 + timeinfo->tm_year); gfx.drawString(120, 6, date); - + gfx.setFont(ArialRoundedMTBold_36); - + if (IS_STYLE_12HR) { int hour = (timeinfo->tm_hour+11)%12+1; // take care of noon and midnight sprintf(time_str, "%2d:%02d:%02d\n",hour, timeinfo->tm_min, timeinfo->tm_sec); @@ -352,7 +353,7 @@ void drawForecast1(MiniGrafx *display, CarouselState* state, int16_t x, int16_t void drawForecast2(MiniGrafx *display, CarouselState* state, int16_t x, int16_t y) { drawForecastDetail(x + 10, y + 165, 6); drawForecastDetail(x + 95, y + 165, 8); - drawForecastDetail(x + 180, y + 165, 10); + drawForecastDetail(x + 180, y + 165, 10); } @@ -375,17 +376,17 @@ void drawForecastDetail(uint16_t x, uint16_t y, uint8_t dayIndex) { // draw moonphase and sunrise/set and moonrise/set void drawAstronomy() { - + gfx.setFont(MoonPhases_Regular_36); gfx.setColor(MINI_WHITE); gfx.setTextAlignment(TEXT_ALIGN_CENTER); gfx.drawString(120, 275, moonAgeImage); - + gfx.setColor(MINI_WHITE); - gfx.setFont(ArialRoundedMTBold_14); + gfx.setFont(ArialRoundedMTBold_14); gfx.setTextAlignment(TEXT_ALIGN_CENTER); gfx.setColor(MINI_YELLOW); - gfx.drawString(120, 250, astronomy.moonPhase); + gfx.drawString(120, 250, astronomy.moonPhase); gfx.setTextAlignment(TEXT_ALIGN_LEFT); gfx.setColor(MINI_YELLOW); gfx.drawString(5, 250, "Sun"); @@ -399,11 +400,11 @@ void drawAstronomy() { gfx.setColor(MINI_WHITE); gfx.drawString(235, 276, astronomy.moonriseTime); gfx.drawString(235, 291, astronomy.moonsetTime); - + } void drawAlert() { - + } void drawCurrentWeatherDetail() { @@ -464,10 +465,10 @@ void drawForecastTable(uint8_t start) { break; } gfx.drawPalettedBitmapFromPgm(0, y, getMiniMeteoconIconFromProgmem(forecasts[i].forecastIcon)); - + gfx.setColor(MINI_YELLOW); gfx.setFont(ArialRoundedMTBold_14); - + gfx.drawString(50, y, forecasts[i].forecastTitle); gfx.setColor(MINI_WHITE); gfx.drawString(50, y + 15, getShortText(forecasts[i].forecastIcon)); @@ -483,23 +484,23 @@ void drawForecastTable(uint8_t start) { gfx.drawString(235, y, temp + degreeSign); /*gfx.setColor(MINI_WHITE); gfx.drawString(x + 25, y, forecasts[dayIndex].forecastLowTemp + "|" + forecasts[dayIndex].forecastHighTemp); - + gfx.drawPalettedBitmapFromPgm(x, y + 15, getMiniMeteoconIconFromProgmem(forecasts[dayIndex].forecastIcon));*/ gfx.setColor(MINI_BLUE); gfx.drawString(235, y + 15, forecasts[i].PoP + "%"); - + } } void drawAbout() { gfx.fillBuffer(MINI_BLACK); - gfx.drawPalettedBitmapFromPgm(23, 30, SquixLogo); + gfx.drawPalettedBitmapFromPgm(23, 30, SquixLogo); gfx.setFont(ArialRoundedMTBold_14); gfx.setTextAlignment(TEXT_ALIGN_CENTER); gfx.setColor(MINI_WHITE); gfx.drawString(120, 80, "https://blog.squix.org"); - + gfx.setFont(ArialRoundedMTBold_14); gfx.setTextAlignment(TEXT_ALIGN_CENTER); gfx.setColor(MINI_WHITE); @@ -519,7 +520,7 @@ void calibrationCallback(int16_t x, int16_t y) { // Helper function, should be part of the weather station library and should disappear soon const char* getMeteoconIconFromProgmem(String iconText) { - + if (iconText == "chanceflurries") return chanceflurries; if (iconText == "chancerain") return chancerain; if (iconText == "chancesleet") return chancesleet; @@ -563,13 +564,13 @@ const char* getMiniMeteoconIconFromProgmem(String iconText) { if (iconText == "snow") return minisnow; if (iconText == "sunny") return minisunny; if (iconText == "tstorms") return minitstorms; - + return miniunknown; } // Helper function, should be part of the weather station library and should disappear soon const String getShortText(String iconText) { - + if (iconText == "chanceflurries") return "Chance of Flurries"; if (iconText == "chancerain") return "Chance of Rain"; if (iconText == "chancesleet") return "Chance of Sleet"; @@ -589,9 +590,7 @@ const String getShortText(String iconText) { if (iconText == "snow") return "Snow"; if (iconText == "sunny") return "Sunny"; if (iconText == "tstorms") return "Storms"; - + return "-"; } - - diff --git a/resources/PlaneSpotterWiring.png b/resources/PlaneSpotterWiring.png new file mode 100644 index 0000000..464508d Binary files /dev/null and b/resources/PlaneSpotterWiring.png differ