2023
HOME

AVR-Programmierung und Minimalismus - ISP-Programmer
ATtiny85-DHT-Minimum
Code-Recycling: Arduino-Sketch "Daten im Gänsemarsch" für ATTiny85 angepasst

Display mit 48x30 ZeichenDer preiswerte Sensor DHT11 ist spezialisiert auf die zwei Messgrößen Temperatur und relative Luftfeuchte.

Ein ATTiny85 in seiner Erscheinung als puristischer Acht-Beiner nimmt den alten Aurduino-Sketch aus dem Jahr 2015 auf und liefert die gewünschten Messwerte.

Die Programmierung erfolgt dabei in der bekannten IDE des Arduino mit Hilfe des Arduino Uno, der lediglich zur In-System-Programmierung (ISP) dient. Der Beitrag ATtiny85-Minimum auf dieser Seite zeigt wie das funktionieren kann. Es werden zunächst alle dortigen Bibliotheken und Einstellungen verwendet.

Die Messdaten stehen dann an PIN 6 des ATTiny als serieller Datenstrom mit 9600 Baud zur Weiterverbreitung bereit. Schließt man daran ein serielles Terminalprogramm an, so laufen die Daten eines seltenen Sonnentages im Februar 2023 entsprechend ein. Auch der Serielle Monitor der IDE kann die Daten anzeigen, wenn der COM auf den zusätzlichen seriellen Adapter umgestellt ist.

Display mit 48x30 Zeichen


												

Software reloaded
Der Arduino-Sketch fällt kürzer aus, weil die damalige eigene Routine mypulseIn entfallen kann, da das Problem der Bibliothek mit dem Timeout aus dieser Zeit nicht mehr existiert. Die Anpassungen finden somit nur im oberen Bereich des Sketches statt und betreffen die serielle Ausgabe und die zu verwendenden Anschlüsse. Aus dem Listing ist ersichtlich, dass nach dem hochladen mittels ISP der ATTiny85 folgende Anschlüsse verwendet:

Pin 8 Vcc 5 Volt
Pin 4 Gnd Masse
Pin 6 (PB) TX Serial
Pin 2 (PB) DHT Sensor

Der Sketch verwendet 2790 Bytes (34%) des Programmspeicherplatzes. Das Maximum sind 8192 Bytes.


															
// H.-J. Berndt 2015 auf www.hjberndt.de
// DHT11-Sensor mit 1-Draht-Datenprotokoll
// ohne Bibliotheken abfragen
// Reloaded 2023 für ATtiny85 mit SoftSerial

#include <SoftwareSerial.h>
#define RX        0     //PB0 Pin 5: Receive Serial
#define TX        1     //PB1 Pin 6: Send Serial

SoftwareSerial Serial(RX, TX); 

#define DHT_PORT 3      // PB3 Pin 2  

int   feuchte,     temperatur;
char sfeuchte[10],stemperatur[10];

void setup(){
  Serial.begin(9600);
  Serial.println("DHT11 Messung.");
  delay(1000);
}

void loop()
{dht11(DHT_PORT);
 Serial.print("DHT11 Luftfeuchte[%]/Temperatur[C]: ");
 Serial.print(sfeuchte);
 Serial.print("/");Serial.println(stemperatur);
 delay(1000);
}

void dht11(int pin)
{int bitcnt=7,ix=0; uint8_t Byte[5];
 for(int i=0;i<5;i++)Byte[i]=0; 
 pinMode(pin, OUTPUT); // REQUEST SAMPLE
 digitalWrite(pin, LOW); delay(18);
 digitalWrite(pin, HIGH);delayMicroseconds(30);
 pinMode(pin, INPUT);
 pulseIn(pin,HIGH,200); // ACKNOWLEDGE ~ 70 us
 for (int i=0; i<40; i++) // READ OUTPUT - 40 BITS = 5 BYTE 
 {if (pulseIn(pin,HIGH,200) > 40) Byte[ix] |= (1 << bitcnt);
  if (--bitcnt < 0)// next byte
  {bitcnt = 7;    // restart
   ix++;   
  }
 }
 feuchte    = Byte[0]; //BYTE[1] bei DHT11 immer 0
 temperatur = Byte[2]; //BYTE[3] bei DHT11 immer 0
 if (Byte[4] != Byte[0]+Byte[2]){feuchte=88;temperatur=88;}
 itoa(feuchte,sfeuchte,9);
 itoa(temperatur,stemperatur,9);
}

