

Der Temperatursensor DHT22 misst die Daten, sie werden auf der SD-Karte des Ethernet-Shields gespeichert und können im Browser verarbeitet werden.
So sieht es aus:


Der Sensor DHT22 misst die Temperatur und die Luftfeuchtigkeit. Das hier verwendete Bauteil besitzt drei Anschlüsse.
Die Version mit vier Pins muss in der Reihenfolge 5V → Daten (Pin) → leer → GND geschaltet werden.

Für diese Anleitung benötigst du ein sogenanntes „Shield“, eine Platine, die einfach auf den Arduino aufgesteckt wird. Auf ihr befindet sich ein LAN-Anschluss (RJ45). Alle digitalen und analogen Anschlüsse stehen auch weiterhin zur Verfügung.



Benötigte Bauteile:
- RTC-Modul
- Ethernet-Shield mit SD-Karten-Modul
- Leitungsdrähte
Baue die Schaltung auf.
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Für das Programm brauchst du eine freie IP-Adresse und eine freie MAC-Adresse in deinem lokalen Netzwerk.
Im Regelfall befindet sich in einem lokalen Netzwerk ein DHCP-Server, der jedem Gerät im Netzwerk automatisch eine IP-Adresse zuteilt. Im Programm wird eine über DHCP vergebene Adresse verwendet.

Wenn du eine ➨statische IP verwenden willst:

Wenn die Temperaturmessung über einenz längeren Zeitraum (mehrere Tage) eingesetzt werden soll, empfiehlt sich die Vergabe einer festen IP-Adresse, weil nach der sogenannten „leasetime“ die IP wieder neu vergeben wird.
➨ Weitere Informationen
Die MAC-Adresse ist die Hardware-Adresse jeder einzelnen Netzwerkschnittstelle (LAN oder WLAN), mit der jedes Gerät im Netzwerk eindeutig identifiziert werden kann.
Sie besteht aus sechs Bytes in hexadezimaler Schreibweise, die durch „:“ oder „-“ getrennt werden.
Du kannst die im Programm verwendete „erfundene“ MAC-Adresse übernehmen: Die Gefahr, dass sich ein Gerät mit der gleichen MAC-Adresse im Netzwerk befindet, ist äußerst gering.
Benötigte Bibliotheken:
Arduino IDE 1.8x:
Sketch → Bibliothek einbinden → Bibliotheken verwalten




Arduino IDE 2.x:
Binde die benötigten Bibliotheken ein und lege die Variablen fest.:
# include <Ethernet.h>
# include <SimpleDHT.h>
# include <RTClib.h>
# include <SdFat.h>
// Bezeichnung der SD-Karte
SdFat SD;
// Bezeichnung der Textdatei
File Messung;
// Datenpin für das SD-Kartenmodul
int DatenPin = 4;
// Name des RTC-Moduls
RTC_DS3231 rtc;
int SENSOR_DHT22 = 8;
// Namen des Sensors (dht22)
SimpleDHT22 dht22(SENSOR_DHT22);
// MAC-Adresse und IP definieren
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
// festeIP = false -> IP-Adresse über DHCP vergeben
bool festeIP = true;
// feste IP
IPAddress ip(192, 168, 1, 200);
// Name des Servers vergeben
EthernetServer server(80);
// Intervall in Millisekunden
// 600000 = 10 Minuten
// 3600000 = 60 Minuten
const long Intervall = 600000;
const unsigned int Minuten = Intervall/60000;
// Start der Zeitmessung
unsigned long StartZeit = 0;
Der setup-Teil. Beachte die Kommentare.
void setup()
{
// RTC-Modul starten
rtc.begin();
/*
wenn Datum und Zeit nicht korrekt -> Datum/Zeit setzen
Jahr, Monat, Tag, Stunde, Minute, Sekunde
keine führende 0 setzen
Beispiel:
rtc.adjust(DateTime(2021, 3, 4, 17, 12, 30));
*/
// rtc.adjust(DateTime(2021, 3, 4, 17, 12, 30));
Serial.begin(9600);
// auf serielle Verbindung warten
while (!Serial) {;}
// Ethernet starten feste IP
if (festeIP) Ethernet.begin(mac, ip);
// Ethernet starten DHCP
else Ethernet.begin(mac);
// Server starten
server.begin();
Serial.begin(9600);
// zur Kontrolle IP-Adresse anzeigen
// localIP -> Adresse, die im Browser eingegeben wird
Serial.println(Ethernet.localIP());
SD.begin(DatenPin);
}
Der loop-Teil. Beachte die Kommentare.
void loop()
{
String Auswertung = "";
float Temperatur;
float Luftfeuchtigkeit;
// auf Clienten warten ...
EthernetClient Client = Server.available();
// abgelaufene Zeit ermitteln
unsigned long VerstricheneZeit = millis();
// neue Messung und speichern, wenn das Zeitintervall erreicht ist
if (VerstricheneZeit - StartZeit >= Intervall)
{
// StartZeit zurücksetzen
StartZeit = VerstricheneZeit;
// Temperatur und Zeit messen
dht22.read2(&Temperatur, &Luftfeuchtigkeit, NULL);
DateTime aktuell = rtc.now();
// in Datei speichern
Messung = SD.open("Messung.txt", FILE_WRITE);
if (Messung)
{
char Datum[] = "DD.MM.YYYY";
Messung.print(aktuell.toString(Datum));
// Zeit schreiben
char Zeit[] = " Uhrzeit: hh:mm:ss";
Messung.println(aktuell.toString(Zeit));
Messung.print(F(" | "));
Messung.println(Temperatur);
Messung.print(F(" °C | "));
Messung.println(Luftfeuchtigkeit);
Messung.print(F("%"));
Messung.println(F("<br>"));
// Datei schließen
Messung.close();
}
}
// neue Anfrage
if (Client)
{
// solange der Client verbunden ist ...
while (Client.connected())
{
if (Client.available())
{
char Zeichen = Client.read();
Auswertung += Zeichen;
// \n = Seite vom Clienten vollständig geladen
if (Zeichen == '\n')
{
// HTTP-Anforderung senden
Client.println(F("HTTP/1.1 200 OK"));
Client.println(F("Content-Type: text/html"));
// Leerzeile zwingend erforderlich
Client.println();
/*
HTML-Seite aufbauen
die folgenden Anweisungen müssen
mit print oder println gesendet werden
println "verschönert" den Quelltext
(jede Anweisung in einer eigenen Zeile)
*/
Client.println(F("<!doctype html>"));
Client.println(F("<html>"));
Client.println(F("<body>"));
// Daten speichern
if (Auswertung.indexOf("s") > 0) {
dht22.read2(&Temperatur, &Luftfeuchtigkeit, NULL);
DateTime aktuell = rtc.now();
Messung = SD.open("Messung.txt", FILE_WRITE);
if (Messung) {
char Datum[] = "DD.MM.YYYY";
Messung.print(aktuell.toString(Datum));
// Zeit schreiben
char Zeit[] = " Uhrzeit: hh:mm:ss";
Messung.println(aktuell.toString(Zeit));
Messung.print(F(" | "));
Messung.println(Temperatur);
Messung.print(F(" °C | "));
Messung.println(Luftfeuchtigkeit);
Messung.print(F("%<br>"));
// Datei schließen
Messung.close();
}
}
if (Auswertung.indexOf("l") > 0) {
Messung = SD.open("Messung.txt");
if (Messung)
{
// solange sich Zeilen in der Datei befinden ...
while (Messung.available())
{
// ... werden sie gelesen und auf der Webseite ausgegeben
Client.write(Messung.read());
}
// Datei schließen
Messung.close();
}
}
// Datei löschen
if (Auswertung.indexOf("e") > 0)
{
if (SD.exists("Messung.txt"))
{
// Datei entfernen
SD.remove("Messung.txt");
Client.println(F("Datei entfernt!<br>"));
}
}
Client.println(F("<hr />Intervall:"));
Client.println(Minuten);
Client.println(F("Minuten<br><hr /> "));
// Button anzeigen und formatieren
Client.print(F("<input type='button' onClick=\"location.href='l'\ value='lesen'>"));
Client.println(F("<input type='button' onClick=\"location.href='s'\" value='schreiben'>"));
Client.print(F("<input type='button' "));
Client.println(F(" onClick=\"location.href='e'\" value='entfernen'>"));
Client.println(F(" value='entfernen'></body></html>"));
// Zeit, um die Antwort zu übertragen
delay(1);
// Verbindung beenden
Client.stop();
}
}
}
}
}
Verwandte Aufgaben:
- DHT22 - Wetterdaten aufzeichnen
- Kniffel - EEPROM verwenden
- Lottozahlen mit einem Ethernet-Shield
- Lottozahlen auf eine SD-Karte schreiben
- Lottozahlen mit Zeitstempel anzeigen und auf einer SD-Karte speichern
Letzte Aktualisierung: