Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
«Дурак подкидной и переводной» — классика карточных игр! Яркий геймплей, простые правила. Развивайте стратегию, бросайте вызов соперникам и станьте королем карт! Играйте прямо сейчас!

Дурак подкидной и переводной

Карточные, Настольные, Логическая

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • SergeyKorsun SergeyKorsun 12 постов
  • SupportHuaport SupportHuaport 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня

Esp8266 + Автоматизация

С этим тегом используют

Arduino Электроника Самоделки Своими руками YouTube Умный дом Ardublock Вертикальное видео Технологии Бизнес IT Искусственный интеллект Робот Работа Все
6 постов сначала свежее
1
i.skuff
i.skuff
11 месяцев назад
Умный дом

ESP8266 + Tasmota + вопрос⁠⁠

Есть esp01 с прошивкой tasmota, нужно периодически включать реле на 0.3 секунды.

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

Цель - включать реле по команде MQTT, сообщать в MQTT статус реле, + может быть сенсоры ds18b20 dht22 (на какие GPIO их лучше подключать?).

Еще бы напряжение питания измерять (аккум) и в MQTT отправлять, без дополнительных микросхем?

Ещё подскажите живые русскоязычные форумы по tasmota?

[моё] Esp8266 Умный дом Автоматизация Электроника Текст
9
4
DELETED
1 год назад
Умный дом

Где посмотреть примеры конфигов для ESPHome?⁠⁠

Короче, у меня лыжи не едут, поиск не помогает, документация не помогает...
Дано: ESP8266, шаговый двигатель, концевик/микрик.
Необходимо: при подаче питания на ESP, шаговым двигателем обнаружить нулевое положение до сработки концевика/микрика. Допустимый диапазон шагового двигателя 0-100% пусть будет 0-10,000 шагов. Далее ручное выставление желаемой позиции в процентах текущего положения.
Проблема в поиске любой русскоязычной информации с примерами конфигов, не могу понять как это реализовать.
Тег без рейтинга.

Esp8266 Автоматизация Без рейтинга Текст
14
27
Lyginarium
Lyginarium
5 лет назад
Arduino & Pi

Не кормите кошку луком или удаленный мониторинг температуры 24/7 за 3 $. Свиристелки и перделки включены⁠⁠

Всем доброго времени суток! Завелась у меня как-то жена. Нет, не так. Завелась у меня как-то девушка. Познакомились мы с ней в закрытом платном клубе для дам и господ прогрессивных мировоззрений и изысканных вкусов. И это не то, о чем вы подумали :). Девушка притащила с улицы котенка со словами "Я покормлю и отнесу обратно". "Я тебе витащю", подумал я. Полная версия анектдота про "я тебе витащю" будет в комментах, он неприличный, здесь я его процитировать не могу. То, что девушка была ведьмой, я тогда еще не знал, поэтому черному цвету котенка значения не придал. Потом девушка стала женой, а котенок - кошкой. Потом мы с женой развелись, она съехала, а кошка осталась со мной. Из цензурных кошкиных имен могу припомнить лишь Жоплин и Писюнцель и есть за что. А потом, несколько лет спустя, у меня в квартире завелся репчатый лук. Вот с этого момента и начинается наша история.


Полежал он (лук) некоторое время и начал прорастать. А я, вместо того, чтобы его съесть или выкинуть, налил в две банки воды, воткнул туда луковицы и поставил на подоконник. Лук стал из бледно-желтого темно-зеленым, а я стал ждать урожай. Но что-то пошло не по плану и в один из дней я обнаружил побеги лука обглоданными. После короткого, но серьезного разговора с кошкой, она призналась, что это она. Я понял, что животине чего-то не хватает, а поскольку я ее скорее люблю, нежели наоборот, то стал выращивать для нее на подоконнике овес.


Как меня занесло на тематические каналы ютуба, где я узнал про гидропонику, микрозелень и витграсс, я уже не помню. Но я захотел выращивать пшеницу и именно на гидропонике, без земли. Потому что к тому времени, опыт выращивания пшеницы на подоконнике в земле у меня уже был. И таки шо ви думаете? Таки стал! Но было одно "но". Эта сука такая пшеница (точнее ее зерна) покрывалась плесенью. Стал искать причину и пути решения проблемы. Большинство людей в интернете говорили и писали про зараженность зерна, циркуляцию воздуха и температуру/влажность. Зерна я и так обеззараживал на этапе замачивания, вентилятор (точнее тепловентилятор без включенного ТЭНа) поставил, влажность мне на тот момент измерить было не чем, управлять ею - тоже нечем, поэтому на влажность я пока что забил. С температурой было еще сложнее.


