Jump to content
iT4iT.CLUB

Recommended Posts

2 часа назад, zenone сказал:

Пробовал другой роутер, результат тот же

Ну тогда подозрение падает на ESP. Либо у вас качество сигнала по какой-то причине ухудшается (расстояние, помехи), либо какая-то аппаратная особенность конкретно этого ESP модуля. Попробовать другой модуль.

Share this post


Link to post
Share on other sites

вносил изменения только по части датчикаов - комментировал датчики температуры-влажности-давления от проекта и добавил поддержку BME-280 библиотекой от Адафрут, остальное от оригинала, единственное но -  эта ЕSP у меня участвовала в обкатке получения даты и времени с NTP сервера (с выдачей в УАРТ GPS строк) для синхронизации часов на основе этого проекта (если @Kitsum вы помните о чём я) но контроллер полностью перепрошит (папка дата тоже).

Оставлю на ночь посмотреть не сбрасываются ли показания, завтра отпишусь.

Edited by zenone

Share this post


Link to post
Share on other sites

Zenone, я так понял, что отправка идёт посредством Post-Get? 

А если настроить её через mqtt? 

Ну и если esp несколько раз удалось достучаться, то с моей точки зрения, этот выводит прошивку(если прошивка с тех пор не менялась)  из подозрения, впрочем как и сам модуль. 

Дурная идея :логин, почту, пароль на народном мониторе не меняли? Совпадает ли с тем, какой вбили в настройки esp? 

Edited by Alex_DIY

Share this post


Link to post
Share on other sites
10 часов назад, Forester сказал:

Ну тогда подозрение падает на ESP. Либо у вас качество сигнала по какой-то причине ухудшается (расстояние, помехи),

Уровень сигнала хороший - ESP_19E2D7

Скрытый текст

photo_2018-01-23_09-54-23.thumb.jpg.648a98a500c19a8ccec4becf72197d20.jpg

 

10 часов назад, Kitsum сказал:

Просматривали ли Вы график, показания не сбрасываются?

на протяжении 5ти часов (с 0:28 и до 5:40 перезагрузок не было)

Скрытый текст

photo_2018-01-23_09-54-28.thumb.jpg.86ceb28982c623031eca2b4df941aaf6.jpg

но данных на народе так и не появилось (идентификация по МАК и они совпадают) 

Скрытый текст

photo_2018-01-23_09-54-29.thumb.jpg.44d582a46b913b3ed0eac56113817f9d.jpg

Попробую выдавать в консоль то что отправляется на народный монитор, погляжу.

8 часов назад, Alex_DIY сказал:

А если настроить её через mqtt? 

Настроить не могу, не куда слать (((

Share this post


Link to post
Share on other sites
В 21.01.2018 в 23:08, Kitsum сказал:

У меня больше вопросов чем ответов. Давайте сделаем так... В данный момент у меня маршрутизатор фирмы MikroTik. Проброс портов настроил через NAT по правилу dstnat для tcp трафика на внешнем интерфейсе по измененному порту т.к 80 постоянно сканируется. Далее через netmap отправляю трафик на внутренний адрес микроконтроллера, но уже по 80 порту. Делал на скорую руку удаленно, но суть ясна по фото.

В том то и проблема, что настроено то по идее все верно, но ни в случае с переадресацией с 80 порта, ни с какого-либо другого от платы веб интерфейс получить не удается, на нее просто приходит запрос, она вроде как его видит и в мониторе прописывает страницу, которую должна отобразить, но при этом отображать не хочет.

Скрытый текст

image.png.d267cadbfa130bb2431cc1989b325c21.png

В 20.01.2018 в 18:14, ololonly сказал:

 

  Показать содержимое

image.png.e46b25ef2b291cd33de32ef028541025.pngimage.png.335e9eec40dfae2766d7a639831e2ac9.png

 

 

Share this post


Link to post
Share on other sites

@zenone тогда давайте посмотрим на ответ сервера.

Найдите строку инициализирующую отправку данных на сервер.

httpClient.GET();

замените её на

int status = httpClient.GET();
if (status > 0) Serial.printf("code: %d\nanswer: %s\n", status, httpClient.getString().c_str());
else Serial.println("No answer");

Оставьте открытым Serial монитор и посмотрите, дойдет ли запрос до сервера и как ответит сервер. К сожалению, нахожусь на работе и самостоятельно проверить работоспособность кода не могу, но думаю, что должно работать.

@ololonly попробуйте пробросить порт до другого узла сети. Для эксперимента, можно поднять Apache на компьютере и посмотреть, что будет на выходе.

Share this post


Link to post
Share on other sites

Если коротко я разобрался...., причина крылась в имени отправляемом на народный мониторинг в GET сформированной строке, почему-то имя ESP8266 (iT4iT.CLUB) не воспринималось, но до этого я попробовал заменить доменное имя на IP адрес, как советовал участник форума @Forester но это не помогло, я восстановил всё как было только убрав вообще имя ESP8266 (iT4iT.CLUB) процесс пошёл, затем по совету @Kitsum вставил в код мониторинга ответ от сервера и убедился в правильности своих выводов - всё на скринах ниже (пробел и скобки были заменены нижним подчёркиванием).

Природа этого феномена мне не понятна.

Спасибо всем кто помогал, может это кому то пригодится.

Скрытый текст

IMG_20180123_201841.thumb.jpg.30e9e7dc16fd47d4130a20d87e7ba211.jpg

Скрытый текст

IMG_20180123_201846.thumb.jpg.e9723cebbfd6c5040a18f8b1496b7875.jpg

Скрытый текст

IMG_20180123_201850.thumb.jpg.14ed005c28e6f1287ca0efaa9c2fe406.jpg

 

Edited by zenone
  • Thanks 1

Share this post


Link to post
Share on other sites
В 25.12.2017 в 02:36, EndWar сказал:

Ну что ж, по поводу статического буфера json, уверен некоторые особи тут (видимо из за малого количества памяти esp и я подозреваю ума) не способны представить себе даже существование такой проблемы, тем более уж возможности её решить, так как с убеждённостью дебила считают что все "непонятные глюки" компьютера решаются  "всего то. Перезагрузить комп и делов  то", так вот кто так не считает и имеет достаточное количество памяти, прошу под кат.

  Скрыть содержимое

После обновления кода метеостанции в августе, я слегка его подправил под собственные нужды и немного добавил функционал. Так как считаю, что не всегда удобно и оперативно только лишь для того, что-бы посмотреть температуру включать ноутбук, стационарный компьютер или возиться с браузером телефона, мной был добавлен OLED экран и энкодер для его включения/выключения и навигации по страницам, так как на 0.96 128x64 мной выводилось не только температура, давление, влажность (BME 280) и освещённость (BH1750) но и текущее время, прогноз погоды на ближайшие три дня и ещё несколько датчиков в квартире. Так же все показания этих дополнительных датчиков были добавлены на индикаторы в веб-интерфейсе метеостанции

5a3f39bc02f96_2017-12-2408-19-13-GoogleChrome.jpg.c04b80c0b9ebce3bd8dafae9b057384d.jpg 

Как я уже писал пользоваться мне удобнее Oled дисплеем 

20112017094.thumb.jpg.d48719a02a63d41c753574a57963e57d.jpg.c6f93c798a5507b35bafbc4861a907c7.jpg

  Показать содержимое

 

 

по этому не сразу заметил, что иногда (почему именно иногда поясню ниже) в веб-интерфейсе возникает вот такая ситуация

5a3fcfb6720ca_2017-12-2419-01-08-GoogleChrome.jpg.88ce2883705b7cbfdeb093e9fce9733f.jpg

а в "инструментах разработчика" браузера, вместо вот такой картинки

5a3fdf611f6e3_2017-12-2420-04-49-GoogleChrome(2).jpg.7c4097563cf7cba033903681b20fcd86.jpg

мы видим

5a3fe2cadf8d9_2017-12-2221-43-37-GoogleChrome(2).jpg.529bad364d3f7f40fc30891580c63c31.jpg

при этом весь остальной функционал метеостанции работает отлично... полная же строка передаваемая в "Ответ на запрос показаний датчиков" в первом случае выглядит вот так



{"light":13,"temperature":26.13,"humidity":50.15,"pressure":726.777,"vcc":3.238,"temperatureT6":"1","temperatureT0":"57.0","temperatureTV":"26.0","temperatureHV":"40.0","temperatureVV":"0"}

а во втором так



{"light":11254,"temperature":26.13,"humidity":50.14648,"pressure":726.45673,"vcc":3.238,"temperatureT6":"-2.1","temperatureT0":"57.0","temperatureTV":"26.0","temperatureHV":"40.0","temperatureVV":}

найдите пять отличий..?! )) Думаю раз вы тут, то все справились, конечно количеством передаваемых данных, а изменяется оно от степени освещённости, количества символов после запятой давления, влажности, температуры и знака температуры, но самое важное, что в первом случае строка собираемая библиотекой json в ответ на запрос показании датчиков, заканчивается корректно "temperatureVV":"0"} а во втором обрывается на "temperatureVV":}  и по этой причине, как я предполагаю, не может быть верно обработана.

То есть в стандартный StaticJsonBuffer<200> при неизменной прошивке строка данных может как помещаться так и нет, этим и объясняется появление и пропадание данного эффекта без видимых для пользователя причин ... Увеличиваем буфер JSON до StaticJsonBuffer<1000> и вуаля, ни каких ошибок в веб-интерфейсе больше не появляется...

Удачных всем экспериментов! 

 

Доброго дня @EndWar 

Не могли бы поделится исходниками

Share this post


Link to post
Share on other sites
4 часа назад, dimon721 сказал:

Здравствуйте @Kitsum , очень понравилась ваша метеостанция

Здравствуйте @Kitsum

Подскажите как реализовать в проекте датчик температуры DS18B20. Датчик температуры BME280 показывает отрицательную температуру до 40 градусов.

У нас температура опускается до 55 градусов

Share this post


Link to post
Share on other sites

@dimon721 доброе время суток

Я бы предложил Вам воспользоваться данной библиотекой https://github.com/milesburton/Arduino-Temperature-Control-Library На основе стандартных примеров Вы можете добавить датчики DS18B20, по аналогии, как это было сделано с датчиками на i2c шине. Поддержка этих датчиков будет добавлена чуть позже. Уже есть идеи, как реализовать отображение и понятное (для человека) распознавание этих датчиков в web интерфейсе.

Share this post


Link to post
Share on other sites

  Удалось мне реализовать свою идею, которую я описывал в этом посте  (про визуализацию скорости изменения давления). Так как программирование веб-интерфейса для меня даже не темный лес, а что-то типа области за горизонтом событий черной дыры, решил использовать для этого протокол MQTT и андроид-приложение с возможностью получения URL картинки и отображения этой самой картинки в интерфейсе. Код получился такой (программистам с расшатанными нервами смотреть не рекомендуется!):

Скрытый текст


/*
Добавленные переменные для расчета двухчасовой разности давления
*/
unsigned long timerPressureDinamic = 0;   // таймер для двухчасового сравнения показания давления
double oldPress = 0;                       // предыдущее значение давления
double deltaPress = 0;                     // разница в показаниях давления через два часа
bool firstMessurePressureOld = true;       // переменная-флаг для записи первого измерения давления при старте



/* 
Запоминаем первое измерение давления для дальнейшего по-двухчасового сравнения
*/
if (firstMessurePressureOld){
  oldPress = pressure.data;
  firstMessurePressureOld = false;
  }



/*  
Если прошло 2 часа, вычисляем дельту давления
*/
if (millis() - timerPressureDinamic > 7200000 or timerPressureDinamic > millis()) pressureDinamic();


    
/*
Отправка URL по MQTT в зависимости от дельты давления. Пришлось добавить лишний метод mqttPublishURL(), так как через существующий mqttPublish() не получилось отправить строковую URL. Понимаю, что, наверное, глупость. Поправьте сами для оптимизации.
*/
      
//если дельта в этом диапазоне, отправляем URL картинки "null" (атмосферное давление без значительных возмущений)
if((deltaPress >= 0)&(deltaPress < 0.75)) mqttPublishURL("deltapressure", "https://pp.userapi.com/c840120/v840120983/69feb/yxLX0-GRlJk.jpg");
      
//если дельта в этом диапазоне, отправляем URL картинки "up1"  (давление растет со скоростью 1 гПа/2ч.)
if((deltaPress >= 0.75)&(deltaPress < 1.5)) mqttPublishURL("deltapressure",    "https://pp.userapi.com/c840120/v840120983/69ff2/i6mLvwA8HRE.jpg"); 
      
//если дельта в этом диапазоне, отправляем URL картинки "up2"  (давление растет со скоростью 2 гПа/2ч.)
if((deltaPress >= 1.5)&(deltaPress < 2.25)) mqttPublishURL("deltapressure", "https://pp.userapi.com/c840120/v840120983/69ff9/gr2cpPuA6Kc.jpg"); 
      
//если дельта в этом диапазоне, отправляем URL картинки "up3"  (давление растет со скоростью 3 гПа/2ч.)
if((deltaPress >= 2.25)&(deltaPress < 3)) mqttPublishURL("deltapressure", "https://pp.userapi.com/c840120/v840120983/6a000/HYXjKndhFEY.jpg"); 

//если дельта в этом диапазоне, отправляем URL картинки "up4"  (давление растет со скоростью 4 и более гПа/2ч.)
if(deltaPress >= 3) mqttPublishURL("deltapressure", "https://pp.userapi.com/c840120/v840120983/6a007/qKjGWt5er4M.jpg"); 

//если дельта в этом диапазоне, отправляем URL картинки "null" (атмосферное давление без значительных возмущений)
if((deltaPress <= 0)&(deltaPress > -0.75))  mqttPublishURL("deltapressure", "https://pp.userapi.com/c840120/v840120983/69feb/yxLX0-GRlJk.jpg"); 
      
//если дельта в этом диапазоне, отправляем URL картинки "down1"  (давление падает со скоростью 1 гПа/2ч.)
if((deltaPress <= -0.75)&(deltaPress > -1.5)) mqttPublishURL("deltapressure", "https://pp.userapi.com/c840120/v840120983/69fcf/bp48SOXx_G8.jpg"); 
      
//если дельта в этом диапазоне, отправляем URL картинки "down2"  (давление падает со скоростью 2 гПа/2ч.)
if((deltaPress <= -1.5)&(deltaPress > -2.25)) mqttPublishURL("deltapressure", "https://pp.userapi.com/c840120/v840120983/69fd6/jnoRojvlQ88.jpg"); 
      
//если дельта в этом диапазоне, отправляем URL картинки "down3"  (давление падает со скоростью 3 гПа/2ч.)
if((deltaPress <= -2.25)&(deltaPress > -3)) mqttPublishURL("deltapressure", "https://pp.userapi.com/c840120/v840120983/69fdd/0qlgQqKPzto.jpg");
       
//если дельта в этом диапазоне, отправляем URL картинки "down4"  (давление падает со скоростью 4 и более гПа/2ч.)
if(deltaPress <= -3) mqttPublishURL("deltapressure", "https://pp.userapi.com/c840120/v840120983/69fe4/IhtWJ_sCgmw.jpg");



/*
Негуманный код для отправки URL по MQTT
*/
bool mqttPublishURL(String topic, String data) {
  if (config.mqtt_path.length()) topic = config.mqtt_path + "/" + topic;
  return mqtt.publish(topic.c_str(), String(data).c_str(), true);
}




/*
Вычисление разницы в давлении каждые два часа
*/

void pressureDinamic() {
  timerPressureDinamic = millis();
  deltaPress = pressure.data - oldPress;
  oldPress =  pressure.data;
}

    
    
 

 

Если кому-то интересно,  файлик ESP8266_WS_iT4iT.CLUB.ino со своими изменениями прикрепил. Понимаю, что грамотный человек реализует все гораздо правильней, взяв уже готовые данные из таблицы для графика. Но моих знаний для этого не хватает. Так что как-то так)) Для отображения показаний сваял в фотошопе на первое время вот такой манометр. В MQTT клиенте это пока выглядит так:

Screenshot_20180203-154417.png

ESP8266_WS_iT4iT.CLUB.zip

Edited by Forester
  • Like 1

Share this post


Link to post
Share on other sites

Доброе время суток всем! У меня есть такой вопрос: моя "метеостанция" сохраняет показания датчиков на SD карточку. Можно ли периодически этот файл name.txt скидывать в облако, на яндекс диск, например?

Share this post


Link to post
Share on other sites

@AlexDerBK думаю, что сходу эту задачу, силами микроконтроллера, не решить. Надо определиться с тем, как проходить авторизацию, удерживать сессию и передавать файл. Использовать OAuth или достаточно правильно сформировать заголовки в multipart/form-data?... А также подводные камни, например, устаревание сертификата при использовании https (не думаю, что Яндекс захочет общаться через http) соединения, а прописывать новый придется каждый раз самому и ручками. В итоге код передачи файла будет в десятки раз больше и сложнее чем код относящийся к метеостанции. Для каких целей это нужно? Обычно для сбора и анализа данных с iot устройств используют различные шлюзы вроде ThingSpeak или Народного мониторинга, а также MQTT брокеры.

  • Thanks 1

Share this post


Link to post
Share on other sites

