/** * @brief Display weather information on HX Display * @author Michael Burmeister * @date April 14, 2019 * @version 1.0 * */ #include "HX8357.h" #include "simpletools.h" #include "esp8266.h" #include "JSON.h" #include "bme280.h" void doHTTP(void); void doWeather(char *); void doPrint(int); char *Direction(int); void getTime(long); // pin definitions #define LITE 14 #define RST 13 #define DC 12 #define CS 11 #define MOSI 10 #define MISO 9 #define CLK 8 #define BMECLK 0 #define BMESDA 1 int OTemp; int ITemp; int Wind; int WindD; int OHumidity; int IHumidity; int MaxTemp; int MinTemp; int Sunrise; int Sunset; char Condition[32]; char TFmt[] = "%02d:%02d:%02d AM"; char Directions[] = "N NEE SES SWW NWN XX@"; char Buffer[2048]; int i, t; int a, v; int V[16]; int A[16]; int main() { i = HX8357_open(CLK, MISO, MOSI, CS, DC, RST, LITE); HX8357_rotation(1); HX8357_cls(HX8357_BLACK); HX8357_displayOn(1); square_wave(LITE, 0, 50); HX8357_writeSStr(10, 10, "Outside"); HX8357_writeSStr(250, 10, "Inside"); HX8357_drawLine(240, 0, 240, 210, HX8357_RED); HX8357_drawLine(241, 0, 241, 210, HX8357_RED); HX8357_drawLine(242, 0, 242, 210, HX8357_RED); HX8357_drawLine(0, 210, 480, 210, HX8357_RED); HX8357_drawLine(0, 211, 480, 211, HX8357_RED); HX8357_drawLine(0, 212, 480, 212, HX8357_RED); HX8357_writeStr(10, 130, "Wind:"); HX8357_writeStr(10, 170, "Humidity:"); HX8357_writeStr(260, 170, "Humidity:"); i = BME280_open(BMECLK, BMESDA); if (i != 0x60) { HX8357_writeSStr(10, 300, "BME280 not found!"); while (1) pause(1000); } BME280_reset(); BME280_setHumidity(oversample_1); BME280_setTemp(oversample_1); BME280_setPressure(oversample_1); BME280_setStandbyRate(standby625); BME280_setMode(BME280_normal); simpleterm_close(); esp8266_open(31, 30); t = 61; while(1) { if (t++ > 60) { doHTTP(); HX8357_textColor(HX8357_GREEN, HX8357_BLACK); doPrint(OTemp); HX8357_writeXStr(20, 30, Buffer); HX8357_textColor(HX8357_WHITE, HX8357_BLACK); HX8357_writeStr(100, 130, Direction(WindD)); doPrint(Wind); strcat(Buffer, " "); HX8357_writeStr(156, 130, Buffer); doPrint(OHumidity); strcat(Buffer, "% "); HX8357_writeStr(160, 170, Buffer); HX8357_writeStr(20, 220, Condition); if (Condition[0] == 'B') t = 61; else t = 0; } while (i = BME280_getStatus() != 0) { pause(1000); } ITemp = BME280_getTempF()/100; IHumidity = BME280_getHumidity()/100; HX8357_textColor(HX8357_GREEN, HX8357_BLACK); doPrint(ITemp); HX8357_writeXStr(260, 30, Buffer); HX8357_textColor(HX8357_WHITE, HX8357_BLACK); doPrint(IHumidity); strcat(Buffer, "% "); HX8357_writeStr(412, 170, Buffer); HX8357_writeStr(20, 252, "Sunset:"); getTime(Sunset); HX8357_writeStr(136, 252, Buffer); pause(10000); } } void doHTTP() { int s; char *d; strcpy(Condition, "Bad Data "); i = esp8266_connect("api.openweathermap.org", 80); if (i > 0) { s = esp8266_send(i, "GET /data/2.5/weather?&units=imperial", 1); s = esp8266_recv(i, Buffer); esp8266_close(i); } else { // something went wrong doPrint(i); esp8266_print(Buffer); return; } // find start of returned data d =strstr(Buffer, "\r\n\r\n"); if (d == NULL) { esp8266_print(Buffer); return; } doWeather(d); } void doWeather(char *B) { char *x; int i; json_init(B); x = json_find("weather.description"); memset(Condition, ' ', sizeof(Condition)-1); i = strlen(x); memcpy(Condition, x, i); x = json_find("main.temp"); OTemp = atoi(x); x = json_find("main.humidity"); OHumidity = atoi(x); x = json_find("main.temp_min"); MinTemp = atoi(x); x = json_find("main.temp_max"); MaxTemp = atoi(x); x = json_find("wind.speed"); Wind = atoi(x); x = json_find("wind.deg"); WindD = atoi(x); x = json_find("sys.sunrise"); Sunrise = atol(x); x = json_find("sys.sunset"); Sunset = atol(x); } void doPrint(int v) { sprinti(Buffer, "%d", v); } char *Direction(int d) { d = (d + 22)/45; d = d * 2; Directions[18] = Directions[d++]; Directions[19] = Directions[d]; return &Directions[18]; } void getTime(long i) { struct tm *tt; tt = localtime(&i); if ((tt->tm_mon > 2) && (tt->tm_mon < 10)) // Central Time with daylight savings i = i - 5 * 60 * 60; else i = i - 6 * 60 * 60; tt = localtime(&i); if (tt->tm_hour > 12) { TFmt[15] = 'P'; tt->tm_hour = tt->tm_hour - 12; } else TFmt[15] = 'A'; sprinti(Buffer, TFmt, tt->tm_hour, tt->tm_min, tt->tm_sec); }