Hallo,
ich bräuchte etwas Hilfe bei meinem Projekt. Ich find irgendwie nicht die richtige Lösung (obwohl es wahrscheinlich super einfach ist und ich evtl. einfach nur auf dem Schlauch stehe).
Ich hab mir eine kleine Schaltung gebaut, mit einem Arduino und einem Relais, dass die Umwälzpumpe meiner Solaranlage an, bzw. ausschaltet, je nach Aussen und Wassertemperatur.
Das Programm ist noch nicht komplett fertig, es fehlen noch ein paar Funktionen, die ich gerne einfügen will, aber das ist nicht das Thema.
Es geht mir eigentlich nur darum, mir Schreibarbeit zu ersparen und zeitgleich den Code etwas übersichtlicher zu halten.
Worum es mir hauptsächlich geht, ist die Ausgabe an den Seriellen Monitor, da würd ich gerne mehrmals die Temperatur anzeigen lassen.
Um nicht jedesmal 20 Zeilen Code da reinzuballern, würd ichs gern auslagern.
Ich hab mir noch ein LCD bestellt, auf dem ich die serielle Ausgabe anzeigen lassen möchte.
Es geht um den Abschnitt:
" // Serielle Ausgabe"
im unteren Teil des "void loop"
Das ist mein bisheriger Code:
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 4
#define LED_GREEN 12
#define LED_RED 13
#define RELAY 2
OneWire oneWire(ONE_WIRE_BUS);// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire);// Pass our oneWire reference to Dallas Temperature.
int numberOfDevices; // Number of temperature devices found
DeviceAddress tempDeviceAddress; // We'll use this variable to store a found device address
void setup(void) {
pinMode(LED_GREEN, OUTPUT);
pinMode(LED_RED, OUTPUT);
pinMode(RELAY, OUTPUT);
Serial.begin(9600); // start serial port
sensors.begin(); // Start up the library
numberOfDevices = sensors.getDeviceCount(); // Grab a count of devices on the wire
// locate devices on the bus
Serial.print("Locating devices...");
Serial.print("Found ");
Serial.print(numberOfDevices, DEC);
Serial.println(" devices.");
// Loop through each device, print out address
for(int i=0;i<numberOfDevices; i++) {
// Search the wire for address
if(sensors.getAddress(tempDeviceAddress, i)) {
Serial.print("Found device ");
Serial.print(i, DEC);
} else {
Serial.print("Found ghost device at ");
Serial.print(i, DEC);
Serial.print(" but could not detect address. Check power and cabling");
}
}
}
void loop(void) {
sensors.requestTemperatures(); // Send the command to get temperatures
// Search the wire for address
sensors.getAddress(tempDeviceAddress, 0);
float tempCWasser = sensors.getTempC(tempDeviceAddress);
sensors.getAddress(tempDeviceAddress, 1);
float tempCAussen = sensors.getTempC(tempDeviceAddress);
float minimumAussen = 20.0;
float minimumWasser = 40.0;
// tempCAussen >= minimumAussen
// tempCWasser >= minimumWasser
if(tempCAussen >= minimumAussen){
if(tempCWasser < minimumWasser){
Serial.println("Aussentemperatur hoch genug");
Serial.println("2 Minuten Pumpe laufen lassen");
RelayEin();
delay(10000); // 2min laufen lassen zum testen
if(tempCWasser < minimumWasser){
Serial.println("Wasser ist nicht warm genug, 30min warten");
RelayAus();
delay(20000); // 30min warten bis erneuter Versuch
}
else if(tempCWasser >= minimumWasser){
Serial.println("Wasser ist warm genug, Pumpe einschalten");
RelayEin();
}
}
else{
Serial.println("Wasser ist warm genug, Pumpe einschalten");
RelayEin();
}
}
else{
Serial.println("Aussentemperatur nicht hoch genug");
RelayAus();
}
// Serielle Ausgabe
if(tempCAussen >= minimumAussen){
Serial.print("Aussen: ");
Serial.print(tempCAussen);
Serial.println("°C (✓)");
}
else{
Serial.print("Aussen: ");
Serial.print(tempCAussen);
Serial.println("°C (X)");
}
if(tempCWasser >= minimumWasser){
Serial.print("Wasser: ");
Serial.print(tempCWasser);
Serial.println("°C (✓)");
}
else{
Serial.print("Wasser: ");
Serial.print(tempCWasser);
Serial.println("°C (X)");
}
Serial.println();
delay(2000);
}
//Relais einschalten & grüne LED einschalten
void RelayEin(){
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, HIGH);
digitalWrite(RELAY, HIGH);
}
//Relais auschlaten & rote LED einschalten
void RelayAus(){
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
digitalWrite(RELAY, LOW);
}
Jetzt würde ich gerne den Serial.print-Teil um die Wasser und Aussentemperaturausgabe in eine Funktion auslagern, um dieses mehrfach nutzen zu können
versucht hab ich es mit:
im loop:
AusgabeAussen();
AusgabeWasser();
unterhalb des loops:
// Ausgabe Aussentemperatur
void AusgabeAussen(){
if(tempCAussen >= minimumAussen){
Serial.print("Aussen: ");
Serial.print(tempCAussen);
Serial.println("°C (✓)");
}
else{
Serial.print("Aussen: ");
Serial.print(tempCAussen);
Serial.println("°C (X)");
}
}
// Ausgabe Wassertemperatur
void AusgabeWasser(){
if(tempCWasser >= minimumWasser){
Serial.print("Wasser: ");
Serial.print(tempCWasser);
Serial.println("°C (✓)");
}
else{
Serial.print("Wasser: ");
Serial.print(tempCWasser);
Serial.println("°C (X)");
}
}
Ich denke auch, ich weiss, warum das nicht funktioniert:
die Funktion unterhalb des Loops bekommt die Werte aus den Variablen nicht, bzw. weiss nicht, was die Variablen sein sollen (z.B. "minimumWasser") und umgekehrt.
Aber hab keine Ahnung, wie ich der das mitteilen soll, oder wie ich das umschreiben muss.
MfG
Der_Affenkoenig