besFUNCTION(DHT11)
int pin;
VARIABLE Argument1;
besARGUMENTS("i")
&pin
besARGEND
VARIABLE Argument2;
VARIABLE Argument3;
unsigned long __refcount_;
LEFTVALUE Lval2;
LEFTVALUE Lval3;
Argument2 = besARGUMENT(2);
besLEFTVALUE(Argument2,Lval2);
besRELEASE(*Lval2);
*Lval2 = NULL;
Argument3 = besARGUMENT(3);
besLEFTVALUE(Argument3,Lval3);
besRELEASE(*Lval3);
*Lval3 = NULL;
*Lval2 = besNEWDOUBLE;
*Lval3 = besNEWDOUBLE;
wiringPiSetup();
int valid = 0;
int samples = 0;
while(valid == 0)
{
int dht11_dat[5] = { 0, 0, 0, 0, 0 };
uint8_t laststate = HIGH;
uint8_t counter = 0;
uint8_t j = 0, i;
float f; /* fahrenheit */
dht11_dat[0] = dht11_dat[1] = dht11_dat[2] = dht11_dat[3] = dht11_dat[4] = 0;
/* pull pin down for 18 milliseconds */
pinMode( pin, OUTPUT );
digitalWrite( pin, LOW );
delay( 18 );
/* then pull it up for 40 microseconds */
digitalWrite( pin, HIGH );
delayMicroseconds( 40 );
/* prepare to read the pin */
pinMode( pin, INPUT );
/* detect change and read data */
for ( i = 0; i < MAXTIMINGS; i++ )
{
counter = 0;
while ( digitalRead( pin ) == laststate )
{
counter++;
delayMicroseconds( 1 );
if ( counter == 255 )
{
break;
}
}
laststate = digitalRead( pin );
if ( counter == 255 )
break;
/* ignore first 3 transitions */
if ( (i >= 4) && (i % 2 == 0) )
{
/* shove each bit into the storage bytes */
dht11_dat[j / 8] <<= 1;
/* if ( counter > 16 ) */
if ( counter > 50 )
dht11_dat[j / 8] |= 1;
j++;
}
}
/*
* check we read 40 bits (8bit x 5 ) + verify checksum in the last byte
* print it out if data is good
*/
if ( (j >= 40) &&
(dht11_dat[4] == ( (dht11_dat[0] + dht11_dat[1] + dht11_dat[2] + dht11_dat[3]) & 0xFF) ) )
{
f = dht11_dat[2] * 9. / 5. + 32;
DOUBLEVALUE(*Lval2) = dht11_dat[0] + (dht11_dat[1] * .1);
DOUBLEVALUE(*Lval3) = dht11_dat[2] + (dht11_dat[3] * .1);
samples = samples + 1;
valid = 1;
}
delay( 1500 );
samples = samples + 1;
}
besRETURN_LONG(samples);
besEND