Мало того, рекомендуемая (допустимая) температура варьировалась (в зависимости от рекомендаций) от 15 до 36 градусов Цельсия, так я еще и не знал, какая именно сейчас у меня температура на окне. Потому что в квартире термометра у меня не было по причине отсутствия в нем необходимости. Был заказан бюджетный термометр-гигрометр Xioami с Алиэкспресс. Но когда он придет, было не известно (на момент написания этого поста это все еще остается неизвестным), а хотелось вот прям сейчас.


Тогда я вспомнил, что с крайнего раза, когда меня накрывало волной энтузиазма и хотения по отношению к автоматизации жилища, интернету вещей и всему вот этому вот, у меня должна была остаться платка Wemos D1 Mini (а точнее, её клон, могу предположить) на базе микроконтроллера ESP 8266 и цифровой датчик температуры DS18B20 в герметичном корпусе на метровом проводе. Причем микроконтроллер у меня уже был прошит NodeMCU, скрипты на Луа залиты и настроены на отправку данных в народный мониторинг, датчик с резистором припаяны. В прошлый раз я хотел разместить датчик на улице и предоставить публичный доступ к его показаниям. И себе и людям, так сказать. Ибо термометра за окном у меня не было, в подъезд (там он был и есть, но неизвестно насколько точно он показывает) не набегаешься, да и хотелось "цифру", облако, графики и вот это вот всё. Тогда у меня дело уперлось в необходимость выводить на улицу из комнаты кабель с датчиком и изготавливать будку Стивенсона. Я не знал, как это правильно сделать и мне было ссыкотно. А без правильного размещения выводить датчик в публичный доступ не было смысла.


Но это было тогда, а сейчас-то это не нужно! А все, что нужно у меня почти что уже есть и сделано. Осталось вот просто взять и запустить проект. И шо ви думаете? Таки взял и запустил! На момент написания этих строк я уже знаю, что обдув подоконника тепловентилятором с выключенным ТЭНом повышает температуру на примерно 2 градуса. Как так? А вот хрен его знает! И теперь я знаю, что днем, на солнце, температура на окне может достигать 36,5 градусов Цельсия, что неожиданно много на мой взгляд, ибо май еще и на улице прохладно - 20 - 22 градуса. Датчик DS18B20 у меня врёт, но в пределах допустимого, сравнивал с показаниями поверенного ртутного лабораторного термометра TGL 1198.


А теперь несколько слов о том, как все это устроено и работает. Схема:

Не кормите кошку луком или удаленный мониторинг температуры 24/7 за 3 $. Свиристелки и перделки включены Esp8266, Своими руками, Nodemcu, Lua, Автоматизация, Длиннопост

Как видите, схема оочень простая. Резистор нужен номиналом 4,7 кОм. Устройству для работы необходимо питание 5 В/очень мало А, поэтому я использовал оочень старую зарядку от кнопочного телефона Sony Ericсson, доставшуюся мне по наследству от предшественника на работе. Спасибо тебе, Виталик! Общий вид:

Не кормите кошку луком или удаленный мониторинг температуры 24/7 за 3 $. Свиристелки и перделки включены Esp8266, Своими руками, Nodemcu, Lua, Автоматизация, Длиннопост

Все это прекрасно запихнулось в распределительную коробку JBL090 от Экопласт, которая, помимо хорошего качества, имеет очень приятный ценник и в Леруа стоит всего 16 рублей.

Кишки устройства:

Не кормите кошку луком или удаленный мониторинг температуры 24/7 за 3 $. Свиристелки и перделки включены Esp8266, Своими руками, Nodemcu, Lua, Автоматизация, Длиннопост

Сама прошивка и луа-скрипты брались отсюда, инструкции по прошивке и заливке скриптов, а также настройке устройства - там же. Общий алгоритм работы устройства следующий: 1 раз в 5 минут железка опрашивает датчики. Датчиков на 1 шину 1-wire (у меня это пин D1) можно повесить несколько штук параллельно. У меня 1 датчик потому что: а) мне пока больше не нужно б) у меня есть в наличии только 1 датчик) Далее, если все хорошо (датчики на шине нашлись, значения отдали, устройство подключено к wi-fi и имеет доступ в инет) устройство отправляет данные на сервер проекта "Народный Мониторинг". Данные отправляются парами "имя-значение". Для датчиков DS18B20 в качестве имени выступает его адрес (идентификатор) - это уникальное значение, в природе не существует двух таких датчиков с одинаковыми адресами. Таким образом, в самом простом случае, у нас будет отправляться две пары значений: адрес датчика - значение температуры и слово "heap" - значение heap. О том, что такое heap, будет чуть ниже. Итак, данные отправляются, осталось только научиться их забирать. Идем на сайт или сайт проекта "Народный Мониторинг" и создаем там аккаунт. Я реально х. з. зачем им два одинаковых сайта в разных доменных зонах. Дальнейшие действия я производил из андроид-приложения проекта. Ссылки на весь разработанный для проекта софт под разные платформы есть на сайте проекта.


