Датчик DHT 11 и Дисплей. Помогите с кодом

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

Купил всеми известный дешёвый датчик 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. 

Прошу обьяснить мне что это за ошибки, как их исправить, и, если надо подкорректировать код.

Заранее спасибо.

 

alex_r61
Offline
Зарегистрирован: 20.06.2012

А подтягивающий резистор стоит?

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

alex_r61 пишет:

А подтягивающий резистор стоит?

На чём?

alex_r61
Offline
Зарегистрирован: 20.06.2012

10K между линией DATA и +5v.

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

Итак, с кодом проблем нет. Вот последняя версия:

#include <GLCDI2C.h>
#include <dht.h>
#include <Wire.h>
// Color definitions
#define	BLACK           0x0000
#define	GREEN           0x07E0
#define WHITE           0xFFFF
#define	BLACK           0x0000
#define	BLUE            0x001F
#define	RED             0xF800
#define	GREEN           0x07E0
#define CYAN            0x07FF
#define MAGENTA         0xF81F
#define YELLOW          0xFFE0  
#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()
{
  Serial.begin(9600);
     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());
            Serial.println("look at display, all are ok");        
            lcd.barGradient(0,0,maxX-1,maxY-1,RED,BLUE,100,GRAD_UP);
            lcd.fontType(FONT_MEDIUM);
            lcd.setColor(GREEN);
            lcd.cursor(40,32);
            lcd.print("HUM");
            lcd.cursor(85, 32);
            lcd.print(sensor.getHumidityInt());
            lcd.cursor(110,32);
            lcd.print("%");
            lcd.fontType(FONT_LARGE);
            lcd.cursor(10, 96);
            lcd.print("TEMP");
            lcd.cursor(98, 96);
            lcd.print(sensor.getTemperatureInt());
            lcd.cursor(140, 96);
            lcd.print("C");
            delay(4000);
            break;
        case DHT_ERROR_START_FAILED_1:
            Serial.println("Error: start failed (stage 1)");
            lcd.fontType(FONT_MEDIUM);
            lcd.setColor(GREEN);
            lcd.cursor(1,0);
            lcd.print("Error:start failed (stage 1)");
            break;
        case DHT_ERROR_START_FAILED_2:
            Serial.println("Error: start failed (stage 2)");
            lcd.fontType(FONT_MEDIUM);
            lcd.setColor(GREEN);
            lcd.cursor(1,0);
            lcd.print("Error: start failed (stage 2)");
            break;
        case DHT_ERROR_READ_TIMEOUT:
            Serial.println("Error: read timeout");
            lcd.fontType(FONT_MEDIUM);
            lcd.setColor(GREEN);
            lcd.cursor(1,0);
            lcd.print("Error:read timeout");
            break;
        case DHT_ERROR_CHECKSUM_FAILURE:
            Serial.println("Error: checksum error");
            lcd.fontType(FONT_MEDIUM);
            lcd.setColor(GREEN);
            lcd.cursor(1,0);
            lcd.print("Error:checksum error");
            break;
    }
 
    delay(1000);
}

Дисплей всё показывает, и ошибки, и температуру(когда нет ошибок), также я продублировал показания дисплея в мониторе порта:

Пробовал менять напряжение, ноль эмоций, датчик подключён к 3,5 а дисплей к 5,0 за отсутствием второго пина на 5,0:

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

alex_r61 пишет:

10K между линией DATA и +5v.

Нет, прошу прощения за нубизм, но для чего он  там? Я в интернете видел 2 варианта подключения нопрямую, и через резистор.

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

alex_r61
Offline
Зарегистрирован: 20.06.2012

Вот на верхнем рисунке показано как надо.

Линия двунаправленная, датчик может принимать

и отправлять данные. Для отправки данных на выходе

стоит транзисор с открытым стоком и резистор является его

нагрузкой. Когда транзистор открыт на выходе лог. 0,

когда закрыт  резистор подтягивает линию к питанию,

создавая лог. 1. На втором рисунке возможно подключают внутренний

резистор подтяжки в МК, но его сопротивление намного больше и в

некоторых случаях могут быть помехи на линии.

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

alex_r61 пишет:

Вот на верхнем рисунке показано как надо.

Линия двунаправленная, датчик может принимать

и отправлять данные. Для отправки данных на выходе

стоит транзисор с открытым стоком и резистор является его

нагрузкой. Когда транзистор открыт на выходе лог. 0,

когда закрыт  резистор подтягивает линию к питанию,

создавая лог. 1. На втором рисунке возможно подключают внутренний

резистор подтяжки в МК, но его сопротивление намного больше и в

некоторых случаях могут быть помехи на линии.

Спасибо, сейчас прилажу, посмотрим, как работать будет

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

очень много таймаутов, и вскоре появляется start failed, через минуту опять всё нормально!

Подтягивающий подключил:

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

если убрать обработку ошибок, то выдаётся просто неправильные температура и влажность

maksim
Offline
Зарегистрирован: 12.02.2012

Для начала попробуйте вот с этой библиотекой https://github.com/markruys/arduino-DHT

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

maksim пишет:

Для начала попробуйте вот с этой библиотекой https://github.com/markruys/arduino-DHT

Вообще фигня какая-то:

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

Стоп, что значит data pin 2?

#include "DHT.h"

DHT dht;

void setup()
{
  Serial.begin(9600);
  Serial.println();
  Serial.println("Status\tHumidity (%)\tTemperature (C)\t(F)");

  dht.setup(2); // 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, 1);
  Serial.print("\t\t");
  Serial.print(temperature, 1);
  Serial.print("\t\t");
  Serial.println(dht.toFahrenheit(temperature), 1);
}

 

vdk
Offline
Зарегистрирован: 14.04.2013
ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013
ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

А резистор с маркировкой (кор чёрн оранж золот) правильный?

alex_r61
Offline
Зарегистрирован: 20.06.2012
maksim
Offline
Зарегистрирован: 12.02.2012

ДимЧик пишет:

Стоп, что значит data pin 2?

То и значит что датчик подключен к цыфровому выводу 2, в вашем же случае нужно указать dht.setup(A0);

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

Не, всёравно не работает

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

maksim пишет:

Для начала попробуйте вот с этой библиотекой https://github.com/markruys/arduino-DHT

Ура! С этой заработало!

А у меня возник вопрос: почему с этой заработало, а с другими нет?

ДимЧик
ДимЧик аватар
Offline
Зарегистрирован: 30.03.2013

Помогите пожалуйста составить код для отображения на дисплее, что-то у меня не выходит