Go Down

Topic: DHT11, LCD DISPLAY and Arduino Mega reset (Read 1 time) previous topic - next topic

kamaxeon

Hi everybody !!

I have a small trouble, and I don't know how to resolve it. I'm getting crazy.

I have a Arduino Mega (using IDE 021) with a DHT11 sensor (temperature and humidity), with a lcd & keypad from dfrobot.

If a run a simple code test, without use the LCD it works without any trouble, and return the values to a Serial.
Code: [Select]

#define SENSORES 52

byte bGlobalErr;
byte dht_dat[4];
int temperatura;
int humedad;

void setup(){
IniciarSensor();
Serial.begin(9600);
delay(300);
Serial.println("Humidity and temperature\n\n");
delay(700);
}

void loop(){
 LeerDHT();
 switch (bGlobalErr){
    case 0:
     Serial.print("Current humdity = ");
     Serial.print(temperatura);
     Serial.print(".");
     Serial.print(dht_dat[1], DEC);
     Serial.print("%  ");
     Serial.print("temperature = ");
     Serial.print(humedad);
     Serial.print(".");
     Serial.print(dht_dat[3], DEC);
     Serial.println("C  ");
       break;
    case 1:
       Serial.println("Error 1: DHT start condition 1 not met.");
       break;
    case 2:
       Serial.println("Error 2: DHT start condition 2 not met.");
       break;
    case 3:
       Serial.println("Error 3: DHT checksum error.");
       break;
    default:
       Serial.println("Error: Unrecognized code encountered.");
       break;
          }
 delay(800);
}



void IniciarSensor(){
 pinMode(SENSORES,OUTPUT);
 digitalWrite(SENSORES,HIGH);
}

void LeerDHT(){

bGlobalErr=0;
byte dht_in;
byte i;

digitalWrite(SENSORES,LOW);
delay(18);
delay(5);
digitalWrite(SENSORES,HIGH);
delayMicroseconds(40);
pinMode(SENSORES,INPUT);
delayMicroseconds(40);

dht_in=digitalRead(SENSORES);

if(dht_in){
  bGlobalErr=1;
  return;
  }
delayMicroseconds(80);

dht_in=digitalRead(SENSORES);

if(!dht_in){
  bGlobalErr=2;
  return;
  }


delayMicroseconds(80);

for (i=0; i<5; i++)
  dht_dat[i] = LeerDatosDHT();



pinMode(SENSORES,OUTPUT);
digitalWrite(SENSORES,HIGH);
byte dht_check_sum =
      dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3];

if(dht_dat[4]!= dht_check_sum)
  {bGlobalErr=3;}
temperatura = dht_dat[0];
humedad = dht_dat[2];
}

byte LeerDatosDHT(){


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

     while(digitalRead(SENSORES)==LOW);
     delayMicroseconds(30);
     if (digitalRead(SENSORES)==HIGH)
         resultado |=(1<<(7-i));
                   
   while (digitalRead(SENSORES)==HIGH);
   }
 return resultado;
}



But when I  upload the code to show the values on the LCD display the arduino automatically reset. Any ideas ???

Code: [Select]

#include <LiquidCrystal.h>
#define SENSORES      52
byte celsius[8] = {
     B01110,
     B01010,
     B01110,
     B00000,
     B00000,
     B00000,
     B00000,
     B00000
};



int temperatura ;
int humedad;
byte bGlobalErr;
byte dht_dat[4];

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void IniciarSensor(){
 pinMode(SENSORES,OUTPUT);
 digitalWrite(SENSORES,HIGH);
}

void LeerDHT(){

bGlobalErr=0;
byte dht_in;
byte i;

digitalWrite(SENSORES,LOW);
delay(23);
digitalWrite(SENSORES,HIGH);
delayMicroseconds(40);
pinMode(SENSORES,INPUT);
delayMicroseconds(40);

dht_in=digitalRead(SENSORES);

if(dht_in){
  bGlobalErr=1;
  return;
  }
delayMicroseconds(80);

dht_in=digitalRead(SENSORES);

if(!dht_in){
  bGlobalErr=2;
  return;
  }


delayMicroseconds(80);

for (i=0; i<5; i++)
  dht_dat[i] = LeerDatosDHT();



pinMode(SENSORES,OUTPUT);

digitalWrite(SENSORES,HIGH);

byte dht_check_sum = dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3];

if(dht_dat[4]!= dht_check_sum)
  {bGlobalErr=3;}

temperatura = dht_dat[0];
Serial.println(temperatura);
humedad = dht_dat[2];
Serial.println(humedad);
}

byte LeerDatosDHT(){

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

     while(digitalRead(SENSORES)==LOW);
     delayMicroseconds(45);
     if (digitalRead(SENSORES)==HIGH)
                       resultado |=(1<<(7-i));

                   
   while (digitalRead(SENSORES)==HIGH);
   }
 return resultado;

}





void MostrarSensores()
{

           LeerDHT();
           // Temperatura
           lcd.setCursor(4,0);
           // Si es menor de 10 grado pongo un cero delante
           if ( temperatura < 10) {
                 lcd.print(0);
           }
           lcd.print(temperatura);
           // Humedad
           lcd.setCursor(12,0);
           // Si es menor de 10 grado pongo un cero delante
           if ( humedad < 10) {
                 lcd.print(0);
           }
           lcd.print(humedad);
           lcd.setCursor(6 ,1);
           lcd.print("test");

}



//# Setup
//# ==================================
void setup()
{

     // Iniciamos el sensores
     IniciarSensor();
     delay(1000); // Necesario
     lcd.begin(16,2);
     lcd.createChar(3, celsius);
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("T.:     H.:   %");
     lcd.setCursor(6,0);
     lcd.write(3); //
     lcd.setCursor(0,1);
     lcd.print("Modo: ");

 
 Serial.begin(9600);
 Serial.println("DEBUG:");
 Serial.println("================");
 
}






//# LOOP
//# ==================================
void loop()
{

MostrarSensores();
delay(800);


}


Thanks a lot

floresta

#1
Nov 19, 2010, 04:28 pm Last Edit: Nov 19, 2010, 04:29 pm by floresta Reason: 1
kamaxeon:

Do you have any prior experience successfully using the LCD with your Mega?

If the answer is yes then do you have any experience successfully using the custom characters?

If the answer is also yes then have you tried temporarily ending your program just before the 'serial.begin()' statement to see if the LCD part is working at that point?

Don

kamaxeon

Don:


Quote
Do you have any prior experience successfully using the LCD with your Mega?


Yes

Quote
If the answer is yes then do you have any experience successfully using the custom characters?


Yes, using a ds18b20 (temperature sensor)
Quote
If the answer is also yes then have you tried temporarily ending your program just before the 'serial.begin()' statement to see if the LCD part is working at that point?


Using this code the arduino doesn't reset
Code: [Select]

#include <LiquidCrystal.h>
#define SENSORES      52
byte celsius[8] = {
     B01110,
     B01010,
     B01110,
     B00000,
     B00000,
     B00000,
     B00000,
     B00000
};



int temperatura ;
int humedad;
byte bGlobalErr;
byte dht_dat[4];

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void IniciarSensor(){
 pinMode(SENSORES,OUTPUT);
 digitalWrite(SENSORES,HIGH);
}

void LeerDHT(){

bGlobalErr=0;
byte dht_in;
byte i;

digitalWrite(SENSORES,LOW);
delay(23);
digitalWrite(SENSORES,HIGH);
delayMicroseconds(40);
pinMode(SENSORES,INPUT);
delayMicroseconds(40);

dht_in=digitalRead(SENSORES);

if(dht_in){
  bGlobalErr=1;
  return;
  }
delayMicroseconds(80);

dht_in=digitalRead(SENSORES);

if(!dht_in){
  bGlobalErr=2;
  return;
  }


delayMicroseconds(80);

for (i=0; i<5; i++)
  dht_dat[i] = LeerDatosDHT();



pinMode(SENSORES,OUTPUT);

digitalWrite(SENSORES,HIGH);

byte dht_check_sum = dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3];

if(dht_dat[4]!= dht_check_sum)
  {bGlobalErr=3;}

temperatura = dht_dat[0];
Serial.println(temperatura);
humedad = dht_dat[2];
Serial.println(humedad);
}

byte LeerDatosDHT(){

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

     while(digitalRead(SENSORES)==LOW);
     delayMicroseconds(45);
     if (digitalRead(SENSORES)==HIGH)
                       resultado |=(1<<(7-i));

                   
   while (digitalRead(SENSORES)==HIGH);
   }
 return resultado;

}





void MostrarSensores()
{

           LeerDHT();
           // Temperatura
           lcd.setCursor(4,0);
           // Si es menor de 10 grado pongo un cero delante
           if ( temperatura < 10) {
                 lcd.print(0);
           }
           lcd.print(temperatura);
           // Humedad
           lcd.setCursor(12,0);
           // Si es menor de 10 grado pongo un cero delante
           if ( humedad < 10) {
                 lcd.print(0);
           }
           lcd.print(humedad);
           lcd.setCursor(6 ,1);
           lcd.print("test");

}



//# Setup
//# ==================================
void setup()
{

     // Iniciamos el sensores
     IniciarSensor();
     delay(1000); // Necesario
     lcd.begin(16,2);
     lcd.createChar(3, celsius);
     lcd.clear();
     lcd.setCursor(0,0);
     lcd.print("T.:     H.:   %");
     lcd.setCursor(6,0);
     lcd.write(3); //
     lcd.setCursor(0,1);
     lcd.print("Modo: ");

 

 
}






//# LOOP
//# ==================================
void loop()
{



}


Any ideas ?

floresta

Quote
Using this code the arduino doesn't reset

Help me out here.  Does the LCD display what it should display?

Don

kamaxeon

Something like  this:

T.: 24º H.: 55%
Modo: test

floresta

#5
Nov 29, 2010, 04:49 am Last Edit: Nov 29, 2010, 04:52 am by floresta Reason: 1
Do you have a question?  Carnac the Magnificent died with Johnny Carson.

Go Up