Логинимся в приложении. Переходим в раздел "Мои датчики" нажимаем на "+", вводим MAC-адрес своего устройства. Если вы все сделали правильно, то через некоторое время в приложении вы увидите что-то вроде этого: 

Не кормите кошку луком или удаленный мониторинг температуры 24/7 за 3 $. Свиристелки и перделки включены Esp8266, Своими руками, Nodemcu, Lua, Автоматизация, Длиннопост

У вас вместо понятного имени датчика будет букво-цифренный набор. Это адрес датчика DS18B20 на шине 1-wire. В приложении можете переименовать датчики на свой вкус и цвет.


Параметр "Heap" - это, скажем так, размер оперативной памяти, доступный для исполнения Луа-скриптов. От версии к версии прошивка NodeMCU содержала в себе разные баги. И порой получалось так, что размер heap становился меньше, меньше, вплоть до полного исчерпания и тогда устройство или самопроизвольно перезагружалось (плохой, но не самый худший вариант) или впадало в упячку. В наши дни такое (вроде бы) редкость. Но, судя по всему, автор скриптов - старый опытный джедай и реализовал отправку размера heap для собственного спокойствия. На нормально функционирующем устройстве график размера heap должен иметь примерно такой вид:

Не кормите кошку луком или удаленный мониторинг температуры 24/7 за 3 $. Свиристелки и перделки включены Esp8266, Своими руками, Nodemcu, Lua, Автоматизация, Длиннопост

Финальный вид устройства на подколоннике:

Не кормите кошку луком или удаленный мониторинг температуры 24/7 за 3 $. Свиристелки и перделки включены Esp8266, Своими руками, Nodemcu, Lua, Автоматизация, Длиннопост

А вот ради этого, собственно, проект и затевался:

Не кормите кошку луком или удаленный мониторинг температуры 24/7 за 3 $. Свиристелки и перделки включены Esp8266, Своими руками, Nodemcu, Lua, Автоматизация, Длиннопост

Технические замечания.


Ограничения бесплатного аккаунта народного мониторинга:

1) В приватный доступ можно вывести только одно устройство. Приватный доступ - это когда ваше устройство и показания его датчиков видно только вам и тем людям, которым вы предоставили. Одно приватное устройство может иметь неограниченное количество датчиков. Но. Размер передаваемых за один раз данных - не более 4 кБайт. Периодичность отправки данных на сервер - не чаще, чем 1 раз в 5 минут.

2) Срок хранения подробных показаний датчиков составляет 30 дней, среднечасовых значений - 1 год, среднесуточных - вечность.

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


Мои замечания по сборке и прошивке устройства:

1) Если у вас плата типа Wemos, NodeMCU и иже с ними, т. е. со встроенным конвертером интерфейсов USB<->Serial типа CH340, то никакой переходник USB-UART отдельно вам не нужен, подключается и шьется напрямую через USB порт.

2) Для непосредственно прошивки я использовал ESP8266Flasher, брать тут  (нажать на кнопку "Clone or download", выбрать "Download ZIP"), инструкция как прошить, например, здесь.

3) В файле "NarodMonFinal.lua номер пина соответствует номеру пина у Wemos D1 Mini, т. е. если желтый (Data) провод датчика припаян к пину D1, то соответсвующая строчка скрипта должна выглядеть как: local pin = 1

4) Скрипты Lua заливать через софтину ESPlorer, брать здесь

5) Лично я не понял, зачем автор скриптов подменяет MAC-адрес своего устройства на "MAC адрес от балды". Я использовал реальный MAC своего устройства. Узнать можно в ESPlorer. Его же и подставил в строчку local MACaddr = "#12-34-56-78-90-AB\n" в файле NarodMonFinal.lua.

6) Скрипты выводят результаты выполнения своих основных действий и сообщения об ошибках в консоль. Поэтому, при любых непонятках в работе устройства, подключайте его к компу, запускайте ESPlorer и читайте вывод консоли.


По цене устройства. На момент подготовки поста (25.05.2020 г. от Р. Х.): Wemos D1 Mini - 143 рубля, DS18B20 - 90 рублей. Итого - 233 рубля = примерно $3,24. Так что те, кто хотел закидать меня тапками за кликбейт, могут оставить свои тапки себе.


За сим откланиваюсь, всем бобра, вкусных печенюгов и нескрипучих половиц :)

Показать полностью 7
[моё] Esp8266 Своими руками Nodemcu Lua Автоматизация Длиннопост
16
171
electrobesom
electrobesom
8 лет назад
Arduino & Pi

Радионяня с термометром и гигрометром на Esp8266 и Android⁠⁠

Привет, Пикабу!

У меня пару недель назад родились сразу две удивительные дочки, Василиса и Варвара:) Я от них просто без ума, они потрясающие! :) Но! Даже самому безумному папке нужно иногда отойти от кроваток своих дочурок,  сделать домашние дела, подключиться по vpn на работу или просто пойти и выкинуть мусор, пока любимая жена в душе.

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

Радионяня!

Ок!

(Можно смириться с ебучей ценой за трехсотенный девайс и не читать дальше)

Но это не наши методы, правда?

Пикабушник, ты видел цены на два куса пластика с тремя транзисторами внутри? Я чутка потерялся, буду честен. Всё, что имеет приставку "детское", почему то и цену имеет неоправданно завышенную. Не буду далее томить.

Я сделал радионяню на датчике звука от ардуино, присовокупил датчик температуры/влажности, и всё это мониторю по домашнему WiFi на любом Android-устройстве.

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

Радионяня с термометром и гигрометром на Esp8266 и Android Моё, Arduino, Nodemcu, Ky-038, Android, Dht22, Esp8266, Автоматизация, Длиннопост

Итак, что мы имеем. Два устройства, смартфон и nodemcu с датчиками.

Алгоритм простой, nodemcu подключается к домашнему вайфаю, открывает там сервер, и вещает на нем данные от датчиков. Андроид-смартфон получает данные, выводит их на экран и если данные от датчика звука превышают порог - меняет цвет фона экрана и пищит.

Код для esp простейший:

#include <ESP8266WiFi.h>
#include "DHT.h"
#define DHTPIN 5
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
const char *ssid = "wlan;
const char *pass = "pass";
WiFiServer server(80);
IPAddress ip(192,168,1,128);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
void setup() {
pinMode(A0,INPUT);
Serial.begin(115200);
delay(10);
WiFi.begin(ssid, pass);
WiFi.config(ip, gateway, subnet);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("WiFi connected, using IP address: ");
Serial.println(WiFi.localIP());
server.begin();
dht.begin();
}
void loop() {
WiFiClient client = server.available();
if (!client) {
return;
}
while(!client.available()){
delay(1);
}
delay(3000);
float h = dht.readHumidity();
float t = dht.readTemperature();
int s = analogRead(A0);
String req = client.readStringUntil('\r');
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println("");
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head></head><body>");
client.print(t);
client.print(":");
client.print(h);
client.print(":");
client.print(s);
client.println("</body></html>");
delay(1);
client.stop();
}

Исходники для андроида можно взять на гитхабе

https://github.com/antsharapov/ArduinoBabyMonitor

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

Радионяня с термометром и гигрометром на Esp8266 и Android Моё, Arduino, Nodemcu, Ky-038, Android, Dht22, Esp8266, Автоматизация, Длиннопост

Датчик звука у меня KY-038.

Не знаю, что еще описать подробнее, чем есть. Отвечу в комментариях и приму критику и пожелания в комментариях.

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


Спасибо за внимание, надеюсь быть полезным.

Показать полностью 2
[моё] Моё Arduino Nodemcu Ky-038 Android Dht22 Esp8266 Автоматизация Длиннопост
64
49
mrWeles
mrWeles
8 лет назад

Подробный разбор датчика качества воздуха на базе ESP8266⁠⁠

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

http://pikabu.ru/story/universalnyiy_datchik_s_esp8288_datch...


Итак, для начала Вам понадобится:

1. ESP8266 Esp-07 - 120 руб

2. Плата-адаптер для ESP - 11 руб

3. Линейный стабилизатор напряжения на 3.3В. В моем случае XC6206 - 2.5 руб

4. Датчик СО2 MH-Z19 - 1500 руб

5. Датчик температуры и влажности DHT22 - 130 руб

6. I2C монохромный дисплей SSD1306 - 180 руб

7. Монтажная плата - 10 руб

8. Резистор 10 КОм - 0.5 руб

Итого: 1954 руб


Цены указаны ориентировочные, состоянием на декабрь-январь 2017 г.


Собираем всё в соответствии со схемой.

Подробный разбор датчика качества воздуха на базе ESP8266 Esp8266, Arduino, Mh-z19 arduino, Своими руками, Умный дом, Автоматизация, Smart home, Длиннопост

Между первым и вторым выводами DHT22 необходимо припаять резистор на 10 КОм. Без него скетч будет выдавать ошибку.

Обязательно обратите внимание на то что ESP8266 питается от 3.3В, а в качестве цепи питания схема использует 5В, для того чтобы ESP не сгрела, необходимо впаять на обратной стороне платы адаптера, линейный стабилизатор на 3.3В и выпаять перемычку на передней части. То что нужно сдлать отмечено на картинке ниже.

Некоторые могут заметить что неплохо было бы поставить делители на входах ESP, однако как показала практика, всё работает стабильно и в оде экспериментов ни одна ESP'шка не пострадала)

Подробный разбор датчика качества воздуха на базе ESP8266 Esp8266, Arduino, Mh-z19 arduino, Своими руками, Умный дом, Автоматизация, Smart home, Длиннопост

После подачи питания ESP моргнёт синим огоньком, говоря о том что она включилась и зажжет красный индикатор питания. Если это произошло - перейдем к скетчу, если нет - проверьте правильность сборки и подаваемое питание. Зачастую ESP капризничает при подключении китайских блоков питания.


