سلام دوستان
من میخوام دما رو از رو سنسور 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();
}
}