Метеостанция на NodeMcu. Народный мониторинг

  • Цена: $3.10 + $2.11 доставка. (только nodemcu)

Когда узнал о народном мониторинге, о возможности быть частью этой системы мониторинга погоды, меня охватил азарт, и была сделана простенькая метеостанция на ардуино нано и ethernet модуле.
Передавала она на сайт температуру, давление и влажность. Работала худо бедно, иногда подвисала, необходимо было перезагружать. Потом сдох датчик влажности, и я занялся поиском альтернативного устройства. Долго поглядывал на esp8266, но знал о ней очень немного. Останавливало то, что код для нее надо было писать в незнакомой мне среде esplorer на незнакомом мне языке. Здесь уже публиковался обзор подобного устройства, устройство работало с условно бесплатной прошивкой от Homes Smart, такое решение меня не устроило. Позднее я узнал, что esp8266 можно вполне успешно подружить с arduinoIDE. Я начал усиленно гуглить, и в результате догуглился до устраивающих меня результатов.
Надеюсь, статья окажется полезной. Думаю, ее можно расценивать как обзор-руководство по сборке.

NodeMcu это своего рода отладочная плата для esp8266 (в моем понимании). С помощью нее удобно делать прототипы устройств на макетных платах. Удобно заливать прошивку из ArduinoIDE, все происходит автоматически. Естественно, необходимо подготовить ArduinoIDE к работе с esp8266. Подготовив рабочую среду сразу набросал схему, это было не сложно.
Датчик давления и температуры bmp180 подключен по i2c к SCL(gpio05) и SDA(gpio04).
Датчик влажности и температуры dht22 подключен к gpio02
Дисплей 1602 с припаянным i2c адаптером так же посажен на scl и cda, параллельно с датчиком давления.
Питание датчиков 3.3в, питание дисплея 5в.

фоторезистор подключен к пину А0, он управляет яркостью дисплея, чтобы в ночи дисплей не светился слишком ярко. Питанием подсветки заведует gpio14, на котором реализован программный ШИМ. После транзисторного каскада питание подсветки подходит непосредственно к пятачку А (анод) на дисплее. он находится рядом со светодиодом. Со spi адаптера дисплея необходимо снять перемычку, которая отвечает за подсветку.
Фото прототипа



Схему и печатку приложу в конце.

Сложнее было с кодом.
код

//ардуино 181, либы схоронил
#include <Wire.h>
#include <Adafruit_BMP085.h>
#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h> 
#define debug true // вывод отладочных сообщений
#define postingInterval  300000 // интервал между отправками данных в миллисекундах (5 минут)

#define DHTPIN   2   // dht на gpio02
// Uncomment the type of sensor in use:
//#define DHTTYPE           DHT11     // DHT 11 
#define DHTTYPE           DHT22     // DHT 22 (AM2302)
//#define DHTTYPE           DHT21     // DHT 21 (AM2301)
// Lib instantiate
DHT dht(DHTPIN, DHTTYPE);

Adafruit_BMP085 bmp;

/**/unsigned long lastConnectionTime = 0;           // время последней передачи данных
/**/String Hostname; //имя железки - выглядит как ESPAABBCCDDEEFF т.е. ESP+mac адрес.

float dhttemp; // буферная переменная для хранения температуры от dht22
int dhthum; // буферная переменная для хранения влажности от dht22
int topwm; // хранит значение для шима яркости дисплея
void wifimanstart() { // Волшебная процедура начального подключения к Wifi.
                      // Если не знает к чему подцепить - создает точку доступа ESP8266 и настроечную таблицу http://192.168.4.1
                      // Подробнее: https://github.com/tzapu/WiFiManager
  WiFiManager wifiManager;
  wifiManager.setDebugOutput(debug);
  wifiManager.setMinimumSignalQuality();
  if (!wifiManager.autoConnect("ESP8266")) {
  if (debug) Serial.println("failed to connect and hit timeout");
    delay(3000);
    //reset and try again, or maybe put it to deep sleep
    ESP.reset();
    delay(5000); }
if (debug) Serial.println("connected...");
}



 
void setup() 
{

//
pinMode(14, OUTPUT); // gpio14 будет шимить подсветку дисплея
  Hostname = "ESP"+WiFi.macAddress();
  Hostname.replace(":","");
  Serial.begin(115200);

  // инициализация экрана
  lcd.begin(4, 5);  // sda=gpio04, scl=gpio05
  lcd.backlight();

// инициализация датчика температуры и давления bmp180
  dht.begin();
  if (!bmp.begin()) // если датчик не обнаружен, сообщаем об этом в компорт и на дисплей
  {
    Serial.println("Could not find BMP180 or BMP085 sensor at 0x77");
    lcd.clear();
    lcd.print("BMP180 FAILED");
    while (1) {}
  }

  WiFi.hostname(Hostname);
  wifimanstart();
  Serial.println(WiFi.localIP()); Serial.println(WiFi.macAddress()); Serial.print("Narodmon ID: "); Serial.println(Hostname); // выдаем в компорт мак и айпишник железки, так же выводим на дисплей
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(WiFi.localIP());
  lcd.setCursor(0, 1);
  lcd.print(Hostname);
  lastConnectionTime = millis() - postingInterval + 15000; //первая передача на народный мониторинг через 15 сек.
}

 void WriteLcdTemp (void){ // заполнение дисплея. происходит каждые 5 минут после получения данных с датчиков
 lcd.clear();
  lcd.setCursor(1, 0);
  lcd.print("T1 ");
  lcd.setCursor(4, 0);
  lcd.print(bmp.readTemperature());

lcd.setCursor(8,0);
lcd.print(" P ");
lcd.setCursor(11,0);
lcd.print(bmp.readPressure()/133.3);

  lcd.setCursor(1, 1);
  lcd.print("T2 ");
  lcd.setCursor(4, 1);
  lcd.print(dhttemp);

  lcd.setCursor(8,1);
lcd.print(" H ");
lcd.setCursor(11,1);
lcd.print(dhthum);
lcd.setCursor(13,1);
lcd.print("%");
  }

bool SendToNarodmon() { // Собственно формирование пакета и отправка.
    WiFiClient client;
    String buf;
    buf = "#" + Hostname + "#ESP_YOBA" + "\r\n"; // заголовок И ИМЯ, которое будет отображаться в народном мониторинге, чтоб не палить мак адрес
dhttemp=dht.readTemperature(); // сохравняем в буферные переменные данные с dht22, чтобы удобно было оперировать
dhthum=dht.readHumidity();
    buf = buf + "#T1#" + String(bmp.readTemperature()) + "\r\n"; //температура bmp180
    buf = buf + "#T2#" + String(dhttemp) + "\r\n"; //температура dht22
    
    buf = buf + "#H1#" + String(dhthum) + "\r\n"; //влажность
    buf = buf + "#P1#" + String(bmp.readPressure()) + "\r\n"; //давление
    buf = buf + "##\r\n"; // закрываем пакет
 
    if (!client.connect("narodmon.ru", 8283)) { // попытка подключения
      Serial.println("connection failed");
      lcd.clear();
      lcd.print("connect failed");
      return false; // не удалось;
    } else
    {
      WriteLcdTemp();
      client.print(buf); // и отправляем данные
      if (debug) Serial.print(buf);
      while (client.available()) {
        String line = client.readStringUntil('\r'); // если что-то в ответ будет - все в Serial
        Serial.print(line);
        
        }
    }
      return true; //ушло
      
  }


void loop() 
{

//автояркость
topwm=map(analogRead(A0), 0, 1023, 10, 950); 
analogWrite(14, topwm);
  delay(100);// нужна, беж делея у меня не подключался к вайфаю

 
  if (millis() - lastConnectionTime > postingInterval) {// ждем 5 минут и отправляем
      if (WiFi.status() == WL_CONNECTED) { // ну конечно если подключены
      if (SendToNarodmon()) {
      lastConnectionTime = millis();
      }else{  lastConnectionTime = millis() - postingInterval + 15000; }//следующая попытка через 15 сек    
      }else{  lastConnectionTime = millis() - postingInterval + 15000; Serial.println("Not connected to WiFi"); lcd.clear(); lcd.print("No WiFi");}//следующая попытка через 15 сек
    } yield(); // что за команда - фиг знает, но ESP работает с ней стабильно и не глючит.
}




