Монитор погоды на ESP8266

Вопросы и замечания по статьям и схемам, представленным на нашем сайте

При поддержке РадиоКОТструктор.ру


Ответить
Электрический кот
Аватара пользователя
Сообщения: 1081
Зарегистрирован: Ср фев 15, 2017 22:37:11

Сообщение himikat123 »

По поводу GPIO16, Вы правы, нужно поставить резистор на пару сотен ом, или диод, чтоб защитить вывод.

А вот по поводу пропадания иконки заряда сказать нечего. Я не видел этого глюка, попробую понаблюдать более пристально. Может фотку скинете как это выглядит.
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 564
Зарегистрирован: Чт окт 25, 2007 14:51:26
Откуда: KO59FV

Сообщение Mizetsky »

[uquote="himikat123",url="/forum/viewtopic.php?p=3246943#p3246943"]По поводу GPIO16, Вы правы, нужно поставить резистор на пару сотен ом, или диод, чтоб защитить вывод.

А вот по поводу пропадания иконки заряда сказать нечего. Я не видел этого глюка, попробую понаблюдать более пристально. Может фотку скинете как это выглядит.[/uquote]

Парой сотен Ом не выйдет. На плате NodeMCU нога Ресет подтянута к питанию через резистор 12 К,
а кнопка подключена через резистор 470 Ом к земле. Не просаживается GPIO16 до нолика,
выход достаточно мощный и десятком-другим миллиампер его не просадишь.
С диодом - Х его З, надо попробовать.
Замыкал напрямую - держит, но не факт что на 101 раз не выгорит.
Лучше дёрнуть по питанию.

Насчет иконки - просто пропадает в верхнем левом углу, всё остальное в норме.

Добавлено after 44 minutes 22 seconds:
В дополнение к предыдущему посту:
Диод надо подключить анодом к РЕСЕТу, катодом к ГПИО16.
Проверено - работает, и ГПИО так не спалишь.
Диод подцепил 1N4148, но лучше какой-нибудь Шоттки.

Есть просьба - нельзя ли добавить в настройки время выхода из спячки, чтобы не ждать 15 минут,
для настройки вполне бы устроила 1 минута.
Реклама
Открыл глаза
Сообщения: 55
Зарегистрирован: Пт авг 02, 2013 06:10:26

Сообщение vladimirk68 »

По поводу пропадания иконки - попробовать перезагрузить домашний роутер Wi-Fi. У меня с Huawei 8245 такая проблема. Пришлось в программе встроить сброс по условию пропадания иконки.
Вымогатель припоя
Аватара пользователя
Сообщения: 564
Зарегистрирован: Чт окт 25, 2007 14:51:26
Откуда: KO59FV

Сообщение Mizetsky »

Вопрос к himikat123 по схеме основного блока: зачем нужен резистор R7?
Для чего подтягивать GPIO15 к земле, если в данном случае это выход,
CS дисплея тоже незачем, он подключен к GPIO15 и прекрасно им управляется.
Во внешнем блоке GPIO15 просто подключен к земле через тот-же R7. Зачем?
Реклама
Эиком - электронные компоненты и радиодетали
Электрический кот
Аватара пользователя
Сообщения: 1081
Зарегистрирован: Ср фев 15, 2017 22:37:11

Сообщение himikat123 »

Так нужно для старта модуля ESP8266, чтоб на GPIO0 и на GPIO2 был высокий уровень, а на GPIO15 низкий. Производитель чипа ESP8266 сказал, что при старте чипа в обычном режиме нужно обеспечить данные уровни.
Контактная информация:
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 564
Зарегистрирован: Чт окт 25, 2007 14:51:26
Откуда: KO59FV

Сообщение Mizetsky »

[uquote="himikat123",url="/forum/viewtopic.php?p=3248307#p3248307"]Так нужно для старта модуля ESP8266, чтоб на GPIO0 и на GPIO2 был высокий уровень, а на GPIO15 низкий. Производитель чипа ESP8266 сказал, что при старте чипа в обычном режиме нужно обеспечить данные уровни.[/uquote]

Это, похоже, так и есть.
Прозвонил тестером две платы NodeMCU, собранные в разных сараях:
GPIO0 - как и РЕСЕТ, 12К на питание, кнопка FLASH на землю через 470 Ом.
GPIO2 - 12К на питание.
GPIO15- 12К на землю.
Вопрос снят.

Но просьба сделать прошивку уличного блока с регулировкой времени спячки осталась.
Реклама
Электрический кот
Аватара пользователя
Сообщения: 1081
Зарегистрирован: Ср фев 15, 2017 22:37:11

Сообщение himikat123 »

