ADUINO UNO + DHT11 + IR + LCD 1602 I2C увлажнитель воздуха
- Войдите на сайт для отправки комментариев
Всем доброго дня.
Вот решил собрать увлажнитель воздуха для комнаты.
В виде датчика, решил взять стандартный 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();
}
Хотя... посмотрите как работать с millis() в цикле.
Скорее всего необходимо запрещать прерывания на время чтения dht ,желательно интервал увеличить -смысла нет раз в 2 секунды читать таким недодатчиком данные..
Хотя... посмотрите как работать с millis() в цикле.
Пробую прерывания поюзать :), пока все плохо.
Пробовал найти, в библиотеке, обратое условие 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.
А это нормально, что вы постоянно проверяете в цикле ir_data(); без задержки ?
Увеличение времени между опросами, не дает результата.
А это нормально, что вы постоянно проверяете в цикле ir_data(); без задержки ?
Дело в том, что да же не прописывая код по ИК датчику, а только подтянув библиотеку и в setup() прописываем irrecv.enableIRIn(); все рушится.
Скорее всего необходимо запрещать прерывания на время чтения dht
А это пробовали?
Похоже это должно решить проблему, т.к. работа с IR построена на прерываниях, а работа с DHT11 нет (с задержками), то постоянные прерывания не дают правильно работать с DHT11.
И еще нашел такую траблу (не знаю с какой именно библиотекой IR), может пригодиться кому на заметку.
Если библиотека(которая кстати тут не указана какая используется) использует обычные delay , то прерывания искажают(увеличивают) паузы и датчик не читается. Например датчики ds18b20 ещё более чувствительны к паузам из-за прерываний.У меня (правда на другом м/к) например датчик dht не глючил,а ds18b20 сразу искажал данные..
alexeko, я переписывал библиотеку DHT на прерываниях. Попробуй - может поможет ;)
alexeko, я переписывал библиотеку DHT на прерываниях. Попробуй - может поможет ;)
Щас разберусь.
alexeko, я переписывал библиотеку DHT на прерываниях. Попробуй - может поможет ;)
Не усмотрел, а где там у вас attach прерывания?
Garry, может не туда смотрел? Прямой линк
Сори, забыл открыть "11" датчик. Сейчас попробую ИК подцепить.
alexeko, я переписывал библиотеку DHT на прерываниях. Попробуй - может поможет ;)
Щас разберусь.
Не должно быть такого. Как подключаете и как используете?
Уважаемые ГУРУ, надеюсь тема ЗАКРЫТА, Всем СПАСИБО!!!!
Все работает отлично. Думаю код выкладывать нет смысла. Все что написано: лиснинг кода в начале поста, а библиотека с ПРЕРЫВАНИЯМИ от CityCat есть то же. НУ,а сложить все не трудно.
Всем спасибо,
alexeko, так а почему значения неправильные были?
alexeko, так а почему значения неправильные были?
Идиот я , надо было стоку раскоментировать #define DHTTYPE DHT11 // DHT 11
Результат:
alexeko, а смысл выводить 2 нуля после запятой? Они все равно нулями будут ))) Как по мне эстетичней было бы без нулей вообще.
Ага ,у дхт11 только целые числа ,а у дхт22 один знак после запятой возможен
Ага ,у дхт11 только целые числа ,а у дхт22 один знак после запятой возможен
Мало того, у DHT11 точность +- 2град. (даже не один, а два).
Проверено личным опытом - DHT11 сильно врет (проверял датчиках на 10). У DHT22 ситуация немного лучше, но тоже не идеальна, но для дома пойдет :)
Я давно считаю DHT11 недодатчиками и выше это писал ) Опыт по ним имеется.По ним можно следить изменилась ли влажность или температура,но не более..
С вами я полностью согласен. По всем вопросам.
Почему две нуля: - переменная стояла float, теперь поменял на byte и все поменялось.
Почему работаю с DHT11: - а что еще, из дешевого, меряет влажность?
Мало того, у DHT11 точность +- 2град. (даже не один, а два).
Проверено личным опытом - DHT11 сильно врет (проверял датчиках на 10). У DHT22 ситуация немного лучше, но тоже не идеальна, но для дома пойдет :)
Вот заказал себе это чудо, посмотим на результат.
С вами я полностью согласен. По всем вопросам.
Почему две нуля: - переменная стояла float, теперь поменял на byte и все поменялось.
Почему работаю с DHT11: - а что еще, из дешевого, меряет влажность?
Кстати, у меня в библиотеке (именно в библиотеке) не используется float и возвращается показание умноженное на 10 (с долями градусов и влажности) - как раз для экономии памяти. А после - в самом скетче уже можно и делить на 10 (а можно как я и передавать, допустим серваку - в php-скрипт - там памяти да и быстродействие побольше - пусть сам уже делит).
А по датчикам - я работаю на фирме, занимающейся производством высокоточных производственных датчиков давления и температуры - есть где поверить. Поверял 11-е и 22-е. 11-е ну просто никуда не гордятся, а вот 22-е плавают от нормальных показаний +- 0,3 град. Я считаю, для домашнего использования вариант из "дешево и сердито".
а вот 22-е плавают от нормальных показаний +- 0,3 град. Я считаю, для домашнего использования вариант из "дешево и сердито".
Больше интересует насколько врет влажность .Температура там да,достаточно точна,если сравнивать с другими датчиками..
MaksMS, влажность, увы - нечем поверить :(
Но могу сказать то, что датчики достаточно инертны по влажности. У меня висит один такой на улице - как только намек на влажность (осадки, туман и т.д.) - сразу влажность 99,9% и на полдня.
То есть влажность ИМХО - "в попугаях".
С учетом того, что я работаю в АСУ ТП, программистом, и КИП мне хорошо знаком, DHT11 - меня устраивает. Гситерезис поставил на 10%, 40-50. Ну и пусть врет на +-2%, это для комнаты не критично. Темболее, что образцовый прибор показал 33%-34% влажности в комнате, этого маловато. + сошлемся на инертность измерений (Время), и получим, что то около 52%-53% на остановку увлажнения.
А по датчикам - я работаю на фирме, занимающейся производством высокоточных производственных датчиков давления и температуры.
Тогда проф. вопрос. а 4-20мА, пробовали подключать?
Правда там 24В, но это не суть, а ток можно и в напругу переделать.
А по датчикам - я работаю на фирме, занимающейся производством высокоточных производственных датчиков давления и температуры.
Тогда проф. вопрос. а 4-20мА, пробовали подключать?
Правда там 24В, но это не суть, а ток можно и в напругу переделать.
Нет не пробовал пока - нет времени. Добью одну разработку к лету - обязательно попробую с токовой петлей.
Ну а про "для дома некритично" - так я об этом и писал выше.