Feuchtesensor AM2302/DHT22

Seit längerem habe ich hier schon ein Feuchtesensor AM2302 herumliegen der auch unter dem Namen DHT22 bekannt ist. Ich habe verschiedene Codes, die für den DHT11 geschrieben waren, getestet, aber das passte alles nicht zu 100% zum AM2302. Und da ich den Arduino Code nicht gebrauchen konnte, habe ich mir die Mühe gemacht eine kleine Bibliothek dazu zu schrieben. Die gibt es unten zum download.

Aber erst mal eine kurze Beschreibung des AM2302. Dieser kann die Temperatur und die relative Luftfeuchtigkeit bestimmen mit einer Genauigkeit bei 25°C von +-1°C und +-2%RH. Da der AM2302 ziemlich günstig zu bekommen ist hat er natürlich keine atemberaubende Genauigkeit.

Angeschlossen wird der Sensor an einen x beliebigen IO Pin eines AVRs mit einem 4,7kOhm Pullup Widerstand.

am2302

Quelle: Datenblatt

Der Sensor hat ganz links den ersten Pin mit folgender Belegung:

  1. Vcc (3,3 - 5V)
  2. SDA
  3. NC
  4. GND

 

 

 

Schaltplan

Ein kurzen Schaltplan habe ich auch noch gebaut, sodass es relativ einfach sein sollte, das auch auf anderen AVRs um zu setzen.

Download

Die Software habe ich für einen Atmega8 bei 8MHz geschrieben. Das Makefile das dabei ist, ist einfach so aus Eclipse unter Debian exportiert. Daher muss der Code, mit großer Wahrscheinlichkeit, zum verwenden auf einem anderen System noch angepasst werden. Die Fusesbits, um den Atmega8 mit 8MHz zu betreiben, werden allerdings nicht gesetzt. Darüber hinaus müsst ihr mit Sicherheit noch den Programmer und Port im Makefile anpassen. Ich verwende die stk500v2 Variante am Port /dev/ttyACM0.

Jetzt aber genug der Beschreibungen hier ist der Code als git repository:

34 Antworten auf Feuchtesensor AM2302/DHT22

  1. Erik von Beeg Weiner sagt:

    hallo,

    Nur fallen ein Linien zu sagen "Dankeschön" an Sie für Ihre Gedanken und Quellcode mit uns Netizens. Sie präsentieren eine schöne Website.

    Außerdem zeigt eine Ihrer Grafiken als 3,5 V bis 5,5 V, während die aosong.com AM2302.pdf spec-Blatt zeigt 3,3 V bis 5,5 V Vdd, nur ein Tippfehler!

    Nochmals vielen Dank.

    Prost

    Erik von paar große Weiner
    Los Angeles, Kalifornien, USA

    • Kalle sagt:

      Hi Erik,

      thanks for your tip. I think think the voltage supply range ist from 3,3V to 5,5V.
      I found diveres datasheets. In one sheet is 3.5V and another is 3.3V.

      Kind regards,
      Kalle

  2. Stefan sagt:

    Hallo Kalle,

    danke für den Code. Habe ein LCD implementiert und funktioniert echt super.

    Grüsse vom Bodensee

  3. Martin sagt:

    Hallo!

    Ich hab Deinen Code entdeckt und versuche ihn gerade zu nutzen um die Temp und Feuchtigkeit auszulesen und auf einem Display zu zeigen. ich nutze den ATTiny2313. Ich bin da noch sehr neu drin und deshalb kenne ich mich noch nicht so gut aus. Beim Kompilieren bekomme ich ständig den Fehler "../am2302.c:70:2: error: lvalue required as left operand of assignment" an der Stelle:
    SENSOR_sda_low; // MCU start signal

    Leider komme ich hier nicht weiter. Kannst Du mir helfen?

    • Kalle sagt:

      Moin Martin,

      der Code ist von mir nicht direkt für den AtTiny2313 geschrieben worden. Dein Controller hat z.B. keinen PortC. Dieser ist aber in der am2302.h angegeben. Beim Atmega8 passt dies auch. Das heißt du musst die Pinbelegung auf deinen Controller anpassen.

      Darüber hinaus kann es sein, dass die UART Library nicht mit deinem µC funktioniert. Daher würde ich dir empfehlen, die von Peter Fleury zu nutzen. Dann musst du aber auch alle uart Befehle anpassen.

      Falls du damit Probleme hast, empfehle ich dir erst mal nur mit einem kleinen Hallo Welt Programm die UART Schnittstelle (Seriell) an zu sprechen und nach und nach erst den Code von mir mit ein zu fügen. Da gibt es auch genug Tutorials im Internet dazu.

      LG
      Kalle

      • Martin sagt:

        Hallo!

        Ich habe die Pins entsprechend angepasst. Leider das gleiche Problem. Wenn ich das richtig sehe, liegt das Problem im
        #define SENSOR_sda_low PIN_SENSOR &= ~(1 << SENSOR)

        • Kalle sagt:

          Hallo Martin,
          in der Zeile ist auf jeden Fall kein Fehler. Dies ist nur ein Makro.
          Schick mir am besten einmal per E-Mail (kalle@pgollor.de) dein Code, dann kann ich da mal rein schauen.

          Gruß
          Pascal

  4. Serge sagt:

    Hi,
    I tried to run your code (am2302.c) on ATTiny85, 1MHz, 3.3V, pin 3, pullup 10k.
    In order to make it working I was need to change:

    #define SENSOR_sda_low PIN_SENSOR &= ~(1 << SENSOR)

    to:

    #define SENSOR_sda_low PORT_SENSOR &= ~(1 << SENSOR)

    Hope it helps.
    Regards, Serge

  5. Gottfried Prandstetter sagt:

    Hallo!

    Der Code funktioniert grundsätzlich einwandfrei (ATMega88@8MHz). Bei nur etwas längerer Leitung (2m) zum Am2302 gibt es allerdings Probleme durch Reflektionen.

    Meine Abhilfe: Nach einem erkannten Flankenwechsel nicht sofort auf die nächste Flanke testen, sondern erst ein bisschen warten, bis sich die Datenleitung wieder beruhigt hat.

    Konkret: Vor Test "while(SENSOR_is_hi)" bzw. "while(SENSOR_is_low)" ein _delay_us(5) einfügen, siehe Code unten . Dann funktioniert's auch mit langen Leitungen!

    Danke & freundliche Grüße!

    /*
    * am2302.h
    *
    * Created on: 13.03.2013
    * Author: Pascal Gollor
    * web: http://www.pgollor.de
    *
    * Dieses Werk ist unter einer Creative Commons Lizenz vom Typ
    * Namensnennung - Nicht-kommerziell - Weitergabe unter gleichen Bedingungen 3.0 Deutschland zugänglich.
    * Um eine Kopie dieser Lizenz einzusehen, konsultieren Sie
    * http://creativecommons.org/licenses/by-nc-sa/3.0/de/ oder wenden Sie sich
    * brieflich an Creative Commons, 444 Castro Street, Suite 900, Mountain View, California, 94041, USA.
    *
    *
    *
    * AM2302/DHT22 (Temperatur und Luftfeuchtigkeitssensor)
    * _________
    * | -+-+- |
    * | +-+-+-+ |
    * | +-+-+-+ |
    * | -+-+- |
    * | +-+-+-+ |
    * |_________|
    * | | | |
    * 1 2 3 4
    *
    * 1. VCC (3 to 5V power)
    * 2. Data out (Pullup 4,7k)
    * 3. Not connected
    * 4. Ground
    *
    *
    * Error codes
    * 1: sensor sda bus not free
    * 2: timeout: bus master release time
    * 3: timeout: response to low time
    * 4: timeout: response to high time
    * 5: timeout: signal low timeout
    * 6: timeout: signal high timeout
    *
    * Read the datasheet for more information about the times.
    */

    #include "am2302.h"

    #include
    #include

    //#include "main.h"
    //#include "uart.h"

    #define SENSOR_sda_out DDR_SENSOR |= (1 << SENSOR)
    #define SENSOR_sda_in DDR_SENSOR &= ~(1 < hi in consequence of pullup
    #define SENSOR_sda_low PIN_SENSOR &= ~(1 << SENSOR)
    #define SENSOR_is_hi PIN_SENSOR & (1 << SENSOR)
    #define SENSOR_is_low !(PIN_SENSOR & (1 << SENSOR))

    uint8_t am2302(uint16_t *humidity, uint16_t *temp)
    {
    if (SENSOR_is_low)
    {
    // bus not free
    return 1;
    }

    SENSOR_sda_out;
    SENSOR_sda_low; // MCU start signal
    _delay_ms(10); // start signal (pull sda down for min 0.8ms and maximum 20ms)
    SENSOR_sda_in;

    // Bus master has released time min: 20us, typ: 30us, max: 200us
    uint8_t timeout = 200;
    _delay_us(5);
    while(SENSOR_is_hi) {_delay_us(1); if (!timeout--) {return 2;}}

    // AM2302 response signal min: 75us typ:80us max:85us
    timeout = 85;
    _delay_us(5);
    while(SENSOR_is_low) {_delay_us(1); if (!timeout--) {return 3;}} // response to low time
    timeout = 85;
    _delay_us(5);
    while(SENSOR_is_hi) {_delay_us(1); if (!timeout--) {return 4;}} // response to high time

    /*
    * time in us: min typ max
    * signal 0 high time: 22 26 30 (bit=0)
    * signal 1 high time: 68 70 75 (bit=1)
    * signal 0,1 down time: 48 50 55
    */

    uint8_t sensor_data[5]={0};
    for(uint8_t i = 0; i < 5; i++)
    {
    uint8_t sensor_byte = 0;
    for(uint8_t j = 1; j <= 8; j++) // get 8 bits from sensor
    {
    timeout = 55;
    _delay_us(5);
    while(SENSOR_is_low) {_delay_us(1); if (!timeout--) {return 5;}} // signal "0", "1" low time
    _delay_us(30);
    sensor_byte < bit=1 else bit=0
    {
    sensor_byte |= 1;
    timeout = 45; // 30us - 75us = 45us
    while(SENSOR_is_hi) {_delay_us(1); if (!timeout--) {return 6;}}
    }
    }
    sensor_data[i] = sensor_byte;
    }

    // checksum
    if ( ((sensor_data[0]+sensor_data[1]+sensor_data[2]+sensor_data[3]) & 0xff ) != sensor_data[4])
    {
    // debug output
    //printf("%b %b %b %b %b %b" CR, sensor_data[0], sensor_data[1], sensor_data[2], sensor_data[3], sensor_data[4], ((sensor_data[0]+sensor_data[1]+sensor_data[2]+sensor_data[3]) & 0xff ));
    return 7;
    }

    *humidity = (sensor_data[0]<<8) + sensor_data[1];
    *temp = (sensor_data[2]<<8) + sensor_data[3];

    return 0;
    }

    GP

  6. Michael Fritscher sagt:

    Danke für den Code, tut soweit 🙂

    Vielleicht wäre es gut vor

    while(SENSOR_is_hi) {_delay_us(1); if (!timeout--) {return 2;}}

    und nach

    sensor_data[i] = sensor_byte;
    }

    ein
    cli(); bzw. ein sei(); einzufügen - da geht es schließlich um µs, nicht das da ein IRQ reinfeuert (wenn es dumm läuft schafft der AVR in 30 µs bei 10 MHz nichtmal 1000 Befehle, zumal hier eine delay-funktion verwendet wird, die durch IRQs verlorene Zeit nicht bemerkt)

  7. Jörg sagt:

    Hallo Kalle,

    Danke für die großartige Zusammenfassung. Eine Frage für mich als Anfänger. Warum wird der4,7kOhm Widerstand zwischen Versorgungsspannung und Signalleitung gelegt? Das wird bei anderen Anwendungen nicht so gemacht.
    Danke
    Jörg

    • Kalle sagt:

      Moin Jörg,
      danke erst einmal. Der Widerstand ist ein sogenannter Pull UP Widerstand.
      Dieser zieht den Signalpin auf HIGH Level. Der Controller oder der Sensor ziehen diese Leitung auf LOW, wenn Daten gesendet werden.

      Ohne diesen Widerstand sollte der Sensor nicht funktionieren.
      Bei anderen Sensoren kann dies aber auch anders gelöst sein. Außerdem kommt es dabei auch immer auf die verwendete Schnittstelle an.
      Was für andere Anwendungen meinst du denn?

      Gruß
      Kalle

  8. Mirko sagt:

    Hallo Kalle,
    Danke für den Code, dass hat mir viel Zeit erspart. Allerdings muss ich meinem Vorredner Gottfried Prandstetter zustimmen, denn bei längerer Leitung (bei mir 10m) wurde falsch gemessen. Das heißt als 1.Bit wurde fälschlicherweise die "response to high"-Zeit angenommen, also immer 1. Das ganze lag daran, dass nach umstellen des Sensorports von Ausgang auf Eingang, es einen Moment dauert bis wieder High-Signal anliegt (Kapazität der Leitung). Und zwar so lange das die folgende while-Schleife einfach übersprungen wurde, weil noch Low gemessen wurde. Ich habe das ganze durch eine einfache while-Schleife gelöst, um auf High zu "warten" (kommt auf jeden Fall):

    SENSOR_sda_out;
    SENSOR_sda_low; // MCU start signal
    _delay_ms(20); // start signal (pull sda down for min 0.8ms and maximum 20ms)
    SENSOR_sda_in;

    // Auf High warten
    while(SENSOR_is_low);

    // Bus master has released time min: 20us, typ: 30us, max: 200us
    uint8_t timeout = 200;
    while(SENSOR_is_hi) {_delay_us(1); if (!timeout--) {return 2;}}

    Gruß
    Mirko

    • Kalle sagt:

      Moin Mirko,

      vielen Dank für die Untersuchung und die Lösung dazu.
      Wenn ich Zeit habe, werde ich das mit einpflegen.

      LG
      Kalle

  9. Steffen sagt:

    Hey

    hab eine Frage zum Programm. Kann man das Programm auch für einen DHT11 benutzen?? Weil die Datenübertragung ja bei beiden gleich funktioniert.

    Arbeite zur Zeit an einer Studienarbeit, wo ich einen DHT11 Sensor an einen Microcontroller(Atmega644P) anschließen muss.

    LG

    Steffen

    • Kalle sagt:

      Moin Stefan,
      ich habe es noch nicht mit einem DHT11 versucht, aber das sollte prinzipiell auch möglich sein. Es kann nur sein, dass dieser eine etwas andere Antwort sendet.

      Dazu müsstest du mal beide Datenblätter vergleichen.

      LG
      Kalle

  10. Jürgen Zinn sagt:

    Hallo,
    Ich hätte da gern mal'n Problem : Es wird viel über Code diskutiert, aber mein Problem ist sehr trivial : Ich habe kein Datenblatt AM2302 gefunden, wo definiert ist, wie die Dezimalwerte zu deuten sind. Was ist z.B 50% Feuchte (80h oder 32h) oder schlimmer,
    was ist -10 Grad, was 100 Grad C?? Das muss ich wissen, der Rest ist simpel.
    Wo kann ich das finden? Danke für jeden Hinweis

    • Kalle sagt:

      Hallo Jürgen,
      wenn ich dein Problem richtig verstanden habe, dann steht es serwohl im Datenblatt.
      Schua mal z.B. hier. Da gibt es ein Datenblatt in dem genau steht wie die Daten zu interpretieren sind. Und in jedem Code Beispiel sollte man das auch finden.

      LG
      Kalle

  11. posti sagt:

    Hi

    Durch Deinen Code am2302.c im Zip konnte ich ersehen, wie der Sensor die Daten ausspuckt.
    Da ich keinen AVR oder Arduino nutze, kam ich noch nicht recht weiter.
    *humidity = (sensor_data[0]<<8) + sensor_data[1];
    *temp = (sensor_data[2]<<8) + sensor_data[3];

    lässt erahnen, daß die ersten zwei Byte die Feuchte, die zweiten zwei Byte die Temperatur und das 5.te Byte (Nummer 4) die Prüfsumme sind.
    Was es mit 6-8 auf sich hat, ist noch unklar, wird aber akut auch nicht benötigt.

    Besten Dank für Deinen Code!

    • Kalle sagt:

      Hallo,
      also wie gesagt. Schau bitte in das Datenblatt das ich in meinem letzen Kommentar erwähnt habe.
      Dort ist wirklich alles aufgeschlüsselt. Die letzen Bytes sollten die Prüfsumme sein. Die ist schon sehr wichtig.

      LG
      Kalle

  12. Ferdinand sagt:

    Hallo Kalle,
    vielen Dank für deinen Blogeintrag und den Sourcecode zum AM2302. Ich habe den Sensor bereits auf einem Arduino laufen lassen und versuche es gerade auf einem ATmega8A.
    Das Programm läuft auch grundsätzlich durch. Allerdings bekomme ich bei allen 5 Bytes 0xff als Antwort. Im Datenblatt steht, wenn das Signal durchgehend VCC ist, stimmt etwas mit der Verdrahtung nicht. Wenn das der Fall wäre, würde aber das Programm nicht bis zum Prüfen der Checksumme durchkommen, oder?
    Danke für deine Hilfe,
    VG, Ferdinand

    • Kalle sagt:

      Moin Ferdinand,

      kann sein, dass deine Leitung zum AM2302 vielleicht zu lang ist? Wenn ja, dann schau mal in den anderen Kommentaren nach.
      Habe es leider noch nicht geschafft, die Lösung mit ein zu bauen.

      Eine andere Möglichkeit wäre, dass du zu schnell hintereinander die Daten abfragst. Der AM2302 braucht etwas Zeit.
      Ich nehme z.B. meist einfach ein Wert die Sekunde. Das funktioniert bei mir bisher sehr gut.

      Ansonsten könntest du es mal mit einem Blockkondensator (100nF) am Atmega8A am Pin an dem der AM2302 angeschlossen ist versuchen.
      Hast du ansonsten deinen Atmega8A auch mit Blockkondensatoren versorgt?
      Wenn das alles nicht hilft, könnte es vielleicht sein, dass dein Takt vom Atmega zu langsam oder zu schnell ist. Es ist sehr schwierig da ins dunkle rein zu raten, ohne die Schaltung vor mir liegen zu haben.

      LG
      Kalle

      • Ferdinand sagt:

        Hallo Kalle,
        danke für deine Antwort. Hier mehr Details:
        >>Die Leitung ist extrem kurz, alles ist auf einem Steckbrett aufgebaut.
        >>Ich polle den AM2302 momentan alle 5 Sekunden. Im Datenblatt ist von 1s die Rede, um den Sensor stabil zu bekommen. Ich versuche es mal mit längerem zeitlichem Abstand.
        >>Die Datenabfrage geht sehr schnell, im Datenblatt wird ja dazu geraten, dass alle >Den Blockkondensator habe ich, wie laut Datenblatt empfohlen, zwischen VDD und GND eingefügt. Soll der woanders hin?
        >>Den MCU habe ich anhand der Anleitung des AVR-Tutorials auf http://www.mikrocontroller.net aufgebaut (siehe http://www.mikrocontroller.net/articles/AVR-Tutorial:_Equipment unter "Selbstbau").
        >>Ich nutze UART zum Debuggen, also müsste das mit den Timings des Taktes auch passen. Meinen Code habe ich übrigens in einer weiteren Frage im Forum (http://www.mikrocontroller.net/topic/354190#3950214) gepostet. Das ist der deinige, mit zusätzlichen Kommentaren zu meinem Verständnis und Port-Anpassungen versehen.
        >>Wenn es hilft, kann ich ein Foto meiner Schaltung posten. Es ist allerdings mein erster Gehversuch in die Richtung µC-Programmierung 😉
        Danke für deine Zeit,
        VG, Ferdinand

  13. Gottfried Prandstetter sagt:

    Hallo!
    Das von mir und Mirko beschriebene Problem mit falschem ersten Bit bei längeren Leitungen ist zwar durch das Einfügen von Delay-Loops lösbar, aber nicht der Weisheit letzter Schluss.
    Der Startcode schaut so aus:
    SENSOR_sda_out;
    SENSOR_sda_low; // MCU start signal
    ....
    Wenn man die beiden Defines auflöst und auch die Pin-defines aus am2302.h ersetzt:
    #define DDR_SENSOR DDRB
    #define PORT_SENSOR PORTB
    #define PIN_SENSOR PINB
    #define SENSOR PB7

    ergibt das diesen Code:
    DDR_B |= (1 <<PB7)
    PINB &= ~(1 << PB7)
    ...
    In der zweiten Zeile erfolgt eine ZUWEISUNG an ein Port-IN Register, das nur lesend benutzt werden darf!!!
    In der Folge entsteht ein Glitch und o.a. Problem. Heißen sollte es natürlich
    PORTB &= ~(1 << PB7)
    Warum es trotzdem soweit funktioniert ist damit erklärbar, dass das Bit schon immer auf Null steht und auch nie verändert wird. Die zweite Zeile ist also redundant und sollte entweder korrigiert oder entfernt werden.

    lg GP

    • Kalle sagt:

      Hallo GP,
      vielen Dank für deine Antwort und deine Mühen. Solche Fehler passieren leider immer wieder.
      Ich werde die Zeile gleich mal im Code abändern, sodass in das Output Register geschrieben wird.

      LG
      Kalle

  14. Ronny sagt:

    Hi! Ich hab auch diese lib ausprobiert und leider ein Problem: ich bekomme immer error 2:
    ATTINY85v 10PU mit DHT22 und angepasstem Code, uart+fifo komplett entfernt, dafür blinkt eine LED den Fehlercode oder die Temperatur. Egal ob ich 8MHz oder 1MHz internen Takt nutze, es klappt nicht. Das Problem hatte ich auch, wenn ich den ATTINY als Arduino genutzt habe. Der Tiny funktioniert beim Minimalprogramm (blinkende LED) im richtigen Timing und das DHT22 klappt an einem Arduino Uno auch, scheint beides also generell ok zu sein.
    Ich versuche seit nunmehr einem Jahr, das Problem zu finden. Inzwischen habe ich mehrere ATTINY85 (10PU und 20PU) probiert und mehrere DHT22. Ich habe es bisher immer mit Arduino-Umgebung für tiny probiert, mit reinem AVR-Code will es aber auch nicht 🙁

    Den Code habe ich hier: http://www.ronnylindner.de/wp-content/uploads/2015/05/dht22_problem.tar_.gz
    nach dem runterladen muss das tar_ in tar geändert werden, WordPress scheint es nicht anders zu wollen...

    Weiß jemand Rat?

    • Kalle sagt:

      Moin,
      leider habe ich gerade nicht die Zeit den Code selbst am Attiny zu testen aber überprüf doch mal bitte folgendes:

      - Einfach nur ein Minimalprogramm in c (ohne Arduino) wo du sowas wie:
      PORTB = 0b00001000;
      _delay_ms(100);
      PORTB = 0b00000000;
      _delay_ms(900);
      Und dann überprüfen ob die Frequenz passt.

      - Verifiziere bitte ob F_CPU richtig gesetzt ist.

      - Ansonsten ist es nicht möglich einen Atmega zu verwenden anstatt einem Attiny?

      LG
      Kalle

      • Ronny sagt:

        die fuses hatte ich schon überprüft. Ich habe ein einfaches blink-Programm geschrieben, das eine Sekunde delay drin hat - passt.
        Der Fehlercode blinkt auch richtig, ich habe 300ms an, 300ms aus - testweise hatte ich auch fuses und F_CPU unterschiedlich, da waren die Blinkzeiten dann entsprechend länger oder kürzer

      • Ronny sagt:

        ach, die eine Frage hatte ich übersehen... ich will mein Projekt möglichst minimal haben - sonst kann ich auch einen Arduino Nano nehmen, mit dem es klappen würde. Der attiny hat nur 8 Pins und ist somit sehr viel kleiner als ein atmega.

    • Kalle sagt:

      Moin,
      was ich vergessen hatte gestern Abend zu erwähnen. Teste den code bitte mal ohne Optimierung.

      LG
      Kalle

      • Ronny sagt:

        mit -O0 geht es auch nicht, bleibt bei error 2.
        Bist du so nett und fragst den User weiter oben, der es mit attiny85 geschafft hat per Mail, ob er mir helfen mag - meine Mailadresse darfst weitergeben an ihn. Dankeschön 🙂

  15. Ronny sagt:

    es ist verrückt... es klappt nun auch bei mir, die Software ist (wie so oft) unschuldig: ich hatte den GND-Anschluss des AM2302 in der Versorgungsschiene des Breadboard auf VCC verbunden 😮
    Danach kam (auch nach Tausch des Sensors) immer Fehlercode 1 - auch wenn ich nur einen ganz kleinen Widerstand statt dem 4k7 genommen habe. Als ich dann VCC direkt mit auf SDA gelegt hatte, kam Fehlercode 2. Nach dem Tausch des vorherigen Stromkabels kommt nun kein Fehler mehr sondern die LED leuchtet etwa 2,5 Sekunden (entspricht 25°C) bzw. 5 Sekunden für 50% Luftfeuchtigkeit 🙂 Endlich klappts, blödes Breadboard!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *