Датчик DHT 11 и Дисплей. Помогите с кодом
- Войдите на сайт для отправки комментариев
Купил всеми известный дешёвый датчик DHT 11, прочитал о нём на амперке, взял оттуда код, залил, датчик выдаёт много ошибок.
Код с амперки:
// подключаем библиотеку #include <dht.h> // создаём объект-сенсор DHT sensor = DHT(); void setup() { Serial.begin(9600); // методом attach объявляем к какому контакту подключен // сенсор. В нашем примере это нулевой аналоговый контакт sensor.attach(A0); // // после подачи питания ждём секунду до готовности сенсора к работе delay(1000); } void loop() { // метод update заставляет сенсор выдать текущие измерения sensor.update(); switch (sensor.getLastError()) { case DHT_ERROR_OK: char msg[128]; // данные последнего измерения можно считать соответствующими // методами sprintf(msg, "Temperature = %dC, Humidity = %d%%", sensor.getTemperatureInt(), sensor.getHumidityInt()); Serial.println(msg); break; case DHT_ERROR_START_FAILED_1: Serial.println("Error: start failed (stage 1)"); break; case DHT_ERROR_START_FAILED_2: Serial.println("Error: start failed (stage 2)"); break; case DHT_ERROR_READ_TIMEOUT: Serial.println("Error: read timeout"); break; case DHT_ERROR_CHECKSUM_FAILURE: Serial.println("Error: checksum error"); break; } delay(2000); }
Происходит следующее:
Очень много ошибок таймаута, после ошибка start failed , лечится это только закрытием окна монитора и открытием его заново.
Ладно, теперь я хочу чтобы мои показания отображались на LCD дисплее http://web4robot.com/files/GLCD-FLEXEL.pdf полчаса сидения в гугле и полчаса создания кода сделали следующее:
#include <GLCDI2C.h> #include <dht.h> #include <Wire.h> // Color definitions #define BLACK 0x0000 #define GREEN 0x07E0 #define WHITE 0xFFFF #define DEMODELAY 1500 unsigned int maxX = 160; // LCD x-resolution unsigned int maxY = 128; // LCD y-resolution unsigned char i2cAddress = 0x46; // LCD module I2C address unsigned int counter; unsigned int tmp; GLCDI2C lcd = GLCDI2C(maxX, maxY, i2cAddress); // Создаем сенсор DHT sensor = DHT(); void setup() { delay(500); Wire.begin(); lcd.init(); // Подключаем сенсор к 0 аналоговому порту sensor.attach(A0); // Ждем готовность сенсора delay(1000); } void loop() { lcd.setColor(BLACK); // Проводим измерения lcd.clear(); lcd.cursor(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.fontType(FONT_MEDIUM); lcd.setColor(GREEN); lcd.print("HUM"); lcd.cursor(50, 0); lcd.print(sensor.getHumidityInt()); lcd.cursor(75, 0); lcd.print("%"); lcd.cursor(0, 20); lcd.print("TEMP"); lcd.cursor(60, 20); lcd.print(sensor.getTemperatureInt()); lcd.cursor(85, 20); lcd.print("C"); break; case DHT_ERROR_START_FAILED_1: // ошибка, происходящая через 10 сек lcd.print("Error:"); lcd.cursor(75, 0); lcd.print("Stage 1 failed"); break; case DHT_ERROR_START_FAILED_2: // ошибка, происходящая попеременно с // с DHT_ERROR_START_FAILED_1: lcd.print("Error:"); lcd.cursor(0, 1); lcd.print("Stage 2 failed"); break; case DHT_ERROR_READ_TIMEOUT: // ошибка, происходящая в начале lcd.print("Error:"); lcd.cursor(0, 1); lcd.print("Read timeout"); break; case DHT_ERROR_CHECKSUM_FAILURE: // ошибка, которая ни разу не // происходила lcd.print("Error:"); lcd.cursor(0, 1); lcd.print("Checksum error"); break; } delay(2000); }
В начале показывается это: (прошу прощения за качество)
Потом, когда происходят ошибки, дисплей ничего не показывает (!). Опять же лечится нажатием кнопки reset.
Прошу обьяснить мне что это за ошибки, как их исправить, и, если надо подкорректировать код.
Заранее спасибо.
А подтягивающий резистор стоит?
А подтягивающий резистор стоит?
На чём?
10K между линией DATA и +5v.
Итак, с кодом проблем нет. Вот последняя версия:
Дисплей всё показывает, и ошибки, и температуру(когда нет ошибок), также я продублировал показания дисплея в мониторе порта:
Пробовал менять напряжение, ноль эмоций, датчик подключён к 3,5 а дисплей к 5,0 за отсутствием второго пина на 5,0:
10K между линией DATA и +5v.
Нет, прошу прощения за нубизм, но для чего он там? Я в интернете видел 2 варианта подключения нопрямую, и через резистор.
Вот на верхнем рисунке показано как надо.
Линия двунаправленная, датчик может принимать
и отправлять данные. Для отправки данных на выходе
стоит транзисор с открытым стоком и резистор является его
нагрузкой. Когда транзистор открыт на выходе лог. 0,
когда закрыт резистор подтягивает линию к питанию,
создавая лог. 1. На втором рисунке возможно подключают внутренний
резистор подтяжки в МК, но его сопротивление намного больше и в
некоторых случаях могут быть помехи на линии.
Вот на верхнем рисунке показано как надо.
Линия двунаправленная, датчик может принимать
и отправлять данные. Для отправки данных на выходе
стоит транзисор с открытым стоком и резистор является его
нагрузкой. Когда транзистор открыт на выходе лог. 0,
когда закрыт резистор подтягивает линию к питанию,
создавая лог. 1. На втором рисунке возможно подключают внутренний
резистор подтяжки в МК, но его сопротивление намного больше и в
некоторых случаях могут быть помехи на линии.
Спасибо, сейчас прилажу, посмотрим, как работать будет
очень много таймаутов, и вскоре появляется start failed, через минуту опять всё нормально!
Подтягивающий подключил:
если убрать обработку ошибок, то выдаётся просто неправильные температура и влажность
Для начала попробуйте вот с этой библиотекой https://github.com/markruys/arduino-DHT
Для начала попробуйте вот с этой библиотекой https://github.com/markruys/arduino-DHT
Вообще фигня какая-то:
Стоп, что значит data pin 2?
А такую: http://www.seeedstudio.com/wiki/File:Humidity_Temperature_Sensor.zip ?
Или такую: https://github.com/adafruit/DHT-sensor-library ?
А такую: http://www.seeedstudio.com/wiki/File:Humidity_Temperature_Sensor.zip ?
Или такую: https://github.com/adafruit/DHT-sensor-library ?
А резистор с маркировкой (кор чёрн оранж золот) правильный?
Да.
http://www.qrz.ru/shareware/contribute/decoder.shtml
Стоп, что значит data pin 2?
То и значит что датчик подключен к цыфровому выводу 2, в вашем же случае нужно указать
dht.
setup
(A0);
Не, всёравно не работает
Для начала попробуйте вот с этой библиотекой https://github.com/markruys/arduino-DHT
Ура! С этой заработало!
А у меня возник вопрос: почему с этой заработало, а с другими нет?
Помогите пожалуйста составить код для отображения на дисплее, что-то у меня не выходит