v žití ze mě občas vypadne i to, z čeho mohou mít užitek i jiní a tady Vám to chci dát
DHT11 code for Arduino
Doma celkem zápasím s vlhkostí a na začátku je vždy dobré poznat svého nepřitele. V mém případě ho změřit a to po celém bytě. Pro to jsem si koupil hromádku teplotních sensorů s měřením vlhkosti DHT11. Abych měl za málo peněz hodně legrace, zvolil jsem pro měření modulek Arduino Pro Mini.
Abych neobjevoval znovu Ameriku, zagooglil jsem abych zjistil jestli už něco neexistuje. A ono existuje od Sunfoundera verze pro Rapsbery-Pi. Zaradoval jsem se a kód šel po malém štouchnutí hned přeložit a spustit, jenže to bylo asi tak vše. Při kouknutí na metodu měření vyšlo najevo že tento algoritmus může běžet s MCU cca na 80 Mhz a výše (což je pro Raps.-Pí s 1,2 Ghz úplná malina), ale pro Arduino s 8 Mhz tudy cesta nevede.
Bez kecání ten správný způsob je tady. Lze použít libovolný datový pin, takže k jednomu Pro-Mini lze připojit zároveň klidně 10 sensorů DHT11
/* DHT11 sensor library */
/* MF 2017 www.emuf.cz */
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
#define DHTPIN 9 /* Data pin of DHT11 */
void loop() {
// put your main code here, to run repeatedly:
long int data;
Serial.println( "DHT11 Temperature a humidity app" );
while ( 1 )
{
delay( 2000 ); /* wait 1sec to refresh */
if ((data = dht11_get_data(DHTPIN)) != 0)
dht11_print_data(data);
else
Serial.println("Sensor is not responding");
delay( 2000 ); /* wait 1sec to refresh */;
}
}
/* Returned data dormat of data is per 8bits [ humidity_decimal, humidity_integral, temp_decimal, temp_integral ] */
long int dht11_get_data(uint8_t dht_pin)
{
#define MAXPULSES_COUNT 45
long int data;
uint8_t pulses_time[MAXPULSES_COUNT];
uint8_t crc;
int pulse_time;
uint8_t pulse_id = 0;
uint8_t valid_pulses = 0, i = 0;
/* Set pin to output */
pinMode( dht_pin, OUTPUT );
/* Grab the line to wake up DHT11 */
digitalWrite( dht_pin, LOW );
/* Hold line down 18ms by the spec */
delay( 18 );
/* switch pin to input with pullup resistor */
pinMode( dht_pin, INPUT_PULLUP );
/* To be be sure that DHT take contol over line (takes about 12us) */
delayMicroseconds( 20 );
/* Measuse incoming pulses withs for pulses */
while ((pulse_time = pulseIn( dht_pin, HIGH, 200)) > 0 && pulse_id < MAXPULSES_COUNT)
{
/* All code here must be executed within 50us (pulseIn fucntion included)
=> do not add any extra code in this loop */
pulses_time[pulse_id] = pulse_time;
pulse_id++;
}
/* Process measured data */
if (pulse_id > 0)
{ /* proccess pulses */
while ( i++ < (pulse_id - 1)) /* i++ to skip the first */
{
pulse_time = pulses_time[i];
if (i <= 32)
{ /* pulse belongs to data */
data <<= 1;
data |= ( pulse_time > 50 && pulse_time < 100 )?1:0;
valid_pulses++;
}
else
{ /* pulse belongs to CRC */
crc <<= 1;
crc |= ( pulse_time > 50 && pulse_time < 100 )?1:0;
valid_pulses++;
}
}
/* Check CRC and validity */
if ( (valid_pulses == 40)
&& (crc == ( ((data >> 24) & 0xff) + ((data >> 16) & 0xff) + ((data >> 8) & 0xff) + (data & 0xff)))
)
{ /* data valid */
return data;
} else {
/* data invalid */
return 0;
}
}
else
{ /* dht11 is not responding */
return 0;
}
}
void dht11_print_data(long int data)
{
Serial.print( "Vlhkost:" );
Serial.print(data >> 24); Serial.print('.'); Serial.print((data >> 16) & 0xff);
Serial.print( " teplota:" );
Serial.print((data >> 8) & 0xff); Serial.print('.'); Serial.println(data & 0xff);
}
Odpovědět
Neboj se a klidně sděl svůj názor ...
|
|