Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > ESP8266

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 22.01.2018, 23:40   #1
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Датчик CO2 MH-Z19 MH-Z14A

В наше время людям живущим в мегаполисах, такой датчик просто необходим. Так как концентрация CO2, очень сильно влияет на самочувствие и е здоровье человека. Считаю что "Умный дом" без таких датчиков неполноценный. Датчик CO2 MH-Z14A , как датчик температуры и влажности должен быть в каждом доме.
Незначительное увеличение СО2 во вдыхаемом воздухе у здоровых людей приводит к учащению дыхания и к снижению давления в лёгких. Этот факт свидетельствует о том, что СО2 включает разрушительные процессы в нервных тканях, в работе иммунной системы и во всём организме в целом.

380-400 Атмосферный воздух — Идеальный для здоровья и хорошего самочувствия.
400-600 — Нормальное количество воздуха. Рекомендовано для детских комнат, спален, офисных помещений, школ и детских садов.
600-1000 — Появляются жалобы на качество воздуха. У людей, страдающих астмой, могут учащаться приступы.
Выше 1000 — Общий дискомфорт, слабость, головная боль, концентрация внимания падает на треть, растёт число ошибок в работе. Может привести к негативным изменениям в крови, также могут появиться проблемы с дыхательной и кровеносной системой.
Выше 2000 — Количество ошибок в работе сильно возрастает, 70% сотрудников не могут сосредоточиться на работе. Основные измерения уровня СО2 происходят, конечно же, в центральной нервной системе, и носят они при гиперкапнии фазный характер: сначала повышение, а затем снижение возбудимости нервных образований.

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

И так хватит демагогию разводить, приступим к делу:
Что хочу в итоге сделать?
Засунуть в коробочку из под ночника
Название: light.png
Просмотров: 2767

Размер: 124.2 Кб

1- Блок питания с 220В на 5В
2- Wi-Fi Wemos D1 mini
3- Датчик CO2 MH-Z14A или MH-Z19
4- RGB светодиод.
5- Коробочка из под ночника с вилкой на 220В

На Wemos D1 или ESP8266 будет простой веб сервер. На странице которого можно будет посмотреть более точные CO2 показания датчика
Визуальное отражение показаний будет реализовано на RGB светодиоде
синий - 400ppm
бирюзовый - 500ppm
зеленый - 600ppm
желтый - 700ppm
фиолетовый - 800ppm
красный - 900ppm
плавно и медленно моргающий красный - 1000ppm
быстро моргающий красный - больше 1000ppm

Почему светодиод? Потому что с дисплеем много гемороя с монтажом и корпусом. Так же дисплей в розетке будет не информативен, из-за малого угла обзора и мелкого шрифта, к нему придется близко подходить и т.д.
А со светодиодом все просто и понятно, видно из далека, присматриваться не нужно
Еще я думаю что потребуется датчик освещенности. Что бы ночью подсветка не раздражала

Сегодня провел тестирование датчика CO2
Датчик MH-Z14A подключил к Wi-Fi модулю Wemos на чипе ESP8266 четырьмя проводами
ESP<--->MH-Z14
+5В <--> V+
GND <--> V-
D1 <----> T
D2 <----> R

Схема подключения MH-Z19 к Wemos ESP8266

Нажмите на изображение для увеличения
Название: mh-z19_esp8266.png
Просмотров: 242
Размер:	320.5 Кб
ID:	4781

Проверочный скетч, будет работать на любой Arduino и на ESP8266
PHP код:
//#include <ESP8266WiFi.h>
#include <SoftwareSerial.h>

#define CO2_TX D1 // пин ESP8266
#define CO2_RX D2 // пин ESP8266
SoftwareSerial SerialCO2(CO2_TXCO2_RX);
byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
unsigned char response[9];

void setup() 
{
SerialCO2.begin (9600);
Serial.begin (115200);
}

void loop()
{

  
getCO2(); // получаем и выводим показания;
  
delay(10000);
}


void getCO2() //чтение показаний датчика MH-Z14A
{
  
SerialCO2.write(cmd9); //отправляем команду датчику
  
memset(response09);
  
SerialCO2.readBytes(response9); //получаем ответ
  
  
uint8_t crc 0;
  for (
int i 18i++) crc+=response[i]; //считаем контрольную сумму
  
crc = ~crc;
  
crc++;

  if ( !(
response[0] == 0xFF && response[1] == 0x86 && response[8] == crc) ) // сравниваем ответ с  контрольной суммой
  
{
    
Serial.println("CRC error: " String(crc) + " / "String(response[8])); //выводим ошибку
  

  else 
  {
    
uint8_t responseHigh = (uint8_tresponse[2];
    
uint8_t responseLow = (uint8_tresponse[3];
    
Serial.println("CO2 "+String((256*responseHigh) + responseLow)+"ppm"); //выводим показания датчика
  
}


Видео тестов датчика MH-Z14A


Датчик на фабрике откалиброван. Проверить его можно, достаточно вынести измеритель на улицу на 10 минут и и провести замеры. Делать это лучше рано утром с 5:00 до 6:00, пока автомобили не успели выехать на дороги. А если есть возможность, то провести замеры за городом в лесу или в парке.
Admin вне форума   Ответить с цитированием
Старый 23.01.2018, 00:09   #2
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

И так. Первый день тестов
Проверка датчика CO2 перед сном - 950ppm
На ночь приоткрыл маленькую щель на окне.
С утра показания датчик MH-Z14A -520ppm
Я так понимаю что вечером еще есть влияние загазованности атмосферы автомобилями,
а к утру газы рассеиваются ветром.
Admin вне форума   Ответить с цитированием
Старый 12.02.2018, 16:34   #3
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Подробности по обмену с датчиком MH-Z19
Запрос данных у датчика:
[0]-0xFF — начало
[1]-0×01 — первый сенсор
[2]-0×86 — команда
[3]..[7] 0×00, 0×00, 0×00, 0×00, 0×00 — место для данных
[8]- 0×79 — контрольная сумма.

В ответ придет примерно такое:
[0]- 0xFF — начало
[1]- 0×86 — команда
[2]..[3]- 0×01, 0xC1 — старший и младший байт CO2
[4]- 0×3C — температура
[5]..[7] 0×04, 0×3C, 0xC1 — неизвестно
[8]- 0×7B — контрольная сумма

Расчет контрольной суммы:
Берутся 9 байт ответа, кроме первого и последнего. Складываются, инвертируются, результат увеличивается на единицу: 0×86 + 0×01… + 0xC1 = 0×85, 0×85 xor 0xFF = 0×7A, 0×7A + 1 = 0×7B.
Подсчет crc в коде:
PHP код:
    uint8_t crc 0;                  //обнулить переменную
    
for (int i 18i++) crc += response[i];  //сначала складываем все 7 байт
    
crc = ~crc//инвертируем результат
    
crc++;      // прибавляем к результату 1 единицу 
Admin вне форума   Ответить с цитированием
Старый 12.02.2018, 18:23   #4
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

сделал шкалу для цветового монитора:
светло зеленый – 400 ppm и менее.- Высокое качество воздуха
зеленый – 400-600 ppm – хорошее качество воздуха
желтый – 600-800 ppm – среднее качество воздуха
оранжевый – 800-1000 ppm – допустимое качество воздуха
красный – 1000-1500 ppm- плохое качество воздуха
красный моргающий - 1500 и выше - опасное для здоровья качество воздуха

Не знаю почему, но мне синий как то не нравится в шкале
Может я и ошибаюсь?
Admin вне форума   Ответить с цитированием
Старый 13.02.2018, 17:21   #5
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Что то ее пойму , баг это или Китайская фитча
Вод скриншот официального Datasheet
Нажмите на изображение для увеличения
Название: Без имени.png
Просмотров: 223
Размер:	124.2 Кб
ID:	4854

Проблема в том что китайцы предлагают складывать 7 переменных типа: byte, а результат размещать в переменной типа: Char
Переполнение же будет?
Я бы не заострил внимания на этой проблеме, но если подуть на датчик и его показания взлетают до небес, начинает вылетать ошибка CRC Error . И контрольные суммы не равны.

Кто что скажет по этому поводу?
Admin вне форума   Ответить с цитированием
Старый 21.01.2019, 21:20   #6
darkdrive
Junior Member
 
Регистрация: 21.01.2019
Сообщений: 2
Вес репутации: 0
darkdrive is an unknown quantity at this point
По умолчанию

Подскажите пожалуйста. Сделал такую же историю. Wemos D1 mini + MH-Z14A.
Отправляю данные через POST запрос на внешний сервер.
При подключении к ПК все отлично. Как только подключаю от внешней USB зарядки, или от ПК без загруженной ОС - Wemos работает, но данные с датчика не получает. В чем может быть проблема?
Вот код скетча

PHP код:
#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
#include <SoftwareSerial.h>
#define CO2_TX D1
#define CO2_RX D2
SoftwareSerial SerialCO2(CO2_TXCO2_RX);
byte cmd[9] = {0xFF0x010x860x000x000x000x000x000x79};
unsigned char response[9];

void setup() {
  
SerialCO2.begin (9600);
  
Serial.begin(115200);
  
WiFi.begin("WIFINAME""WIFIPASSWORD");

  while (
WiFi.status() != WL_CONNECTED) {

    
delay(500);
    
Serial.println("Waiting for connection");

  }

}

void loop() {
  
getCO2();
  
delay(5000);
}

void getCO2()
{
  
SerialCO2.write(cmd9);
  
memset(response09);
  
SerialCO2.readBytes(response9);
  
uint8_t crc 0;
  for (
int i 18i++) crc += response[i];
  
crc = ~crc;
  
crc++;

    
uint8_t responseHigh = (uint8_tresponse[2];
    
uint8_t responseLow = (uint8_tresponse[3];

    
String bc "CO2 " String((256 responseHigh) + responseLow) + "ppm";
    
String co2int String((256 responseHigh) + responseLow);
    
Serial.println(bc);
    if (
WiFi.status() == WL_CONNECTED) {
      
HTTPClient http;
      
http.begin("http://SITEPAGE");
      
http.addHeader("Content-Type""application/x-www-form-urlencoded");
      
http.POST("pst=" co2int);
      
http.writeToStream(&Serial);
      
http.end();
    } else {
     
Serial.println("Error in WiFi connection");
    }
  

UPD1: Забавно то, что если программно в ОС отключить COM порт, и после этого подключить Wemos к ПК, то тоже не работает. Далее - Уже на включенном питании - включаем COM порт - сразу работает. При повторном отключении COM порта - продолжает работать до выключения питания у Wemos....

Последний раз редактировалось darkdrive; 21.01.2019 в 21:48.
darkdrive вне форума   Ответить с цитированием
Старый 22.01.2019, 01:07   #7
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Попробуйте уберите из кода, все что связано с Serial.begin(115200);
Admin вне форума   Ответить с цитированием
Старый 22.01.2019, 09:06   #8
darkdrive
Junior Member
 
Регистрация: 21.01.2019
Сообщений: 2
Вес репутации: 0
darkdrive is an unknown quantity at this point
По умолчанию

Убирал. Не помогало. В итоге решил проблему очень странным способом.
Почему-то, при подключении питания от USB зарядки - датчик выдает чушь до той поры пока не перезагрузишь Wemos(кнопкой reset или программно. При этом пробовал в сделать Delay перед SerialCO2.begin - тоже не помогало).
Т.е. порядок такой - Включаем USB шнурок к Wemos(питание на датчик идет от него). Ждем 5-10 секунд - Жмем RESET на Wemos - Все работает.

Решил на программном уровне следующим образом:
Поставил счетчик CRC ошибок подряд.
При включении - интервал опроса 5 секунд. Если получает 2 ошибки подряд - Делается RESET через:
PHP код:
void(* resetFunc) (void) = 0
Далее, при первой нормальной полученной цифре увеличиваю интервал опроса, чтобы каждые 5 секунд не обновлять.

Вот такой код получится в итоге:
Получает данные с датчика и отправляет значение через POST на внешний сервер по HTTP.
PHP код:

#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>
#include <SoftwareSerial.h>
#define CO2_TX D1
#define CO2_RX D2
SoftwareSerial SerialCO2(CO2_TXCO2_RX);
byte cmd[9] = {0xFF0x010x860x000x000x000x000x000x79};
unsigned char response[9];
int crcerrors 0;
int numb 0;
int xdelay 5000;
int ydelay 30000;
String urltopost "URLTOPOSTHERE";
void(* resetFunc) (void) = 0;
void setup() {
  
SerialCO2.begin (9600);
  
WiFi.begin("WIFINAMEHERE""WIFIPASSHERE");
  while (
WiFi.status() != WL_CONNECTED) {
    
delay(500);
  }
}
void loop() {
  
getCO2();
  
delay(xdelay);
}
void getCO2()
{
  
SerialCO2.write(cmd9);
  
memset(response09);
  
SerialCO2.readBytes(response9);
  
uint8_t crc 0;
  for (
int i 18i++) crc += response[i];
  
crc = ~crc;
  
crc++;
  if ( !(
response[0] == 0xFF && response[1] == 0x86 && response[8] == crc) )
  {
    
crcerrors++;
    if (
crcerrors 2) {
      
crcerrors 0;
      
resetFunc();
    }
  }
  else
  {
    
uint8_t responseHigh = (uint8_tresponse[2];
    
uint8_t responseLow = (uint8_tresponse[3];
    
String bc "CO2 " String((256 responseHigh) + responseLow) + "ppm";
    
String co2int String((256 responseHigh) + responseLow);
    if (
numb 2) {
      if (
WiFi.status() == WL_CONNECTED) {
        
xdelay ydelay;
        
HTTPClient http;
        
http.begin(urltopost);
        
http.addHeader("Content-Type""application/x-www-form-urlencoded");
        
http.POST("pst=" co2int);
        
http.end();
      }
      
numb 0;
    }
    
numb++;
  }


Последний раз редактировалось darkdrive; 22.01.2019 в 09:15.
darkdrive вне форума   Ответить с цитированием
Старый 23.01.2019, 00:57   #9
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9820
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Попробуйте лучше БП помощнее и отфильтруйте кондерами пульсации
Admin вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 3 (пользователей: 0 , гостей: 3)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 14:12. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика