#include "Ethernet.h"
#include "RTClib.h"
#include "DHT.h"
#include "SD.h"
// Bezeichnung der Textdatei
File Messung;
// Datenpin für das SD-Kartenmodul
int DatenPin = 4;
// Name des RTC-Moduls
RTC_DS3231 rtc;
// Sensorpin
int SENSOR_DHT = 8;
// Sensortyp festlegen
// DHT22
#define SensorTyp DHT22
// DHT11
// #define SensorTyp DHT11
// Sensor einen Namen zuweisen
DHT dht(SENSOR_DHT, SensorTyp);
// MAC-Adresse und IP definieren
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
// festeIP = false -> IP-Adresse über DHCP vergeben
bool festeIP = false;
// 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 = 1200000;
const unsigned int Minuten = Intervall / 60000;
// Start der Zeitmessung
unsigned long StartZeit = 0;
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(2023, 3, 10, 7, 2, 30));
*/
Serial.begin(9600);
delay(500);
// Ethernet starten feste IP
if (festeIP) Ethernet.begin(mac, ip);
// Ethernet starten DHCP
else Ethernet.begin(mac);
// Server starten
server.begin();
// zur Kontrolle IP-Adresse im Seriellen Monitor anzeigen
// localIP -> Adresse, die im Browser eingegeben wird
Serial.print(F("IP des Ethernet-Shields: "));
Serial.println(Ethernet.localIP());
// SD-Karte starten
SD.begin(DatenPin);
// DHT-Sensor starten
dht.begin();
}
void loop()
{
String Auswertung = "";
// Variablen für Temperatur und Luftfeuchtigkeit
float Temperatur;
float Luftfeuchtigkeit;
// auf Clienten warten ...
EthernetClient Client = server.available();
// abgelaufene Zeit mit millis() ermitteln
unsigned long VerstricheneZeit = millis();
// Zeit messen und Daten speichern, wenn das Zeitintervall erreicht ist
if (VerstricheneZeit - StartZeit >= Intervall)
{
// StartZeit zurücksetzen
StartZeit = VerstricheneZeit;
// Temperatur, Luftfeuchtigkeit messen
Temperatur = dht.readTemperature();
Luftfeuchtigkeit = dht.readHumidity();
// aktuelle Zeit ermitteln
DateTime aktuell = rtc.now();
// in Datei speichern
Messung = SD.open("Messung.txt", FILE_WRITE);
if (Messung)
{
// Datum schreiben
char Datum[] = "DD.MM.YYYY";
Messung.print(aktuell.toString(Datum));
// Zeit schreiben
char Zeit[] = " Uhrzeit: hh:mm:ss";
Messung.println(aktuell.toString(Zeit));
// Messdaten schreiben
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();
/*
einegegebene Zeichen zum String zusammensetzen
der String enthält eines der Zeichen (l, s, e)
Beispiel lesen:
GET /l HTTP/1.1
*/
Auswertung += Zeichen;
// \n =return: 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>"));
// String Auswertung lesen
// indexOf -> Vorhandensein eines Zeichens prüfen
// Daten speichern
if (Auswertung.indexOf("s") > 0)
{
Temperatur = dht.readTemperature();
Luftfeuchtigkeit = dht.readHumidity();
DateTime aktuell = rtc.now();
Messung = SD.open("Messung.txt", FILE_WRITE);
// wenn die Datei vorhanden ist
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(" | "));
// Temperatur und Luftfeuchtigkeit schreiben
Messung.println(Temperatur);
Messung.print(F(" °C | "));
Messung.println(Luftfeuchtigkeit);
Messung.print(F("%"));
Messung.println(F("<br>"));
// Datei schließen
Messung.close();
}
}
// Datei lesen
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();
}
}
// Zeitintervall der Messungen anzeigen
Client.println(F("<hr />"));
Client.println(F("Intervall: "));
Client.println(Minuten);
Client.println(F("Minuten<br> "));
Client.println(F("<hr />"));
// Button anzeigen
Client.print(F("<input type='button' "));
Client.println(F(" onClick=\"location.href='l'\""));
Client.println(F(" value='lesen'>"));
Client.print(F("<input type='button' "));
Client.println(F(" onClick=\"location.href='s'\""));
Client.println(F(" value='schreiben'>"));
Client.println(F("<hr />"));
// IPs anzeigen
Client.print(F("Eigene IP: "));
Client.print(Client.remoteIP());
Client.print(F("<br>IP des Ethernet-Shields: "));
Client.print(Ethernet.localIP());
Client.println(F("</body>"));
Client.println(F("</html>"));
// Zeit, um die Antwort zu übertragen
delay(1);
// Verbindung beenden
Client.stop();
}
}
}
}
}
Letzte Aktualisierung: