cozy
Черногория
Weather widget на NodeMCU или ESP8266
Отступление
Не люблю смотреть погоду на телефоне и часто забываю сделать это перед выходом из дома. А такой виджет всегда на виду и волей не волей погоду узнаешь.
Захотелось сделать что-то своими руками полезного. На instructables нашелся отличный пост по тому как сделать погодный виджет на базе esp8266 или nodemcu.
На nodemcu проще - плата, oled, 4 провода и готово. На esp8266 сложнее, но и интереснее.
Я сделал оба варианта и добавил кое-что от себя в данный проект: скорость ветра, время рассвета и заката, загруженность дорог.
По ссылке http://www.instructables.com/id/ESP8266-Weather-Widget/ описано все подробно и проблем возникнуть не должно. Сделав все по инструкции мы получим окна с текущей датой и временем, окно с текущей погодой, прогноз на три дня, давление, осадки и влажность.
Единственный момент - в этой инструкции перепутаны SDA и SCL пины. Подключить нужно в обратном порядке.
Чтобы добавить дополнительных экранов нужно:
В коде указать нужное кол-во экранов в переменной и дописать drawFrame{N} в следующем месте:
void (*frameCallbacks[])(int x, int y) = {drawFrame1, drawFrame2, drawFrame3, drawFrame4};
int numberOfFrames = 4;
Далее в программе в соответствующих функциях дополнить своим кодом:
void drawFrame4(int x, int y) {...}
Загруженность трафиком, время рассвета и заката я получал с помощью thingspeak.com
Делал все по этой инструкции: https://www.youtube.com/watch?v=4vKxGHGYOtI
В двух словах: портал парсит страницу, выдерает нужный кусок данных и отдает через свой API. Все что оставалось, так это почистить немного данные от мусора (в видео об этом сказано) и вывести на экран.
Парсил я страницу городского портала. На ней, к слову, было много полезной инфы: курсы валют, погода, погода по ощущению и т.д.
В итоге кусок кода для получения времени рассвета и заката у меня выглядит так:
String sunset()
{
String result;
HTTPClient http;
const char kUrl[] = "api.thingspeak.com";
const char kPath[] = "/apps/thinghttp/send_request?api_key=my_apikey_here";
http.begin(kUrl,80,kPath);
int httpCode = http.GET();
if(httpCode == 200) {
String payload = http.getString();
int i = 0;
while (payload.charAt(i) != ':') // Character before required data starts.
i++;
String sunr = payload.substring(i-2,i+3);
payload = payload.substring(i+2);
int j = 0;
while (payload.charAt(j) != ':') // Character after required data ends.
j++;
String suns = payload.substring(j-2, j+3);
result = sunr+"-"+suns;
}
return (result);
}
Какую информацию выводить на экране - решать вам. У меня сразу появилось несколько неплохих идей. Например, вместо индекса загруженности города выводить загруженность по определенному рутинному маршруту (дом-работа). Или для этого маршрута, при наличии нескольких альтернативных дорого, выводить ту, по которой быстрее всего.