Tell us about yourself!

Complete Your Profile
  • solar767 made the instructable ESP8266 Weather Widget2 years ago
    ESP8266 Weather Widget

    I MADE IT!!!! (And I little bit change the code.)You should copy and write in WeatherStationDemo.inoand in underpart, you should copy and write in WeatherStationImages.h OLED SDA -> D3, OLED SCL -> D4 This Code is added Moon and Sun Rise and set time and Moon Phase and UV Level, Humidity, Dew Point, Feel Like, Wind speed, Wind direction, POP, Moonlight! Here is the code!=========================================================================================================================================================================================================================================================================================/**The MIT License (MIT)Copyright (c) 2016 by Daniel EichhornPermission is hereby granted, free of charge, to any person obtaining...

    see more »

    I MADE IT!!!! (And I little bit change the code.)You should copy and write in WeatherStationDemo.inoand in underpart, you should copy and write in WeatherStationImages.h OLED SDA -> D3, OLED SCL -> D4 This Code is added Moon and Sun Rise and set time and Moon Phase and UV Level, Humidity, Dew Point, Feel Like, Wind speed, Wind direction, POP, Moonlight! Here is the code!=========================================================================================================================================================================================================================================================================================/**The MIT License (MIT)Copyright (c) 2016 by Daniel EichhornPermission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THESOFTWARE.See more at http://blog.squix.ch*/#include <ESP8266WiFi.h>#include <Ticker.h>#include <JsonListener.h>#include <Wire.h>#include "SSD1306.h"#include "SSD1306Wire.h"#include "OLEDDisplayUi.h"#include "Wire.h"#include "WundergroundClient.h"#include "WeatherStationFonts.h"#include "WeatherStationImages.h"#include "TimeClient.h"/**************************** Begin Settings**************************/// Please read http://blog.squix.org/weatherstation-getting-code...// for setup instructions// WIFIconst char* WIFI_SSID = "YOUR_WIFI";const char* WIFI_PWD = "PASSWORD";const int I2C_DISPLAY_ADDRESS = 0x3c;const int SDA_PIN = D3;const int SDC_PIN = D4;// Setupconst int UPDATE_INTERVAL_SECS = 10 * 60; // Update every 10 minutes// TimeClient settingsconst float UTC_OFFSET = 9;// Wunderground Settingsconst boolean IS_METRIC = true;const String WUNDERGRROUND_API_KEY = "cf3a39d550c0f2bb";const String WUNDERGRROUND_LANGUAGE = "EN";const String WUNDERGROUND_COUNTRY = "KO";const String WUNDERGROUND_CITY = "Seoul";// Initialize the oled display for address 0x3c// sda-pin=14 and sdc-pin=12SSD1306Wire display(I2C_DISPLAY_ADDRESS, SDA_PIN, SDC_PIN);OLEDDisplayUi ui( &display );/**************************** End Settings**************************/TimeClient timeClient(UTC_OFFSET);// Set to false, if you prefere imperial/inches, FahrenheitWundergroundClient wunderground(IS_METRIC);// flag changed in the ticker function every 10 minutesbool readyForWeatherUpdate = false;String lastUpdate = "--";Ticker ticker;//declaring prototypesvoid drawProgress(OLEDDisplay *display, int percentage, String label);void updateData(OLEDDisplay *display);void drawDateTime(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y);void drawCurrentWeather(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y);void drawForecast(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y);void drawForecastDetails(OLEDDisplay *display, int x, int y, int dayIndex);void drawMoon(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y);void drawSun(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y);void drawData1(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y);void drawData2(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y);void drawHeaderOverlay(OLEDDisplay *display, OLEDDisplayUiState* state);void setReadyForWeatherUpdate();// Add frames// this array keeps function pointers to all frames// frames are the single views that slide from right to leftFrameCallback frames[] = { drawDateTime, drawCurrentWeather, drawForecast, drawMoon, drawSun, drawData1, drawData2};int numberOfFrames = 7;OverlayCallback overlays[] = { drawHeaderOverlay };int numberOfOverlays = 1;void setup() {Serial.begin(115200);Serial.println();Serial.println();// initialize dispalydisplay.init();display.clear();display.display();//display.flipScreenVertically();display.setFont(ArialMT_Plain_10);display.setTextAlignment(TEXT_ALIGN_CENTER);display.setContrast(255);WiFi.begin(WIFI_SSID, WIFI_PWD);int counter = 0;while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");display.clear();display.drawString(64, 10, "Connecting to WiFi");display.drawXbm(46, 30, 8, 8, counter % 3 == 0 ? activeSymbole : inactiveSymbole);display.drawXbm(60, 30, 8, 8, counter % 3 == 1 ? activeSymbole : inactiveSymbole);display.drawXbm(74, 30, 8, 8, counter % 3 == 2 ? activeSymbole : inactiveSymbole);display.display();counter++;}ui.setTargetFPS(30);ui.setActiveSymbol(activeSymbole);ui.setInactiveSymbol(inactiveSymbole);// You can change this to// TOP, LEFT, BOTTOM, RIGHTui.setIndicatorPosition(BOTTOM);// Defines where the first frame is located in the bar.ui.setIndicatorDirection(LEFT_RIGHT);// You can change the transition that is used// SLIDE_LEFT, SLIDE_RIGHT, SLIDE_TOP, SLIDE_DOWNui.setFrameAnimation(SLIDE_LEFT);ui.setFrames(frames, numberOfFrames);ui.setOverlays(overlays, numberOfOverlays);// Inital UI takes care of initalising the display too.ui.init();Serial.println("");updateData(&display);ticker.attach(UPDATE_INTERVAL_SECS, setReadyForWeatherUpdate);}void loop() {if (readyForWeatherUpdate && ui.getUiState()->frameState == FIXED) {updateData(&display);}int remainingTimeBudget = ui.update();if (remainingTimeBudget > 0) {// You can do some work here// Don't do stuff if you are below your// time budget.delay(remainingTimeBudget);}}void drawProgress(OLEDDisplay *display, int percentage, String label) {display->clear();display->setTextAlignment(TEXT_ALIGN_CENTER);display->setFont(ArialMT_Plain_10);display->drawString(64, 10, label);display->drawProgressBar(2, 28, 124, 10, percentage);display->display();}void updateData(OLEDDisplay *display) {drawProgress(display, 10, "Updating time...");timeClient.updateTime();drawProgress(display, 30, "Updating conditions...");wunderground.updateConditions(WUNDERGRROUND_API_KEY, WUNDERGRROUND_LANGUAGE, WUNDERGROUND_COUNTRY, WUNDERGROUND_CITY);drawProgress(display, 50, "Updating forecasts...");wunderground.updateForecast(WUNDERGRROUND_API_KEY, WUNDERGRROUND_LANGUAGE, WUNDERGROUND_COUNTRY, WUNDERGROUND_CITY);drawProgress(display, 80, "Updating Astronomy...");wunderground.updateAstronomy(WUNDERGRROUND_API_KEY, WUNDERGRROUND_LANGUAGE, WUNDERGROUND_COUNTRY, WUNDERGROUND_CITY);lastUpdate = timeClient.getFormattedTime();readyForWeatherUpdate = false;drawProgress(display, 100, "Done...");delay(1000);}void drawDateTime(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {display->setTextAlignment(TEXT_ALIGN_CENTER);display->setFont(ArialMT_Plain_10);String date = wunderground.getDate();int textWidth = display->getStringWidth(date);display->drawString(64 + x, 5 + y, date);display->setFont(ArialMT_Plain_24);String time = timeClient.getFormattedTime();textWidth = display->getStringWidth(time);display->drawString(64 + x, 15 + y, time);display->setTextAlignment(TEXT_ALIGN_LEFT);}void drawCurrentWeather(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {display->setFont(ArialMT_Plain_10);display->setTextAlignment(TEXT_ALIGN_LEFT);display->drawString(60 + x, 5 + y, wunderground.getWeatherText());display->setFont(ArialMT_Plain_24);String temp = wunderground.getCurrentTemp() + "°C";display->drawString(60 + x, 15 + y, temp);int tempWidth = display->getStringWidth(temp);display->setFont(Meteocons_Plain_42);String weatherIcon = wunderground.getTodayIcon();int weatherIconWidth = display->getStringWidth(weatherIcon);display->drawString(32 + x - weatherIconWidth / 2, 05 + y, weatherIcon);}void drawForecast(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {drawForecastDetails(display, x, y, 0);drawForecastDetails(display, x + 44, y, 2);drawForecastDetails(display, x + 88, y, 4);}void drawForecastDetails(OLEDDisplay *display, int x, int y, int dayIndex) {display->setTextAlignment(TEXT_ALIGN_CENTER);display->setFont(ArialMT_Plain_10);String day = wunderground.getForecastTitle(dayIndex).substring(0, 3);day.toUpperCase();display->drawString(x + 20, y, day);display->setFont(Meteocons_Plain_21);display->drawString(x + 20, y + 12, wunderground.getForecastIcon(dayIndex));display->setFont(ArialMT_Plain_10);display->drawString(x + 20, y + 34, wunderground.getForecastLowTemp(dayIndex) + "|" + wunderground.getForecastHighTemp(dayIndex));display->setTextAlignment(TEXT_ALIGN_LEFT);}void drawMoon(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {String moonAge = wunderground.getMoonAge();char ageNum[4];moonAge.substring(0, 3).toCharArray(ageNum, 4);display->setFont(Meteocons_Plain_21);int moonAgeAndPhase = atoi(ageNum);Serial.print("Moon Age is : ");Serial.println(moonAgeAndPhase);if (moonAgeAndPhase == 1 || moonAgeAndPhase == 30) {display->drawXbm (x + 10, y + 3, Moon_And_Sun_width, Moon_And_Sun_height, moon1);Serial.print("The moon set moon 1");} else if (moonAgeAndPhase <= 7) {display->drawXbm (x + 10, y + 3, Moon_And_Sun_width, Moon_And_Sun_height, moon2);Serial.print("The moon set moon 2");} else if (moonAgeAndPhase == 8) {display->drawXbm (x + 10, y + 3, Moon_And_Sun_width, Moon_And_Sun_height, moon3);Serial.print("The moon set moon 3");} else if (moonAgeAndPhase <= 14) {display->drawXbm (x + 10, y + 3, Moon_And_Sun_width, Moon_And_Sun_height, moon4);Serial.print("The moon set moon 4");} else if (moonAgeAndPhase == 15) {display->drawXbm (x + 10, y + 3, Moon_And_Sun_width, Moon_And_Sun_height, moon5);Serial.print("The moon set moon 5");} else if (moonAgeAndPhase <= 22) {display->drawXbm (x + 10, y + 3, Moon_And_Sun_width, Moon_And_Sun_height, moon6);Serial.print("The moon set moon 6");} else if (moonAgeAndPhase == 23) {display->drawXbm (x + 10, y + 3, Moon_And_Sun_width, Moon_And_Sun_height, moon7);Serial.print("The moon set moon 7");} else if (moonAgeAndPhase <= 29) {display->drawXbm (x + 10, y + 3, Moon_And_Sun_width, Moon_And_Sun_height, moon8);Serial.print("The moon set moon 8");}display->setFont(ArialMT_Plain_10);display->setTextAlignment(TEXT_ALIGN_RIGHT);display->setFont(ArialMT_Plain_16);display->drawString(120 + x, 02 + y, "MOON");display->setFont(ArialMT_Plain_10);display->drawString(x + 120, y + 37, wunderground.getMoonPhase());display->drawString(120 + x, 17 + y, "Rise : " + wunderground.getMoonriseTime());display->drawString(120 + x, 27 + y, "Set : " + wunderground.getMoonsetTime());}void drawSun(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {display->setFont(Meteocons_Plain_42);display->drawString(55 + x, y + 02, "B");display->setTextAlignment(TEXT_ALIGN_RIGHT);display->setFont(ArialMT_Plain_16);display->drawString(120 + x, 02 + y, "SUN");display->setFont(ArialMT_Plain_10);display->drawString(120 + x, 17 + y, "Rise : " + wunderground.getSunriseTime());display->drawString(120 + x, 27 + y, "Set : " + wunderground.getSunsetTime());display->drawString(120 + x, 37 + y, "UV : " + wunderground.getUV());}void drawData1(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {String day = wunderground.getDate();char date[3];day.substring(0,2).toCharArray(date, 3);int today = atoi(date);display->setTextAlignment(TEXT_ALIGN_CENTER);display->setFont(ArialMT_Plain_10);display->drawString(36 + x, y, "Humidity");display->drawString(95 + x, y, "Windspeed");display->drawString(36 + x, 24 + y, "Windway");display->drawString(95 + x, 24 + y, "Rain%");display->setFont(ArialMT_Plain_16);display->drawString(35 + x, 10 + y, wunderground.getHumidity());display->drawString(95 + x, 10 + y, wunderground.getWindSpeed() + "Kph");display->drawString(35 + x, 34 + y, wunderground.getWindDir());display->drawString(95 + x, 34 + y, wunderground.getPoP(today) + "%");}void drawData2(OLEDDisplay *display, OLEDDisplayUiState* state, int16_t x, int16_t y) {display->setTextAlignment(TEXT_ALIGN_CENTER);display->setFont(ArialMT_Plain_10);display->drawString(35 + x, y, "Presusure");display->drawString(95 + x, y, "DewPoint");display->drawString(35 + x, 24 + y, "FeelLike");display->drawString(95 + x, 23 + y, "Moonlight");display->setFont(ArialMT_Plain_16);display->drawString(35 + x, 10 + y, wunderground.getPressure());display->drawString(95 + x, 10 + y, wunderground.getDewPoint() + "°C");display->drawString(35 + x, 34 + y, wunderground.getFeelsLike() + "°C");display->drawString(95 + x, 34 + y, wunderground.getMoonPctIlum() + "%");}void drawHeaderOverlay(OLEDDisplay *display, OLEDDisplayUiState* state) {display->setColor(WHITE);display->setFont(ArialMT_Plain_10);String date = wunderground.getDate().substring(0, 3);display->setTextAlignment(TEXT_ALIGN_LEFT);display->drawString(0, 54, date);display->setTextAlignment(TEXT_ALIGN_RIGHT);String temp = wunderground.getCurrentTemp() + "°C";display->drawString(128, 54, temp);display->drawHorizontalLine(0, 52, 128);}void setReadyForWeatherUpdate() {Serial.println("Setting readyForUpdate to true");readyForWeatherUpdate = true;}//CODE END===============================================================================================================================================================================================================================================================================================================================================================================================================and you must add this part in ArduinoStationImage.h===============================================================================================================================================================================================================================================================================================================================================================================================================#define WiFi_Logo_width 60#define WiFi_Logo_height 36#define Moon_And_Sun_width 30#define Moon_And_Sun_height 30const char WiFi_Logo_bits[] PROGMEM = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0x00,0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF,0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x00,0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,0xFF, 0x03, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,0x00, 0xFF, 0xFF, 0xFF, 0x07, 0xC0, 0x83, 0x01, 0x80, 0xFF, 0xFF, 0xFF,0x01, 0x00, 0x07, 0x00, 0xC0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x0C, 0x00,0xC0, 0xFF, 0xFF, 0x7C, 0x00, 0x60, 0x0C, 0x00, 0xC0, 0x31, 0x46, 0x7C,0xFC, 0x77, 0x08, 0x00, 0xE0, 0x23, 0xC6, 0x3C, 0xFC, 0x67, 0x18, 0x00,0xE0, 0x23, 0xE4, 0x3F, 0x1C, 0x00, 0x18, 0x00, 0xE0, 0x23, 0x60, 0x3C,0x1C, 0x70, 0x18, 0x00, 0xE0, 0x03, 0x60, 0x3C, 0x1C, 0x70, 0x18, 0x00,0xE0, 0x07, 0x60, 0x3C, 0xFC, 0x73, 0x18, 0x00, 0xE0, 0x87, 0x70, 0x3C,0xFC, 0x73, 0x18, 0x00, 0xE0, 0x87, 0x70, 0x3C, 0x1C, 0x70, 0x18, 0x00,0xE0, 0x87, 0x70, 0x3C, 0x1C, 0x70, 0x18, 0x00, 0xE0, 0x8F, 0x71, 0x3C,0x1C, 0x70, 0x18, 0x00, 0xC0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x08, 0x00,0xC0, 0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x0C, 0x00, 0x80, 0xFF, 0xFF, 0x1F,0x00, 0x00, 0x06, 0x00, 0x80, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0x07, 0x00,0x00, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x00, 0xF8, 0xFF, 0xFF,0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xFE, 0xFF, 0xFF, 0x01, 0x00, 0x00,0x00, 0x00, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF,0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0x1F, 0x00, 0x00, 0x00,0x00, 0x00, 0x80, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,};const char activeSymbole[] PROGMEM = {B00000000,B00000000,B00011000,B00100100,B01000010,B01000010,B00100100,B00011000};const char inactiveSymbole[] PROGMEM = {B00000000,B00000000,B00000000,B00000000,B00011000,B00011000,B00000000,B00000000};const char PROGMEM moon1[] = {0x00, 0xf8, 0x07, 0x00, 0x00, 0x07, 0x38, 0x00, 0x80, 0x00, 0x40, 0x00,0x60, 0x00, 0x80, 0x01, 0x10, 0x00, 0x00, 0x02, 0x08, 0x00, 0x00, 0x04,0x08, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x10,0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x20,0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x20,0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x20, 0x01, 0x00, 0x00, 0x20,0x01, 0x00, 0x00, 0x20, 0x02, 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x10,0x02, 0x00, 0x00, 0x10, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x04,0x08, 0x00, 0x00, 0x04, 0x10, 0x00, 0x00, 0x02, 0x60, 0x00, 0x80, 0x01,0x80, 0x00, 0x40, 0x00, 0x00, 0x07, 0x38, 0x00, 0x00, 0xf8, 0x07, 0x00};static const char moon2[] PROGMEM = {0x00, 0xf8, 0x07, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x7e, 0x00,0x00, 0x00, 0xfc, 0x01, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xe0, 0x07,0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x80, 0x1f,0x00, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x00, 0x3f,0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x3f,0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x3f,0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x80, 0x1f, 0x00, 0x00, 0x80, 0x1f,0x00, 0x00, 0x80, 0x1f, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0xe0, 0x07,0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xfc, 0x01,0x00, 0x00, 0x7e, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0xf8, 0x07, 0x00};const char PROGMEM moon3[] = {0x00, 0xfc, 0x07, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0xe0, 0x7f, 0x00,0x00, 0xe0, 0xff, 0x01, 0x00, 0xc0, 0xff, 0x03, 0x00, 0x80, 0xff, 0x07,0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xfe, 0x1f,0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0xfc, 0x1f, 0x00, 0x00, 0xfc, 0x3f,0x00, 0x00, 0xfc, 0x3f, 0x00, 0x00, 0xfc, 0x3f, 0x00, 0x00, 0xfc, 0x3f,0x00, 0x00, 0xfc, 0x3f, 0x00, 0x00, 0xfc, 0x3f, 0x00, 0x00, 0xfc, 0x3f,0x00, 0x00, 0xfe, 0x3f, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0xfe, 0x1f,0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x07,0x00, 0x80, 0xff, 0x07, 0x00, 0xc0, 0xff, 0x03, 0x00, 0xe0, 0xff, 0x01,0x00, 0xe0, 0x7f, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00, 0xfc, 0x07, 0x00};const char PROGMEM moon4[] = {0x00, 0xfc, 0x07, 0x00, 0x00, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0x7f, 0x00,0xc0, 0xff, 0xff, 0x01, 0x80, 0xff, 0xff, 0x03, 0x80, 0xff, 0xff, 0x07,0x00, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x1f,0x00, 0xfc, 0xff, 0x1f, 0x00, 0xfc, 0xff, 0x1f, 0x00, 0xfc, 0xff, 0x3f,0x00, 0xfc, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0x3f,0x00, 0xf8, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0x3f, 0x00, 0xf8, 0xff, 0x3f,0x00, 0xf8, 0xff, 0x3f, 0x00, 0xfc, 0xff, 0x1f, 0x00, 0xfc, 0xff, 0x1f,0x00, 0xfc, 0xff, 0x1f, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x07,0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x03, 0xc0, 0xff, 0xff, 0x01,0xc0, 0xff, 0x7f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xfe, 0x07, 0x00};const char PROGMEM moon5[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0xff, 0x3f, 0x00,0x80, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0x03,0xf0, 0xff, 0xff, 0x03, 0xf8, 0xff, 0xff, 0x07, 0xfc, 0xff, 0xff, 0x0f,0xfc, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0x0f, 0xfe, 0xff, 0xff, 0x1f,0xfe, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0x1f,0xfe, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0x1f,0xfe, 0xff, 0xff, 0x1f, 0xfc, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0x0f,0xfc, 0xff, 0xff, 0x0f, 0xf8, 0xff, 0xff, 0x07, 0xf0, 0xff, 0xff, 0x03,0xf0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x01, 0x80, 0xff, 0x7f, 0x00,0x00, 0xff, 0x3f, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00};const char PROGMEM moon6[] = {0x00, 0xf8, 0x0f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x80, 0xff, 0xff, 0x00,0xe0, 0xff, 0xff, 0x00, 0xf0, 0xff, 0x7f, 0x00, 0xf8, 0xff, 0x7f, 0x00,0xf8, 0xff, 0x3f, 0x00, 0xfc, 0xff, 0x1f, 0x00, 0xfe, 0xff, 0x1f, 0x00,0xfe, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x0f, 0x00,0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00,0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00, 0xff, 0xff, 0x07, 0x00,0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0x0f, 0x00,0xfe, 0xff, 0x0f, 0x00, 0xfc, 0xff, 0x1f, 0x00, 0xf8, 0xff, 0x1f, 0x00,0xf8, 0xff, 0x3f, 0x00, 0xf0, 0xff, 0x3f, 0x00, 0xe0, 0xff, 0xff, 0x00,0x80, 0xff, 0xff, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0xf8, 0x1f, 0x00};const char PROGMEM moon7[] = {0x00, 0xf8, 0x0f, 0x00, 0x00, 0xff, 0x07, 0x00, 0x80, 0xff, 0x01, 0x00,0xe0, 0xff, 0x01, 0x00, 0xf0, 0xff, 0x00, 0x00, 0xf8, 0x7f, 0x00, 0x00,0xf8, 0x3f, 0x00, 0x00, 0xfc, 0x3f, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00,0xfe, 0x1f, 0x00, 0x00, 0xfe, 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00,0xff, 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00,0xff, 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x0f, 0x00, 0x00,0xff, 0x1f, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00,0xfe, 0x1f, 0x00, 0x00, 0xfc, 0x3f, 0x00, 0x00, 0xf8, 0x3f, 0x00, 0x00,0xf8, 0x7f, 0x00, 0x00, 0xf0, 0xff, 0x00, 0x00, 0xe0, 0xff, 0x01, 0x00,0x80, 0xff, 0x01, 0x00, 0x00, 0xff, 0x07, 0x00, 0x00, 0xf8, 0x0f, 0x00};const char PROGMEM moon8[] = {0x00, 0xf8, 0x07, 0x00, 0x00, 0xff, 0x00, 0x00, 0x80, 0x1f, 0x00, 0x00,0xe0, 0x0f, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00,0xf8, 0x01, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00,0x7e, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00,0x3f, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00,0x7e, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0xf8, 0x01, 0x00, 0x00,0xf8, 0x01, 0x00, 0x00, 0xf0, 0x03, 0x00, 0x00, 0xe0, 0x0f, 0x00, 0x00,0x80, 0x1f, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xf8, 0x07, 0x00};//CODE END======================================================================================================================================================================================================================================================================================================================================================P.S.If your oled doesn't show Accurately Moon Image, Please try again or Re-conversion Moon Image.Here is the list of moonMoon1 : New MoonMoon2 : Waxing crescentMoon3 : Waxing halfmoonMoon4 : waxing gibbous moonMoon5 : Full moonMoon6 : waning gibbous moonMoon7 : waning halfmoonAND PLEASE DO NOT DRAG ALL THIS COMMENT. THAT CAUSE OF ERRORMoon8 : Waxind crescent

    View Instructable »
  • solar767 commented on deba168's instructable ESP8266 Weather Widget2 years ago
    ESP8266 Weather Widget

    The cause was simple. Just change the pin number. SDA is connected to D1, SCL is connected to D2, and if you change the pin setting of the code (the time display is strange and the weather is not displayed correctly). I live in Seoul and the quality of the service provided by Wunderground is not good.

    Oh, I have same problem too. I donno why my board still not working. It worked even until yesterday ...

    View Instructable »
  • solar767 commented on deba168's instructable ESP8266 Weather Widget2 years ago
    ESP8266 Weather Widget

    In the middle of this site, there is a link called "Arduino code" that links to github. View code> Example> WeatherStationDemoExtended In this way, you will see the h file I mentioned. Was this a solution?

    Ah, you must set "view all level"

    View Instructable »
  • solar767 commented on deba168's instructable ESP8266 Weather Widget2 years ago
    ESP8266 Weather Widget

    I think there's nothing wrong with that code. Because there is no 'fonts.h'! It just arduinoweatherfont.h! Am i right?So, you can just change include parts. Umm. Can you help me please...my comment is under your comment.

    View Instructable »
  • solar767 commented on deba168's instructable ESP8266 Weather Widget2 years ago
    ESP8266 Weather Widget

    How can i use "adafruit 1.3" SPI 128*64 oled"? This oled can change controll interface. I just changed this controll interface SPI to I2C! But in adafruit use more pin. https://learn.adafruit.com/monochrome-oled-breakouts/wiring-1-dot-3-128x64This is url. That will be more help!So, How can i connect with Nodemcu and that oled? And How to do I Change this code?(Sorry, i can't speak english well)

    View Instructable »
  • solar767 commented on deba168's instructable SOLAR POWERED ARDUINO WEATHER STATION2 years ago
    SOLAR POWERED ARDUINO WEATHER STATION

    I have same problem too(sorry, I can't speak English well)exit status 1'POSITIVE' was not declared in this scopeI just followed the system you gave.Setup librarys...but... Why did I get error?

    View Instructable »