So, da Ich grade nichts besseres zu tuen habe und eh grade nicht schlafen kann, gibts direkt noch nen Teil hinterher.
Diesmal nehmen wir uns die Steuerung von Hochvolt Geräten vor. Hierzu nochmal die Warnung:
230V sind kein Spielzeug! Das kann kribbeln und wenn es auf einmal dunkel ist, ist das sehr schlecht. Also finger weg wenn Ihr nicht wisst was Ihr macht!
Also, bisher haben wir ja mit kleinen Spannungen gearbeitet und nur im DC (Gleichstrom) bereich. Jetzt wollen wir uns 230V Wechselstrom (AC) vornehmen. Um die zu schalten brauchen wir nen bisschen mehr als nur nen Transistor. Das Stichwort hier ist Relay. Wir könnten uns sowas natürlich selber zusammen bauen, schaut man sich aber die Preise an, lohnt das kaum. Ausserdem ist mit 230V nicht zu scherzen, da gehen wir lieber auf sicher.
Stellen wir uns also die Frage was wir alles Schalten müssen an unserem Aquarium was 230V benötigt. Eigentlich alles was in einer Steckdose Steckt... Da wären bei mir:
Filter, Heizstab, LED Netzteil, Rückwandbeleuchtung, CO2 Magnetventil.
Filter muss immer an sein und Rückwandbeleuchtung wird noch umgebaut. Bleiben also 3 Teile und Ich entscheide mich für nen 4er Relay, z.B.
http://www.exp-tech.de/Shields/5V-4-Cha ... hield.html
Schliessen wir das erstmal an. GRD löten wir auf unsere Platine an Ground (besser gesagt wir löten da nen Kabel dran und dann mit einem
Buchsenstecker an das Shield), dann VCC daneben an 5V (da es ja ein 5V Relay ist, wer 12V hat nimmt natürlich diese) und INT1-INT4 kommt an den Arduino. Aber wo? Kurz in die Pin Map geschaut und wir sehen, dafür sind 22-25 Vorgesehen. Schon sollte alles funktionieren. Jetzt nur noch die andere Seite anschliessen.
Hier haben wir pro Relay 3 Buchsen. Die mittlere ist die die von der Steckdose kommt. Hier können wir also einen Stecker anschliessen und alle 4 mit einander Verbinden. Ich hab dafür eine 5er Wago Klemme benutzt. Die linke und Rechte Seite haben je entgegen gesetzte Funktionen. Eine Seite ist Stromlos offen, die andere Geschlossen. Heißt wenn wir das Relay High schalten leitet es den Strom zur einen Seite, bei Low zur anderen. Dass können wir nutzen um z.B. die Heizung ein zu schalten, beim Arduino-ausfall ist sie aber aus und den Filter auch bei Ausfall noch laufen zu haben, aber aus wenn wir Reinigen z.B..
Welche Seite welche ist KANN abweichen, bei mir ist aber von vorne gesehen die linke die, die beim Neustart oder abstecken aus ist. Also Stecke Ich hier eine Ader der Heizung ein und Verbinde die andere wieder mit ner Wago Klemme mit dem Stecker. Schutzleiter habe Ich leider keinen an der Heizung, also ignorieren wir den.
Das Gleiche mache Ich nun noch mit den Kabel vom Netzteil. Filter und Magnet Ventil schliesse Ich anderes mal an. Alternativ dazu kann man natürlich auch Steckdosen ans Relay anschliessen und dort die Geräte einstecken. In meiner Abdeckung war hierfür leider kein Platz...
So, wir können nun etwas schalten, aber wie sieht das jetzt im Code aus?
eigentlich ganz einfach:
Code:
//Bei Variablen
int DaylightPowerPin = 22; // Relay 1
int Water_TempPin=23; // Relay 2
// In Setup()
pinMode(DaylightPowerPin, OUTPUT);
digitalWrite(DaylightPowerPin, HIGH);
pinMode(Water_TempPin, OUTPUT);
digitalWrite(Water_TempPin, HIGH);
Sehr schön. HIGH gesetzt und aus ist es? Irgendwie komisch aber bei LOW schaltet er ein. Andersrum wäre es logischer, aber wenn Ich die andere Seite der Buchse nehme hab Ich storm an der Heizung wenn Ich den Arduino abklemme.
Nun, was machen wwir jetzt damit? Heizung immer wieder per Hand an und aus zuschalten nerved irgendwie. Also braauchen wir nen Temperatur Fühler. Hier fiel meine Wahl auf den Dallas DS18B20. Vorteil: jeder von diesen hat eine eigene ID, was bedeutet Ich kann viele davon an einen Pin anschliessen und getrennt ansprechen.
Es gibt Ihn sogar Wasserdicht aus
Metal oder
Plastik. Ich hab beide (Oberfläshentemperatur und 30cm Tiefe :irre: ) und merke keinen unterschied. Nunja, wollen wir den mal anschliessen: Schwarz an Ground, Rot (oder weiss) an 5V und Gelb (oder blau) an Pin 26. Dann noch einen 4,7K Widerstand von Gelb zu 5V und fertig ist es.
Als erstes sollten wir uns die
lib nun runterladen und das DS18B20 Beispiel aufrufen (denkt dran den Pin zu ändern). Er zeigt euch nun im serial Monitor eure Sensor ID an. Schreibt euch die auf. (Meine sind 0x7059, 0x9C6E und 0xF5)
Nun bringen wir das ganze in unser Programm. Also erstmal wieder variablen definieren:
Code:
DS18B20_List ds18b20(26); // pin 10 <- Konstruktor aufrufen
#define TempOnBoard 0x7059
#define TempMetal 0x9C6E
#define TempPlastik 0xF5
float Water_Temp = 25.5; // Unsere Wassertemperatur/Mittelwert
Das warrs auch schon. Der Rest passiert wieder in der loop():
Code:
ds18b20.update(); // Temperatur update
und dann irgendwo in unserer 1Sek schleiffe:
Code:
// Temperaturen auslesen
float T_inside=ds18b20.get_temp_by_id(TempOnBoard);
float T_air=ds18b20.get_temp_by_id(TempMetal);
float T_water=ds18b20.get_temp_by_id(TempPlastik);
// Heizung Steuern
if(Water_Temp-0.5>T_water && Water_TempState==HIGH){
Water_TempState=LOW;
digitalWrite(Water_TempPin,Water_TempState);
}else if(Water_Temp+0.5<T_water && Water_TempState==LOW){
Water_TempState=HIGH;
digitalWrite(Water_TempPin,Water_TempState);
}
Was macht das ganze? Es liest die Temperaturen ein (vom Sensor mit der id XXX), Schaut nach ob der Wert ein halbes grad ober oder unterhalb unseres Mittelwertes ist und falls ja schaltet er das Relay an oder aus. Und wenn wir das ganze nun ausführen wollen: Großer Mist, nix klappt. Logisch wir müssen die lib ja einbinden. Also ganz oben noch schnell
#include <DS18B20.h>
reingeschrieben...
Wer es noch genauer haben möchte kann auch mal if(Water_Temp-0.2>T_water .... }else if(Water_Temp+0.2 schreiben. Oder Nachts und Tags andere Temperaturen?
Code:
// Heizung Steuern
if(RTC.daystamp>get_ts(10,0,0) && RTC.daystamp<get_ts(20,0,0)){
if(Water_Temp-0.5>T_water && Water_TempState==HIGH){
Water_TempState=LOW;
digitalWrite(Water_TempPin,Water_TempState);
}else if(Water_Temp+0.5<T_water && Water_TempState==LOW){
Water_TempState=HIGH;
digitalWrite(Water_TempPin,Water_TempState);
}
}else{
if(Water_Temp-3.0-0.5>T_water && Water_TempState==HIGH){
Water_TempState=LOW;
digitalWrite(Water_TempPin,Water_TempState);
}else if(Water_Temp-3.0+0.5<T_water && Water_TempState==LOW){
Water_TempState=HIGH;
digitalWrite(Water_TempPin,Water_TempState);
}
Jetzt haben es die Fische über Tag 25,5 und nachts 22,5° warm...
So und nun kleine denksport Aufgabe:
Wie mach Ich es jetzt Hell und Dunkel? :? Es geht erst weiter wenn Ich ne Lösung sehe :glaskugel:
Bis denne dann Moritz
Achja: Hier noch unser Code bisher: