Bräuchte mal eine hilfreife Info oder Tip

Hallo zusammen, ich bin noch relativ neu,
aktuell benutze ich ein Arduino MEGA 2560 Board.

Ich baue mir eine Poolsteurung auf und habe dazu bereits jeweils einzelne Sketche programmiert, die jeweils einzeln laufen.
Jetzt ist es ander Zeit alle bisherigen Sketche in einem zu vereinen, dies wär nicht unbedingt das Problem.
Jedoch hätte ich gerne Loops jeweils einzeln im Sketch.

z.b. Loop1 // Zeiterfassung
Loop2 // Berechnung der Laufzeit
Loop3 // Display ansteuerung
Loop4 // Relais schaltungen

ist die möglich mit dem MEGA 2560 oder sollte ich zum Arduino Due greifen, für jeden weitern Tip wär ich dankbar.

Gruß

Cool, sowas baue ich auch gerade.

Ist allerdings noch im Beta Status.

Ein extra Display konnte ich mir nicht leisten, deshalb muss ich immer auf‘s Handy gucken welche Temperatur das Wasser hat oder ob die Pumpe gerade an ist.

Kleiner Tipp: Versuch mit einer loop() auszukommen und pack die Einzelteile in Funktionen.

Gruß Fips

Servus,

wie hast Du das mit dem Handy realisiert ?

Hallo,

warum der Gedanke an den Due? Der Sketchaufbau bleibt gleich. Der löst dein Problem kein Stückchen. Selbst ein Ryzen 3000 mit 16 Kernen löst dein Problem nicht. Wenn du deine Einzelsketche sauber mit Funktionsaufrufen aufgebaut hast und dir auch sonstige Gedanken vorher gemacht hast, dann kannste alles ineinander werfen. Nur scheinbar hast du überall gleichnamige globale Variablen die sich nun gegenseitig behindern. Da hilft nur Struktur reinbringen. Wo es nur geht sinnvolle Funktionen mit lokalen Variablen schreiben. Die kann man rum und num kopieren.

Markzero0815:
Servus,

wie hast Du das mit dem Handy realisiert ?

Wie meinst du das?

Hardware oder Software?

Gruß Fips

Markzero0815:
Jedoch hätte ich gerne Loops jeweils einzeln im Sketch.

Beim Ardiono gibt es immer nur ein 'loop()' im Sketch.
Leider zeigst Du uns deine Sketche nicht. Wenn Du sie zusammenbauen willst, ist es or allem wichtig, dass sie ohne delay geschrieben hast. Dann kann man sie - unter ein paar Vorausetzungen, die Doc schon geschrieben hat - in einem loop zusammenfassen.
Wenn es für dich übersichtlicher ist, kannst Du sie auch in 4 Funktionen loop1(), loop2(),... lassen, und diese 4 Funktionen dann nacheinander im gemeinsamen loop() aufrufen. Aber dazu müssen sie vor allem nicht blockierend geschrieben sein.
Wobei delay() nicht die einzige Methode ist, einen loop zu blockieren ...

Servus

Delays sind drin

Hier die der Poolsteurung

// Date and time functions using a DS3231 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal.h>

RTC_DS3231 rtc;

char daysOfTheWeek[7][12] = {"So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"};
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup () {

#ifndef ESP8266
 while (!Serial); 
#endif

 Serial.begin(9600);
 Serial.println("Pumpenlaufzeit");
 pinMode(40,OUTPUT);

 delay(3000); // wait for console opening

 if (! rtc.begin()) {
   Serial.println("Couldn't find RTC");
   while (1);
 }

 if (rtc.lostPower()) {
   Serial.println("RTC lost power, lets set the time!");
   // following line sets the RTC to the date & time this sketch was compiled
   rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
   // This line sets the RTC with an explicit date & time, for example to set
   // January 21, 2014 at 3am you would call:
   // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
 }
 {
   // set up the LCD's number of columns and rows:
   lcd.begin(16, 2);                                     //LCD Zeile 1
   lcd.print("Poolsteuerung");                           //Startanzeige vom LCD Display
   lcd.setCursor(0, 1);                                   //LCD Zeile 2
   lcd.print("MW");                                      //Schreibe Text
   delay(10000);                                          //Wartezeit
 }
}

void loop () {
 DateTime now = rtc.now();

 Serial.print(now.year(), DEC);            //Serial Ausgabe Zeiten
 Serial.print('/');
 Serial.print(now.month(), DEC);
 Serial.print('/');
 Serial.print(now.day(), DEC);
 Serial.print(" (");
 Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
 Serial.print(") ");
 Serial.print(now.hour(), DEC);
 Serial.print(':');
 Serial.print(now.minute(), DEC);
 Serial.print(':');
 Serial.print(now.second(), DEC);
 Serial.println();

 Serial.print("Temperature: ");            //Serial Ausgabe Temperatur
 Serial.print(rtc.getTemperature());
 Serial.println(" C");

 Serial.println();
 delay(1000);
 {
   lcd.setCursor(0, 1);                                    //Cursor in Zeile 2
   // print the number of seconds since reset:
   lcd.print(millis() / 1000);
 }
 {
   // set up the LCD's number of columns and rows:
   lcd.begin(16, 2);
   // Print a message to the LCD.

   lcd.print(now.hour(), DEC);
   lcd.print(":");
   lcd.print(now.minute(), DEC);
   lcd.print("  ");
   lcd.print(now.day(), DEC);
   lcd.print(".");
   lcd.print(now.month(), DEC);
   lcd.print(".");
   lcd.print(now.year(), DEC);
   delay(5000);

   lcd.clear();

   lcd.begin(16, 2);
   //lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);
   lcd.print("Technik  ");
   lcd.print(rtc.getTemperature());
   lcd.print("\337C");
   lcd.setCursor(0, 1);
   lcd.print("Pool ");
   lcd.print(" \337C");
   

   //Variable
//
float pumpe = 6, volumen = 12.08, pleistung = 0, mlaufzeit = 0,dtemp = 0, atemp = 32, ptemp = 28, pltemp = 0, tnausgleichA = 0, tnausgleichB = 0, vorm = 0, nachm = 0;
int dptemp = 0, endzn = 0; 
 Serial.print("Pumpenleistung ");
 Serial.println(pumpe);        //Ausgabe Variable Pumpenleistung
 Serial.print("Poolvolumen ");     //schreibe Poolvolumen
 Serial.println(volumen);          // Ausgabe Variable Poolvolumen  
 Serial.print("Pumpenlaufzeit 75%  ");     //Schreibe Pumpenlaufzeit berchnet auf 75%
 Serial.println(pleistung = (pumpe/100)*75);     //Ergebnis 75% Pumpenleistung
 Serial.print("min. Laufzeit ");          //schreibe min. Laufzeit
 Serial.println(mlaufzeit = (volumen / pleistung));    //Ergebnis min Laufzeit
 Serial.print("Aussentemperatur ");        
 Serial.println(atemp);
 Serial.print("Pooltemparatur ");
 Serial.println(ptemp);
 Serial.print("Durchschnitt Temp (Pool/Aussen) ");
 Serial.println(dtemp = (atemp + ptemp)/2);
 Serial.print("Pumpenlaufzeit nach Temp ");
 Serial.println(pltemp = (dtemp/2));
 Serial.print("Tag / Nacht Ausgleich zwischenberechnung ");
 Serial.println(tnausgleichA = dtemp/2);
 Serial.print("Tag / Nacht Ausgleich ");
 Serial.println(tnausgleichB = (tnausgleichA/2)/1.1);
 Serial.print("Duchschnitt Laufzeit Pumpe nach Temperatur ");
 Serial.println(dptemp = ((tnausgleichB + mlaufzeit)/2)+2);
 Serial.println("Verteilung Zeiten vormittag / Nachmittag");
 Serial.print("Vormittag ");
 Serial.println(vorm = dptemp/2);
 Serial.print("Nachmittag ");
 Serial.println(nachm = dptemp/2);
 Serial.println("Startzeit vormittag 9:00");
 Serial.print("Endzeit vormittag ");
 Serial.println(9 + vorm);
 Serial.println("Startzeit nachmittag 15:00");
 Serial.print("Endzeit nachmittag ");
 Serial.println(endzn = (15 + nachm));
 Serial.println();
 delay(10000);



 }
}