Что умеет устройство?
Устройство производит измерение температуры, давления (датчик bmp180) и влажности (датчик dht22), отображает показания на дисплее, и отправляет на сайт народного мониторинга.
При первом после прошивки включении, или при отсутствии знакомых wifi сетей устройство прикидывается точкой доступа открытого типа с именем ESP8266.

В com порт устройство шлет это:


Необходимо подключиться с телефона, ноутбука или планшета к точке с именем ESP8266, и пройти по адресу 192.168.4.1
Откроется такая страничка:
...



Нажимаем кнопку Configure Wifi, и попадаем на такую страничку
...



Далее выбираем свою сеть, вводим пароль, жмем Save. Готово, устройство само перезагружается, и начинает работать. Сначала на дисплей и в com порт выводится ip адрес и mac адрес устройства с префиксом ESP, его надо использовать в качестве id датчика при регистрации на сайте народного мониторинга, а через 15 секунд на дисплей, в com порт, и на сайт народного мониторинга выводятся первые показания с датчиков.
T1 — температура с bmp180
T2 — температура с dht22
P — атмосферное давление. На дисплей выводится в мм. рт. ст., на народный мониторинг идет в не помню каких единицах, преобразуется в мм. рт. ст. автоматически.
Н — влажность в процентах.

В строчках Т2 и Н ересь, потому что не подключен датчик dht22

В таком виде конструкция проработала пару недель, пока я потихоньку продумывал готовое устройство.
Готовое устройство решил собирать на модуле esp8266 12e (такой же стоит на nodemcu)
Быстренько развел и вытравил плату.
фото




Код менять не пришлось вообще. Номера портов для датчиков те же, необходимо только подключить голую esp8266 по типовой схеме, чтобы она могла работать, и можно было заливать прошивку. 3.3 вольта получил с помощью стабилизатора ams 1117 3.3v.
Питается устройство от телефонной зарядки 5в. 2А. Но и одного ампера, думаю, будет достаточно.

Для прошивки вывел отдельный 3-pin разъем с контактами RX, TX и GND.

Прошивал готовое устройство с помощью такого адаптера usb — uart. Плюс его в том, что на нем имеется переключатель 5v-3.3v, хотя знающие ребята говорят, что этот переключатель работает только для питания, а уровень rx и tx не меняется. Но у меня все работало без преобразования уровней, наверное потому, что esp8266 толерантна к 5v на rx tx, хоть и работает от 3.3.
Так же на готовой плате был предусмотрен переключатель для ввода в режим прошивки (красный ползунковый, нижний ползунок для ввода в режим прошивки. Верхний ползунок я подключил на gpio12, на всякий случай, возможно для переключения режимов индикации на будущее, а пока он не задействован. Можно не мудрить, и просто поставить перемычку между gpio0 и GND)


Для прошивки нужно подключить usb-uart преобразователь таким образом:
esp rx — uart tx
esp tx — uart rx
esp gnd — uart gnd

Затем подключить gpio0 к земле с помощью нижнего ползунка на переключателе, нажать кнопку «Reset» на плате (находится сверху), в arduinoIDE выбрать нужный com port, скорость загрузки (115200 для большинства плат esp8266), и нажать кнопку «Загрузка».
После окончания загрузки устройство начнет работать, переключатель прошивки нужно возвратить в положение OFF, иначе при следующей перезагрузке или отключении питания устройство опять войдет в режим прошивки.

Вспомним сдохший датчик dht22. Симптомы — постоянно показывает влажность 99.9, в сухую погоду может показывать меньше. Сдох он осенью 2016 года, исправно проработав всю весну и лето. Была неделя постоянных дождей, и мне на электропочту свалилось письмо от народного мониторинга, что, мол, ваш датчик несколько дней подряд показывает одно и то же. Я не стал менять датчик, а просто спрятал его из общего доступа до недавнего момента.
Возможной причиной помирания считаю тесный корпус. В качестве его основы было использовано яйцо от киндерсюрприза. Был разработан новый, более технологичный и просторный корпус из подрозетника и заглушки канализационной трубы. Вот оба корпуса рядом:
фото



Плату датчиков не переделывал, просто заменил дохлый dht22 на живой, покрыл цапонлаком и закрепил термосоплями в верхней части уличного корпуса.
Вот так выглядит схема платы датчиков. Нарисовать можно даже маркером
схема и внешний вид




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


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


В собранном виде


Испытание влажностью пройдено успешно. Датчик жив.


Исходники
Проект в proteus8. схема и печатная плата.
Код
Библиотеки для работы в подготовленной ArduinoIDE
Использовалась ArduinoIDE 1.8.1. рекомендую скачать ее портабл версию, и распаковать в какую нибудь папочку. Туда же накидать приложенные библиотеки, в папку libraries естественно.


Это был полезный опыт для меня, я наконец то пощупал esp8266, и получил стабильно работающее полезное мне устройство.
Надеюсь кому то пригодится эта статья. Если возникнут трудности или вопросы, пишите в личку, отвечу.
Планирую купить +127 Добавить в избранное +108 +214
+
avatar
  • madmax
  • 23 февраля 2017, 13:42
+3
А готовых решений у китайцев таких нет? Хотелось бы температуру влажность давление + wifi и данные на мобильник. Но разбираться паять тупо нет времени.
+
avatar
+2
продаются готовые спецом для народного мониторинга, у них на сайте есть в разделе «устройства».
нашел на али такую йобу
+
avatar
  • stasgid
  • 23 февраля 2017, 13:54
+9
Зря вы черный верх сделали на выносном датчике летом будет нагрев и погрешность )
Я делаю так

+
avatar
+1
Туда не проникают солнечные лучи толком. Ну и фольгой же можно на крайняк
+
avatar
+1
во, кстати, фольгой ИМХО суперская идея. насчет черного верха и сам хотел написать.
+
avatar
  • Glabus
  • 28 февраля 2017, 14:43
0
Туда не проникают солнечные лучи толком. Ну и фольгой же можно на крайняк
Учитывая местоположение над внешним блоком кондиционера, а он при работе ого как греет воздух, а теплый воздух идёт вверх, то хоть ватой вместе с фольгой, всё равно будет врать.
+
avatar
  • 4ishops
  • 23 февраля 2017, 15:26
+3
Есть специальная конструкция, типа такой —



Можно готовую найти, можно самому сделать, инструкции есть в сети, не сложно.
+
avatar
0
Сначала искал такие тарелочки везде. Чот не нашел ничего, пришлось кошмарить подрозетник
+
avatar
+3
+
avatar
  • Reaper5
  • 23 февраля 2017, 16:40
0
А по каким ключевым словам их искать, не подскажете?
+
avatar
  • dansar
  • 23 февраля 2017, 19:10
0
Я видел статью, где американец делал будку из одноразовых тарелок и красил ее серебристой краской. Сейчас попробовал поискать, что-то сходу не получается.
+
avatar
  • Delanet
  • 23 февраля 2017, 23:16
+3
Из мисок получается шикарно. Выбирайте: solar radiation shield diy.
+
avatar
  • char
  • 26 февраля 2017, 01:56
0
Это называется «пагода» (pagoda)
+
avatar
  • Roofcat2
  • 27 февраля 2017, 10:52
0
Stevenson screen
+
avatar
  • Xiiz
  • 23 февраля 2017, 18:54
-4
Зря вы черный верх сделали
Что не так с черным?
+
avatar
  • batal
  • 23 февраля 2017, 20:34
0
Посмотрите espmeteo.ru/
+
avatar
  • Alber
  • 23 февраля 2017, 13:43
+8
В обзоре указано 186 руб. Это с доставкой?
Это стоимость по курсу доллара, что был вчера до 15:00 или после 17:00? Или по такой цене покупалось месяц назад?

BTW скриншоты уменьшать следует. Не нужно в обзоры вставлять FullHD скриншоты-портянки, которые потом скролить приходится.
+
avatar
  • sir0ta
  • 23 февраля 2017, 13:53
-16
+
avatar
  • dimats
  • 23 февраля 2017, 13:55
+27
Да пишите же цены в нормальных еденицах, в долларах…
+
avatar
  • Addiss
  • 23 февраля 2017, 14:05