Kitsum. Спасибо за ответ.  Есть ещё проблема. Связь с метеостанцией не держится больше суток. В другом проекте такая же ерунда.  Но там я смог перевести его на режим точки доступа и он работает. На этом же проекте, так как имя моего роутера содержит нижнее подчеркивание, пришлось прописать его в скетча. Сейчас все вернул обратно, но он упорно конктится к домашнему роутеру и периодически пропадает совсем. Неполучается график посмотреть за сутки :( И еще, если показания температуры после запятой имеют 0, то он пропадает и цифры пляшут. 

Share this post


Link to post
Share on other sites

@AlexDerBK доброе время суток

1 час назад, AlexDerBK сказал:

Связь с метеостанцией не держится больше суток. В другом проекте такая же ерунда.

Возможно дело не в программе. О каком втором проекте идет речь?

1 час назад, AlexDerBK сказал:

Но там я смог перевести его на режим точки доступа и он работает. На этом же проекте, так как имя моего роутера содержит нижнее подчеркивание, пришлось прописать его в скетча.

Спасибо за уточнение. Я пересмотрю поддержку спецсимволов при настройке домашней сети.

1 час назад, AlexDerBK сказал:

И еще, если показания температуры после запятой имеют 0, то он пропадает и цифры пляшут.

Не могли бы Вы сделать снимок экрана чтобы было более понятно, о чем идет речь?

Share this post


Link to post
Share on other sites

1. Конечно дело не в программе. Второй проект, тоже метеостанция, сборная солянка с записью на SD карту показаний и с выводом показаний датчиков на вебсервер.

Просто в режиме точки доступа, такой проблемы нет. А в Вашем проекте убрал уже все имена и пароли о своей локальной сети, а оно все равно к ней конектится????

2. Вот за это спасибо!

3. Попробую так объяснить. Если периодически меняются показания с 20.0 , 20.1, то показывает 20 или 20.1. А так как цифры центрируются на индикаторе, получается мельтешение. Возможно это я и наколбасил, когда хотел, чтобы была одна только цифра после запятой.

Share this post


Link to post
Share on other sites

Можно по подробнее про сторожевой таймер. Мне кажется,  в нем собака зарылась.  Как узнать, что он срабатывает. Светодиод как моргал, так и моргает, а связи нет.

Share this post


Link to post
Share on other sites
В 07.02.2018 в 15:42, AlexDerBK сказал:

убрал уже все имена и пароли о своей локальной сети, а оно все равно к ней конектится????

Дело в том, что контроллер способен хранить информацию о сети в отдельной области памяти и Вы даже можете залить пустой скетч и при этом будет происходить автоматическое подключение и переподключение к известной сети. За это отвечают следующие функции.

WiFi.setAutoConnect(true);
WiFi.setAutoReconnect(true);

В зависимости от требуемого поведения, выставляются необходимые логические значения

В 07.02.2018 в 15:42, AlexDerBK сказал:

Если периодически меняются показания с 20.0 , 20.1, то показывает 20 или 20.1. А так как цифры центрируются на индикаторе, получается мельтешение.

По умолчанию опрос датчиков и обновление информации происходит с интервалом в 5 секунд, а, следовательно, и многократного переключения за одну анимацию быть не может. Исключением являются те случаи, когда разница показаний слишком велика и происходит 2-х секундная анимация в ходе которой идет перебор значения в промежутке между старыми и новыми показаниями. Такое возможно только в случае специального влияния на датчики, например, принудительный нагрев. Но и в таком случае центровка значений будет не тем, на что обратишь внимание в ходе всей анимации. Возможно описание в виде мельтешения здесь не уместно, и Вы имели в виду что-то другое. Я проверил у себя и переход через целое значение не вызывает какое-либо не стандартное поведение.

В 08.02.2018 в 05:25, AlexDerBK сказал:

Можно по подробнее про сторожевой таймер. Мне кажется,  в нем собака зарылась.  Как узнать, что он срабатывает. Светодиод как моргал, так и моргает, а связи нет.

Имеется встроенный сторожевой таймер, настроенный на 1.2 секунды (если память не подводит) и сбрасывающий контроллер в случае если не выполняются внутренние инструкции. На сколько мне известно, отключить его нельзя. Но и проблема явно не в нем. Второй - программный сторожевой таймер используется в самом скетче и, как показала практика, совершенно бесполезен и не приносит никакой пользы, как собственно и вреда. В новой версии программы он уже полностью искоренен из-за переосмысления причины зависания контроллера при перезагрузке (об этом писалось ранее, лечится перемычкой) и оптимизации кода проводившейся в предыдущий версиях и в основном связанных с работой web интерфейса, а также практически законченных в будущей версии.

Что касаемо постоянной индикации режима работы, то это говорит только о том, что контроллер не висит. Если контроллер перезагружается, то индикация будет сбоить: пропадать, сбиваться или светодиод будет гореть постоянно. В зависимости от состояния порта на момент сбоя и характер самого сбоя.

Я бы посоветовал запомнить MAC адрес esp8266 и при следующем сбое, зайти на маршрутизатор и посмотреть подключен ли контроллер, какой ему выдан IP адрес и попробовал бы как проходит PING до данного адреса, а также отвечает ли web сервер по имени и по IP адресу.

  • Thanks 1

Share this post


Link to post
Share on other sites

Спасибо! Пользуюсь программой Fing, так что нет сомнения что ESP нет в сети. Но про перемычку я что то упустил. Попробую, отпишусь. Сейчас пока переключился на первый вариант метеостанции. За этот проект отдельное спасибо. То что нужно. Хочу объеденить два проекта в один. Типа, гараж(DHT)+подвал(DHT)+датчик движения+может быть, датчик дыма или СО -> 433-> дом (ESP)+BME280+лог на SD и отправка СМС или на почту. Сейчас , пока, нужно убедиться в реальности задачи, а косметикой займусь на завершающем этапе.

Share this post


Link to post
Share on other sites
В 09.02.2018 в 05:52, AlexDerBK сказал:

Спасибо! Пользуюсь программой Fing, так что нет сомнения что ESP нет в сети. Но про перемычку я что то упустил.

Может быть, не совсем в тему, но опишу забавный случай. У меня есть реле Sonoff Base, на котором я провожу периодически тестирование разных прошивок. Последний раз тестировал ESPEasy. И в процессе тестирования обнаружился аппаратный брак. Если плату вынести на холод (примерно -10 градусов), то через некоторое время она теряет wifi роутер и уходит в бесконечный реконнект. Заносишь в дом, нагревается, и уже минуты через две нормально коннектится к точке. Я предполагаю, что проблема в бракованном кварцевом резонаторе, у которого уплывает частота при охлаждении.Просто была уже подобная проблема с клоном Arduino UNO. Только там наоборот плата нормально работала только в холодильнике, а принагреве зависала)) Поменял резонтатор - отлично работает уже не один год. Вот такие поделки иногда приходят с али. Либо во втором случае присутствует какая-то микротрещина на плате.

Share this post


Link to post
Share on other sites

Интересное наблюдение. Так то обе ESPшки у меня на балконе лежат, а это и до -10 бывает. Хотя, та которую на точку доступа перевёл, уже две ночи пережила. А на ту, что со второго проекта метеостанции, поставил перемычку. С утра связь была, но все датчики по 0. В режим настройки войти была возможность, но график показать отказалась. Сказала, что соединение сильно занято. Сделал ресет через вебинтерфейс. Прошёл, но датчики также по нулям. Позже совсем соединение пропало. Пришлось питание передернуть.

Edited by AlexDerBK

Share this post


Link to post
Share on other sites

Kitsum, большое спасибо за метеостанцию, самая лучшая из всех, что я нашел.

Прошу помощи в доработке метеостанции:

1. Удалить датчик освещенности не только из текущих показаний но и из показаний графика за последние сутки.

2. Использовать ДВА датчика ВМЕ280 (просто их есть у меня) для метеостанции (улица/дом). В текущих показаниях  сделать 5 индикаторов (показания давления уличного датчика не нужно), на графике оставить показания давления/температуры/влажности уличного датчика.

Сделать самому не хватает знаний. Из текущих показаний датчик освещенности убрал, из графика не получилось. Пробую добавлять второй ВМЕ280 - компилятор выдает ошибки. Мои знания и умения в этих вопросах находятся на уровне Ctrl+C - Ctrl+V.

Ну и прошу прощения за наглость - 

3. Выдать на один из GPIO высокий уровень по понижению температуры домашнего датчика ниже определенного значения, на второй GPIO - высокий уровень по превышению определенного значения (вот бы еще это значение через web-интерфейс задавать!).

4. На третий GPIO высокий уровень по понижению влажности домашнего датчика ниже определенного значения, на четвертый - высокий уровень по превышению влажности (если не получится менять это значение через web-интерфейс, то просто можно знать где что заменить в скетче)

 

Edited by vavandemidov

Share this post


Link to post
Share on other sites
8 часов назад, vavandemidov сказал:

Kitsum, большое спасибо за метеостанцию, самая лучшая из всех, что я нашел.

Прошу помощи в доработке метеостанции:

1. Удалить датчик освещенности не только из текущих показаний но и из показаний графика за последние сутки.

2. Использовать ДВА датчика ВМЕ280 (просто их есть у меня) для метеостанции (улица/дом). В текущих показаниях  сделать 5 индикаторов (показания давления уличного датчика не нужно), на графике оставить показания давления/температуры/влажности уличного датчика.

Сделать самому не хватает знаний. Из текущих показаний датчик освещенности убрал, из графика не получилось. Пробую добавлять второй ВМЕ280 - компилятор выдает ошибки. Мои знания и умения в этих вопросах находятся на уровне Ctrl+C - Ctrl+V.

Ну и прошу прощения за наглость - 

3. Выдать на один из GPIO высокий уровень по понижению температуры домашнего датчика ниже определенного значения (вот бы еще это значение через web-интерфейс задавать!).

4. На другой GPIO высокий уровень по понижению влажности домашнего датчика ниже определенного значения (если не получится менять это значение через web-интерфейс, то просто можно знать где что заменить в скетче)

 

Присоединяюсь к просьбе. И большое спасибо за проделанную работу.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Similar Content

    • By Kitsum
      Просмотреть файл [esp8266] Библиотека CMD, реализует настройку микроконтроллера и управление вашей программой через терминал.
      Основная задача библиотеки, это прием пользовательских команд через UART интерфейс, их обработка и выполнение пользовательского кода, связанного с той или иной командой.
      Данная библиотека позволяет реализовать:
      Управление микроконтроллером Любую настройку, будь то WiFi, другие библиотеки или часть Вашей программы Вызывать Ваши задачи (функции) из терминала по команде и передавать им требуемые параметры Использовать контроллер в качестве шлюза между датчиками и программами на PC Внимание: любая команда, передаваемая в терминал обязана заканчиваться символом перевода строки "\n".
      Подключение библиотеки
      #include <cmd.h> Инициализация объекта, к которому мы будем обращаться для добавления команд. В качестве параметра объекту необходимо передать указатель на объект Serial или любой другой схожий по типу интерфейс.
      cmd command(&Serial); В функции Setup описываем какие команды требуется обрабатывать. Например, по команде "test" вызывать пользовательскую функцию с именем "myFunctionName". Имя пользовательской функции может быть абсолютно любым.
      void Setup() { Serial.begin(115200); command.add("test", myFunctionName); } Пользовательская функция будет вызываться каждый раз, когда по интерфейсу Serial поступит команда "test". Если команда будет передана с параметрами, то эти параметры будут переданы в качестве аргументов пользовательской функции.
      В функции loop должна находится команда вызова обработчика.
      void loop() { command.handleEvents(); } Пользовательская функция обязана соответствовать ряду требований:
      Не возвращать никакого результата (быть объявленной с типом void) Принимать в качестве первого аргумента переменную с типом byte в которой будет храниться число равное количеству переданных параметров Принимать в качестве второго параметра переменную с типом char** в которой будет храниться указатель на массив со всеми указателями (char*) на переданные параметры void myFunctionName(byte argc, char** argv) { /* ... */ } Функция всегда должна иметь такой вид, даже если не подразумевается, что ей будут передаваться какие-либо параметры.
      Чтобы перебрать все переданные параметры и вывести их в консоль, можно воспользоваться следующим примером
      void myFunctionName(byte argc, char** argv) { if (0 < argc) { for (uint8_t i = 0; i < argc; i++) { Serial.printf("%i. %s\n", i, argv[i]); } } } Пример вызова пользовательской функции без параметров и с ними
      # test No parameter was passed # test p1 p2 p3 p4 p5 0. p1 1. p2 2. p3 3. p4 4. p5 Помните, что параметры представлены в виде указателей и работать с ними нужно как с обычными переменными не получится т.к указатель содержит не значение переменной (переданный параметр), а указатель на ту область памяти микроконтроллера в которой это значение находится.
      Чтобы сравнить два значения, например, параметр под индексом 0 (идет первым в списке) с каким-либо значением в программе, воспользуйтесь функцией strcmp, которая возвращает целочисленное значение, указывающее на лексическое расхождение строк. Если строки равны, то возвращаемое значение равно 0.
      if (!strcmp(argv[0], "wifi")) { Serial.println(F("Первый аргумент WiFi")); } else { Serial.println(F("Первый аргумент НЕ WiFi!!!")); } Для копирования значения указателя в другую переменную с типом char можно воспользоваться функцией strcpy
      char myVar[20]; strcpy(myVar, argv[0]); if (myVar == "123456") { Serial.prinln(F("ok")); } Также можно обернуть указатель объектом String и получить весь функционал этого объекта, который будет содержать значение параметра
      String param1(argv[0]); // String param1 = argv[0]; Serial.printf("argv[0] length: %i\n", param1.length()); Serial.printf("argv[0] is integer?: %s\n", param1.toInt() ? "YES" : "NO"); if (param1 == "qwerty") { Serial.println(F("Hello QWERTY!")); } С библиотекой идут несколько примеров, в том числе и пример конфигурации WiFi в режиме STA.
      Автор Kitsum Добавлен 05.12.2018 Категория Библиотеки  
    • By Kitsum
      Просмотреть файл [esp8266] Библиотека smartBlink, реализует умное управление штатным светодиодом, что позволяет добавить индикацию состояния вашей программы или микроконтроллера.
      Основная задача библиотеки, это добавление индикации состояния Вашей программы или микроконтроллера. Отображение состояния производится посредством светодиода. Что самое важное, работа библиотеки через прерывание, это позволяет ей поддерживать индикацию даже в то время, когда выполняется длительный код основной программы. Например, Вы можете использовать её для отображения в каком режиме сейчас работает WiFi микроконтроллера, STA или AP и т.д. Или ход выполнения какой-либо операции, например, передача данных на внешний сервер.
      Подключение библиотеки
      #include <smartBlink.h> Чтобы инициализировать управление светодиодом необходимо создать объект, через который мы буем задавать режимы работы индикации.
      smartBlink::smartBlink(byte gpio, bool on = LOW); Объекту необходимо передать два параметра, первый это номер порта, на котором находится светодиод, а второй это уровень логического сигнала, который заставит светодиод работать. Сигнал может быть низким (LOW) или высоким (HIGH), это зависит от схемотехники подключения светодиода.
      Например, штатный светодиод модуля ESP12, использующий GPIO2 (порт 2) можно объявить следующим образом.
      #define led2_pin 2 #define led2_on_signal LOW smartBlink led2(led2_pin, led2_on_signal); Теперь можно в основной программе использовать метод устанавливающий какой режим индикации использовать.
      smartBlink::setMode(mode_t mode); Например, зададим режим светодиода led2 в котором светодиод будет давать одну короткую вспышку раз в секунду.
      led2.setMode(smartBlink::mode_flash1); Режимов работы может быть несколько.
      led2.setMode(smartBlink::mode_off); led2.setMode(smartBlink::mode_flash1); led2.setMode(smartBlink::mode_flash2); led2.setMode(smartBlink::mode_flash3); led2.setMode(smartBlink::mode_flash4); led2.setMode(smartBlink::mode_burn); led2.setMode(smartBlink::mode_inhalf); Чтобы вернуть предыдущий режим индикации для ранее объявленного светодиода led2 используйте следующий метод
      led2.previous(); Благодаря работе библиотеки через прерывания по таймеру, индикация будет работать даже в тех случаях, когда выполняется долгий код.
      С библиотекой идут несколько примеров.
      Автор Kitsum Добавлен 10.12.2018 Категория Библиотеки  
    • By Kitsum
      Основная задача библиотеки, это добавление индикации состояния Вашей программы или микроконтроллера. Отображение состояния производится посредством светодиода. Что самое важное, работа библиотеки через прерывание, это позволяет ей поддерживать индикацию даже в то время, когда выполняется длительный код основной программы. Например, Вы можете использовать её для отображения в каком режиме сейчас работает WiFi микроконтроллера, STA или AP и т.д. Или ход выполнения какой-либо операции, например, передача данных на внешний сервер.
      Подключение библиотеки
      #include <smartBlink.h> Чтобы инициализировать управление светодиодом необходимо создать объект, через который мы буем задавать режимы работы индикации.
      smartBlink::smartBlink(byte gpio, bool on = LOW); Объекту необходимо передать два параметра, первый это номер порта, на котором находится светодиод, а второй это уровень логического сигнала, который заставит светодиод работать. Сигнал может быть низким (LOW) или высоким (HIGH), это зависит от схемотехники подключения светодиода.
      Например, штатный светодиод модуля ESP12, использующий GPIO2 (порт 2) можно объявить следующим образом.
      #define led2_pin 2 #define led2_on_signal LOW smartBlink led2(led2_pin, led2_on_signal); Теперь можно в основной программе использовать метод устанавливающий какой режим индикации использовать.
      smartBlink::setMode(mode_t mode); Например, зададим режим светодиода led2 в котором светодиод будет давать одну короткую вспышку раз в секунду.
      led2.setMode(smartBlink::mode_flash1); Режимов работы может быть несколько.
      led2.setMode(smartBlink::mode_off); led2.setMode(smartBlink::mode_flash1); led2.setMode(smartBlink::mode_flash2); led2.setMode(smartBlink::mode_flash3); led2.setMode(smartBlink::mode_flash4); led2.setMode(smartBlink::mode_burn); led2.setMode(smartBlink::mode_inhalf); Чтобы вернуть предыдущий режим индикации для ранее объявленного светодиода led2 используйте следующий метод
      led2.previous(); Благодаря работе библиотеки через прерывания по таймеру, индикация будет работать даже в тех случаях, когда выполняется долгий код.
      С библиотекой идут несколько примеров.
    • By Kitsum
      Просмотреть файл [esp8266] Библиотека Cron, реализует планировщик задач для периодического выполнения пользовательских функций.
      Основная задача библиотеки, это вызов пользовательских функций через установленный интервал времени. Библиотека работает по схожему принципу с широко известной программой Cron распространяемой в составе UNIX систем. От этой утилиты библиотека и унаследовала название.
      Библиотека работает исходя из принципов однопоточного выполнения кода в микроконтроллере. Когда обработчик библиотеки получает процессорное время, он проверяет список всех пользовательских задач в поиске задач, которые необходимо выполнить, основываясь на установленном интервале времени для каждой задачи.
      Данная библиотека предоставляет следующий функционал
      Позволяет добавлять большое количество пользовательских заданий в виде функций. Количество задач ограничено только их сложностью и свободной памятью микроконтроллера. Предоставляет возможность холодного старта задачи. Дает возможность вызова задачи при старте микроконтроллера с последующим выполнением задачи через установленный интервал времени. Поиск задачи по лексическому идентификатору. Получение время последнего вызова задачи. Обнуление интервала вызова задачи или установку нового интервала в мс. Останавливать задачу на неопределенный срок. Проверять активность задачи. Подключение библиотеки
      #include <cron.h> Пример добавление задачи, которая вызывает функцию blink_f каждую секунду
      cron.add(1000, blink_f); Добавление этой же задачи в режиме холодного старта
      cron.add(1000, blink_f, true); Добавление задачи и присвоение ей человек понятного идентификатора
      cron.add(1000, blink_f, "Blink"); Добавление задачи с холодным стартом и присвоением ей человек понятного идентификатора
      cron.add(1000, blink_f, "Blink", true); В качестве временного интервала вызова задачи необходимо указывать количество миллисекунд. Но можно воспользоваться готовыми константами.
      Фундаментальные константы
      cron::second cron::minute cron::hour cron::day Самые распространенные значения
      cron::time_1s cron::time_5s cron::time_10s cron::time_15s cron::time_30s cron::time_1m cron::time_5m cron::time_10m cron::time_15m cron::time_30m cron::time_1h cron::time_5h cron::time_10h cron::time_12h cron::time_1d С константами можно производить арифметические операции чтобы получить необходимые временные интервалы.
      cron.update("Blink", cron::time_1s); cron.update("Blink", cron::time_1s * 12); cron.update("Blink", cron::time_30s + 500); и т.д
      В функции loop должна находится команда вызова обработчика.
      void loop() { cron.handleEvents(); } Поиск задачи по установленному ранее идентификатору
      cron.find("Blink"); В ответ возвращается объект типа cronEvent который содержит все данные задачи или 0 если задача не была найдена. Можно использовать в качестве простой проверки.
      if (cron.find("Blink")) { /* … */ } Следующий метод позволяет получить время последнего вызова задачи
      uint32_t time = cron.lastRun("Blink"); В качестве параметра можно передать идентификатор с типом cronEvent полученный с помощью метода поиска задачи.
      Перезапуск таймера задачи производится следующим образом
      cron.update("Blink"); А так можно установить новый интервал вызова задачи
      cron.update("Blink", cron::time_10m); Остановка выполнения задачи
      cron.stop("Blink"); Проверка активности задачи
      bool active = cron.isActive("Blink"); С библиотекой идут несколько примеров.
      Автор Kitsum Добавлен 09.12.2018 Категория Библиотеки  
    • By Kitsum
      Основная задача библиотеки, это вызов пользовательских функций через установленный интервал времени. Библиотека работает по схожему принципу с широко известной программой Cron распространяемой в составе UNIX систем. От этой утилиты библиотека и унаследовала название.
      Библиотека работает исходя из принципов однопоточного выполнения кода в микроконтроллере. Когда обработчик библиотеки получает процессорное время, он проверяет список всех пользовательских задач в поиске задач, которые необходимо выполнить, основываясь на установленном интервале времени для каждой задачи.
      Данная библиотека предоставляет следующий функционал
      Позволяет добавлять большое количество пользовательских заданий в виде функций. Количество задач ограничено только их сложностью и свободной памятью микроконтроллера. Предоставляет возможность холодного старта задачи. Дает возможность вызова задачи при старте микроконтроллера с последующим выполнением задачи через установленный интервал времени. Поиск задачи по лексическому идентификатору. Получение время последнего вызова задачи. Обнуление интервала вызова задачи или установку нового интервала в мс. Останавливать задачу на неопределенный срок. Проверять активность задачи. Подключение библиотеки
      #include <cron.h> Пример добавление задачи, которая вызывает функцию blink_f каждую секунду
      cron.add(1000, blink_f); Добавление этой же задачи в режиме холодного старта
      cron.add(1000, blink_f, true); Добавление задачи и присвоение ей человек понятного идентификатора
      cron.add(1000, blink_f, "Blink"); Добавление задачи с холодным стартом и присвоением ей человек понятного идентификатора
      cron.add(1000, blink_f, "Blink", true); В качестве временного интервала вызова задачи необходимо указывать количество миллисекунд. Но можно воспользоваться готовыми константами.
      Фундаментальные константы
      cron::second cron::minute cron::hour cron::day Самые распространенные значения
      cron::time_1s cron::time_5s cron::time_10s cron::time_15s cron::time_30s cron::time_1m cron::time_5m cron::time_10m cron::time_15m cron::time_30m cron::time_1h cron::time_5h cron::time_10h cron::time_12h cron::time_1d С константами можно производить арифметические операции чтобы получить необходимые временные интервалы.
      cron.update("Blink", cron::time_1s); cron.update("Blink", cron::time_1s * 12); cron.update("Blink", cron::time_30s + 500); и т.д
      В функции loop должна находится команда вызова обработчика.
      void loop() { cron.handleEvents(); } Поиск задачи по установленному ранее идентификатору
      cron.find("Blink"); В ответ возвращается объект типа cronEvent который содержит все данные задачи или 0 если задача не была найдена. Можно использовать в качестве простой проверки.
      if (cron.find("Blink")) { /* … */ } Следующий метод позволяет получить время последнего вызова задачи
      uint32_t time = cron.lastRun("Blink"); В качестве параметра можно передать идентификатор с типом cronEvent полученный с помощью метода поиска задачи.
      Перезапуск таймера задачи производится следующим образом
      cron.update("Blink"); А так можно установить новый интервал вызова задачи
      cron.update("Blink", cron::time_10m); Остановка выполнения задачи
      cron.stop("Blink"); Проверка активности задачи
      bool active = cron.isActive("Blink"); С библиотекой идут несколько примеров.
    • By Kitsum
      Основная задача библиотеки, это прием пользовательских команд через UART интерфейс, их обработка и выполнение пользовательского кода, связанного с той или иной командой.
      Данная библиотека позволяет реализовать:
      Управление микроконтроллером Любую настройку, будь то WiFi, другие библиотеки или часть Вашей программы Вызывать Ваши задачи (функции) из терминала по команде и передавать им требуемые параметры Использовать контроллер в качестве шлюза между датчиками и программами на PC Внимание: любая команда, передаваемая в терминал обязана заканчиваться символом перевода строки "\n".
      Подключение библиотеки
      #include <cmd.h> Инициализация объекта, к которому мы будем обращаться для добавления команд. В качестве параметра объекту необходимо передать указатель на объект Serial или любой другой схожий по типу интерфейс.
      cmd command(&Serial); В функции Setup описываем какие команды требуется обрабатывать. Например, по команде "test" вызывать пользовательскую функцию с именем "myFunctionName". Имя пользовательской функции может быть абсолютно любым.
      void Setup() { Serial.begin(115200); command.add("test", myFunctionName); } Пользовательская функция будет вызываться каждый раз, когда по интерфейсу Serial поступит команда "test". Если команда будет передана с параметрами, то эти параметры будут переданы в качестве аргументов пользовательской функции.
      В функции loop должна находится команда вызова обработчика.
      void loop() { command.handleEvents(); } Пользовательская функция обязана соответствовать ряду требований:
      Не возвращать никакого результата (быть объявленной с типом void) Принимать в качестве первого аргумента переменную с типом byte в которой будет храниться число равное количеству переданных параметров Принимать в качестве второго параметра переменную с типом char** в которой будет храниться указатель на массив со всеми указателями (char*) на переданные параметры void myFunctionName(byte argc, char** argv) { /* ... */ } Функция всегда должна иметь такой вид, даже если не подразумевается, что ей будут передаваться какие-либо параметры.
      Чтобы перебрать все переданные параметры и вывести их в консоль, можно воспользоваться следующим примером
      void myFunctionName(byte argc, char** argv) { if (0 < argc) { for (uint8_t i = 0; i < argc; i++) { Serial.printf("%i. %s\n", i, argv[i]); } } } Пример вызова пользовательской функции без параметров и с ними
      # test No parameter was passed # test p1 p2 p3 p4 p5 0. p1 1. p2 2. p3 3. p4 4. p5 Помните, что параметры представлены в виде указателей и работать с ними нужно как с обычными переменными не получится т.к указатель содержит не значение переменной (переданный параметр), а указатель на ту область памяти микроконтроллера в которой это значение находится.
      Чтобы сравнить два значения, например, параметр под индексом 0 (идет первым в списке) с каким-либо значением в программе, воспользуйтесь функцией strcmp, которая возвращает целочисленное значение, указывающее на лексическое расхождение строк. Если строки равны, то возвращаемое значение равно 0.
      if (!strcmp(argv[0], "wifi")) { Serial.println(F("Первый аргумент WiFi")); } else { Serial.println(F("Первый аргумент НЕ WiFi!!!")); } Для копирования значения указателя в другую переменную с типом char можно воспользоваться функцией strcpy
      char myVar[20]; strcpy(myVar, argv[0]); if (myVar == "123456") { Serial.prinln(F("ok")); } Также можно обернуть указатель объектом String и получить весь функционал этого объекта, который будет содержать значение параметра
      String param1(argv[0]); // String param1 = argv[0]; Serial.printf("argv[0] length: %i\n", param1.length()); Serial.printf("argv[0] is integer?: %s\n", param1.toInt() ? "YES" : "NO"); if (param1 == "qwerty") { Serial.println(F("Hello QWERTY!")); } С библиотекой идут несколько примеров, в том числе и пример конфигурации WiFi в режиме STA.
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...