[uquote="Mizetsky",url="/forum/viewtopic.php?p=3248442#p3248442"]Но просьба сделать прошивку уличного блока с регулировкой времени спячки осталась.[/uquote]
Об этой просьбе я помню, обязательно добавлю эту регулировку в следующую прошивку.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 564
Зарегистрирован: Чт окт 25, 2007 14:51:26
Откуда: KO59FV

Сообщение Mizetsky »

То himikat123: если в погодном мониторе спячка отключена, то показания погоды с сайта openweathermap не обновляются автоматически. Обновление происходит только после сброса,
но каждый раз давить РЕСЕТ - как-то нехорошо. Автоматическое обновление раз в полчаса было бы самое то.
В спящем режиме все нормально - всё равно будим РЕСЕТом.
Электрический кот
Аватара пользователя
Сообщения: 1081
Зарегистрирован: Ср фев 15, 2017 22:37:11

Сообщение himikat123 »

Mizetsky Я только что еще раз проверил, все обновляется как положено, примерно раз в 3 минуты. Может у Вас прошивка старая?
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 564
Зарегистрирован: Чт окт 25, 2007 14:51:26
Откуда: KO59FV

Сообщение Mizetsky »

[uquote="himikat123",url="/forum/viewtopic.php?p=3255764#p3255764"]Mizetsky Я только что еще раз проверил, все обновляется как положено, примерно раз в 3 минуты. Может у Вас прошивка старая?[/uquote]

Прошивка 2.7, уличный датчик отключен.
Пробовал с Вашим и со своим APPID, разница только в наличии и отсутствии прогноза.

Добавлено after 29 minutes 4 seconds:
Добавлю: картинка перерисовывается, как положено, но данные о текущей погоде не меняются,
хотя на сайте openweathermap они изменились. И так может стоять часами.
После сброса всё синхронизируется до следующего сброса.
Электрический кот
Аватара пользователя
Сообщения: 1081
Зарегистрирован: Ср фев 15, 2017 22:37:11

Сообщение himikat123 »

OK, я исследую этот вопрос более детально.
Контактная информация:
Супер-Кот
Аватара пользователя
Сообщения: 235
Зарегистрирован: Пт мар 13, 2015 15:02:43
Откуда: Город Грёз

Сообщение Silvermonk »

Mizetsky, странно. Проверил у себя, все отлично. Прошивка 2.7а (вместо значка батарейки - вольтаж)
Электрический кот
Аватара пользователя
Сообщения: 1081
Зарегистрирован: Ср фев 15, 2017 22:37:11

Сообщение himikat123 »

понаблюдал более пристально, даже лог обновлений погоды снял:

16:44:32
weather.id 620
weather.icon 13d
weather.temp 1.00
weather.humidity 86
weather.pressure 1005.00
weather.speed 8.20
weather.deg 300.00
weather.country MD
weather.sunrise 1512884394
weather.sunset 1512915318
weather.city Chisinau


16:46:5
weather.id 620
weather.icon 13d
weather.temp 1.00
weather.humidity 86
weather.pressure 1005.00
weather.speed 8.20
weather.deg 300.00
weather.country MD
weather.sunrise 1512884394
weather.sunset 1512915318
weather.city Chisinau


16:47:39
weather.id 620
weather.icon 13n
weather.temp 1.00
weather.humidity 86
weather.pressure 1006.00
weather.speed 8.70
weather.deg 290.00
weather.country MD
weather.sunrise 1512884395
weather.sunset 1512915318
weather.city Chisinau


16:49:12
weather.id 620
weather.icon 13n
weather.temp 1.00
weather.humidity 86
weather.pressure 1006.00
weather.speed 8.70
weather.deg 290.00
weather.country MD
weather.sunrise 1512884395
weather.sunset 1512915318
weather.city Chisinau


16:50:45
weather.id 620
weather.icon 13n
weather.temp 1.00
weather.humidity 86
weather.pressure 1006.00
weather.speed 8.70
weather.deg 290.00
weather.country MD
weather.sunrise 1512884395
weather.sunset 1512915318
weather.city Chisinau

обратите внимание атмосферное давление weather.pressure и скорость ветра weather.speed поменялись, значит обновление происходит.
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 564
Зарегистрирован: Чт окт 25, 2007 14:51:26
Откуда: KO59FV

Сообщение Mizetsky »

А как такой лог получить?
В скетче есть Serial.begin(115200);, но ничего не выводится.
Электрический кот
Аватара пользователя
Сообщения: 1081
Зарегистрирован: Ср фев 15, 2017 22:37:11

Сообщение himikat123 »

Нужно модифицировать файл weather.ino. Замените все содержимое данного файла на это

void getCoordinates(void){
String url="http://api.2ip.ua/geo.json?ip=";
coordinatesRequest(url);
parseCoordinates();
}

void getWeatherNow(void){
String Units,url;
if(html.units) Units="imperial";
else Units="metric";
if(html.city.indexOf("auto")!=-1){
url="http://api.openweathermap.org/data/2.5/weather?lat=";
url+=weather.latitude;
url+="&lon=";
url+=weather.longitude;
url+="&units=";
url+=Units;
url+="&appid=";
url+=html.appid;
url+="&lang=";
url+=urlLang;
}
else{
url="http://api.openweathermap.org/data/2.5/weather?q=";
url+=html.city;
url+="&units=";
url+=Units;
url+="&appid=";
url+=html.appid;
url+="&lang=";
url+=urlLang;
}
if(weatherNowRequest(url) and parseWeatherNow()){
country=weather.country;
city=weather.city;
lang=html.lang;
sprintf(cityName,"%s",weather.city);
sprintf(descript,"%s",weather.descript);
icon=atoi(weather.icon);
dtostrf(weather.temp,1,1,text_buf);
dtostrf(weather.speed,1,1,text_buf);
}
}

void getWeatherDaily(void){
String Units,url;
if(html.units) Units="imperial";
else Units="metric";
url="http://api.openweathermap.org/data/2.5/forecast/daily?q=";
url+=weather.city;
url+="&mode=json&units=";
url+=Units;
url+="&cnt=4&appid=";
url+=html.appid;
if(weatherDailyRequest(url) and parseWeatherDaily()){
dtostrf(weather.day1,1,1,text_buf);
dtostrf(weather.night1,1,1,text_buf);
dtostrf(weather.speed1,1,1,text_buf);
dtostrf(weather.day2,1,1,text_buf);
dtostrf(weather.night2,1,1,text_buf);
dtostrf(weather.speed2,1,1,text_buf);
dtostrf(weather.day3,1,1,text_buf);
dtostrf(weather.night3,1,1,text_buf);
dtostrf(weather.speed3,1,1,text_buf);
}
}

bool weatherNowRequest(String url){
HTTPClient client;
bool find=false;
client.begin(url);
Serial.print(hour());Serial.print(":");Serial.print(minute());Serial.print(":");Serial.println(second());
Serial.println(url);
int httpCode=client.GET();

if(httpCode>0){
if(httpCode==HTTP_CODE_OK){
httpData=client.getString();
if(httpData.indexOf(F("\"main\":{\"temp\":"))>-1) find=true;
}
}
client.end();
return find;
}

bool parseWeatherNow(){
DynamicJsonBuffer jsonBuffer;
JsonObject& root=jsonBuffer.parseObject(httpData);

if(!root.success()) return false;

weather.id = root["weather"][0]["id"];
Serial.print("weather.id ");Serial.println(weather.id);
weather.descript = root["weather"][0]["description"];
weather.icon = root["weather"][0]["icon"];
Serial.print("weather.icon ");Serial.println(weather.icon);
weather.temp = root["main"]["temp"];
Serial.print("weather.temp ");Serial.println(weather.temp);
weather.humidity = root["main"]["humidity"];
Serial.print("weather.humidity ");Serial.println(weather.humidity);
weather.pressure = root["main"]["pressure"];
Serial.print("weather.pressure ");Serial.println(weather.pressure);
weather.speed = root["wind"]["speed"];
Serial.print("weather.speed ");Serial.println(weather.speed);
weather.deg = root["wind"]["deg"];
Serial.print("weather.deg ");Serial.println(weather.deg);
weather.country = root["sys"]["country"];
Serial.print("weather.country ");Serial.println(weather.country);
weather.sunrise = root["sys"]["sunrise"];
Serial.print("weather.sunrise ");Serial.println(weather.sunrise);
weather.sunset = root["sys"]["sunset"];
Serial.print("weather.sunset ");Serial.println(weather.sunset);
weather.city = root["name"];
Serial.print("weather.city ");Serial.println(weather.city);Serial.println("\r\n");
int dayLight=0;
if(summertime()) dayLight=3600;
time_t time_now=now()-html.zone*3600-dayLight;
if(time_now>weather.sunrise and time_now<weather.sunset) weather.isDay=true;
else weather.isDay=false;
if(time_now<weather.sunrise) weather.isDay=true;
httpData="";
return true;
}

bool weatherDailyRequest(String url){
HTTPClient client;
bool find=false;
client.begin(url);
int httpCode=client.GET();

if(httpCode>0){
if(httpCode==HTTP_CODE_OK){
httpData=client.getString();
if(httpData.indexOf(F(",\"weather\":[{\"id\":"))>-1) find=true;
}
}
client.end();
return find;
}

