door mvdbro » 31 mei 2012, 15:56
Ik heb zelf een DHT11, is volgens mij gelijk aan de DHT22. Ik weet niet of het one-wire protocol universeel is. Ik gebruik de code die als voorbeeld op de website stond waar ik de DHT11 heb gekocht. De code heb ik aangepast voor de Nodo zodat deze via de terminal wordt uitgestuurd als tekst. De DHT zit bij mij aangesloten op digital pin 7.
/*********************************************************************************************\
* dht 11 functies
\*********************************************************************************************/
#define DHT11_PIN 7 // digital port 7
void dhtread()
{
byte dht11_dat[5];
byte dht11_in;
byte i;
DDRD |= _BV(DHT11_PIN);
PORTD |= _BV(DHT11_PIN);
// start condition
// 1. pull-down i/o pin from 18ms
PORTD &= ~_BV(DHT11_PIN);
delay(18);
PORTD |= _BV(DHT11_PIN);
delayMicroseconds(40);
DDRD &= ~_BV(DHT11_PIN);
delayMicroseconds(40);
dht11_in = PIND & _BV(DHT11_PIN);
if(dht11_in)
{
sprintf(TempString,"%s","dht11 E1");
PrintTerminal(TempString);
return;
}
delayMicroseconds(80);
dht11_in = PIND & _BV(DHT11_PIN);
if(!dht11_in)
{
sprintf(TempString,"%s","dht11 E2");
PrintTerminal(TempString);
return;
}
delayMicroseconds(80);// now ready for data reception
for (i=0; i<5; i++)
dht11_dat[i] = read_dht11_dat();
DDRD |= _BV(DHT11_PIN);
PORTD |= _BV(DHT11_PIN);
byte dht11_check_sum = dht11_dat[0]+dht11_dat[1]+dht11_dat[2]+dht11_dat[3];// check check_sum
if(dht11_dat[4]!= dht11_check_sum)
{
sprintf(TempString,"%s","dht11 E3");
PrintTerminal(TempString);
}
sprintf(TempString,"%s","Humidity:");
strcat(TempString,int2str(dht11_dat[0]));
PrintTerminal(TempString);
sprintf(TempString,"%s","Temperature:");
strcat(TempString,int2str(dht11_dat[2]));
PrintTerminal(TempString);
}
byte read_dht11_dat()
{
byte i = 0;
byte result=0;
for(i=0; i< 8; i++)
{
while(!(PIND & _BV(DHT11_PIN))); // wait for 50us
delayMicroseconds(30);
if(PIND & _BV(DHT11_PIN))
result |=(1<<(7-i));
while((PIND & _BV(DHT11_PIN))); // wait '1' finish
}
return result;
}
Vervolgens heb je een call nodig om dit in een Nodo variable te stoppen. Dit heb ik nog niet gerealiseerd, maar het moet volgens mij met onderstaand commando:
ProcessEvent(AnalogInt2event(UserVar[x], value, CMD_VARIABLE_EVENT), VALUE_DIRECTION_INTERNAL, VALUE_SOURCE_VARIABLE, 0, 0);
waarbij x de variable is die je wilt gebruiken en value moet zijn ingesteld op de meetwaarde.
In mijn geval zou dat b.v. dht11_dat[0] zijn.
de code kun je opnemen in de volgende functie in het tabje userplugin:
void UserPlugin_Periodically()
Helaas draait het dan elke seconde en dat is denk ik teveel. Het lijkt me handig als de Nodo programmeurs ook een functie call maken die b.v. elke minuut draait.