+17
У некоторых «авторов» это принципиально не получается ((((
Им никогда не приходил в голову вопрос: «а почему это в 99% обзоров цена на товар указана в долларах?»
+
avatar
  • leelou
  • 23 февраля 2017, 13:55
0
Не сталкивались с зависанием периодическим?.. т.е модуль перестает передавать и только после нажатия на reset отправляет данные на народмон…
+
avatar
0
Пока нет. Две недели на столе лежал весь в проводах с плохим контактом, ему пофиг было. Я думаю тут ооочень много е от прошивки зависит
+
avatar
  • Dimon_
  • 23 февраля 2017, 14:01
0
Вот меня тоже удивила эта реплика в тексте.
Автор, ответьте, пожалуйста. У вас ардуина зависала, а ESP не зависает?
Я без сарказма…
+
avatar
0
Пока esp не зависала. Это наверное опыта нет
+
avatar
  • Alber
  • 23 февраля 2017, 14:15
+2
Говорят, что 99% зависаний на ESP связано с неправильной схемой/разводкой питания.
+
avatar
  • leelou
  • 23 февраля 2017, 14:21
0
у меня NODEMCU как у автора в заглавии на фото, готовый вариант…
+
avatar
  • 4ishops
  • 23 февраля 2017, 15:28
-3
работает год уже что-то подобное, «разрывов не было» :)

+
avatar
  • olehua
  • 23 февраля 2017, 18:26
-2
Баян
+
avatar
  • dimkin
  • 23 февраля 2017, 14:04
0
у меня ардуинка + esp в качестве wifi карточки. Зависает именно esp — иногда через неделю, иногда через час :(
+
avatar
  • Sanja
  • 23 февраля 2017, 17:01
0
Поставьте тантал на вход по питанию.

У меня 2 месяца как полёт нормальный:

+
avatar
  • FAlVik
  • 24 февраля 2017, 11:15
0
Какого номинала?
+
avatar
-1
религия сказать не позволяет видимо)
+
avatar
  • Naevus
  • 25 февраля 2017, 20:26
0
Да любого — чем больше, тем лучше. Верхний предел ограничен только мощностью БП (при включении весь ток пойдет на заряд конденсатора) и свободным местом :)
У меня по 5в и по 3,3в стоят обыкновенные электролиты по 470мф, воткнуты прямо в макетку. На самом модуле только керамика блокировочная после стабилизатора 0,1мф.
Второй год работает — зависаний не было (бывают сбросы, когда я в тот же многопортовый БП втыкаю телефон на зарядку)
+
avatar
  • Sdoro
  • 23 февраля 2017, 13:56
+1
Тоже планировал приобщится к ESP8266, попробовать это «чудо» в деле. Всё уже давно закуплено, среда настроена, да руки не доходили. Теперь, благодаря этому обзору (сам тоже пользую Протеус), процесс резко упростился и можно сразу переходить к готовому устройству! За обзор жирный +
+
avatar
0
У меня очень похожее устройство и код похожий. За пол года заметил 2 бага. Иногда появляются провалы на датчике давления в 30 едениц, выглядят как пики на графике и от датчика dht22 иногда прилетает показания NAN на что народный мониторинг сразу ругается. В код нужно добавить проверку на NAN если, если так то повторный запрос от датчика а на датчик давления проверку по последним 2м показаниям, если разница больше 20 допустим тогда повторный запрос. Всё сделать легко но руки никак не доходят )
Дополнительная информация


<spoiler/>
+
avatar
0
Nan был тоже. При том появился через недельку где то. Я переделал опрос dht, и еще убрал строку #include <DHT_U> И nan исчез
+
avatar
0
Попробую, спасибо. Я хотел просто условие добавить, если NAN то делаем перезамер. Там 3 строчки кода всего добавляется, но ваш способ тоже имеет право на жизнь )
+
avatar
+7
Уже много раз писал — dht22 ужасный сенсор. Пробуйте этот github.com/enjoyneering/HTU21D
elchupanibrei.livejournal.com/23293.html
+
avatar
  • xneo
  • 23 февраля 2017, 21:24
0
Спасибо за совет! Выглядят брутально конечно, на нам лучше «ехать».
+
avatar
+1
Там еще неплохая библиотека под хитачи экран, такой как у вас. Она по быстрее стандартной и универсальна
+
avatar
  • darkbyte
  • 26 февраля 2017, 10:54
+1
BME280 можно ещё взять, по цене чуть дороже HTU21, но не сильно больше SHT21, зато сразу температура, влажность и давление.
+
avatar
0
да у BME280 щас конкупентов нет. да же HTU21 уже его не догнать. правда если у вас очень мало свободной пямяти, то HTU21 предпочтительнее, тк либа от BME280 тянет в пямять кучу коэффицинтов из датчика для расчетов.
+
avatar
  • st512
  • 23 февраля 2017, 14:07
0
для комнаты такое подойдет? ищу, в идеале готовое, решение для комнаты чтоб влажность и температуру мерять
+
avatar
0
Конечно. Можно вообще 1 датчиком обойтись. BMP есть модель влажность\давление\температура в одном корпусе, сам датчик со спичечную головку и на платке с 10 копеек размером.
+
avatar
  • Razdel
  • 24 февраля 2017, 18:35
0
«BMP есть модель влажность\давление\температура в одном корпусе, сам датчик » — можно поподробнее, что это за «BMP»?
+
avatar
  • Creo
  • 24 февраля 2017, 19:32
0
BME280 производства Bosch Sensortec
+
avatar
+1
Все верно. Причем у него родное напряжение 3.3 вольта как у есп8266 так что колхозить ничего не придется с уровнями сигналов. У меня в моей системе стоит BMP280 (отличается буквой, и в нем как раз нет влажности, а только температура и давление) а влажность и дополнительную температуру меряет отдельный датчик dht22 и ds18b20 (можно цеплять несколько датчиков на 1 пин и измерять наружную\внутреннюю температуру например или температуру батарей и вести лог на народмоне)
+
avatar
0
Легче купить какую нибуть метеостанцию с часами на али
+
avatar
  • Serko
  • 23 февраля 2017, 16:05
0
Если не передавать, а просто проверять — от пары долларов на али термогигрометры. Если с мониторингом — то mySKU.me/blog/aliexpress/37928.html попроще рассказано и собрано почти без пайки и совсем без изготовления печатной платы.
+
avatar
  • Razdel
  • 24 февраля 2017, 18:37
0
Нужно помониторить влажность в ванной комнате несколько дней. С частотой в минуту. Посмотреть график. Подскажите, а вот для такой задачи это подойдёт или ещё упростить можно?
+
avatar
  • Serko
  • 24 февраля 2017, 21:59
0
Именно для мониторинга есть уже готовые устройства. Было у меня подобное этому ebay.com/itm/322044124666
но примерно через год лежания в подвале датчик влажности дал дуба.
Для ванной симпатично и недорого выглядит вот такой ebay.com/itm/351645178898
Как всегда, на али может быть дешевле. Поиск по «Logger Humidity».
+
avatar
  • Razdel
  • 25 февраля 2017, 17:54
0
Понятно, спасибо. :) Видимо, на ESP всё-таки проще и дешевле будет собрать — по вашей ссылке выше (https://mysku.me/blog/aliexpress/37928.html)
+
avatar
  • Serko
  • 26 февраля 2017, 12:33
0
Для меня загвоздка в том, как собирать данные в автоматическом режиме. С логгерами просто — подцепил к компу и скачал всё накопленное. А на ESP — сервер держать и данные снимать? Или вам нужно только удалённое наблюдение?
+
avatar
  • Razdel
  • 27 февраля 2017, 12:21
0
Мне удалённое наблюдение как раз не нужно.
В одном из обзоров ( а может и в комментах к этому :) ) Проскакивала ссылка на сервис thingspeak.com/. Кажется, он как раз для этого. И он такой не единственный, естественно.
+
avatar
  • Corvair
  • 23 февраля 2017, 14:13
0
Спасибо за обзор! Недавно пришёл с Али комплект для метеостанции на ESP8266, тоже засяду за шаманство :). У меня будет на прошивке от Homes Smart. Не заказывал только дисплей, есть 2004 VFD от старого оборудования попробую подключить его.
+
avatar
+1
Крышку черную лучше серебрянкой покрасить, иначе будет нагреваться на солнце и врать.
+
avatar
0
Займусь непременно. Как потеплее будет. Чото я тупанул, есть же отраженные лучи еще
+
avatar
  • Delanet
  • 23 февраля 2017, 23:21
0
И вроде как от дома еще теплый воздух зимой идет из-за отопления.
+
avatar
+4
Это не esp зависает, это он wifi странно теряет. На форуме esp8266.ru есть где-то описание, что нужно в коде поправить.
По уму для мониторинга постоянный конект не нужен.
Нужно по старту
— подать напругу на датчик,
— собрать данные,
— подключить сеть,
— отправить данные,
— уйти в глубокий сон на 5 мин
(esp просыпается резетом)

есть вариант накапливать данные в памяти и отправлять пачками
+
avatar
0
aliexpress.com/item/New-Wireless-module-NodeMcu-Lua-WIFI-Internet-of-Things-development-board-based-ESP8266-with-pcb-Antenna/32265993979.html
А эта фиговина лучше или наоборот? Там CP2102 вместо CH340 стоит. Я понятия не имею что это, просто та фигня у меня заказана.
+
avatar
+2
Не принципиально. Это встроенный usb-uart, еспшка то одна
+
avatar
0
Спасибо. Там цена, конечно, получше, но китаец какой-то тугой. Уже дней 10 отправки ожидает.
+
avatar
  • Delanet
  • 23 февраля 2017, 17:20
0
+
avatar
  • naoboom
  • 23 февраля 2017, 14:42
+2
Лучше CH340. Не слышал чтобы их подделывали. А вот фейковый CP2102 запросто. Винда обновляет драйвер и он отказывается работать с паленым usb-uart.
+
avatar
+1
Прувы в студию пожалуйста. Подделывали FTDI чипы. Про P2102 слышу впервые. По мне доверия к чипам от Silicon labs больше, чем у китайцам.
+
avatar
  • naoboom
  • 24 февраля 2017, 08:50
0
FTDI у меня тоже есть. Недавно в коллекцию фейковый PL от китайцев получил.
www.radioscanner.ru/files/miscsoftware/file18946/
+
avatar
0
Простите но cp2102 и pl2303 — это разные микросхемы и производители. Я пока не видел поддельных cp2102, поэтому доверия к чипам от Silicon labs больше, чем у китайцами их ch340.
+
avatar
+1
А в чем проблема ch340? Ни разу не слышал, чтобы они глючили.
+
avatar
0
Если есть выбор между ch340 и cp2102 по одинаковой цене — я выберу silicone labs.
+
avatar
0
Кто-нибудь пробовал запитать bmp280 от 4-5 вольт? По даташиту 3,6 максимум(4,2 абсолютный максимум) Хочу запитать напрямую от лития, интересно сдохнет оно или будет хоть как-то работать?
+
avatar
0
Я бы попробовал через диод. Падение напряжения там, вот это все. Или дцдц какой, если такие существуют
+
avatar
0
Через диод не хочу, так как литий просядет и будет меньше 3 вольт. Есп у меня напрямую от лития работает, а если питать через диод только бмп, то уровни на входах не совпадут, будет глючить.
+
avatar
  • IVF
  • 23 февраля 2017, 15:57
0
AMS1117 пойдёт?
+
avatar
0
Надо что то с low dropout. Эта хз как себя поведет с такой малой разницей входного и выходного напряжения
+
avatar
  • Delanet
  • 23 февраля 2017, 17:25
+1
У Holtek серия LDO HT75xx: www.holtek.com.tw/producthome/-/pid/45
+
avatar
0
Он сам по себе жрет целых 10мА, аккумуляторов не напасешься.
+
avatar
  • rx3apf
  • 23 февраля 2017, 14:45
+2
Зачем издеваться над хорошей вещью? XC6206 стоит копейки, жрет еще меньше и решает все проблемы питания. Кстати, кроме BMP180/BMP280 давно уже есть не сильно дороже BME280, в котором уже есть и датчик влажности тоже. Очень неплохой (жаль только, не прикрытый внешним фильтром)
+
avatar
0
Хочу обойтись вообще без стабилизаторов. Собственно идет речь об интеграции бмп280 в уже работающее устройство. XC6206 конечно хорошо, но литий надо высасывать до 3 вольт опять же.
+
avatar
  • darkbyte
  • 26 февраля 2017, 11:00
0
Для питания от лития можно взять такой конвертер aliexpress.com/item/5pcs-mini-1-8V-3V-3-7V-5V-to-3-3V-Boost-Buck-Low-Noise-Regulated/32365767349.html
+
avatar
  • m13ale
  • 23 февраля 2017, 14:43
+1
А не проще ли было использовать один датчик на BME280 за 3.5$? Тоже собираю интернет-метеостанцию, но в минималистичном стиле — на ESP-12F + BME280. Без дисплея и веб-сервера, чисто отправка данных на narodmon.ru и openweathermap.org
+
avatar
0
Проще. Но что было, на том и сделал. Сдохнут, надо будет запилить
+
avatar
  • Creo
  • 24 февраля 2017, 19:34
+1
Я еже к своей станции датчик освещенности по приколу приделал :) Хотел еще силу и направление ветра добавить, но там ценник не разумный :)
+
avatar
0
Интересная штука, а у Вас есть рисунок печатной платы в формате PCB. Если есть сбросьте в почту.
+
avatar
0
Только в протеусе
+
avatar
  • AlekseyM
  • 23 февраля 2017, 15:08
0
Собирал подобное. Внешний датчик впихнул в розетку RG45.
Замена простая и как провод использую простой пачкорд.
+
avatar
  • serg_mur
  • 23 февраля 2017, 16:01
+1
Вспомним сдохший датчик dht22. Симптомы — постоянно показывает влажность 99.9, в сухую погоду может показывать меньше.
Аналогичная проблема. За год поменял два датчика. Сейчас жду тепла, чтобы опять поменять. Корпус проветривается, влажность в нём не накапливается.

Питается устройство от телефонной зарядки 5в. 2А. Но и одного ампера, думаю, будет достаточно.
В максимуме ESP12 потребляет 70мА. С индикатором 1602 потребление 100 мА.
+
avatar
0
Нда. Надо другой датчик брать, вон там выше советовали какие то со всеми ништяками на борту. А дохли в холод и сырую погоду?
+
avatar
  • serg_mur
  • 23 февраля 2017, 16:54
+1
Есть и BMP280, и другие. С другими модулями ESP работают, проблем нет. Всего 7 датчиков (ESP) в квартире.
А дохнуть стал, когда похолодало до минусовых температур.
+
avatar
  • batal
  • 23 февраля 2017, 20:50
0
О, собрат. Меня жена скоро из дома выгонит за развешенные по всей квартире ESPшки с датчиками :)
+
avatar
+1
В пике она до 300мА берет. Поэтому или питальник на 1А очень даже как полезен
+
avatar
  • Naevus
  • 24 февраля 2017, 10:18
+2
У меня было тоже 99% влажность. но через какое то время — прошло само и больше не возвращалось.
А dht есть в уличном исполнении — надо было сразу их ставить (я когда 99% было заказал, но пока датчик ехал — старый «вылечился»).

Ну и датчик давления я бы не стал лепить на улицу. Давление в комнате от уличного не отличается, а датчику в комнате жить гораздо легче. Заодно можно и комнатную температуру с него выводить.
+
avatar
0
Дело не в том что они перестают тработать, а в том что после 50% влажности они врут безбожно. Почитайте — www.kandrsmith.org/RJS/Misc/Hygrometers/calib_many.html
+
avatar
  • Omega
  • 25 февраля 2017, 14:37
+2
С чего это Вы взяли, что он уличный? В нем практически внутри и стоит что-то вроде 22го. У меня есть 2301 в составе Sonoff th16. Я разбирал, смотрел.
+
avatar
  • Naevus
  • 25 февраля 2017, 20:27
0
Честно говоря — где то в каментах вычитал… Посмотрел даташит — про outdoor ни слова :( Приношу извинения кого ввел в заблуждение.
+
avatar
  • Jury_78
  • 23 февраля 2017, 16:06
+1
код для нее надо было писать в незнакомой мне среде esplorer на незнакомом мне языке
Как понимаю это Lua? Поначалу тоже испугался :), но потом ничего немного освоился. Очень удобно в плане отладки программы. Теперь делаю управление кочегаркой для дачи.
+
avatar
0
Я даже загрузить ничего не смог. Нафиг там кнопка flash?
+
avatar
  • Jury_78
  • 23 февраля 2017, 16:23