Далее нам нужно подключить USB to TTL конвертер к TX, RX и GND выводам ESP.

Не забываем что TX RX подключаются зеркально, т.е. TX ESP к RX конвертера и наоборот.

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


Перейдем к скетчу.


Подключение библиотек:


extern "C" { //Это нужно для работы таймера

#include "user_interface.h"

}

#include <DHT.h> //Библиотека для работы с датчиком температуры/влажности

#include <SoftwareSerial.h> //Программный UART для MH-Z19

#include <ESP8266WiFi.h> //Работа с Wi-Fi

#include <WiFiUdp.h> //Работа с UDP пакетами

#include <EEPROM.h> //Эмуляция EEPROM на флешке для хранения статистики

#include <Wire.h> //I2C шина для подключения дисплея

#include "SSD1306.h" //Библиотека для работы с дисплеем

#define DHTPIN 13 //Говорим на какой ноге будет висеть сигнальная нога DHT22


Объявление переменных:


SoftwareSerial mySerial(14, 12); //Говорим библиотеке на каких ногах будет висеть программный UART

IPAddress ipServidor(192, 168, 1, 1); //Адрес шлюза (в моем случае роутера)

IPAddress ipCliente(192, 168, 1, 5); //Адрес нашего устройства

IPAddress Subnet(255, 255, 255, 0); //Подсеть

IPAddress broadcastIp(192, 168, 1, 255); //Адрес для широковещатльных сообщений


Здесь стоит отметить что стандартный broadcast адрес 255.255.255.255 на ESP'шке не работает.


WiFiUDP Udp; //Говорим что будем использовать UDP

SSD1306 display(0x3c, 4, 5); //Объявляем ноги на которых будет висеть дисплей

DHT dht(DHTPIN, DHT22); //Берем из define ногу для DHT22


byte cmd[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79}; // команда запроса данных у MH-Z19


Для запроса данных на скорости 9600 (8 bit, stop — 1, parity — none) нужно отправить следующие девять байт:

• 0xFF — начало любой команды

• 0x01 — первый сенсор (он всего один)

• 0x86 — команда

• 0x00, 0x00, 0x00, 0x00, 0x00 — данные

• 0x79 — контрольная сумма.


В ответ придет что-то такое:

• 0xFF — начало любого ответа

• 0x86 — команда

• 0x01, 0xC1 — старшее и младшее значение (256 * 0x01 + 0xC1 = 449)

• 0x3C, 0x04, 0x3C, 0xC1 — в документации сказано, что должно приходить что-то типа 0x47, 0x00, 0x00, 0x00, но на деле приходит непонятно что.

• 0x7B — контрольная сумма.


Контрольная сумма считается следующим образом: берутся 7 байт ответа (все кроме первого и последнего), складываются, инвертируются, увеличиваются на 1: 0x86 + 0x01… + 0xC1 = 0x85, 0x85 xor 0xFF = 0x7A, 0x7A + 1 = 0x7B.


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

(скопировал с гиктаймса у Hellsy22)


unsigned char response[9]; //Сюда пишем ответ MH-Z19

unsigned int ppm = 0; //Текущее значение уровня СО2

float hum; //Текущее значение уровня влажности


float temp; //Текущее значение уровня температуры

unsigned int coCurrentHour = 0; //Значение СО2 в текущем часе

unsigned int tempCurrentHour = 0; //Значение тмпературы в текущем часе

unsigned int humidityCurrentHour = 0; //Значение влажности в текущем часе

const char *ssid = "имя_вашей_сети_в_кавычках";

const char *password = "пароль_от_вашей_сети_в_кавычках";

unsigned int localPort = 1900; //Порт по которому мы будем рассылать данные

long t = 0; //Счётчик

int displayClk = 0; //Счётчик

Для того чтобы хранить статистику мы должны записывать данные за последние 24 часа по каждому параметру в ОЗУ и один раз в час обновлять значения в енергонезависимой памяти. Так как энергонезависимая память хранит данные побайтово, а у нас есть значения типа float и int которые занимают боьше одного байта, мы разбиваем каждое значение на старший и младший байт. При чтении из памяти производим обратную процедуру.


unsigned int coHour[250] = {0}; //Масив с суточной статистикой СО2

unsigned int tempHour[250] = {0}; //Масив с суточной статистикой температуры

unsigned int humidityHour[250] = {0}; //Масив с суточной статистикой влажностиbyte coHigh[26]; //Массив старших байтов значения СО2

byte coLow[26]; //Массив младших байтов значения СО2

byte tempHigh[26]; //Массив старших байтов значения температуры

byte tempLow[26]; //Массив младших байтов значения температуры

byte humidityHigh[26]; //Массив старших байтов значения влажности

byte humidityLow[26]; //Массив младших байтов значения влажности

Блок Setup это что-то вроде автозагрузки в ПК, весь хранящийся здесь код выполняется один раз при загрузке устройства.


void setup() {

Serial.begin(9600); //Запускаем аппаратный UART

mySerial.begin(9600); //Запускаем программный UART

WiFi.begin(ssid, password); //Задаем параметры работы Wi-Fi

WiFi.mode(WIFI_STA);

WiFi.config(ipCliente, ipServidor, Subnet);

Udp.begin(localPort); //Запускаем UDP

EEPROM.begin(512); //Задаем размерность энергонезависимой памяти

display.init(); //Инициализируем дисплей

display.flipScreenVertically(); //Переворачиваем координатную сетку дисплея

dht.begin(); //Подключаем датчик температуры и влажности

delay(2000); //Ждём

В случае с ESP8266 иногда нужно намеренно делать задержки в выполнении программы чтобы успел отработать Wi-Fi стек и все фоновые процессы

for (unsigned int h = 0; h != 24; h++) { //Читаем данные из EEPROM

coHigh[h] = EEPROM.read(h);

delay(5);

coLow[h] = EEPROM.read(h + 24);

delay(5);

tempLow[h] = EEPROM.read(h + 48);

delay(5);

tempHigh[h] = 0;

humidityLow[h] = EEPROM.read(h + 72);

delay(5);

humidityHigh[h] = 0;


coHour[h] = word(coHigh[h], coLow[h]); //Собираем данные из отдельных байтов

tempHour[h] = word(tempHigh[h], tempLow[h]);

humidityHour[h] = word(humidityHigh[h], humidityLow[h]);


Udp.beginPacket(broadcastIp, localPort); //Отправляем статистику за последние сутки в UART и в сеть всем желающим

Serial.print("C"); Serial.print(h); Serial.print(":"); Serial.print(coHour[h]); Serial.print("|"); Serial.print(tempHour[h]); Serial.print("|"); Serial.print(humidityHour[h]); Serial.println("|");

Udp.write("C"); Udp.print(h); Udp.write(":"); Udp.print(coHour[h]); Udp.write("|"); Udp.print(tempHour[h]); Udp.write("|"); Udp.print(humidityHour[h]); Udp.write("|");

Udp.endPacket();

}

}

WiFiClient client;


Блок Loop представляет собой бесконечный цикл


void loop()