Wird das Timeout von 200 us beim Aufruf pulseIn weggelassen, kehrt der Code erst nach sehr langer Zeit wieder zurück, falls der Anschluss des DHT nicht korrekt ist.


															

															

Software reloaded für ATTinyCore
Die Arduino IDE Legacy bleibt unverändert verfügbar, auch wenn die Entwicklung inzwischen bei der Version 2 angekommen ist. Um sich Inkompatibilitäten mit alter Software zu ersparen, kann es sinnvoll sein auch eine solche Version mit der Nummer 1.8.19 installiert zu halten. Auch die Hardwareunterstützung der IDE wandelt sich ständig und so existiert für die ATTiny-Serie ein ATTinyCore, der die Anpassung von Arduino-Code nochmals erleichtert, falls überhaupt nötig. Die folgenden Einstellungen gelten für den weiter unten gezeigten Sketch und ATTinyCore-Anbindung:

So funktioniert die Serial-Ausgabe ohne Änderung oder explizite Einbindung von SoftSerial sofort. Am ATTiny85 ist die Leitung TX mit PIN 5 zu verbinden. Der Kern des Sketches für den DHT11 bleibt gleich und verkürzt sich insgesamt.

Der Sketch verwendet 2100 Bytes (25%) des Programmspeicherplatzes.

// DHT11-Sensor mit 1-Draht-Datenprotokoll
// ohne Bibliotheken abfragen
// http://www.hjberndt.de/soft/arddht11.html
// Reloaded 2023 für ATtiny85 und ATTinyCore

#define DHT_PORT 3      // PB3 Pin 2  
//      TX_PIN   5 Serial default t85
int   feuchte,     temperatur;
char sfeuchte[10],stemperatur[10];

void setup(){
  Serial.begin(9600); // TX-Pin 5
  Serial.println("DHT11 Messung.");
  delay(1000);
}

void loop()
{dht11(DHT_PORT);
 Serial.print("DHT11 Luftfeuchte[%]/Temperatur[C]: ");
 Serial.print(sfeuchte);
 Serial.print("/");Serial.println(stemperatur);
 delay(1000);
}

void dht11(int pin)
{int bitcnt=7,ix=0; uint8_t Byte[5];
 for(int i=0;i<5;i++)Byte[i]=0; 
 pinMode(pin, OUTPUT); // REQUEST SAMPLE
 digitalWrite(pin, LOW); delay(18);
 digitalWrite(pin, HIGH);delayMicroseconds(30);
 pinMode(pin, INPUT);
 pulseIn(pin,HIGH,200); // ACKNOWLEDGE ~ 70 us
 for (int i=0; i<40; i++) // READ OUTPUT - 40 BITS = 5 BYTE 
 {if (pulseIn(pin,HIGH,200) > 40) Byte[ix] |= (1 << bitcnt);
  if (--bitcnt < 0)// next byte
  {bitcnt = 7;    // restart
   ix++;   
  }
 }
 feuchte    = Byte[0]; //BYTE[1] bei DHT11 immer 0
 temperatur = Byte[2]; //BYTE[3] bei DHT11 immer 0
 if (Byte[4] != Byte[0]+Byte[2]){feuchte=66;temperatur=66;}
 itoa(feuchte,sfeuchte,9);
 itoa(temperatur,stemperatur,9);
}

Dieser DHT11 liefert nur ganzzahlige Messwerte und darum ist die Berechnung der Checksumme besonders einfach gehalten. Im Fehlerfall wird für beide Werte eine 66 zurückgegeben. Wer alternative Wege gehen möchte findet unter DHT11 und DHT22 Luftfeuchtigkeitsmodule | DevXplained eine Gegenüberstellung mit nützlichen Hinweisen.


ATtiny85 Assembler 8-Byte-Blink
ATtiny85 als Compact-Interface
ATtiny88 als Compact-Interface
Mehr Software

.
Startseite Bücher Software Digital RTV Musik Kontakt

Für Inhalt und weitere Verzweigung externer Links sind die Betreiber der dortigen Seiten verantwortlich - H.-J. Berndt