اطلاعیه

Collapse
No announcement yet.

خواند دما توسط DHT22 با LPC1768

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    خواند دما توسط DHT22 با LPC1768

    سلام دوستان
    من میخوام دما رو از رو سنسور DHT22 بخونم .
    البته در ARM .
    من کد زیر را با توجه به datasheet در keil نوشتم اما GPIO_ReadValue(0) پیوسته 0xff را نمایش می ده و به این ترتیب از حلقه های while خارج نمی شیم و دما محاسبه نمی شه . و این که آیا نیاز هست من از تایمر استفاده کنم ؟
    دوستان میشه کد را نگاهی بندازید و اگر نظری دارید اعلام کنید .

    کد:
    #include "LPC17xx.h"
    #include "stdio.h"
    #include "string.h"
    
    
    
    //#define StartPin 23
    #define Num 23
    
    
    
    #define DHT22_DATA_BIT_COUNT 41
    float  lastHumidity;
    float  lastTemperature;
    
    
    
    
    
     
    
      
    void StartSignal(void){
    	
      int i, j, retryCount ;
      int currentTemperature=0;
      int currentHumidity=0;
      unsigned int bitTimes[DHT22_DATA_BIT_COUNT];
    			
        		    //return currentTime;
    				    for(i = 0; i < DHT22_DATA_BIT_COUNT; i++)
    						    {
    						    bitTimes[i] = 0;
    						    }
    
    
            //----------------------------------------------- Step 1: Send the activate pulse     ----------------------------------------
    
            // MCU send out start signal to DHT22 (1- pin is out put , 2- MCU pulls low for 18ms , 3- MCU pulls up for 20~40us).
            // and DHT22 send response signal to MCU(1-pin is input , 2- DTH22 pulls low 80us , 3- DHT22 pulls up 80us ).
            // If always signal high-voltage-level, it means DHT22 is not working properly, please check the electrical connection status.
    
    
    	          GPIO_SetDir(0, 1<< Num,1);   			 //Set Pin 0.23 As output 
    	          GPIO_ClearValue(0,0x800000);				 //pull down 0.23
                delay_ms(18);               // 18 ms wait (spec: at least 1ms)
    	          GPIO_SetValue(0,1<< Num);        //pull up 0.23
    
    
    							//=========Find the start of the ACK Pulse 
    							retryCount = 0;
    							do {
    												if (retryCount > 40) {
    													// (Spec is 20-40 us high)
                                err=1;
    														return err;
    													}
    												retryCount++;
    												Delay_us(1);
    						  	} while (GPIO_ReadValue(0)>> Num == 0xff);  // Exit on DHT22 pull low within 40us
    	
    
    
                   //=======check that Am2302 is pulls low for 80us
                  retryCount = 0;	
    							do {
    							if (retryCount > 40) {
                    // (Spec is 80 us, 40 * 2 == 80us)
    								err=2;
                    return err;
    							}
    							retryCount++;
    							Delay_us(2);
    							temp= GPIO_ReadValue(0)>> Num;
    							} while ((GPIO_ReadValue(0)>> Num)== 0x00); // Exit on DHT22 pull high within 80us
    							
    							
    
    
    							//===========check that Am2302 is pulls high for 80us 
    							retryCount = 0;
    			   
    							do {
    							if (retryCount > 40) {
                    //(Spec is 80 us, 40 * 2 == 80us)
    								err=3;
                    return err;
    							}
    							retryCount++;
    							Delay_us(2);
    							temp= GPIO_ReadValue(0)>> Num;
    					  } while ((GPIO_ReadValue(0)>> Num)== 0xff); // Exit on DHT22 pull low within 80us
    
    							
    
    			 //----------------------------------------------- Step 2: RHT22 send data to MCU    ----------------------------------------	
    
    
                  
                  //     Start bit -> low volage within 50us (actually could be anything from 35-75us)
                  //     0     -> high volage within 26-28us (actually could be 10-40us)
                  //     1     -> high volage within 70us (actually could be 60-85us)
    
    				         //============================ Read the 40 bit data stream
    										for (i = 0; i < 5; i++) {
    											for (j = 0; j < 8; j++) {
                              // Instead of relying on the data sheet, just wait while the DHT22 pin is low
    					    		          // We now wait between 1us to 75us
    					                     retryCount = 0;
    					                   do {
    											              if (retryCount > 75) {
    													              err=4;
                                            return err;
    											              }
    											               retryCount++;
    											               Delay_us(1);
    									              } while (GPIO_ReadValue(0)>> Num == 0x00);
     
    		
    		                        temp = GPIO_ReadValue(0)>> Num;		
                                if (GPIO_ReadValue(0)>> Num == 0xff) {  
    						                        bitTimes[i*8+j] = 1; // If pin is still high, bit value is a 1
                                } else { 
                                  bitTimes[i*8+j] = 0; // The bit value is a 0
                                }
         
                                      }
    				 }//end for
    							
    
                 // Second 16 bits is Temperature ===============================
    							
    								for(i = 0; i < 16; i++)
    										 {
    												 if(bitTimes[i + 17] > 11)
    													 {
    													 currentTemperature |= (1 << (15 - i));
    													 }
    										 }
    							
    										if ((currentTemperature & 0x8000)==0x8000) {    
    												lastTemperature = ((float)(currentTemperature & 0x7FFF) / 10.0) * -1.0;
    										} else {
    												lastTemperature = (float)(currentTemperature) / 10.0;
    										}
    }
    	
    
    	///////////////////////////////////////////////////////////main////////////////////////////////////////////////
    int main ( void )
    {							  																			 
     
    	
    	while ( 1 )
    	{
    StartSignal();
    		
    	}
    
    }
لطفا صبر کنید...
X