I'm trying to read temperature and humidity from a DHT11 sensor and write values to a 20x4 LCD. I hit a behaviour I don't understand. When I use the DHT tester program that come with the DHT library, everything works well. I get the DHT information on the Serial console. This DHT tester program use the pin 2 to read the data from the DHT.

I wrote the following code who works perfectly:

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>  // F Malpartida's NewLiquidCrystal library
#include <DHT.h>

#define DHTTYPE DHT11
#define DHTPIN 13      // Digital

LiquidCrystal_I2C    lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

void setup() {
  while (!Serial) {
  Serial.println("Serial OK!"); 

  lcd.print("Hello! ");

  Serial.println("Init finished!"); 

void loop() {

  float DHT_hum = dht.readHumidity();
  float DHT_temp_c = dht.readTemperature(false);
  float DHT_temp_f = dht.readTemperature(true);

  if (isnan(DHT_hum) || isnan(DHT_temp_c) || isnan(DHT_temp_f)) {
    Serial.println("Failed to read from DHT sensor!!");
    lcd.print("fail! "); 

  float heat_index = dht.computeHeatIndex(DHT_temp_f, DHT_hum);

  Serial.print("Humidity: "); 
  Serial.print(" %\t");
  Serial.print("Temperature: "); 
  Serial.print(" *C ");
  Serial.print(" *F\t");
  Serial.print("Heat index: ");
  Serial.println(" *F");

  lcd.print("Humi: ");  
  lcd.setCursor(0, 1);
  lcd.print("Temp: ");  
  lcd.setCursor(14, 0);
  lcd.print("HI: ");
  lcd.setCursor(14, 1);


As you can see, I use pin 13 for the DHT11 (DHTPIN). If I set to it to "2" then my program is no longer working (having the pin connected or not doesn't change the result). The serial display

Serial OK!
Init finished!
Failed to read from DHT sensor!!

and that's all, it even doesn't loop to display "Failed to read from DHT sensor!!" again. LCD text doesn't change too. Like if the program is totally exiting after "Serial.println("Failed to read from DHT sensor!!");"

I'm lost... The LCD lib I use is the very common one from fm https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/Home

2 Answers 2

LiquidCrystal_I2C    lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

Are you not using pin 2 in the LiquidCrystal_I2C constructor? So you can't also use it for the DHT sensor.

I withdraw that suggestion.

Can you please try saving some RAM?

Use the F macro with your prints, eg.

  Serial.print(F("Humidity: ")); 
  Serial.print(F(" %\t"));
  Serial.print(F("Temperature: ")); 

Ditto with the lcd.print() calls.

  • From my understanding, the pin used in the constructor, are the pin used by the logic chip on the LCD panel, not on the arduino. I don't have anything from the LCD connected on pin 2 and LCD works. If I changed '2' to another (not used) pin, the LCD no longer work.
    – radius
    Commented Jul 7, 2015 at 9:09
  • I don't see how that could be right. Why would the code care what pin is on the LCD logic chip? It needs to know what pin on the Arduino it uses for certain functions.
    – Nick Gammon
    Commented Jul 7, 2015 at 21:17
  • Because all LCD panel are not wired the same way. see arduino-info.wikispaces.com/LCD-Blue-I2C "Set the pins on the I2C chip used for LCD connections"
    – radius
    Commented Jul 7, 2015 at 23:28
  • Hmm, that's odd. I see what you mean. Please see revised answer.
    – Nick Gammon
    Commented Jul 7, 2015 at 23:59

I'm self answering.. On my Arduino Leonardo, the SDA and SCL pin used for the I2C connexion to the LCD panel, are the same pin than the Digital pin 2 and 3. So using SDA/SCL remove ability to use pin 2 & 3.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.