{

display.clear(); //Готовим дисплей к выводу текста и говорим что всё ок, но мы ждем

display.setTextAlignment(TEXT_ALIGN_LEFT);

display.setFont(ArialMT_Plain_16);

display.drawString(0, 40, "LOADING....");

display.display();

delay(5000);

mySerial.write(cmd, 9); //Запрашиваем данные у MH-Z19

memset(response, 0, 9); //Чистим переменную от предыдущих значений

mySerial.readBytes(response, 9); //Записываем свежий ответ от MH-Z19

unsigned int i;

byte crc = 0;//Ниже магия контрольной суммы

for (i = 1; i < 8; i++) crc += response[i];

crc = 255 - crc;

crc++;


String stringBr;

float prevHum = hum;

float prevTemp = temp;

hum = dht.readHumidity(); //Получаем текущую влажность

temp = dht.readTemperature(); //Получаем текущуютемпературу

int intHum = hum; //Переводим значения в int для упрощения обработки

int intTemp = temp;


//Проверяем контрольную сумму и если она не сходится - перезагружаем модуль

if ( !(response[0] == 0xFF && response[1] == 0x86 && response[8] == crc) ) {

Serial.println("CRC error: " + String(crc) + " / " + String(response[8]));

ESP.restart();

}

else {

unsigned int responseHigh = (unsigned int) response[2];

unsigned int responseLow = (unsigned int) response[3];

ppm = (256 * responseHigh) + responseLow;

Serial.print("Time: " + String(t) + " sec\t" + "CO2: " + String(ppm) + " ppm\t"); //Выводим данные на UART для отладки

Udp.beginPacket(broadcastIp, localPort); //Отправляем данные в сеть

Udp.print(t); Udp.write("["); Udp.print(ppm); Udp.write("]");

if (isnan(hum) || isnan(temp)) { //Проверяем получили ли данные температуры и влажности

Serial.println(" Data reading error!"); //Если получена ошибка то отправляем предыдущее значение в сеть


Udp.write("["); Udp.print(prevHum); Udp.write("]"); Udp.write("["); Udp.print(prevTemp); Udp.write("]");

display.setTextAlignment(TEXT_ALIGN_LEFT);

display.setFont(ArialMT_Plain_16);

display.drawString(64, 20, "DHT Data Error!"); //Выводим сообщение об ошибке на дисплей

}

else

{

//Если всё ок - выводим данные на UART и отправляем в сеть

Serial.println(" Temperature: " + String(temp) + " *C " + "Humidity: " + String(hum) + " %\t");

Udp.write("["); Udp.print(hum); Udp.write("]"); Udp.write("["); Udp.print(temp); Udp.write("]");

tempCurrentHour = (tempCurrentHour + intTemp) / 2;

humidityCurrentHour = (humidityCurrentHour + intHum) / 2;

}

Udp.endPacket();

delay(100);

}

//Считаем статистику

t = t + 2;

coCurrentHour = (coCurrentHour + ppm) / 2;

if (t == 720) {

//Если пришло время обновлять статистику, запускаем цикл и сдвигаем все значения на одно

for (unsigned int d = 0; d != 24; d++) {

if (d == 23) {

coHour[d] = coCurrentHour;

tempHour[d] = tempCurrentHour;

humidityHour[d] = humidityCurrentHour;

Serial.print("C"); Serial.print(String(d)); Serial.print(":"); Serial.print(String(coHour[d])); Serial.print("|"); Serial.print(String(tempHour[d])); Serial.print("|"); Serial.print(String(humidityHour[d])); Serial.println("|");

Udp.beginPacket(broadcastIp, localPort);

Udp.write("C"); Udp.print(d); Udp.write(":"); Udp.print(coHour[d]); Udp.write("|"); Udp.print(tempHour[d]); Udp.write("|"); Udp.print(humidityHour[d]); Udp.write("|");

Udp.endPacket();

delay(100);

coCurrentHour = ppm;

tempCurrentHour = intTemp;

humidityCurrentHour = intHum;

t = 0;

}

else {

coHour[d] = coHour[d + 1];

tempHour[d] = tempHour[d + 1];

humidityHour[d] = humidityHour[d + 1];

Serial.print("C"); Serial.print(String(d)); Serial.print(":"); Serial.print(String(coHour[d])); Serial.print("|"); Serial.print(String(tempHour[d])); Serial.print("|"); Serial.print(String(humidityHour[d])); Serial.println("|");

Udp.beginPacket(broadcastIp, localPort);

Udp.write("C"); Udp.print(d); Udp.write(":"); Udp.print(coHour[d]); Udp.write("|"); Udp.print(tempHour[d]); Udp.write("|"); Udp.print(humidityHour[d]); Udp.write("|");

Udp.endPacket();

delay(100);

}

coHigh[d] = highByte(coHour[d]);

coLow[d] = lowByte(coHour[d]);

tempHigh[d] = highByte(tempHour[d]);

tempLow[d] = lowByte(tempHour[d]);

humidityHigh[d] = highByte(humidityHour[d]);

humidityLow[d] = lowByte(humidityHour[d]);

//Записываем обновленные данные в EEPROM

EEPROM.write(d, coHigh[d]);

delay(50);

EEPROM.write(d + 24, coLow[d]);

delay(50);

EEPROM.write(d + 48, tempLow[d]);

delay(50);

EEPROM.write(d + 72, humidityLow[d]);

delay(50);

EEPROM.commit();

}

}

//Проверяем значение счётчика и выводим на дисплей текущие показания

if (displayClk == 1) {

display.clear();

display.setFont(ArialMT_Plain_24);

display.setTextAlignment(TEXT_ALIGN_CENTER);

display.drawString(64, 0, "CO2");

display.drawString(64, 35, String(ppm) + " ppm");

}

if (displayClk == 2) {

display.clear();

display.setFont(ArialMT_Plain_24);

display.setTextAlignment(TEXT_ALIGN_CENTER);

display.drawString(64, 0, "Temp");

display.drawString(64, 35, String(temp) + " °C");

}

if (displayClk == 3) {

display.clear();

display.setFont(ArialMT_Plain_24);

display.setTextAlignment(TEXT_ALIGN_CENTER);

display.drawString(64, 0, "Humidity");

display.drawString(64, 35, String(hum) + " %");

displayClk = 0;

}

display.display();


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

Если у кого-то есть Crestron, в следующем посте могу описать модуль который парсит данные на стороне контроллера.

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

Показать полностью 2
[моё] Esp8266 Arduino Mh-z19 arduino Своими руками Умный дом Автоматизация Smart home Длиннопост
23
163
mrWeles
mrWeles
8 лет назад

Универсальный датчик с ESP8266, датчиками температуры, влажности, СО2 и плюшками⁠⁠

Универсальный датчик с ESP8266, датчиками температуры, влажности, СО2 и плюшками Esp8266, Arduino, Mh-z19 arduino, Автоматизация, Умный дом, Своими руками, Длиннопост

Доброго времени суток мои подписчики и все интересующиеся темой!


Давно хотел написать пост, но всё руки не доходили, так что бонусом предлагаю описание устройства которое под силу собрать любому пикабшнику с паяльником.


Итак, стоит начать с того что мне привалило счастье в виде контроллера автоматизации Crestron CP2e. Для тех кто не знаком с продукцией Crestron, это достаточно древний, но тем не менее пригодный для домашнего использования контроллер, который умеет управлять оборудованием по Ethernet, rs232, IR, аналоговым входам/выходам и при помощи реле.

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

Фото железяки прилагаю.

Универсальный датчик с ESP8266, датчиками температуры, влажности, СО2 и плюшками Esp8266, Arduino, Mh-z19 arduino, Автоматизация, Умный дом, Своими руками, Длиннопост

Пропущу автоматизацию домашнего кинотеатра, если Вам будет интересно то опишу в следующем посте.

После того как я наигрался стандартными фишками, мне захотелось сделать что-то своё, после не долгих раздумий выбор пал в сторону датчика качества воздуха, в моём случае это датчики температуры/влажности и CO2, но так как я живу на съемной квартире и ковырять стенку для прокладки кабелей и красивого монтажа мне никто не даст, датчик должен быть беспроводным.


Исходя из требований и опыта людей на хабрахабре, было решено использовать в качестве мозгов Wi-Fi модуль ESP8266, скетчи для которого можно писать на множестве языков в том числе и на С в Arduino IDE.


Датчик СО2 выбирался спонтанно, но как потом оказалось правильно. MH-Z19 умеет определять концентрацию СО2 в диапазоне от 0 до 5000 ррm (частей на миллион) на практике 1500 ppm бывает только если в комнате спит два человека и закрыты двери, поэтому если вы выберете более дешевый датчик ничего страшного не случится.

Для сомневающихся табличка из тырнета.

Универсальный датчик с ESP8266, датчиками температуры, влажности, СО2 и плюшками Esp8266, Arduino, Mh-z19 arduino, Автоматизация, Умный дом, Своими руками, Длиннопост

Датчик температуры и влажности (2 в 1) выбирался по отзывам и ширине диапазона. Я выбрал AM2302 он же DHT22 он рассчитан на измерение уровня влажности в диапазоне от 0% до 100%. При этом точность измерений находится в диапазоне 2%-5%.

Измеряет температуру в диапазоне от -40 до 125 градусов с точностью плюс-минус 0.5 градусов.

Если температура у меня дома выйдет за границы диапазона, до показания датчика это последнее о чём я буду думать)


