У датчика кабель для подключения не подходит для IO Shield. GND и VCC нужно менять местами. Такие дела Руками чтоли переделать этот провод?
Уверены, что ничего не путаете? Не пытаетесь ли вы случаем его подключить к digital-тройке контактов? Вам нужна analog-тройка, там штырьки идут в другом порядке. Да, датчик цифровой, но он работает на аналоговых входах Arduino A0-A5. На самом деле деление ролей входов/выходов на микроконтроллере Atmega328p не такое прямолинейное как цифровой/аналоговый, просто для простоты или от незнания всюду в интернете используют эту формулировку. В случае с DHT11 вы наверняка будете использовать стороннюю библиотеку — она скроет от вас low-level детали взаимодействия с датчиком, просто подключите его к A0.
Так точно, хотя он и на цифровом работал. Юзаю библиотеку. На аналоговом постоянно получал таймаут, но это наверное потому что было очень поздно и я устал.
Вот кстати да. Постоянно дает "read timeout". Сделал делэй побольше, пошли показания, но таймауты выскакивают вперемешку с данными. Как лечить то?
Игнорировать считывания с таймаутами: использовать при этом значение с предыдущей итерации. Либо тут же переспрашивать.
а можно пример такого игнорирования? у меня сейчас time out выскакивает примерно каждые 15 секунд. Вот мой код вместо светодиодов будет в будущем реле Код (C): #include <dht.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> #define MIN_HUM 0 #define MAX_HUM 0 #define MIN_TEMP 27 #define MAX_TEMP 28 DHT sensor = DHT(); int curHum, curTemp; int ledA = 11; int ledB = 10; int ledC = 13; LiquidCrystal_I2C lcd(0x20,20,4); void setup() { pinMode(ledA, OUTPUT); pinMode(ledB, OUTPUT); pinMode(ledC, OUTPUT); lcd.init(); lcd.backlight(); sensor.attach(A0); delay(1000); } void loop() { lcd.clear(); lcd.setCursor(0,0); sensor.update(); switch (sensor.getLastError()) { case DHT_ERROR_OK: char msg[128]; curHum = sensor.getHumidityInt(); curTemp = sensor.getTemperatureInt(); sprintf(msg, "Current humidity = %d%% temperature = %dC", sensor.getHumidityInt(), sensor.getTemperatureInt()); lcd.setCursor(0, 1); lcd.print("HUM"); lcd.setCursor(5, 1); lcd.print(sensor.getHumidityInt()); lcd.setCursor(10, 1); lcd.print("%"); lcd.setCursor(0, 2); lcd.print("TEMP"); lcd.setCursor(5, 2); lcd.print(sensor.getTemperatureInt()); lcd.setCursor(10, 2); lcd.print("C"); if (curHum > MAX_HUM) { // } if (curHum < MIN_HUM) { // } if (curTemp > MAX_TEMP) { digitalWrite(ledA, HIGH); digitalWrite(ledB, LOW); } if (curTemp < MIN_TEMP) { digitalWrite(ledB, HIGH); digitalWrite(ledA, LOW); } 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(3000); }
отвечаю на свой вопрос сам Код (C): case DHT_ERROR_READ_TIMEOUT: lcd.setCursor(0, 1); lcd.print("HUM"); lcd.setCursor(5, 1); lcd.print(curHum); lcd.setCursor(10, 1); lcd.print("%"); lcd.setCursor(0, 2); lcd.print("TEMP"); lcd.setCursor(5, 2); lcd.print(curTemp); lcd.setCursor(10, 2); lcd.print("C"); break; так можно делать? мы ввели в setup переменные curHum и curTemp, при выполнении скетча они постоянно перезаписываются на новые данные о температуре и влажности посредством определений Код (C): curHum = sensor.getHumidityInt(); curTemp = sensor.getTemperatureInt(); и при попытке выдать error мы получаем последние данные из буфера. я правильно рассуждаю?
Да, в общем можно и так, но в этом случае вы повторяетесь с кодом. Проще вообще ничего не делать в случае `DHT_ERROR_READ_TIMEOUT`. Просто `break` и всё
ну тогда получается что во время error'a у меня на дисплее просто пустой экран в добавку к тому что он и так мерцает при каждом опросе а они бывают и 3-4 раза подряд, тоесть у меня с некоторой периодичностью пропадают показания на 4-5 секунд с ЖК
Ещё раз взглянул на ваш код и всё же не понимаю, что приводит к очистке дисплея? Что в него записали остаётся на нём навсегда, до перезагрузки. Ведь так?!
там первой строкой clear() она раз в 3 сек чистит на каждой итерации. если упадет ошибка не отлавливаемая кейсом, на 3-6 секунд пропадет инфа с экрана. Надо добавить кейс, который будет все неуказанные ошибки собирать и выводить на экран Код (C): // ........... default: lcd.print("Unknown error!"); break; // ...............
я бы не стал.. придется тиражировать на каждую ветку. Разрастется код, его станет трудно поддерживать, увеличится размер скетча в бинарнике. лучше просмотреть внимательно ветви управления, и добиться, чтобы не было ветви не выводящей ничего на экран