ADUINO UNO + DHT11 + IR + LCD 1602 I2C увлажнитель воздуха

alexeko
Offline
Зарегистрирован: 03.01.2014

Всем доброго дня.

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

В виде датчика, решил взять стандартный DHT11 (оставим тот момент, что есть большая погрешность).

Дисплей классический 16Х2 по шине I2C подключен.

Ну и UNO, то что будет думать за все это :) .

Вывод данных на дисплей с DHT11, не составил трудности. Все работает, только в место, не любимого мной delay(), поставил millis().

Проблема вот в чем: Управление всей этой "игрушкой" решил сделать от пульта телевизора (ну не люблю я кнопки, а с IR уже много проектов дома есть). Так вот, как только  я (в любом месте программы, а не только в setup() )запускаю работу библиотеки <IRremote.h>  условием  irrecv.enableIRIn(), данные с DHT11, проподают. Причем использовал разные способы снимать данные с DHT11, результат тот же.

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

Помогите кто чем может!?

#include <dht.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <IRremote.h>
//==========================================
int RECV_PIN = 6; //vkhod IK priyemnika
IRrecv irrecv(RECV_PIN);
decode_results results;
int flag,button5,selecter=0;
// Создаем сенсор
DHT sensor = DHT();
// Подключаем LCD
LiquidCrystal_I2C lcd(0x27,16,2);
long previousMillis = 0;        // храним время последнего переключения светодиода
long interval = 2000;           // интервал между включение/выключением светодиода (1 секунда)


//=========================================================

void htr()
{
    // Проводим измерения
   lcd.clear();
   
    lcd.setCursor(0,0);
    sensor.update();
 
    switch (sensor.getLastError())
    {
        case DHT_ERROR_OK:
            char msg[128];
            // Если ошибок нет, то собираем данные
            sprintf(msg, "Current humidity = %d%% temperature = %dC", 
                    sensor.getHumidityInt(), sensor.getTemperatureInt());
            lcd.print("HUM");
            lcd.setCursor(5, 0);
            lcd.print(sensor.getHumidityInt());
            lcd.print("%");
            lcd.setCursor(0, 1);
            lcd.print("TEMP");
            lcd.setCursor(5, 1);
            lcd.print(sensor.getTemperatureInt());
            lcd.print("C");
            break;
        case DHT_ERROR_START_FAILED_1:
            lcd.print("Error:");
            lcd.setCursor(0, 1);
            lcd.print("Stage 1 failed");
            break;
        case DHT_ERROR_START_FAILED_2:
            lcd.print("Error:");
            lcd.setCursor(0, 1);
            lcd.print("Stage 2 failed");
            break;
        case DHT_ERROR_READ_TIMEOUT:
            lcd.print("Error:");
            lcd.setCursor(0, 1);
            lcd.print("Read timeout");
            break;
        case DHT_ERROR_CHECKSUM_FAILURE:
            lcd.print("Error:");
            lcd.setCursor(0, 1);
            lcd.print("Checksum error");
            break;
    }
 
    //delay(2000);
}

void ir_data()
{
  if (irrecv.decode(&results)) 
   {
  delay(300); // zaderzhka pered vypolneniyem opredeleniya knopok , chtoby izbezhat? bystroye dvoynoye nazhatiye
  if (results.value == 0x8AF13528){button5=5;} // obrabotka nazhitya klavishi / ввод
  if (results.value == 0xC26BF044){button5=1;} // вверх
  if (results.value == 0xC4FFB646){button5=2;} // вниз
  if (results.value == 0x758C9D82){button5=3;} // лево
  if (results.value == 0x53801EE8){button5=4;} // право
 //if (a_ir==1){digitalWrite(13, HIGH);} else {digitalWrite(13, LOW); a_ir=0;} // deystviye posle nazhatiya knopki , yesli peremennaya stala ravna 1 to
  { //
   delay(50); //pauza mezhdu povtorami //
   } //
   irrecv.resume();
  }
}
//=========================================================
void setup()
{
   Serial.begin(9600);
    irrecv.enableIRIn(); // vklyuchit? priyemnik
    
   pinMode(8, OUTPUT);
  digitalWrite(8, HIGH); 
    lcd.init();                      
    lcd.backlight();
    sensor.attach(A0);// Подключаем сенсор к 0 аналоговому порту
    delay(1000);// Ждем готовность сенсора
}
 
void loop()
{
  unsigned long currentMillis = millis();
  //проверяем не прошел ли нужный интервал, если прошел то
  if(currentMillis - previousMillis > interval) {
    // сохраняем время последнего переключения
    previousMillis = currentMillis;
   htr();
   }
   ir_data();
}

 

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012
Хм, чет ступил.

Хотя... посмотрите как работать с millis() в цикле.

MaksMS
Offline
Зарегистрирован: 11.03.2013

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

alexeko
Offline
Зарегистрирован: 03.01.2014

Garry пишет:

Хм, чет ступил.

Хотя... посмотрите как работать с millis() в цикле.

Это не в этом дело.

Пробую прерывания поюзать :), пока все плохо.

alexeko
Offline
Зарегистрирован: 03.01.2014

Пробовал найти, в библиотеке, обратое условие irrecv.enableIRIn(), что бы остановить приемник, но ... :(.

void IRrecv::enableIRIn() {
  cli();
  // setup pulse clock timer interrupt
  //Prescale /8 (16M/8 = 0.5 microseconds per tick)
  // Therefore, the timer interval can range from 0.5 to 128 microseconds
  // depending on the reset value (255 to 0)
  TIMER_CONFIG_NORMAL();

  //Timer2 Overflow Interrupt Enable
  TIMER_ENABLE_INTR;

  TIMER_RESET;

  sei();  // enable interrupts

  // initialize state machine variables
  irparams.rcvstate = STATE_IDLE;
  irparams.rawlen = 0;

  // set pin modes
  pinMode(irparams.recvpin, INPUT);
}

Пробую поправить библиотеку, путем остановки таймера -  TIMER_DISABLE_INTR.

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

А это нормально, что вы постоянно проверяете в цикле ir_data(); без задержки ?

alexeko
Offline
Зарегистрирован: 03.01.2014

Увеличение времени между опросами, не дает результата.

alexeko
Offline
Зарегистрирован: 03.01.2014

Garry пишет:

А это нормально, что вы постоянно проверяете в цикле ir_data(); без задержки ?

Дело в том, что да же не прописывая код по ИК датчику, а только подтянув библиотеку и в setup()  прописываем irrecv.enableIRIn(); все рушится.

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

MaksMS пишет:

Скорее всего необходимо запрещать прерывания на время чтения dht 

А это пробовали?

Похоже это должно решить проблему, т.к. работа с IR построена на прерываниях, а работа с DHT11 нет (с задержками), то постоянные прерывания не дают правильно работать с DHT11.

И еще нашел такую траблу (не знаю с какой именно библиотекой IR), может пригодиться кому на заметку.

MaksMS
Offline
Зарегистрирован: 11.03.2013

Если библиотека(которая кстати тут не указана какая используется) использует обычные delay , то прерывания искажают(увеличивают) паузы и датчик не читается. Например датчики ds18b20 ещё более чувствительны к паузам из-за прерываний.У меня (правда на другом м/к) например датчик dht не глючил,а ds18b20 сразу искажал данные..

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

alexeko, я переписывал библиотеку DHT на прерываниях. Попробуй - может поможет ;)

alexeko
Offline
Зарегистрирован: 03.01.2014

CityCat пишет:

alexeko, я переписывал библиотеку DHT на прерываниях. Попробуй - может поможет ;)

Отличная библиотека, работает, вот только, что то цифры какие то  большие Т= 748.20

Щас разберусь.

Garry
Garry аватар
Offline
Зарегистрирован: 07.04.2012

CityCat пишет:

alexeko, я переписывал библиотеку DHT на прерываниях. Попробуй - может поможет ;)

Не усмотрел, а где там у вас attach прерывания?

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

Garry, может не туда смотрел? Прямой линк

alexeko
Offline
Зарегистрирован: 03.01.2014

Сори, забыл открыть "11" датчик. Сейчас попробую ИК подцепить.

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

alexeko пишет:

CityCat пишет:

alexeko, я переписывал библиотеку DHT на прерываниях. Попробуй - может поможет ;)

Отличная библиотека, работает, вот только, что то цифры какие то  большие Т= 748.20

Щас разберусь.

Не должно быть такого. Как подключаете и как используете?

alexeko
Offline
Зарегистрирован: 03.01.2014

Уважаемые ГУРУ, надеюсь тема ЗАКРЫТА, Всем СПАСИБО!!!!

Все работает отлично. Думаю код выкладывать нет смысла. Все что написано: лиснинг кода в начале поста, а библиотека с ПРЕРЫВАНИЯМИ  от CityCat есть то же. НУ,а сложить все не трудно.

Всем спасибо,

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

alexeko, так а почему значения неправильные были?

alexeko
Offline
Зарегистрирован: 03.01.2014

CityCat пишет:

alexeko, так а почему значения неправильные были?

Идиот я , надо было стоку раскоментировать #define DHTTYPE DHT11   // DHT 11 

alexeko
Offline
Зарегистрирован: 03.01.2014

Результат:

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

alexeko, а смысл выводить 2 нуля после запятой? Они все равно нулями будут ))) Как по мне эстетичней было бы без нулей вообще.

MaksMS
Offline
Зарегистрирован: 11.03.2013

 Ага ,у дхт11 только целые числа ,а у дхт22 один знак после запятой возможен

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

MaksMS пишет:

 Ага ,у дхт11 только целые числа ,а у дхт22 один знак после запятой возможен

Мало того, у DHT11 точность +- 2град. (даже не один, а два).

Проверено личным опытом - DHT11 сильно врет (проверял датчиках на 10). У DHT22 ситуация немного лучше, но тоже не идеальна, но для дома пойдет :)

MaksMS
Offline
Зарегистрирован: 11.03.2013

Я давно считаю DHT11 недодатчиками и выше это писал ) Опыт по ним имеется.По ним можно следить изменилась ли влажность или температура,но не более..

alexeko
Offline
Зарегистрирован: 03.01.2014

С вами  я полностью согласен. По всем вопросам.

Почему две нуля: - переменная стояла float, теперь поменял на byte и все поменялось.

Почему работаю с DHT11: - а что еще, из дешевого, меряет влажность?

alexeko
Offline
Зарегистрирован: 03.01.2014

CityCat пишет:

Мало того, у DHT11 точность +- 2град. (даже не один, а два).

Проверено личным опытом - DHT11 сильно врет (проверял датчиках на 10). У DHT22 ситуация немного лучше, но тоже не идеальна, но для дома пойдет :)

Вот заказал себе это чудо, посмотим на результат.

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

alexeko пишет:

С вами  я полностью согласен. По всем вопросам.

Почему две нуля: - переменная стояла float, теперь поменял на byte и все поменялось.

Почему работаю с DHT11: - а что еще, из дешевого, меряет влажность?

Кстати, у меня в библиотеке (именно в библиотеке) не используется float и возвращается показание умноженное на 10 (с долями градусов и влажности) - как раз для экономии памяти. А после - в самом скетче уже можно и делить на 10 (а можно как я и передавать, допустим серваку - в php-скрипт - там памяти да и быстродействие побольше - пусть сам уже делит).

А по датчикам - я работаю на фирме, занимающейся производством высокоточных производственных датчиков давления и температуры - есть где поверить. Поверял 11-е и 22-е. 11-е ну просто никуда не гордятся, а вот 22-е плавают от нормальных показаний +- 0,3 град. Я считаю, для домашнего использования вариант из "дешево и сердито".

MaksMS
Offline
Зарегистрирован: 11.03.2013

CityCat пишет:

а вот 22-е плавают от нормальных показаний +- 0,3 град. Я считаю, для домашнего использования вариант из "дешево и сердито".

Больше интересует насколько врет влажность .Температура там да,достаточно точна,если сравнивать с другими датчиками..

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

MaksMS, влажность, увы - нечем поверить :(

Но могу сказать то, что датчики достаточно инертны по влажности. У меня висит один такой на улице - как только намек на влажность (осадки, туман и т.д.) - сразу влажность 99,9% и на полдня.

То есть влажность ИМХО - "в попугаях".

alexeko
Offline
Зарегистрирован: 03.01.2014

С учетом того, что я работаю в АСУ ТП, программистом, и КИП мне хорошо знаком, DHT11 - меня устраивает. Гситерезис поставил на 10%, 40-50. Ну и пусть врет на +-2%, это для комнаты не критично. Темболее, что образцовый прибор показал 33%-34% влажности в комнате, этого маловато. + сошлемся на инертность измерений (Время), и получим, что то около 52%-53% на остановку увлажнения.

alexeko
Offline
Зарегистрирован: 03.01.2014

CityCat пишет:

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

Тогда проф. вопрос. а 4-20мА, пробовали подключать? 

Правда там 24В, но это не суть, а ток можно и в напругу переделать.

CityCat
CityCat аватар
Offline
Зарегистрирован: 13.06.2013

alexeko пишет:

CityCat пишет:

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

Тогда проф. вопрос. а 4-20мА, пробовали подключать? 

Правда там 24В, но это не суть, а ток можно и в напругу переделать.

Нет не пробовал пока - нет времени. Добью одну разработку к лету - обязательно попробую с токовой петлей.

Ну а про "для дома некритично" - так я об этом и писал выше.