/* * Copyright Paul Warren 2019 * * Released under the terms of the GPLv3 license. */ #include #include #include #include #include #include "epd.h" #include "credential.h" // Weather bits // Australian BOM bits, Belconnen is mine. // see http://www.bom.gov.au/catalogue/data-feeds.shtml //const char* aac = "NSW_PT254"; //const char* bom_url = "ftp://ftp.bom.gov.au/anon/gen/fwo/IDN11060.xml"; // openweathermap, api_key from credential.h // // Maybe try String types? const String owm_url = "http://api.openweathermap.org/data/2.5/weather?q=Belconnen,AU&APPID="; // Timezone bits // Australia Eastern Time Zone (Sydney, Melbourne) TimeChangeRule aEDT = {"AEDT", First, Sun, Oct, 2, 660}; // UTC + 11 hours TimeChangeRule aEST = {"AEST", First, Sun, Apr, 3, 600}; // UTC + 10 hours Timezone ausET(aEDT, aEST); TimeChangeRule *tcr; // Network clients WiFiUDP ntpUDP; HTTPClient http; NTPClient timeClient(ntpUDP, "raspberrypi.lan", 0, 60000); //use internal ntp server, update every 10 minutes // defined in "credentials.h" const char* ssid = ssid_name; // The SSID (name) of your Wi-Fi network const char* password = ssid_pass; // The password of the Wi-Fi network const int led = LED_BUILTIN; // yes this seems backwards but it works... void ledOn(void) { digitalWrite(led, LOW);} void ledOff(void) { digitalWrite(led, HIGH);} void wait(void) { delay(1500);} // Font width int dwidth = 185; void setup() { pinMode(led, OUTPUT); ledOff(); wifi_set_sleep_type(LIGHT_SLEEP_T); epd_init(); epd_wakeup(); epd_set_memory(MEM_NAND); epd_set_color(BLACK, WHITE); epd_set_en_font(ASCII64); epd_clear(); Serial.begin(115200); // Start serial communication Serial.setTimeout(2000); while (!Serial) { } Serial.println("\r\n\r\nSTARTING\r\n"); wifi(); printDateTime(0); timeClient.begin(); ntpUpdate(); epd_clear(); printDateTime(1); ledOff(); } void wifi() { WiFi.persistent(false); WiFi.mode(WIFI_OFF); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); // Access WiFi Serial.print("Connecting to "); Serial.print(ssid); Serial.print(" ..."); while (WiFi.status() != WL_CONNECTED) { // Wait for WiFi to connect delay(250); Serial.print("."); } Serial.println('\n'); Serial.println("WiFi connection established"); Serial.print("Device's IP address is "); Serial.println(WiFi.localIP()); // Show device's IP address } void ntpUpdate() { timeClient.update(); setTime(timeClient.getEpochTime()); } void disp_digit(int digit, int xpos){ // digit: digit to display // xpos: X digit position, indexed at 1 int dpos = 0; int ypos = 0; dpos = ((xpos - 1) * dwidth); if (xpos > 2) { dpos += 60; // account for colon } switch (digit) { case 0: epd_disp_bitmap("0.JPG", dpos, ypos); break; case 1: epd_disp_bitmap("1.JPG", dpos, ypos); break; case 2: epd_disp_bitmap("2.JPG", dpos, ypos); break; case 3: epd_disp_bitmap("3.JPG", dpos, ypos); break; case 4: epd_disp_bitmap("4.JPG", dpos, ypos); break; case 5: epd_disp_bitmap("5.JPG", dpos, ypos); break; case 6: epd_disp_bitmap("6.JPG", dpos, ypos); break; case 7: epd_disp_bitmap("7.JPG", dpos, ypos); break; case 8: epd_disp_bitmap("8.JPG", dpos, ypos); break; case 9: epd_disp_bitmap("9.JPG", dpos, ypos); break; } } void disp_time(int hours, int minutes) { epd_clear(); // first digit of hours if (hours > 19) { disp_digit(2, 1); hours -= 20; } else if (hours > 9) { disp_digit(1, 1); hours -= 10; } else { disp_digit(0, 1); } // second hours digit disp_digit(hours, 2); epd_disp_bitmap("COLO.JPG", 2 * dwidth, 0); // first minutes digit if (minutes > 49) { disp_digit(5, 3); minutes -= 50; } else if (minutes > 39) { disp_digit(4, 3); minutes -= 40; } else if (minutes > 29) { disp_digit(3, 3); minutes -= 30; } else if (minutes > 19) { disp_digit(2, 3); minutes -= 20; } else if (minutes > 9) { disp_digit(1, 3); minutes -= 10; } else { disp_digit(0, 3); } // second minutes digit disp_digit(minutes, 4); } void printDateTime(int update_epd) { char buf[64]; time_t t; t = ausET.toLocal(now(), &tcr); char m[4]; // temporary storage for month string (DateStrings.cpp uses shared buffer) strcpy(m, monthShortStr(month(t))); sprintf(buf, "%.2d:%.2d:%.2d", hour(t), minute(t), second(t)); Serial.print(buf); Serial.print(" "); if (update_epd > 0) { disp_time(hour(t), minute(t)); } sprintf(buf, "%s %.2d %s %d %s", dayShortStr(weekday(t)), day(t), m, year(t), &tcr -> abbrev); Serial.println(buf); if (update_epd > 0) { epd_set_en_font(ASCII64); epd_disp_string(buf, 150, 290); epd_update(); delay(1500); Serial.println("Screen Updated"); } } void weatherUpdate(void) { http.begin(owm_url + api_key); int httpCode = http.GET(); if (httpCode > 0) { String payload = http.getString(); Serial.println(httpCode); Serial.println(payload); } else { Serial.print("Error on HTTP Request: "); Serial.println(httpCode); http.end(); } } void loop() { int sleep_seconds = 0; Serial.println("Back from sleep!"); if (WiFi.status() != WL_CONNECTED) { wifi(); } ntpUpdate(); //weatherUpdate(); if (second(now()) >= 49) { epd_wakeup(); while (second(now()) != 0) { delay(500); } printDateTime(1); delay(4000); epd_enter_stopmode(); } sleep_seconds = 49 - second(now()); Serial.print("Sleeping for: "); Serial.println(sleep_seconds); delay(sleep_seconds * 1000); }