Hier sind die Daten zum Senoren auslesen

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 6

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

void setup()
{
 Serial.begin(9600);
 sensors.begin();
}

void loop()
{ 
 sensors.requestTemperatures();
 Serial.println("Temperaturen");
 Serial.print("Pool           ");
 Serial.print(sensors.getTempCByIndex(0));  
 Serial.println(" °C");
 Serial.print("Solar Absorber ");
 Serial.print(sensors.getTempCByIndex(1));
 Serial.println(" °C");
 Serial.println("");
 delay(2000);
}

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Hi

Packe die einzelnen setup()'s nach setup() und die loop()s in loop().
Dort packst Du Diese in Tasks, Combie hat Da was gesschrieben.
Die loop()s müssen 'nur' möglichst keine Zeit brauchen, also selber state-maschines sein.
delay() oder so Kram ist dabei blöd.
Identische Variablen solltest Du ebenso sein lassen - Da wird aber eh der Kompiler meckern, wenn Da was von auftaucht.

MfG

Servus,

das werd ich mal machen
Danke schon mal dafür

Gruß
Markus

Markzero0815:
z.b. Loop1 // Zeiterfassung

Mit delay() wird das nix.

Tipp: BlinkWithoutDelay
millis-das-unbekannte-Wesen
Blink-Without-Delay-mal-anders-erklärt

Achja: Vergiss meine Frage aus #4

Gruß Fips

Hallo,

du kannst folgendes versuchen und den Inhalt Deiner 3 loops in drei function´s auslagern. Das sieht dann von der Struktur etwa so aus.

// include und
// Gemeinsame Variable hier

void setup() {
  Serial.begin(9600);
  // hier das Zeug aus Setup 1

  // hier das Zeug aus Setup 2

  // hier das Zeug aus Setup 3

}

void loop() {
  loop1();
  loop2();
  loop3();

}

void loop1() {
  // Achtung Variable sind lokal und verlieren
  // Ihre Werte also mit Static deklarieren
  // hier das aus loop1
}

void loop2() {
  // hier das aus loop2

}

void loop3() {
  //hier das aus loop 3

}

Alledingst musst Du mit globalen Variablen aufpassen das sie nicht eventuell doppelt verwendet werden wenn sie eine unterschieliche Funktion haben, dann must Du den Namen ändern. In den drei functionen loop1,loop2,loop3 sind die deklarierten Variablen lokal und verlieren Ihre Werte wenn sie nicht mit static deklariert sind.

Heinz

Hi

Rentner:
...
In den drei functionen loop1,loop2,loop3 sind die deklarierten Variablen lokal und verlieren Ihre Werte wenn sie nicht mit static deklariert sind.

Heinz

Das 'Problem' hast Du aber auch bei einer einzigen loop() - Da sehe ich noch kein Problem drin.
Wenn Das Einzeln funktioniert, funtionieren die loop()s 'in Reihe' mit Ihren lokalen Variablen ebenso.
Globale Variablen werden hier Probleme bereiten, wenn Diese verschieden benutzt werden.
Und: delay() und per while auf 'was_weiß_ich_denn' warten ist der Todesstoß für solche Programmierung.
DAS muß Vorher nicht nur gelaufen sein, sondern auch damals schon richtig konzipiert, eben als eigene State-Maschine, Die möglichst keine Zeit zum Ausführen von loop() braucht.
Nur dadurch ist sichergestellt, daß die 'anderen loop()s' auch zeitnah dran kommen.

MfG