Go Down

Topic: DHT11 + LCD weather station (Read 5 times) previous topic - next topic

WiredMeUp

#5
May 27, 2012, 04:44 pm Last Edit: May 27, 2012, 05:07 pm by WiredMeUp Reason: 1
Code: [Select]

       flip++;

       light_intensity=analogRead(LIGHT_SENSOR_PIN);

       ReadDHT(); //This is the "heart" of the program.
       //Fills global array dht_dpin[], and bGlobalErr, which
       //will hold zero if ReadDHT went okay.
       //Must call InitDHT once (in "setup()" is usual) before
       //calling ReadDHT.
       //Following: Display what was seen...
       switch (bGlobalErr) {
       case 0:
               lcd.setCursor(0, 0);
               // Serial.print("humdity = ");
               lcd.print("temp =       ");
               lcd.setCursor(7, 0);
               lcd.print( dht_dat[2], DEC);

               //Serial.print(dht_dat[0], DEC);
               //Serial.print(".");
               //Serial.print(dht_dat[1], DEC);
               //Serial.print("%  ");
               lcd.setCursor(0, 1);
               //Every 7 out of 15 times we show humidity, rest temp
               if ((flip % 15) > 7 )
               {
                       lcd.print("humidity = ");
                       lcd.setCursor(11, 1);
                       lcd.print( dht_dat[0], DEC);
               } else {
                       lcd.print("Light =         ");
                       lcd.setCursor(8, 1);
                       lcd.print( light_intensity, DEC);
               }
               //Serial.print("temperature = ");
               //Serial.print(dht_dat[2], DEC);
               //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;
       } //end "switch"
       delay(800); //Don't try to access too frequently... in theory
       //should be once per two seconds, fastest,
       //but seems to work after 0.8 second.

} // end loop()

/*Below here: Only "black box" elements which can just be plugged unchanged
  unchanged into programs. Provide InitDHT() and ReadDHT(), and a function
  one of them uses.*/

void InitDHT(){
       //DDRC |= _BV(dht_PIN);//set data pin... for now... as output
       //DDRC is data direction register for pins A0-5 are on
       //PORTC |= _BV(dht_PIN);//Set line high
       //PORTC relates to the pins A0-5 are on.
       //Alternative code...
//        if (dht_dpin-14 != dht_PIN){Serial.println("ERROR- dht_dpin must be 14 more than dht_PIN");};//end InitDHT
       pinMode(dht_dpin,OUTPUT); // replaces DDRC... as long as dht_dpin=14->19
       digitalWrite(dht_dpin,HIGH); //Replaces PORTC |= if dht_pin=14->19
} //end InitDHT

void ReadDHT(){
/*Uses global variables dht_dat[0-4], and bGlobalErr to pass
  "answer" back. bGlobalErr=0 if read went okay.
  Depends on global dht_PIN for where to look for sensor.*/
       bGlobalErr=0;
       byte dht_in;
       byte i;
       // Send "start read and report" command to sensor....
       // First: pull-down i/o pin for 18ms
       digitalWrite(dht_dpin,LOW); //Was: PORTC &= ~_BV(dht_PIN);
       delay(18);
       delayMicroseconds(600);//TKB, frm Quine at Arduino forum
/*aosong.com datasheet for DHT22 says pin should be low at least
  500us. I infer it can be low longer without any]
  penalty apart from making "read sensor" process take
  longer. */
//Next line: Brings line high again,
//   second step in giving "start read..." command
       digitalWrite(dht_dpin,HIGH); //Was: PORTC |= _BV(dht_PIN);
       delayMicroseconds(40); //DHT22 datasheet says host should
       //keep line high 20-40us, then watch for sensor taking line
       //low. That low should last 80us. Acknowledges "start read
       //and report" command.

//Next: Change Arduino pin to an input, to
//watch for the 80us low explained a moment ago.
       pinMode(dht_dpin,INPUT); //Was: DDRC &= ~_BV(dht_PIN);
       delayMicroseconds(40);

       dht_in=digitalRead(dht_dpin); //Was: dht_in = PINC & _BV(dht_PIN);

       if(dht_in) {
               bGlobalErr=1; //Was: Serial.println("dht11 start condition 1 not met");
               return;
       } //end "if..."
       delayMicroseconds(80);

       dht_in=digitalRead(dht_dpin); //Was: dht_in = PINC & _BV(dht_PIN);

       if(!dht_in) {
               bGlobalErr=2; //Was: Serial.println("dht11 start condition 2 not met");
               return;
       } //end "if..."

/*After 80us low, the line should be taken high for 80us by the
  sensor. The low following that high is the start of the first
  bit of the forty to come. The routine "read_dht_dat()"
  expects to be called with the system already into this low.*/
       delayMicroseconds(70);
//now ready for data reception... pick up the 5 bytes coming from
//   the sensor
       for (i=0; i<5; i++)
               dht_dat[i] = read_dht_dat();

//Next: restore pin to output duties
       pinMode(dht_dpin,OUTPUT); //Was: DDRC |= _BV(dht_PIN);
//N.B.: Using DDRC put restrictions on value of dht_pin

//Next: Make data line high again, as output from Arduino
       digitalWrite(dht_dpin,HIGH); //Was: PORTC |= _BV(dht_PIN);
//N.B.: Using PORTC put restrictions on value of dht_pin

//Next see if data received consistent with checksum received
       byte dht_check_sum =
               dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3];
/*Condition in following "if" says "if fifth byte from sensor
      not the same as the sum of the first four..."*/
       if(dht_dat[4]!= dht_check_sum)
       {bGlobalErr=3; } //Was: Serial.println("DHT11 checksum error");
}; //end ReadDHT()

byte read_dht_dat(){
//Collect 8 bits from datastream, return them interpreted
//as a byte. I.e. if 0000.0101 is sent, return decimal 5.

//Code expects the system to have recently entered the
//dataline low condition at the start of every data bit's
//transmission BEFORE this function is called.

       byte i = 0;
       byte result=0;
       for(i=0; i< 8; i++) {
               //We enter this during the first start bit (low for 50uS) of the byte
               //Next: wait until pin goes high
               while(digitalRead(dht_dpin)==LOW) ;  //Was: while(!(PINC & _BV(dht_PIN)));
               //signalling end of start of bit's transmission.

               //Dataline will now stay high for 27 or 70 uS, depending on
               //whether a 0 or a 1 is being sent, respectively.
               delayMicroseconds(30); //AFTER pin is high, wait further period, to be
               //into the part of the timing diagram where a 0 or a 1 denotes
               //the datum being send. The "further period" was 30uS in the software
               //that this has been created from. I believe that a higher number
               //(45?) would be more appropriate.

               //Next: Wait while pin still high
               if (digitalRead(dht_dpin)==HIGH) //Was: if(PINC & _BV(dht_PIN))
                       result |=(1<<(7-i));  // "add" (not just addition) the 1
               //to the growing byte
               //Next wait until pin goes low again, which signals the START
               //of the NEXT bit's transmission.
               while (digitalRead(dht_dpin)==HIGH) ;  //Was: while((PINC & _BV(dht_PIN)));
       } //end of "for.."
       return result;
} //end of "read_dht_dat()"



... and they all work, but I would love to be able to use the last script but get the readings on the arduino software port monitor as well so I could have data readings saved all throught night.. I have never been programming or anything alike, but I do enjoy the wiring part and making something myself.. Thanks alot to everyone who want to help me.

Martin

robtillaart


please please please use the # button when posting code, it provides tags to present the code in a better readable format.

- you can modify old posts easily, select the code part and press the # button just above the smileys :)

Thank you..
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

WiredMeUp

Noted with thanks, I did not know that :)

robtillaart

thanks,

sometimes code contains parts that resemble smileys like this one   

if (x == 8)
{
  bool b =( a & b );
}

Code: [Select]

if (x == 8)
{
  bool b =( a & b );
}
Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

WiredMeUp

Have you got any ideas how to merge pc data logging to this script?

Go Up