0
Все грузится без кнопок. Зачем они нужны не знаю, может для другой прошивки.
+
avatar
0
если не хочется кодить, то www.esp8266.nu
если хочется смотреть на телефоне у Виктора(https://esp8266.ru/esplorer/) есть интересный проект iotmanager.ru/
сам он использует platformio
много примеров автомаизации github.com/4refr0nt/iot-manager-demo
+
avatar
+1
Не подружился с lua — считай что тебе повезло. Это тупиковый путь.
+
avatar
  • Jury_78
  • 23 февраля 2017, 20:18
0
На вкус и цвет…
+
avatar
  • Reaper5
  • 23 февраля 2017, 17:03
+1
Датчик bmp180, кстати, подключен по i2c, а не spi.
+
avatar
  • svlvenok
  • 23 февраля 2017, 18:29
0
Жду BME280. ESP прошита, все работает. Корпус буду использовать от датчика дыма. Это уже третья метеостанция. :-) две первые с матричным дисплеем. Прошивка от wifi-iot.com. Зависания были, тантал по питанию все решил, да и вачдог есть. Раз в сутки ребут. Всем добра и с праздником!
+
avatar
  • wadamir
  • 23 февраля 2017, 22:03
0
Тоже такой корпус использую. Удобно.
+
avatar
  • FAlVik
  • 24 февраля 2017, 11:23
0
Какого номинала тантал?
Ватчдог использовал?
+
avatar
+1
с условно бесплатной прошивкой от Homes Smart, такое решение меня не устроило.
Ну да, 100 рублей нынче много платить за прошивку с кучей функций.
+
avatar
  • Zhila
  • 23 февраля 2017, 19:38
0
Коллега приветствую. Кину и я пару копеек, на HS зависания не обнаружены, питалово идет от простого зарядника для телефона. Работает почти полгода без сбоев.
+
avatar
0
дайте две тогда
+
avatar
  • spectre
  • 23 февраля 2017, 19:26
+2
Можно немного «доделать» схему, переключатель для прошивки можно выкинуть. С платы вывести не rx\tx\gnd а rx\tx\reset\gpio0\gnd, и подключать к usb-uart вот так: rx-tx, tx-rx, reset-rts(cts), gpio0-dtr, gnd-gnd. Тогда не понадобиться что-то наживать, переключать при попытке обновить прошивку. Воткнул пины — прошил.
А лучше сделать логический конвертер на мосфетах 1n7002 их как грязи на материнках. Часть схемы конвертора уже разведена на вашей плате (резисторы 10к).

Как uart через конвертер, так и i2c, тем более dht22 рекомендуется кормить 5 вольтами, реле и тп, тоже требуют 5 воль. Да и многие китайские uart-usb выдают 5вольт а не 3.3.
Датчики внешние тоже на 5 вольт, тогда не страшно если пара вольт потеряется по дороге к этому датчику :)
+
avatar
  • nochkin
  • 23 февраля 2017, 19:40
0
Зачем такой полигон под антенной? Лучше ведь не станет.
+
avatar
0
привычка. раствор берегу
+
avatar
  • nochkin
  • 23 февраля 2017, 20:41
0
Я в таких случаях делаю так, что бы антенна торчала за периметр платы. Тогда у меня ещё и место дополнительное получается за счёт этого и тогда уже сама плата-полигоны не особо мешают радио-сигналу.
+
avatar
  • X3Shim
  • 23 февраля 2017, 19:51
+1
Блин, вот как ты узнал ?!? NodeMCU уже давно пришла, недавно датчик. Достал из стола, смотрю на все это, думаю что LUA не буду, писать буду все сам, NodeMCU уже проверил про ArduinoIDE, начал гуглить про ардуиновую либу для этого датчика, параллельно листаю муську… И тут нате :)
+
avatar
0
Тоже как раз лежит на столе NodeMCU и BMP180. Остались пару пинов незадействованных, решил задействовать датчиком давления.
+
avatar
  • sswa
  • 23 февраля 2017, 20:01
+2
Есть серьезное замечание к плате, которые вы развели и изготовили.
В непосредственной близости от антенны ESP8266 модуля вижу большой полигон. Это сильно влияет на КСВН печатной антенны, а => и на излучаемую мощность и как следствие — на качества связи.
Обратите внимание как установлен этот модуль на оригинальной плате NodeMCU.
+
avatar
0
спасибо, в таких тонкостях не шарю вообще
+
avatar
  • bazis13
  • 24 февраля 2017, 13:54
0
Если массивный земляной полигон будет в 11 миллиметрах под антенной, это сильно повлияет на прием?
+
avatar
0
Не сильно. Моя то с полигоном ловила в соседней с роутером комнатой
+
avatar
  • dealwith
  • 23 февраля 2017, 20:40
+1
Из витой пары, горстки ds18b20 и esp8266 (01) можно много веселого сделать:
+
avatar
  • Creo
  • 24 февраля 2017, 19:37
0
Что за софт? Через облако — или напрямую к метеостанции?
+
avatar
0
А почему никто не рассматривает Wemos D1, точнее его копии, по цене подешевле, чем NodeMCU, функции те же. У меня есть метеостанция, точнее пока только термометр, код без всяких проектов, только отсылает данные. Зависаний за почти месяц работы не было, было только отключение интернета на пару часов за неуплату.
narodmon.ru/3306
+
avatar
  • batal
  • 23 февраля 2017, 20:58
0
У китайцев примерно одинаково стоят.

Вемос компактнее, nodemcu имеет больше пинов.

По сути дело вкуса какую платку использовать.

У меня есть и вемосы (штук 5) и 2 nodemcu и 1 witty cloud (бутерброд).

Вемос нравится больше всех своей компактность. Но столкнулся с тем что на нем криво работает INT ADC с хоум смартовской прошивкой. Пока не понял почему.
+
avatar
  • batal
  • 23 февраля 2017, 20:55
0
А подскажите какой датчик температуры и влажности (или 2 раздельных) использовать именно для наружнего мониторинга. DHT22 на сколько я понял в таких условиях дохнут быстро. Какие альтернативы?
+
avatar
  • m13ale
  • 23 февраля 2017, 21:24
0
Такой, например.
+
avatar
0
Я использую Si7021 для влажности и температуры + BMP180 для давления. Вполне доволен, датчики точные и живучие.
+
avatar
  • vlad1955
  • 23 февраля 2017, 22:20
0
вот ESP8266 дешевле ebay.com/itm/192110151797:g:at0AAOSwaZdXINTm
и датчик ebay.com/itm/112206549256
+
avatar
  • Delanet
  • 23 февраля 2017, 22:51
0
По вашей ссылке ESP8266 получается $4.35 с доставкой, что дороже, чем на Али — $3.94.
+
avatar
  • svlvenok
  • 23 февраля 2017, 23:09
0
Можно взять голую esp и степ-даун на 1117. А прошить не проблема и ардуинкой. :-) Дешевле, в два с мелочью выйдет.
+
avatar
0
У меня Nodemcu с CH340G определялась компом один раз из 20 подключений. Там рядом с кнопкой reset есть 2 диода, если вместо ближнего к отверстию поставить перемычку, то все ОК.
+
avatar
  • DRON2402
  • 23 февраля 2017, 23:40
0
Уважаемые спецы, подскажите!
Пришли с Али два модуля Wemos D1, точнее, как выяснилось, копии.
При подключении к компу идёт постоянный реконнект. На питание реагируют. Сеть создают.
Один из модулей мне удалось прошить, подключив его под конец компиляции скетча.
Witty Cloud и NodeMcu Lua подключаются и шьются без вопросов.
Куда копнуть?
+
avatar
0
Питание батенька им от usb не хватает. Подключить внешний источник на 1а и будет счастье
+
avatar
0
+
avatar
  • gulin176
  • 24 февраля 2017, 08:49
0

я так сделал
+
avatar
  • FAlVik
  • 24 февраля 2017, 11:28
0
Температуру комфорта по какой методике расчитывал?
+
avatar
  • gulin176
  • 24 февраля 2017, 11:42
+2
float calculate_humidex(float temperature, float humidity) {
float e;
e = (6.112 * pow(10, (7.5 * temperature / (237.7 + temperature))) * humidity / 100);
float humidex = temperature + 0.55555555 * (e — 10.0);
return humidex;
}
код такой, сам подсчёт взял готовый у кого то из программы :)
весь код тут arduino.ru/forum/programmirovanie/18-tft-128160-i-bmp180#comment-248522
+
avatar
0
По-моему в последнем примере к этой библиотеке все есть

github.com/enjoyneering/HTU21D
+
avatar
  • le-lik
  • 25 февраля 2017, 10:18
0
Я вот на такое глаз положил но цена…
+
avatar
  • le-lik
  • 25 февраля 2017, 12:10