Дисплей куплен на одном популярном китайском сайте и изначально предназнаяался для другого проекта.


Теперь о реализации.


В интернете есть множество примеров, но мы не ищем лёгких путей, поэтому было решено реализовать рассылку по UDP в пределах домашней сети показаний раз в 5 секунд, сохранение суточной статистики при отключении питания и вывод актуальных данных на дисплей.


Если кого-то заинтересует подробная реализация (скетч и схема) пишите в ЛС, с радостью поделюсь, а для всех остальных - результат.


Внешний вид и индикация показаний (фото засвечены лампой, дисплей на самом деле яркий)

Универсальный датчик с ESP8266, датчиками температуры, влажности, СО2 и плюшками Esp8266, Arduino, Mh-z19 arduino, Автоматизация, Умный дом, Своими руками, Длиннопост
Универсальный датчик с ESP8266, датчиками температуры, влажности, СО2 и плюшками Esp8266, Arduino, Mh-z19 arduino, Автоматизация, Умный дом, Своими руками, Длиннопост
Универсальный датчик с ESP8266, датчиками температуры, влажности, СО2 и плюшками Esp8266, Arduino, Mh-z19 arduino, Автоматизация, Умный дом, Своими руками, Длиннопост
Универсальный датчик с ESP8266, датчиками температуры, влажности, СО2 и плюшками Esp8266, Arduino, Mh-z19 arduino, Автоматизация, Умный дом, Своими руками, Длиннопост

Интерфейс в Crestron с суточной статистикой

Универсальный датчик с ESP8266, датчиками температуры, влажности, СО2 и плюшками Esp8266, Arduino, Mh-z19 arduino, Автоматизация, Умный дом, Своими руками, Длиннопост

Данные которые шлются в сеть по UDP

Универсальный датчик с ESP8266, датчиками температуры, влажности, СО2 и плюшками Esp8266, Arduino, Mh-z19 arduino, Автоматизация, Умный дом, Своими руками, Длиннопост

Посуточная статистика (рассылается каждый час и при обрыве питания)

Универсальный датчик с ESP8266, датчиками температуры, влажности, СО2 и плюшками Esp8266, Arduino, Mh-z19 arduino, Автоматизация, Умный дом, Своими руками, Длиннопост

Следующим этапом будет разработка корпуса для печати на 3d принтере и веб интерфейс чтобы при смене названия сети не нужно было заново прошивать модуль.


Спасибо тем кто дочитал, ещё раз повторюсь что готов поделиться исходниками со всеми желающими.

В комментариях жду критику, пожелания предложения и т.п.

Показать полностью 9
[моё] Esp8266 Arduino Mh-z19 arduino Автоматизация Умный дом Своими руками Длиннопост
52
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии