Библиотека DHT11
- Войдите на сайт для отправки комментариев
Пнд, 06/01/2014 - 20:25
Друзья, есть у кого нормальная библиотека для датчика температуры и влажности DHT11. Многие перепробывал не работают. Одну скачал, код для примера загрузил, все работала, а теперь уже нет. Вот такое выдает
C:\Program Files\Arduino\libraries\dht\~$dht.cpp:3: error: stray '\20' in program
C:\Program Files\Arduino\libraries\dht\~$dht.cpp:1: error: 'nout' does not name a type
C:\Program Files\Arduino\libraries\dht\~$dht.cpp:3: error: 'l' does not name a type.
Или может кто подскажет что не так. Я новичок
у меня так работает
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); // датчик на аналогый вход 0 #define DHT11_PIN 0 byte read_dht11_dat() { byte i = 0; byte result=0; for(i=0; i< 8; i++) { while(!(PINC & _BV(DHT11_PIN))) { }; delayMicroseconds(30); if(PINC & _BV(DHT11_PIN)) result |=(1<<(7-i)); while((PINC & _BV(DHT11_PIN))); } return result; } void setup() { lcd.init(); lcd.backlight(); DDRC |= _BV(DHT11_PIN); PORTC |= _BV(DHT11_PIN); } void loop() { byte dht11_dat[5]; byte dht11_in; byte i; PORTC &= ~_BV(DHT11_PIN); delay(18); PORTC |= _BV(DHT11_PIN); delayMicroseconds(1); DDRC &= ~_BV(DHT11_PIN); delayMicroseconds(40); dht11_in = PINC & _BV(DHT11_PIN); if(dht11_in) { lcd.clear(); lcd.setCursor(0,0); lcd.print("1 not met"); delay(1000); return; } delayMicroseconds(80); dht11_in = PINC & _BV(DHT11_PIN); // if(!dht11_in) { lcd.clear(); lcd.setCursor(0,0); lcd.print("2 not met"); return; } delayMicroseconds(80); for (i=0; i<5; i++) { dht11_dat[i] = read_dht11_dat(); } DDRC |= _BV(DHT11_PIN); PORTC |= _BV(DHT11_PIN); byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3]; if(dht11_dat[4]!= dht11_check_sum) { lcd.clear(); lcd.setCursor(0,0); lcd.print("checksum"); } lcd.clear(); lcd.setCursor(0,0); lcd.print("HUM"); lcd.setCursor(5,0); lcd.print(dht11_dat[0], DEC); lcd.setCursor(10,0); lcd.print("%"); lcd.setCursor(0,1); lcd.print("TEMP"); lcd.setCursor(5,1); lcd.print(dht11_dat[2], DEC); lcd.setCursor(10,1); lcd.print("C"); delay(2000); }вот еще
https://github.com/niesteszeck/idDHT11
Спасибо большое за библиотеки! Я тоже нашел одну, загрузил в ардуино тест программу, работает. Попытался переделать под свои нужды, добавил код чтоб реле срабатывала выше какой-то температуры. Не хочет работать, тоесть температуру и влажность показывает чрез монитор порта, а реле молчит. Может кто подскажет, что не так, я совсем только начинаю изучать. Может конечно не много сразу со сложного, но я с пользой для дела
#include "DHT.h" DHT dht; int ven = 33; void setup() { Serial.begin(9600); Serial.println(); Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)"); dht.setup(A2); // data pin 2 } void loop() { delay(dht.getMinimumSamplingPeriod()); float humidity = dht.getHumidity(); float temperature = dht.getTemperature(); Serial.print(dht.getStatusString()); Serial.print("\t"); Serial.print(humidity); Serial.print("\t\t"); Serial.print(temperature); Serial.print("\t\t"); Serial.println(dht.toFahrenheit(temperature)); if (temperature > 30 ) digitalWrite(ven,HIGH); else digitalWrite(ven,LOW); delay(1000); }Помогите люди добрые!!!
Идея такова : сделать в частном доме вентиляцию , для этого использовал dht11 ( в планах подключить 3 датчика ), датчик движения ( для туалета), реле и естественно вентилятор.
Проблема в том что при подключенном USB к компу и открытом окне монитора порта все работает!!! Но как только я подключаю внешнее питание ( блок 12 вольт) ардуинка перестает опрашивать датчик dht11 хотя на пир реагирует реле отлично счелкает выдерживает все паузы.
Не судите строго это первая программа .
Вот что смог неимоверными усилиями слепить :
Разобрался со свом случаем. Забыл определить 33 ножку как выход
shurrup
код пришлось менять?
напиши текст конечного скетча..
поясни
01#include "DHT.h"0203DHT dht;04intven = 33;05voidsetup()06{07Serial.begin(9600);08Serial.println();09Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)");1011dht.setup(A2);// data pin 21213}1415voidloop()16{1718delay(dht.getMinimumSamplingPeriod());1920floathumidity = dht.getHumidity();21floattemperature = dht.getTemperature();2223Serial.print(dht.getStatusString());24Serial.print("\t");25Serial.print(humidity);26Serial.print("\t\t");27Serial.print(temperature);28Serial.print("\t\t");29Serial.println(dht.toFahrenheit(temperature));30if(temperature > 30 ) digitalWrite(ven,HIGH);31elsedigitalWrite(ven,LOW);32delay(1000);3334}я правда уже гораздо более сложный забабахал. а ты что делаешь?
Спасибо за пояснения!
Имею:
Arduino UNO, DHT11, LCD1602 Keypad Shield? релюши http://www.buyincoins.com/item/27801.html
Требуется скетч с выводом температуры на дисплей (желательно при нажатии влево, вправо были показания по разным датчикам А1, А2,А3, и.т.д.)
при превышении Т 80гр. по дному датчику, срабатывает реле N1, при превышении Т по двум датчикам реле N2.
Думаю затея вполне понятная и не сложная, скетчи по отдельности нужных мне функций встречал, и анализирую (мало времени) вот только объединить бы их в конечный код.....
З.Ы. И тут где то писали как правильно код скетча вставлять в сообщения...
в верхней строке где пишеш сообщения там значок с красными скобками "вставка и редактирование кода"
30if(temperature > 30 ) digitalWrite(ven,HIGH);31elsedigitalWrite(ven,LOW);Думается мне температура HIGH and LOW должна быть разная, хотяб на градус (у меня в готовом китайском термоконтроллере минимум устанавливается дельта 2 оС). При температуре в около 30 может получится дребезг на ven ноге. Мк будет ей многократно дергать.
if (temp>30) {on;}
if (temp<28) {off;}
Вопрос по библеотеке DHT.h
НЕ хочет она работать если я включаю таймер2.
виснет мк в момент чтения температуры, влажности в 20 строке.
Пляски пока не помогли. Дайте бубен :-)
Потому что она тоже этот таймер использует. 0 таймер используется для millis, 1 таймер для PWM. Используйте 1 таймер если у вас PWM не используется.
Спасибо, буду пробавать.
Правильно ли я понимаю:
У таймера 0 и 1 общий предделитель. В ардуине настроенный на 64. (ATMega328p)
0 таймер используется для millis
1 таймер для PWM.
2 dht
А где про это можно почитать?
A не существует ли готовой библиотеки для dht11 без использования таймеров - на задержках.
0 таймер используется для millis
1 таймер для PWM.
2 dht
А где про это можно почитать?
A не существует ли готовой библиотеки для dht11 без использования таймеров - на задержках.
Она вроде и так, в delay()-ях как барбоска в блохах.
Она вроде и так, в delay()-ях как барбоска в блохах.
DHT.h : #if ARDUINO >= 100 #include "Arduino.h" #else #include "WProgram.h" #endif /* DHT library MIT license written by Adafruit Industries */ // how many timing transitions we need to keep track of. 2 * number bits + extra #define MAXTIMINGS 85 #define DHT11 11 #define DHT22 22 #define DHT21 21 #define AM2301 21 class DHT { private: uint8_t data[6]; uint8_t _pin, _type; boolean read(void); unsigned long _lastreadtime; boolean firstreading; public: DHT(uint8_t pin, uint8_t type); void begin(void); float readTemperature(bool S=false); float convertCtoF(float); float readHumidity(void); }; DHT.cpp /* DHT library MIT license written by Adafruit Industries */ #include "DHT.h" DHT::DHT(uint8_t pin, uint8_t type) { _pin = pin; _type = type; firstreading = true; } void DHT::begin(void) { // set up the pins! pinMode(_pin, INPUT); digitalWrite(_pin, HIGH); _lastreadtime = 0; } //boolean S == Scale. True == Farenheit; False == Celcius float DHT::readTemperature(bool S) { float f; if (read()) { switch (_type) { case DHT11: f = data[2]; if(S) f = convertCtoF(f); return f; case DHT22: case DHT21: f = data[2] & 0x7F; f *= 256; f += data[3]; f /= 10; if (data[2] & 0x80) f *= -1; if(S) f = convertCtoF(f); return f; } } Serial.print("Read fail"); return NAN; } float DHT::convertCtoF(float c) { return c * 9 / 5 + 32; } float DHT::readHumidity(void) { float f; if (read()) { switch (_type) { case DHT11: f = data[0]; return f; case DHT22: case DHT21: f = data[0]; f *= 256; f += data[1]; f /= 10; return f; } } Serial.print("Read fail"); return NAN; } boolean DHT::read(void) { uint8_t laststate = HIGH; uint8_t counter = 0; uint8_t j = 0, i; unsigned long currenttime; // pull the pin high and wait 250 milliseconds digitalWrite(_pin, HIGH); delay(250); currenttime = millis(); if (currenttime < _lastreadtime) { // ie there was a rollover _lastreadtime = 0; } if (!firstreading && ((currenttime - _lastreadtime) < 2000)) { return true; // return last correct measurement //delay(2000 - (currenttime - _lastreadtime)); } firstreading = false; /* Serial.print("Currtime: "); Serial.print(currenttime); Serial.print(" Lasttime: "); Serial.print(_lastreadtime); */ _lastreadtime = millis(); data[0] = data[1] = data[2] = data[3] = data[4] = 0; // now pull it low for ~20 milliseconds pinMode(_pin, OUTPUT); digitalWrite(_pin, LOW); delay(20); cli(); digitalWrite(_pin, HIGH); delayMicroseconds(40); pinMode(_pin, INPUT); // read in timings for ( i=0; i< MAXTIMINGS; i++) { counter = 0; while (digitalRead(_pin) == laststate) { counter++; delayMicroseconds(1); if (counter == 255) { break; } } laststate = digitalRead(_pin); if (counter == 255) break; // ignore first 3 transitions if ((i >= 4) && (i%2 == 0)) { // shove each bit into the storage bytes data[j/8] <<= 1; if (counter > 6) data[j/8] |= 1; j++; } } sei(); /* Serial.println(j, DEC); Serial.print(data[0], HEX); Serial.print(", "); Serial.print(data[1], HEX); Serial.print(", "); Serial.print(data[2], HEX); Serial.print(", "); Serial.print(data[3], HEX); Serial.print(", "); Serial.print(data[4], HEX); Serial.print(" =? "); Serial.println(data[0] + data[1] + data[2] + data[3], HEX); */ // check we read 40 bits and that the checksum matches if ((j >= 40) && (data[4] == ((data[0] + data[1] + data[2] + data[3]) & 0xFF)) ) { return true; } return false; }Вот и я не пойму. Вроде таймер не один не используется.
А прерывания вы не включаете? У меня температуру отдает, но при ее считывании диммер помаргивает. Как раз с delay() проблема.
Прерывания включаю. и 1 и 2.
подмигивание вызвано не отображением дисплея в момент считывания с датчика.
Считавать с датчика надо между включениями разрядов дисплея.
На своей мини столкнулся с тем, что похоже реально она работает на 2Mhz (кварц16 и похоже включен предделитель на8). это тоже тормозит процесс. Думаю надо перепрошивать. А еще использовать прямой доступ к портам.
Библиотека для датчика, ту которую выложил выше г-но. Нах каждый раз проверять какой у меня датчик(как будто в процессе работы я его меняю) и проверять в чем в цельчиях или ф-гейтах выводить?
Библиотеку начал коцать. Уже половину выкинул. Мучаю дальше.
А с нуля написать проблемно? вроде ничего сложного - http://codius.ru/articles/187#a21
Ну отчего ж "проблемно"? Совсем нет.
Сходил по ссылке. Спасибо, повеселили. Казалось бы действительно, ничего сложного. Стоит только шашку вытащить и разз-з-зз-махнуться...
На своей мини столкнулся с тем, что похоже реально она работает на 2Mhz (кварц16 и похоже включен предделитель на8). это тоже тормозит процесс. Думаю надо перепрошивать. А еще использовать прямой доступ к портам.
не тут ошибся 16и есть
Сходил по ссылке. Спасибо, повеселили. Казалось бы действительно, ничего сложного.
Рассказали бы что веселого, чтобы опыт некорректный не перенимать?
Сходил по ссылке. Спасибо, повеселили. Казалось бы действительно, ничего сложного.
Рассказали бы что веселого, чтобы опыт некорректный не перенимать?
жизнь веселая, смотришь ищешь знакомые букАвы и иногда находишь.
вот и я урезал ее практически до состояния приведенного примера где без библиотеки все работает.
2 deftvk
Ну начиналось-то интригующе
А с нуля написать проблемно? вроде ничего сложного - http://codius.ru/articles/187#a21
Вдруг, наконец, кто-то перестал копипастить говнокод и написал что-то стоющее, оригинальное, пуркуа бы и не па? Но вам удалось переписать код от Rob Tillaart (вы сами даете на него ссылку, где в скетче пытаетесь прикрутить 7-индикатор) э-ээ... специфично, без улыбки не прочтешь. Кстати, отчего ж его ("свой") не использовать в своих-то примерах?
Вот и ответил вам - повеселило бесконечное повторение не лучших образцов в еще худшем исполнении. А написать с нуля, неблокирующее чтение датчика, компактный код - да нет, не проблемно.
Вот и ответил вам - повеселило бесконечное повторение не лучших образцов в еще худшем исполнении. А написать с нуля, неблокирующее чтение датчика, компактный код - да нет, не проблемно.
Автор по ссылке, ИМХО, дает код для разбора начинающим и пониманию работы датчика, и "худшее исполнение" также преследовало именно эту цель, а не мало кому понятный из начинающих "С++ жесткач" с прерываниями и программированием потоков - это тема другого обсуждения...
2 deftvk
Мало кто из "начинающих" вообще читает код, судя по этому и другим форумам, предпочитая готовые решения. Ну в целом это нормально, соответствует парадигме проекта "ардуино".
Но, размещая на этом форуме ссылку, вы ведь меньше всего хотели о DHT11 поговорить, не правда ли?
Поэтому компенсируя мою язвительность (следствие дурного характера), очень коротко скажу. Понравилось в целом, четкий и лаконичный дизайн, внятный и грамотный язык без провинциального "... намедни пришла с али микруха и решил я ее тута потестить", разумная компиляция материалов, видео как пруф работы кода и т.п. Если хватит сил продолжить, не забросить - вот тогда и критиковать можно будет.