0
Ссылку не могу прикрепить на али по запросу «Запасные части (наружный блок) для Профессиональная Беспроводная Погодная Станция, MS-WH-SP-WS02»
+
avatar
  • X3Shim
  • 26 февраля 2017, 14:35
0
>> Датчик давления и температуры bmp180

А я вот задумался, почему сразу два BME280 не поставить? На улицу и дома. Зато полный набор показаний.
+
avatar
  • SuperXL
  • 27 февраля 2017, 03:06
+4
Приветствую!
Зачем выводить разъем для прошивки? Посмотрите в сторону ArduinoOTA. У Вас же есть wi-fi, вот и прошивайте по воздуху. Да, согласен, в первый раз нужны провода, чтоб зашить OTA, это нужно сделать только один раз при первом включении, так сказать «извлечении модуля из заводской упаковки», можно даже просто проводками «на коленке». Потом здравствуй wi-fi.
Вот мой вариант. Начинка вся та-же, только OLED 0,96" дисплейчик. Установлен в коробочку от RJ-45 розетки, на застекленный балкон, без утепления.
Показывает:
Уровень сигнала Wi-Fi;
Динамика температуры (рядом со значком «температура» стрелочки в нужную сторону или знак "=" при отсутствии изм. темп. );
Время по NTP;
Сброс показаний раз в 10 минут на сервер (домашний)
Обновление показаний на экране раз в секунду (часы идут) опрос датчиков раз в 5 секунд. Динамика вычисляется раз в 10 минут, в момент отправки показаний. OLED пережил холода вполне достойно, а вот DHT врет не по детски, буду переделывать на другой датчик. Зависаний пока не было, т.к. использованы танталы по питанию, блок питания китайская зарядка для телефона.

+
avatar
  • akaivp
  • 27 февраля 2017, 08:25
0
Красиво. Поделитесь скетчем.
+
avatar
  • SuperXL
  • 28 февраля 2017, 12:04
+1
Ок, вечером доберусь до домашнего компа, выложу. Сразу предупрежу, что писал скетч для себя, поэтому где-то сильно не «причесано» :-)
+
avatar
  • SuperXL
  • 01 марта 2017, 01:18
+1
Выкладываю скетч «не причесанный»
Да простят меня модераторы, но не нашел кнопки Споллера.


#include <TimeLib.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <Wire.h>
#include "SSD1306.h"
#include "DHT.h"
#include <Adafruit_BMP085.h>
#include <ArduinoOTA.h>

#define DHTPIN D6
#define DHTTYPE DHT22

const char ssid[] = "Имя Вашего wi-fi";  //  your network SSID (name)
const char pass[] = "Пароль от wi-fi";       // your network password
const char* server = "IP адрес куда можно закинуть данные";
const char id_sensor[] = "01"; // ID прибора для того чтобы сервер понимал от кого данные
// NTP Server:
static const char ntpServerName[] = "ru.pool.ntp.org";
const int timeZone = 3;     // Moskow Time

WiFiUDP Udp;
unsigned int localPort = 8888;  // local port to listen for UDP packets

SSD1306  display(0x3c, D1, D2); // используются вроде не стандартные пины для дисплея

DHT dht(DHTPIN, DHTTYPE, 15);
Adafruit_BMP085 bmp;

#define oled_antena_width 8
#define oled_antena_height 8
static char oled_antena_bits[] = {0B10010010,0B01010100,0B00111000,0B00010000,0B00010000,0B00010000,0B00010000,0B00010000};

// картинки на дисплей
#define oled_din_up_width 3
#define oled_din_up_height 2
static char oled_din_up_bits[] = { 0x02,0x05 }; 

#define oled_din_down_width 3
#define oled_din_down_height 2
static char oled_din_down_bits[] = { 0x05,0x02 }; 

#define oled_din_stat_width 4
#define oled_din_stat_height 4
static char oled_din_stat_bits[] = { 0x0f,0x00,0x00,0x0f }; 

#define oled_humi_width 9
#define oled_humi_height 13
static char oled_humi_bits[] = { 0x10,0x00,0x38,0x00,0x28,0x00,0x44,0x00,0x44,0x00,0x82,0x00,0x82,0x00,0x83,0x01,0x01,0x01,0x21,0x01,0x93,0x01,0xc6,0x00,0x7c,0x00 };  

#define oled_temp_width 9
#define oled_temp_height 21
static char oled_temp_bits[] = { 0x38,0x00,0x6c,0x00,0x44,0x00,0x44,0x00,0xc4,0x01,0x44,0x00,0x54,0x00,0xd4,0x01,0x54,0x00,0x54,0x00,0xd4,0x01,0x54,0x00,0x54,0x00,0x54,0x00,0xd6,0x00,0x93,0x01,0x39,0x01,0x39,0x01,0x93,0x01,0xc6,0x00,0x7c,0x00 }; 

#define oled_pres_width 13
#define oled_pres_height 13
static char oled_pres_bits [] = { 0xf8,0x03,0x0c,0x06,0x46,0x0c,0x03,0x18,0x49,0x12,0x41,0x10,0x45,0x14,0x41,0x10,0x41,0x10,0xe3,0x18,0xe6,0x0c,0x0c,0x06,0xf8,0x03 }; 

int ledPin = D4; // мигает светодиод раз в 5 секунд, показывая что девайс скорее жив, чем мертв...
int UpdateTime_5 = 4;


time_t getNtpTime();
// void TimeEvent(); // лишняя запчасть

void sendNTPpacket(IPAddress &address);
void ShowTime();
void ShowWiFiScale();
void ShowTHP();
void Send_data_to_server();
void Calc_din();
void ShowTempDin();

// шпаргалка для размеров шрифтов
// Arial 10 - Width: 10 Height: 13 
// Arial 16 - Width: 16 Height: 19
// Arial 24 - Width: 24 Height: 28

void WiFiEvent(WiFiEvent_t event) {
    Serial.println();
    Serial.printf("[WiFi-event] event: %d\n", event);

    switch(event) {
        case WIFI_EVENT_STAMODE_GOT_IP:
            Serial.println("WiFi connected");
            Serial.println("IP address: ");
            Serial.println(WiFi.localIP());
            break;
        case WIFI_EVENT_STAMODE_DISCONNECTED:
            Serial.println("WiFi lost connection");
            display.drawString(64, 49, "reboot...");
            display.display();
            WiFi.disconnect(true);
            delay(1000);
            ESP.reset();
            break;
    }
}
String ipToString(IPAddress ip){
  String s="";
  for (int i=0; i<4; i++)
    s += i  ? "." + String(ip[i]) : String(ip[i]);
  return s;
} 
+
avatar
  • SuperXL
  • 01 марта 2017, 01:20
+1
продолжение

void setup(){

  String Dev_Status = "";
  
  display.init();
  display.flipScreenVertically();
  display.setColor(WHITE);
  display.setTextAlignment(TEXT_ALIGN_CENTER);
  display.setFont(ArialMT_Plain_16);
  
  Serial.begin(9600);
  while (!Serial) ; // Needed for Leonardo only
  delay(250);
  
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH);
  
  display.drawString(64, 0, "Weather station");
  display.display();
  delay(2500);
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.setFont(ArialMT_Plain_10);
  
  display.drawString(0, 25, "Connecting to " + String(ssid));
  display.display();
  Serial.println("Weather station");
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  if (!bmp.begin()) Serial.println("Could not find a valid BMP085 sensor, check wiring!");

  WiFi.disconnect(true);
  delay(1000);
  WiFi.onEvent(WiFiEvent);
  //WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, pass);
  int x = 0;
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
    display.drawString(0 + x, 39, "|");
    display.display();
    Serial.print(".");
    x += 1;
    
    if (x >= 80 ){
      display.drawString(100, 39, "error");
      display.drawString(64, 49, "reboot...");
      display.display();
      delay(1000);
      ESP.reset();
    }
  }
  display.drawString(100, 39, " - OK");
  display.display();
  delay(1000);
  display.clear();
  //                           x  y          ширина                    высота              массив самой картинки
  display.drawXbm(0, 0, oled_antena_width, oled_antena_height, oled_antena_bits);
  ShowWiFiScale();
  display.drawString(0, 25, "IP address: " + ipToString(WiFi.localIP()));
  display.drawString(0, 39, "Get time from NTP ...");
  display.display();
  delay(1000);
  
  Udp.begin(localPort);
  
  Serial.print("Local port: ");
  Serial.println(Udp.localPort());
  Serial.println("waiting for sync");
  setSyncProvider(getNtpTime);
  setSyncInterval(300);
  
  display.drawString(95, 39, " done");
  display.display();
  
  ArduinoOTA.setHostname("esp8266-balkon"); // название модуля для прошивки по воздуху. т.к. этот девайс живет на балконе
// то и название мне понятное с кем имею дело.
  ArduinoOTA.setPassword((const char *)"Пароль для прошивки по воздуху"); // если не нужен пароль то просто закоментить эту строку
// в примере для прошивки по воздуху, есть еще интересные плюшки, которые происходят в начале прошивки, в процессе, и в 
// конце, а также при ошибках. Я не стал их сюда засовывать, т.к. считаю в данном случае применения девайса это лишним  

ArduinoOTA.begin();
  
  dht.begin();
 
  delay(1000);
  display.clear();
  display.drawXbm(0, 0, oled_antena_width, oled_antena_height, oled_antena_bits);
  display.drawXbm(0, 15, oled_temp_width, oled_temp_height, oled_temp_bits);
  display.display();
}

time_t prevDisplay = 0; // when the digital clock was displayed

void loop()
{
  ArduinoOTA.handle(); // для прошивки по воздуху обязательно присутствие этой строки
// и желательно чтоб в циклах с делеем тоже эта строчка присутствовала. можно много раз исп. эту строку.
// чтоб не получилось так, что среда ардуино не может получить доступ к модулю для прошивки по воздуху
// пока модуль в цикле делеей отсчитывает.

  if (timeStatus() != timeNotSet) {
    if (now() != prevDisplay) { //односекундный интервал для уровня вай-фая, часов, анимации динамики.
      prevDisplay = now();
      ShowTime();
      ShowWiFiScale();

      if (++UpdateTime_5 >= 5){ // пятисекундный интервал обновления данных с датчиков
        digitalWrite(ledPin, LOW); // у меня на модуле диод вкл низким уровнем
        delay(1);
        digitalWrite(ledPin, HIGH); // и выкл высоким.
        UpdateTime_5 = 0;
        ShowTHP();
      }
      if (minute() % 10 == 0 && second() == 0){  // десятиминутный интервал
          Calc_din();
      }
      ShowTempDin();
    }
  }
}
+
avatar
  • SuperXL
  • 01 марта 2017, 01:21
+1

int draw_stat = 0;
int t_up_down = 0;
float h = 0;
float t = 0;
float p = 0;
float t_din = 0;
String CurrentTime  = "";

void ShowTempDin(){
  if (t_up_down == 1){ //down
    display.drawXbm(15, 18 + draw_stat, oled_din_down_width, oled_din_down_height, oled_din_down_bits);
    display.display();
  }
  if (t_up_down == -1){ //up
    display.drawXbm(15, 31 - draw_stat, oled_din_up_width, oled_din_up_height, oled_din_up_bits);
    display.display();
  }
  if (t_up_down == 0){ // =
    display.drawXbm(15, 21, oled_din_stat_width, oled_din_stat_height, oled_din_stat_bits);
    display.display();
  }

  draw_stat += 3; // смещение по Y координате, для анимации
  if (draw_stat >= 15) draw_stat = 0;
}

void Send_data_to_server(){
  WiFiClient client;
  if (client.connect(server,8091)) {
    String postStr  ="id="; // ид прибора
           postStr += String(id_sensor);
           postStr +="&temp="; 
           postStr += String(t,1); // температура с округлением до десятых
           postStr +="&humi=";
           postStr += String(h,1); // влажность тоже с округл.
           postStr +="&pres=";
           postStr += String(p/133.322368,0); //давление в мм Р ст. челое число
           postStr +="&time=";
           postStr +=CurrentTime; // время передачи показаний (для базы на сервере) 
           postStr += "\r\n\r\n";
 
     client.print("POST /путь и имя скрипта принимающего показания HTTP/1.1\n");
     client.print("Host: Ваш IP адрес сервера \n");
     client.print("Connection: close\n");
     client.print("Content-Type: application/x-www-form-urlencoded\n");
     client.print("Content-Length: ");
     client.print(postStr.length());
     client.print("\n\n");
     client.print(postStr);
    
     client.stop();
  }
}

void Calc_din(){
  t_din = t_din / 120; // динамика вычисляется за 10 минут с 5 секундным интервалом то есть 120 раз. поэтому и делим на 120.
  if(t_din > t)  t_up_down = 1;
  if(t_din < t)  t_up_down = -1;
  if(t_din == t) t_up_down = 0;
  t_din = 0;
  Send_data_to_server();
}

void ShowTHP(){
  h = dht.readHumidity();
  t = dht.readTemperature();
  p = bmp.readPressure();

  t = t - 5.0F; // ВОТ НА СТОЛЬКО ВРЕТ У МЕНЯ ДАТЧИК !!!! >:-(
// Serial.println(t);
  t_din += t;
  draw_stat = 0;
  String temp = String(t,1);
  String humi = String(h,1);
  String presure = String(p / 133.322368,0);
 
  display.setTextAlignment(TEXT_ALIGN_LEFT);
  display.setFont(ArialMT_Plain_24);
  display.setColor(BLACK);
  display.fillRect(9, 15, 119, 20);
  display.fillRect(0, 42, 128, 13);
  display.setColor(WHITE);
  display.drawXbm(0, 43, oled_pres_width, oled_pres_height, oled_pres_bits);
  display.drawXbm(72, 43, oled_humi_width, oled_humi_height, oled_humi_bits);
  display.drawString(98, 12, "C");
  display.drawCircle(90, 20, 3);
  display.setTextAlignment(TEXT_ALIGN_RIGHT);
  display.drawString(84, 12, temp);
  display.setFont(ArialMT_Plain_10);
  display.drawString(128, 45, "%");
  display.drawString(60, 45, "mm");
  display.setFont(ArialMT_Plain_16);
  display.drawString(118, 40, humi);
  display.drawString(44, 40, presure);
  display.display();
}

void ShowTime(){
  CurrentTime  = String(hour());
  CurrentTime += ":";
  if (minute() < 10) CurrentTime += "0";
  CurrentTime += minute();
  CurrentTime += ":";
  if (second() < 10) CurrentTime += "0";
  CurrentTime += second();
  
  display.setColor(BLACK);
  display.fillRect(86, 3, 42, 7);
  display.setColor(WHITE);
  display.setTextAlignment(TEXT_ALIGN_RIGHT);
  display.setFont(ArialMT_Plain_10);
  display.drawString(128, 0, String(CurrentTime));
  display.display();

}

void ShowWiFiScale(){
  long rssi = -1 * WiFi.RSSI();
  display.fillRect(10, 4, 4, 4); 
  display.fillRect(15, 3, 4, 5); 
  display.fillRect(20, 2, 4, 6); 
  display.fillRect(25, 1, 4, 7); 
  display.fillRect(30, 0, 4, 8); 
  display.setColor(BLACK);
  if (rssi > 66) {display.fillRect(31, 1, 2, 6);}
  if (rssi > 74) {display.fillRect(26, 2, 2, 5);}
  if (rssi > 80) {display.fillRect(21, 3, 2, 4);}
  if (rssi > 85) {display.fillRect(16, 4, 2, 3);}
  if (rssi >= 90){display.fillRect(11, 5, 2, 2);}
  display.display();
  display.setColor(WHITE);
}

/*-------- NTP code ----------*/

const int NTP_PACKET_SIZE = 48; // NTP time is in the first 48 bytes of message
byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming & outgoing packets

time_t getNtpTime()
{
  IPAddress ntpServerIP; // NTP server's ip address

  while (Udp.parsePacket() > 0) ; // discard any previously received packets
  Serial.println("Transmit NTP Request");
  // get a random server from the pool
  WiFi.hostByName(ntpServerName, ntpServerIP);
  Serial.print(ntpServerName);
  Serial.print(": ");
  Serial.println(ntpServerIP);
  sendNTPpacket(ntpServerIP);
  uint32_t beginWait = millis();
  while (millis() - beginWait < 1500) {
    int size = Udp.parsePacket();
    if (size >= NTP_PACKET_SIZE) {
      Serial.println("Receive NTP Response");
      Udp.read(packetBuffer, NTP_PACKET_SIZE);  // read packet into the buffer
      unsigned long secsSince1900;
      // convert four bytes starting at location 40 to a long integer
      secsSince1900 =  (unsigned long)packetBuffer[40] << 24;
      secsSince1900 |= (unsigned long)packetBuffer[41] << 16;
      secsSince1900 |= (unsigned long)packetBuffer[42] << 8;
      secsSince1900 |= (unsigned long)packetBuffer[43];
      return secsSince1900 - 2208988800UL + timeZone * SECS_PER_HOUR;
    }
  }
  Serial.println("No NTP Response :-(");
  return 0; // return 0 if unable to get the time
}

