Arduino DHT11 LCD testowe pomiary wilgotności

Nawiązując do nowej funkcji nettempa, czyli obsługi czujników wilgotności DHT11, musiałem sobie zbudować tester takich czujników. Najlepiej na Arduino, więc zobaczcie jak to zrobiłem.

Arduino i LCD 2×16 shield to fajna sprawa, dzięki takim kanapkom można łatwo i fajnie ożywić swój projekt. Ja dołączyłem jeszcze do tego czujnik temperatury i wilgotności DHT11.

IMG_20131207_193003_1 IMG_20131207_202340_1

Hardware jest ale potrzeby był jeszcze program dla Arduino. Trochę pogooglałem i dopiero po jakimś czasie znalazłem fajny wsad który dobrze działa z DHT11 i odczytuje go co dwie sekundy bez błędów. Link do wątku na forum arduino. A ja go trochę zmodyfikowałem dodając obsługę LCD shielda, tak aby wyświetlał wyniki w dwóch liniach. Naprawdę nic trudnego. Kod poniżej.

/*  DHT11 Example Sketch Code for reading the sensor without delay on your program!
 Example Code by: Nick Athanasoulas
 Date: 27/5/2012
 FUNCTION: It reads the sensor every 2 seconds without delays.
 The user can also use the temperature and humidity values directly as an integer 
 and compare it to other values without making new arrays.
 Date; 07/12/2013 add LCD2x16 techfreak.pl
 */

#include <LiquidCrystal.h>

#define DHT11_PIN 4      // ADC0  Define the ANALOG Pin connected to DHT11 Sensor
int temp1[3];                //Temp1, temp2, hum1 & hum2 are the final integer values that you are going to use in your program. 
int temp2[3];                // They update every 2 seconds.
int hum1[3];
int hum2[3];

byte read_dht11_dat()
{
  byte i = 0;
  byte result=0;
  for(i=0; i< 8; i++){

    while(!(PINC & _BV(DHT11_PIN)));  // wait for 50us
    delayMicroseconds(30);

    if(PINC & _BV(DHT11_PIN)) 
      result |=(1<<(7-i));
    while((PINC & _BV(DHT11_PIN)));  // wait '1' finish

  }
  return result;
}

long dht11delay_previousMillis = 0;        // will store last time LED was updated
long dht11delay_interval = 1000;           // dht11delay_interval at which to blink (milliseconds)

// initialize the library with the numbers of the interface pins
//LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup()
{
  DDRC |= _BV(DHT11_PIN);
  PORTC |= _BV(DHT11_PIN);

  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);

  Serial.begin(9600);
Serial.println("DHT11 without delay");
Serial.println("Example code by: Nick Athanasoulas");
  Serial.println("Ready");
  delay(1000);
}

void loop()
{

  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  //lcd.print(millis()/1000);

  unsigned long dht11delay_currentMillis = millis();

  if(dht11delay_currentMillis - dht11delay_previousMillis > dht11delay_interval) {
    // save the last time you blinked the LED 
    dht11delay_previousMillis = dht11delay_currentMillis;   
    byte dht11_dat[5];
    byte dht11_in;
    byte i;
    // start condition
    // 1. pull-down i/o pin from 18ms
    PORTC &= ~_BV(DHT11_PIN);
    delay(18);
    PORTC |= _BV(DHT11_PIN);
    delayMicroseconds(40);

    DDRC &= ~_BV(DHT11_PIN);
    delayMicroseconds(40);

    dht11_in = PINC & _BV(DHT11_PIN);

    if(dht11_in){
      lcd.println("dht11 start condition 1 not met");
      return;
    }
    delayMicroseconds(80);

    dht11_in = PINC & _BV(DHT11_PIN);

    if(!dht11_in){
      lcd.println("dht11 start condition 2 not met");
      return;
    }
    delayMicroseconds(80);
    // now ready for data reception
    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];
    // check check_sum
    if(dht11_dat[4]!= dht11_check_sum)
    {
      lcd.println("DHT11 checksum error");
    }

lcd.setCursor(0, 0);
    temp1[0]=dht11_dat[2];
    temp2[0]=dht11_dat[3];
    lcd.print("Temp: ");
    lcd.print(temp1[0]);
    lcd.print(".");
    lcd.print(temp2[0]);
    lcd.print(" C");
   // lcd.print("    ");
lcd.setCursor(1, 1);    
    hum1[0]=dht11_dat[0];
    hum2[0]=dht11_dat[1];
    lcd.print("Humidity: ");
    lcd.print(hum1[0]);
    lcd.print(".");
    lcd.print(hum2[0]);
    lcd.println("%");

  }
}
// END OF CODE

A poniżej odczyty już na LCD.

IMG_20131207_212440_1

Wygląda na to że odczyty są poprawne. A wiec szukam dalej jak usprawnić obsługę w Raspberry Pi i nettemp.

Share Button

Przemek

Twórca portalu techfreak, elektronik, pasjonat wszystkiego co fajnie, co można przerobić. W wolnym czasie grzebie przy nettemp. A sport jaki uprawia to mini drony klasy 250.

  • Adrian

    Może przy okazji dodasz wyświetlacz do maliny :)

    Proponuję wyświetlacz graficzny. Więcej możliwości :)

    • Tak to jest fajna opcja;)