Вопросы и замечания по статьям и схемам, представленным на нашем сайте
При поддержке РадиоКОТструктор.ру
Чт ноя 30, 2017 16:21:29
По поводу GPIO16, Вы правы, нужно поставить резистор на пару сотен ом, или диод, чтоб защитить вывод.
А вот по поводу пропадания иконки заряда сказать нечего. Я не видел этого глюка, попробую понаблюдать более пристально. Может фотку скинете как это выглядит.
Чт ноя 30, 2017 17:21:49
По поводу GPIO16, Вы правы, нужно поставить резистор на пару сотен ом, или диод, чтоб защитить вывод.
А вот по поводу пропадания иконки заряда сказать нечего. Я не видел этого глюка, попробую понаблюдать более пристально. Может фотку скинете как это выглядит.
Парой сотен Ом не выйдет. На плате NodeMCU нога Ресет подтянута к питанию через резистор 12 К,
а кнопка подключена через резистор 470 Ом к земле. Не просаживается GPIO16 до нолика,
выход достаточно мощный и десятком-другим миллиампер его не просадишь.
С диодом - Х его З, надо попробовать.
Замыкал напрямую - держит, но не факт что на 101 раз не выгорит.
Лучше дёрнуть по питанию.
Насчет иконки - просто пропадает в верхнем левом углу, всё остальное в норме.
Добавлено after 44 minutes 22 seconds:В дополнение к предыдущему посту:
Диод надо подключить анодом к РЕСЕТу, катодом к ГПИО16.
Проверено - работает, и ГПИО так не спалишь.
Диод подцепил 1N4148, но лучше какой-нибудь Шоттки.
Есть просьба - нельзя ли добавить в настройки время выхода из спячки, чтобы не ждать 15 минут,
для настройки вполне бы устроила 1 минута.
Чт ноя 30, 2017 19:57:29
По поводу пропадания иконки - попробовать перезагрузить домашний роутер Wi-Fi. У меня с Huawei 8245 такая проблема. Пришлось в программе встроить сброс по условию пропадания иконки.
Сб дек 02, 2017 11:21:24
Вопрос к himikat123 по схеме основного блока: зачем нужен резистор R7?
Для чего подтягивать GPIO15 к земле, если в данном случае это выход,
CS дисплея тоже незачем, он подключен к GPIO15 и прекрасно им управляется.
Во внешнем блоке GPIO15 просто подключен к земле через тот-же R7. Зачем?
Сб дек 02, 2017 13:54:51
Так нужно для старта модуля ESP8266, чтоб на GPIO0 и на GPIO2 был высокий уровень, а на GPIO15 низкий. Производитель чипа ESP8266 сказал, что при старте чипа в обычном режиме нужно обеспечить данные уровни.
Сб дек 02, 2017 15:59:05
Так нужно для старта модуля ESP8266, чтоб на GPIO0 и на GPIO2 был высокий уровень, а на GPIO15 низкий. Производитель чипа ESP8266 сказал, что при старте чипа в обычном режиме нужно обеспечить данные уровни.
Это, похоже, так и есть.
Прозвонил тестером две платы NodeMCU, собранные в разных сараях:
GPIO0 - как и РЕСЕТ, 12К на питание, кнопка FLASH на землю через 470 Ом.
GPIO2 - 12К на питание.
GPIO15- 12К на землю.
Вопрос снят.
Но просьба сделать прошивку уличного блока с регулировкой времени спячки осталась.
Сб дек 02, 2017 22:35:52
Но просьба сделать прошивку уличного блока с регулировкой времени спячки осталась.
Об этой просьбе я помню, обязательно добавлю эту регулировку в следующую прошивку.
Вс дек 10, 2017 14:33:47
То himikat123: если в погодном мониторе спячка отключена, то показания погоды с сайта openweathermap не обновляются автоматически. Обновление происходит только после сброса,
но каждый раз давить РЕСЕТ - как-то нехорошо. Автоматическое обновление раз в полчаса было бы самое то.
В спящем режиме все нормально - всё равно будим РЕСЕТом.
Вс дек 10, 2017 14:50:23
Mizetsky Я только что еще раз проверил, все обновляется как положено, примерно раз в 3 минуты. Может у Вас прошивка старая?
Вс дек 10, 2017 16:23:22
Mizetsky Я только что еще раз проверил, все обновляется как положено, примерно раз в 3 минуты. Может у Вас прошивка старая?
Прошивка 2.7, уличный датчик отключен.
Пробовал с Вашим и со своим APPID, разница только в наличии и отсутствии прогноза.
Добавлено after 29 minutes 4 seconds:Добавлю: картинка перерисовывается, как положено, но данные о текущей погоде не меняются,
хотя на сайте openweathermap они изменились. И так может стоять часами.
После сброса всё синхронизируется до следующего сброса.
Вс дек 10, 2017 16:26:40
OK, я исследую этот вопрос более детально.
Вс дек 10, 2017 17:04:08
Mizetsky, странно. Проверил у себя, все отлично. Прошивка 2.7а (вместо значка батарейки - вольтаж)
Вс дек 10, 2017 17:06:42
понаблюдал более пристально, даже лог обновлений погоды снял:
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 поменялись, значит обновление происходит.
Вс дек 10, 2017 17:45:22
А как такой лог получить?
В скетче есть Serial.begin(115200);, но ничего не выводится.
Вс дек 10, 2017 20:14:08
Нужно модифицировать файл 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 будет такой же лог
Пн дек 11, 2017 14:04:14
То himikat123: А не здесь ли собака порылась? Вы говорили, что запросы идут раз в три минуты.
А если с Вашим APPID ломится куча народу?
Вот что нашел на сайте openweathermap.org (перевод машинный)
Если Вы не получили ответа от сервера, не пытайтесь повторить Ваш запрос немедленно, а только через 10 мин. Также мы рекомендуем хранить ваши предыдущие данные запроса.
Ограничение доступа:
Если счет превышает лимиты, то отправляется уведомление о превышении лимитов. Если она повторяется снова, то учетная запись блокируется на час. Таким образом, срок блокировки увеличивается на один час, пока блок не будет установлен на 4 часа. При блокировке повторяется пятый раз, то период блокировки длится 24 часа. Это правило циклическое. Пожалуйста, будьте осторожны с количеством вызовов API завершения.
Пн дек 11, 2017 14:22:48
Ну дык у него самого же все ок. Ничего не блокируется. Если бы сработала блокировка, то для всех сразу, а не выборочно. Ну это мое ИМХО.
Пн дек 11, 2017 22:44:31
Там на openweathermap пишут что ограничение бесплатного ключа не более 60 запросов в минуту. При условии что уже собрано 83 монитора погоды, из них редко когда бывает чтоб более 15 были включены одновременно, из них вряд ли более половины сидят на моем APPID.
Даже если 60 мониторов одновременно выйдут на связь и израсходуют лимит этой минуты, все равно в следующий раз они запросят данные не в эту же минуту, а через три минуты, то есть лимит той минуты к этому времени обнулится. Я думаю пока можно смело пользоваться одним APPID, а может еще кто поделится своим рабочим APPID, тогда шансы что нас ограничат резко уменьшатся.
Вт дек 12, 2017 08:16:52
У меня такая же проблема как у Mizetsky. Без РЕСЕТа обновляться не хочет. Использую свой APPID (рабочий).
Добавлено after 9 hours 19 minutes 52 seconds:
Вношу свой вклад в наше общее дело, мой APPID ab1f93e58657308028621e57e243e2b7
Вт дек 12, 2017 22:37:21
У меня вопрос к Mizetsky, что Вы используете, самолепный девайс или NodeMCU ESP8266 ESP-12E.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.