// send an NTP request to the time server at the given address
void sendNTPpacket(IPAddress &address)
{
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 6;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12] = 49;
  packetBuffer[13] = 0x4E;
  packetBuffer[14] = 49;
  packetBuffer[15] = 52;
  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}


будут вопросы, спрашивайте, но заранее прошу прощения если сразу не отвечаю, на работе аврал такой, что врагу не пожелаешь.
+
avatar
  • avi1962
  • 01 марта 2017, 11:25
0
некоторые строчки, к сожалению, видны не полностью
+
avatar
  • akaivp
  • 01 марта 2017, 11:59
0
Выделяете, копируете в буфер обмена, вставляете в текстовом редакторе и все видно.
+
avatar
  • avi1962
  • 01 марта 2017, 12:15
0
понял, спасибо
+
avatar
  • Stavr
  • 22 апреля 2017, 20:46
0
А можно по подробнее о Вашем проекте (фото, что куда паять) заранее спасибо. Попробовал залить Ваш скейч в nodmsu вылетает ошибка видать я что то делаю не так. Если вопросы глупые не судите строго новичка я с ардуино только знакомлюсь
+
avatar
  • mag21
  • 08 ноября 2017, 08:12
0
А схемку не скинете?
+
avatar
  • FloX
  • 28 февраля 2017, 09:52
0
dht врет по температуре или влажности?
+
avatar
  • SuperXL
  • 28 февраля 2017, 12:16
0
и там и там, по температуре я даже ввел поправочный коэффициент, аж целых 5 градусов, в скетче будет видно. С влажностью даже и не знаю в какую сторону сдвигать, т.к. температуру еще можно как то проконтролировать, а вот с влажностью проблема. Планирую переделать DHT22 на Si7021, но т.к. он i2c и линия связи не может быть длинной, то скорее всего сделаю конвертер на attiny85 из i2c в 1-wire, чтоб оставить проложенный уже провод. Детальки заказаны, уже в пути.
+
avatar
  • dSave
  • 04 марта 2017, 22:45
0
Уже несколько раз в комментариях рекомендуют использовать танталовые конденсаторы на питании.
Подскажите, пожалуйста, что они дают?
Это нужно только ESP или для Ардуино тоже?
+
avatar
0
Всё правильно. Но одно добавление есть.
Технология OTA предполагает сокращение доступного объёма памяти под программу — например, половину, а то и меньше, из имеющегося. В одной половине памяти находится рабочая программа, во вторую будет загружаться обновление, при удачной загрузке будет переключение на новую программу, а прежняя часть памяти будет использоваться при очередном OTA-обновлении.
Многие модули, построенные на ESP8266, имеют на борту, как пишут продавцы, «4 М» или даже «4 М байт», что часто означает всего лишь 4 мегабита или 512 килобайт. (На сколько я могу судить, модуль из статьи именно с 512 кБ.) Для использования OTA с таким модулем программа должна умещаться в 256 килобайт. При программировании в ArduinoIDE это может стать ограничением, когда захочется добавить функциональности в проект. В результате программа может просто перестать работать, а в com-порт будут приходить лишь сообщения от WDT.
Но модули встречаются и с 1 мегабайтом (8 мегабит), и даже с 4 мегабайтами (32 мегабита) памяти. Я приобрёл такой aliexpress.com/item/NodeMCU-V3-Lua-WIFI-module-integration-of-ESP8266-extra-memory-32M-flash-USB-serial-CH340G/32739832131.html ещё до введения платной доставки, отчего цена получилась ниже, чем итоговая у обозреваемого в статье. (Кстати, эта плата уже обычных NodeMCU и на беспаячной макетной плате остаётся по одному ряду с боков для подключения.)
Сейчас поиск на Али выдал, среди прочих, такое: $2.88 (+$1.02 доставка в РФ) aliexpress.com/item/NodeMCU-V3-Lua-WIFI-module-integration-of-ESP8266-extra-memory-32M-flash-USB-serial-CH340G/32789696232.html, за $3.15 с бесплатной доставкой в РФ: aliexpress.com/item/V3-4M-bytes-32Mbits-FLASH-NodeMcu-Lua-WIFI-Networking-development-board-Based-ESP8266-with-firmware/32565317233.html — но эти варианты плат я не проверял.
+
avatar
  • megavis
  • 05 марта 2017, 23:58
0
дисплей грустный
мне больше нравится OLED, как в проекте выше, или например, минимализм:
learn.adafruit.com/huzzah-weather-display/circuit-assembly
+
avatar
  • kiv69
  • 09 марта 2017, 15:55
-1
За столько лет не появилось желания ни собрать, ни купить метеостанцию. Либо мерить температуру в квартире.
Перед выходом из дома глянул за окно, нет ли дождя. Посмотрел температуру «за бортом». Можно ещё в смартфоне глянуть прогноз погоды на день. Всё.
А зачем эта метеостанция? Не понимаю. Тем более зачем собирать метеоисторию и передавать её куда-то?
Или тут все поголовно синоптики и архивные данные о погоде им позарез нужны в работе?
Иначе полезность подобных устройств равняется нулю. Впрочем. занудам, которые ещё в койке планируют, что же надеть, выходя из дома, какая-то польза от метеостанции на прикроватной тумбочке будет.
Из шести моих самоделок, которые я делаю/буду, температура используется в двух — контроллер паяльного фена(встроенный датчик) и ламинатор для ПП(датчик LM35). Никакой температуры окружающей среды, она нужна разве что в каком-нибудь контроллере отопления/кондиционирования дома. В квартире температуру вообще не контролирую, без устройств её регулирования это идиотизм.
+
avatar
  • SuperXL
  • 11 марта 2017, 09:12
0
Перед выходом из дома глянул за окно, нет ли дождя.

В наших широтах такое не прокатывает! У нас в народе ходит такая пословица-поговорка «Даже в самый жаркий и солнечный день не забудь взять с собой теплый свитер и зонтик» :-) Динамика изменений позволяет немного прикинуть — а что нас ждет дальше. Сутра, с просоней, чисто на автопилоте, глянув на обычные цифры на дисплее можно прикинуть, как одеть ребенка в детский сад. Поверьте, лезть в смартфон чтобы ознакомиться с прогнозом совсем влом (ну по крайней мере у меня). Да Вы и сами знаете поговорку «каждый… так, как хочет» :-) В большинстве случаев все (на мой взгляд) такие поделки это не более чем красивый локальный показометр, у одних это может быть «пробой пера» в программировании, так сказать «Hello World», у других что то новое в железках, у третих интересная самоделка с пользой «только для меня».
+
avatar
  • Aduard
  • 06 августа 2017, 22:52
0
+
avatar
  • Aduard
  • 06 августа 2017, 22:52
0
+
avatar
  • Aduard
  • 06 августа 2017, 22:53
0
+
avatar
  • Aduard
  • 06 августа 2017, 22:53
0
+
avatar
  • Aduard
  • 06 августа 2017, 22:57
0
Здравствуйте, я собрал 1.8 TFT + BME280.Большое спасибо автору за статью…
+
avatar
  • zinf
  • 26 октября 2020, 16:33
0
Всё по инструкции, но:

exit status 1
Ошибка компиляции для платы NodeMCU 1.0 (ESP-12E Module).

Подскажите пожалуйста…
+
avatar
0
Добрый день все по инструкции, уже голову сломал в чем может быть проблема?

exit status 1
Ошибка компиляции для платы Generic ESP8266 Module.
+
avatar
0
Добрый вечер. Запустил устройство. Но с датчика AM2302 данные на дисплей выводятся один раз при включении. Через 5 минут когда следующий запрос данные температуры и влажности не считываются. На дисплее отображается T2 nan, на влажности безумные значения. В чем может быть проблема?
+
avatar
0
Схема подключения и код нао глядеть, может быть все что угодно
+
avatar
0
Да уже все пересмотрел, код от проекта. И родной и мой дописанный тоже самое. Датчики менял на разные AM2302. Резистор подтягивающий ставил. Все равно считывается один раз при старте далее нет.