bool parseWeatherDaily(){
DynamicJsonBuffer jsonBuffer;
JsonObject& root=jsonBuffer.parseObject(httpData);

if(!root.success()) return false;

weather.day1 = root["list"][0]["temp"]["day"];
weather.night1 = root["list"][0]["temp"]["night"];
weather.icon1 = root["list"][0]["weather"][0]["icon"];
icon1=atoi(weather.icon1);
weather.speed1 = root["list"][0]["speed"];

weather.day2 = root["list"][1]["temp"]["day"];
weather.night2 = root["list"][1]["temp"]["night"];
weather.icon2 = root["list"][1]["weather"][0]["icon"];
icon2=atoi(weather.icon2);
weather.speed2 = root["list"][1]["speed"];

weather.day3 = root["list"][2]["temp"]["day"];
weather.night3 = root["list"][2]["temp"]["night"];
weather.icon3 = root["list"][2]["weather"][0]["icon"];
icon3=atoi(weather.icon3);
weather.speed3 = root["list"][2]["speed"];

httpData = "";
return true;
}

bool coordinatesRequest(String url){
HTTPClient client;
bool find=false;
client.begin(url);
int httpCode=client.GET();

if(httpCode>0){
if(httpCode==HTTP_CODE_OK){
httpData=client.getString();
if(httpData.indexOf(F(",\"region\":"))>-1) find=true;
}
}
client.end();
return find;
}

bool parseCoordinates(){
DynamicJsonBuffer jsonBuffer;
JsonObject& root=jsonBuffer.parseObject(httpData);

if(!root.success()) return false;

weather.latitude =root["latitude"];
weather.longitude=root["longitude"];

httpData="";
return true;
}

ну и, в ардуино, в мониторе порта на скорости 115200 будет такой же лог
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 564
Зарегистрирован: Чт окт 25, 2007 14:51:26
Откуда: KO59FV

Сообщение Mizetsky »

То himikat123: А не здесь ли собака порылась? Вы говорили, что запросы идут раз в три минуты.
А если с Вашим APPID ломится куча народу?
Вот что нашел на сайте openweathermap.org (перевод машинный)

Если Вы не получили ответа от сервера, не пытайтесь повторить Ваш запрос немедленно, а только через 10 мин. Также мы рекомендуем хранить ваши предыдущие данные запроса.
Ограничение доступа:
Если счет превышает лимиты, то отправляется уведомление о превышении лимитов. Если она повторяется снова, то учетная запись блокируется на час. Таким образом, срок блокировки увеличивается на один час, пока блок не будет установлен на 4 часа. При блокировке повторяется пятый раз, то период блокировки длится 24 часа. Это правило циклическое. Пожалуйста, будьте осторожны с количеством вызовов API завершения.
Супер-Кот
Аватара пользователя
Сообщения: 235
Зарегистрирован: Пт мар 13, 2015 15:02:43
Откуда: Город Грёз

Сообщение Silvermonk »

Ну дык у него самого же все ок. Ничего не блокируется. Если бы сработала блокировка, то для всех сразу, а не выборочно. Ну это мое ИМХО.
Электрический кот
Аватара пользователя
Сообщения: 1081
Зарегистрирован: Ср фев 15, 2017 22:37:11

Сообщение himikat123 »

Там на openweathermap пишут что ограничение бесплатного ключа не более 60 запросов в минуту. При условии что уже собрано 83 монитора погоды, из них редко когда бывает чтоб более 15 были включены одновременно, из них вряд ли более половины сидят на моем APPID.
Даже если 60 мониторов одновременно выйдут на связь и израсходуют лимит этой минуты, все равно в следующий раз они запросят данные не в эту же минуту, а через три минуты, то есть лимит той минуты к этому времени обнулится. Я думаю пока можно смело пользоваться одним APPID, а может еще кто поделится своим рабочим APPID, тогда шансы что нас ограничат резко уменьшатся.
Контактная информация:
Родился
Сообщения: 9
Зарегистрирован: Пн июн 12, 2017 07:23:07
Откуда: Санкт-Петербург

Сообщение Krasver »

У меня такая же проблема как у Mizetsky. Без РЕСЕТа обновляться не хочет. Использую свой APPID (рабочий).

Добавлено after 9 hours 19 minutes 52 seconds:
Вношу свой вклад в наше общее дело, мой APPID ab1f93e58657308028621e57e243e2b7
Родился
Сообщения: 9
Зарегистрирован: Пн июн 12, 2017 07:23:07
Откуда: Санкт-Петербург

Сообщение Krasver »

У меня вопрос к Mizetsky, что Вы используете, самолепный девайс или NodeMCU ESP8266 ESP-12E.
Ответить

Вернуться в «Статьи»