Hier der Code Teil 1:
// Hier werden die verwendete "Librarys" eingebunden
#include <OneWire.h> // OneWire Library (Nötig für den Bus an dem die DS18B20 hängen)
#include <DallasTemperature.h> // Dallas Library für die DS18B20
#include <LiquidCrystal.h> // LCD Library
#include <dht.h> // DHT11 Library (Für Feuchtesensor nötig)
#include <DCF77.h> // DCF77 Library für Pollin DCF Modul
#include <Utils.h> // Wird vom der DCF77 Library benötigt
#include <Time.h> // Time Library
// Initialisierung der Pins und Werte
int ledPin = 9; // Hier ist der NPN Transistor BC547 über 1k5 Ohm an der Basis angeschlossen
int analogPin = 0; // Am AnalogPin 0 ist der LDR (RS-Online Bestell Nr.: 596-141) über ein Spg. Teiler angeschlossen. 5V --> 100k --> A0 --> LDR --> GND
int val = 0; // LDR Wert wird erstmal auf 0 gesetzt
int fadeValue = 200; // Initialisierungs PWM Wert (78,43%) für Backlight
const int analogPin1 = 16; // Min. Temp. Taster auf Pin 16
const int analogPin2 = 17; // Max. Temp. Taster auf Pin 17
const int analogPin3 = 15; // Uhrzeit Taster auf Pin 15
const int analogPin4 = 18; // HilfsPin für LCD Pin D7
int interval = 10000; // Intervalzeit für Temperaturabfrage (10s)
int interval_in = 4000;
int interval_out = 3000;
unsigned long prev; // Variable "prev" wird als "unsigned long" deklariert
unsigned long prev_in;
unsigned long prev_out;
int tempupdate = 0; // Tempupdate Variable mit 0 initialisieren
float temp_ti_min = 100; // Min. Temp. Inside mit 100 initialisieren (Trick damit geupdated wird.)
float temp_hi_min = 100; // Min. Hum. Inside mit 100 initialisieren (Trick damit geupdated wird.)
float temp_to_min = 100; // Min. Temp. Outside mit 100 initialisieren (Trick damit geupdated wird.)
float temp_ho_min = 100; // Min. Hum. Outside mit 100 initialisieren (Trick damit geupdated wird.)
float temp_ti_max = 0; // Max. Temp. Inside mit 0 initialisieren
float temp_hi_max = 0; // Max. Hum. Inside mit 0 initialisieren
float temp_to_max = 0; // Max. Temp. Outside mit 0 initialisieren
float temp_ho_max = 0; // Max. Hum. Outside mit 0 initialisieren
float temp_ti = 0; // Temp. Inside mit 0 initialisieren
float temp_hi = 0; // Hum. Inside mit 0 initialisieren
float temp_to = 0; // Temp. Outside mit 0 initialisieren
float temp_ho = 0; // Hum. Outside mit 0 initialisieren
int buttonState = 0; // Status Variable für die Buttons
int buttonState2 = 0; // Status Variable für die Buttons
int buttonStateClock = LOW; // ButtonStateClock mit "LOW" initialisieren
int lastbuttonStateClock = LOW; //LastButtonStateClock mit "LOW" initialisieren
int lastbuttonStateClock2 = LOW; // LastButtonStateClock2 mit "LOW" initialisieren
int buttonCount = 1; // Button Counter (Initialisierung mit 1 weil kein PullDown am Pin)
int screen = 0; // Screen 0 setzten (Temperaturanzeige)
long lastDebounceTime = 0; // DebounceTime auf 0 setzten
long debounceDelay = 100; // Entprellzeit (in ms) für Button
// Pollin DCF77 Modul Artikelnr.: 810054
#define DCF_PIN 2 // DCF Data Pin auf Arduino Pin 2
#define DCF_INTERRUPT 0 // Interrupt für Pin 2
time_t time; // Time Library starten
DCF77 DCF = DCF77(DCF_PIN,DCF_INTERRUPT); // DCF77 Library starten
// Der OneWire Bus für DS18B20 hängt an Pin 8
#define ONE_WIRE_BUS 8
// LCD wird mit folgenden Pins initialisiert
LiquidCrystal lcd(1, 0, 5, 4, 3, 18);
// Errichtet eine Instanz um mit anderen OneWire Geräten zu kommunizieren zu können
OneWire oneWire(ONE_WIRE_BUS);
// Verweis das die Dallas Temperatur Sensoren am OneWire Bus dran sind
DallasTemperature sensors(&oneWire);
// DHT Library starten
dht DHT;
// Definiere Pin für Innen- und Aussen Feuchtesensor
#define DHT11_PIN 6 // Innensensor
#define DHT22_PIN 7 // Aussensensor
// Die DS18B20 Sensoren werden per Seriennummer "Hard" gecoded
// Hier gibt es ein Tutorial wie man an die Seriennummer kommt:
// http://www.hacktronics.com/Tutorials/arduino-1-wire-address-finder.html
// Seriennummer der verwendeten Dallas DS18B20 Sensoren
DeviceAddress insideThermometer = {
0x28, 0x26, 0xD5, 0xD1, 0x03, 0x00, 0x00, 0xFC }; // Seriennummer für den "insideThermometer"
DeviceAddress outsideThermometer = {
0x28, 0x6D, 0xF0, 0xD1, 0x03, 0x00, 0x00, 0x5B }; // Seriennummer für den "outsideThermometer"
// Zeichentabelle für "Eigene" Zeichen
// Um eigene Zeichen zu erstellen kann die Seite verwendet werden:
// http://www.quinapalus.com/hd44780udg.html
// Zeichen "haken"
byte haken[8] = {
B00000, // Zeile 1
B00001, // Zeile 2
B00011, // Zeile 3
B10110, // Zeile 4
B11100, // Zeile 5
B01000, // Zeile 6
B00000, // Zeile 7
B00000, // Zeile 8
};
// Zeichen "update"
byte update[8] = {
B00000, // Zeile 1
B00100, // Zeile 2
B00100, // Zeile 3
B01110, // Zeile 4
B01110, // Zeile 5
B11111, // Zeile 6
B11111, // Zeile 7
B00000, // Zeile 8
};
// Zeichen "del"
byte del[8] = {
B00000, // Zeile 1
B00000, // Zeile 2
B00000, // Zeile 3
B00000, // Zeile 4
B00000, // Zeile 5
B00000, // Zeile 6
B00000, // Zeile 7
B00000, // Zeile 8
};
void setup(void) // Setup wird einmalig durchlaufen
{
pinMode(ledPin, OUTPUT); // ledPin 13 (Backlight Ansteuerung per NPN Transistor (BC547)) wird als Ausgang deklariert
analogWrite(ledPin, 200); // Schreibe ein PWM Wert von 200 (78,43%) als Initialwert für Backlight
pinMode(analogPin1, INPUT); // analogPin1 (Min. Temp. Taster) wird als Eingang deklariert
pinMode(analogPin2, INPUT); // analogPin2 (Max. Temp. Taster) wird als Eingang deklariert
pinMode(analogPin3, INPUT); // analogPin3 (Umschaltaster Uhrzeit / Temp-Feuchte)
pinMode(analogPin4, OUTPUT); // analogPin4 (Hilfs Pin für LCD)
prev = millis(); // Millis (Zeit seitdem der µC läuft) wird in Variable "prev" geschrieben
prev_in = millis();
prev_out = millis();
sensors.begin(); // Sensoren (DS18B20) initialisieren
sensors.setResolution(insideThermometer, 12); // Auflösung des Wertebereichs auf 12 bit
sensors.setResolution(outsideThermometer, 12); // Auflösung des Wertebereichs auf 12 bit
lcd.begin(20,4); // LCD initialisieren und auf 20 Zeichen, 4 Zeilen setzten
lcd.clear(); // Alles auf LCD löschen
DCF.Start(); // DCF starten
// Hier werden "Eigene" Zeichen aus den "byte" (vor der setup deklariert) für das Display erstellt
lcd.createChar(0, haken); // Erstellt Zeichen "haken" und kann über // lcd.print(char(0)); // im Programm jederzeit aufgerufen werden
lcd.createChar(1, update); // Erstellt Zeichen "update" und kann über // lcd.print(char(1)); // im Programm jederzeit aufgerufen werden
lcd.createChar(2, del); // Erstellt Zeichen "del" und kann über // lcd.print(char(2)); // im Programm jederzeit aufgerufen werden
// Screen 1
lcd.setCursor(2,1); // Cursorbeginn auf Zeichen 2, Zeile 2
lcd.print("Found "); // Text "Found "
lcd.print(sensors.getDeviceCount(), DEC); // DEC gibt die Anzahl der gefundenen Sensoren aus
//Entscheidung ob "sensor" oder "sensors" ausgegeben wird
if (sensors.getDeviceCount() == 2) {
lcd.print(" sensors"); // gibt bei 2 Sensoren "sensors" aus
}
else {
lcd.print(" sensor"); // gibt bei 1 Sensor "sensor" aus
}
// Hier werden die Haken dargestellt
if (sensors.getDeviceCount() == 1) { // Hier wird die Anzahl der Sensoren geholt
lcd.setCursor(2,2); // Cursorbeginn auf Zeichen 2, Zeile 3
lcd.print(char(0)); // Zeichne "Haken"
}
if (sensors.getDeviceCount() == 2) { // Hier wird die Anzahl der Sensoren geholt
lcd.setCursor(2,2); // Cursorbeginn auf Zeichen 2, Zeile 3
lcd.print(char(0)); // Zeichne "Haken"
lcd.setCursor(3,2); // Cursorbeginn auf Zeichen 3, Zeile 3
lcd.print(char(0)); // Zeichne "Haken"
}
delay(2000); // Anzeige für 2s darstellen
lcd.clear(); // Alles auf LCD löschen
//Screen 2 (Initialscreen für Loop Schleife)
lcd.setCursor(0, 0); // Cursorbeginn auf Zeichen 0, Zeile 1
lcd.print("Wohnzimmer:"); // Text "Wohnzimmer:"
lcd.setCursor(0, 2); // Cursorbeginn auf Zeichen 0, Zeile 3
lcd.print("Aussen:"); // Text "Aussen:"
sensors.requestTemperatures(); // Temp Werte holen lassen
lcd.setCursor(10, 1); // Cursorbeginn auf Zeichen 6, Zeile 2
InTemperature(); //Ausgabe des Temp. Wertes vom "InTemperature"
lcd.setCursor(17, 1); // Cursorbeginn auf Zeichen 13, Zeile 2
HumidityInside(); // Ausgabe der Luftfeuchte vom "HumidityInside"
lcd.setCursor(10, 3); // Cursorbeginn auf Zeichen 6, Zeile 2
OutTemperature(); //Ausgabe des Temp. Wertes vom "OutTemperature"
lcd.setCursor(17, 3); // Cursorbeginn auf Zeichen 13, Zeile 2
HumidityOutside(); // Ausgabe der Luftfeuchte vom "HumidityInside"
}