Официальный сайт компании Arduino по адресу arduino.cc
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(), что бы остановить приемник, но ... :(.
Пробую поправить библиотеку, путем остановки таймера - 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В, но это не суть, а ток можно и в напругу переделать.
Нет не пробовал пока - нет времени. Добью одну разработку к лету - обязательно попробую с токовой петлей.
Ну а про "для дома некритично" - так я об этом и писал выше.