Go Down

Topic: Web-Seite gibt Statusanzeige nicht zurück (Read 2673 times) previous topic - next topic

Joggel67

Ich hab mir das
Quote
Serial.print(i+1);
gar  nicht rein schreiben trauen.
War nämlich etwas irritiert als du
Quote
Das Ergebnis stimmt dann nicht ganz.
geschrieben hattest...
Ist aber so gesehen wirklich ganz einfach... wenn man es richtig macht :)

my_xy_projekt

Ich hab mir das gar  nicht rein schreiben trauen.
Kein Grund dafür. Einfach machen.
Wenn das Ergebnis nicht das ist, was Du wolltest, kannst Du immernoch schreiben "Ich habe das gewollt, das gemacht, aber das ist dabei rausgekommen".

Quote
War nämlich etwas irritiert als dugeschrieben hattest...
Ja, wenn Du nur die Variable benutzt, hast Du nur den Index. Daher hatte ich drauf hingewiesen, das da noch was passieren muss...

Joggel67

#92
Apr 11, 2020, 11:46 pm Last Edit: Apr 11, 2020, 11:56 pm by Joggel67
So, hab etwas getüftelt, viele Fehler gehabt und bin jetzt doch zu einem kleinen weiteren Ergebnis gekommen.
Habe jetzt schon mal die for-Schleife für die Pumpen mit einfügen können.
Ich bin mir nur nicht sicher ob das jetzt so wie ich es geschrieben habe hier her gehört, oder in den loop (wovon ich jetzt auch ausgehe).
Code: [Select]
void setup()
{
  Serial.begin(115200);
    for (int i = 0; i < 2; i++)
    pinMode(pumpe[i], OUTPUT);
}

Soll ich vorsichtshalber auch mal den ganzen Sketch rein stellen?
Und noch etwas:
Ich würde jetzt für  die Pumpen anstatt einem i am liebsten einen anderen Buchstaben verwenden, rein aus dem Grund damit man später auch nachvollziehen kann, dass es sich hierbei ja um einen Ausgang oder neuer Anschluss oder wie auch immer, handelt. Macht man das so?

my_xy_projekt

So, hab etwas getüftelt, viele Fehler gehabt und bin jetzt doch zu einem kleinen weiteren Ergebnis gekommen.
Habe jetzt schon mal die for-Schleife für die Pumpen mit einfügen können.
Ich bin mir nur nicht sicher ob das jetzt so wie ich es geschrieben habe hier her gehört, oder in den loop (wovon ich jetzt auch ausgehe).

Ich würde jetzt für  die Pumpen anstatt einem i am liebsten einen anderen Buchstaben verwenden, rein aus dem Grund damit man später auch nachvollziehen kann, dass es sich hierbei ja um einen Ausgang oder neuer Anschluss oder wie auch immer, handelt. Macht man das so?
Moin,

ja die Initialisierung im Setup ist richtig. Die muss nur einmal durchgeführt werden.
Es ändert sich grundsätzlich nichts am bisherigen Aufbau deines Giess-Sketches.

Wie Du die Variable nennst, ist Dir überlasssen. Ich wies Dich auf das Beispiel in der IDE hin.
Allerdings halte ich es für vertretbar grundsätzlich mit nur einem Buchstaben auszukommen.
Das wirst Du später noch sehen...


Aus meinem Post #85 fehlt noch die Umsetzung:

Quote
Lege Dir eine globale Variable an, in der Du die tatsächle Anzahl der Sensorkreise angibst.
Ersetze den Festwert in der for-Bedingung durch die Variable.

Der Sketch sollte jetzt noch immer das so ausgeben wie vorher.
Dann meld Dich mit dem 10-Zeiler.
Die Variable mit der Anzahl brauchst Du später noch mehrfach.

Dann schau Dir mal in Andreas' Code-Referenz am Anfang die Erklärung zu Funktionen an.
In dem Giess-Sketch hatten wir ja schon die Sensoren, Sperre, Nachlauf, Webausgabe jeweils aus dem loop() in Funktionen gelegt.

Nimm den 10 Zeiler, und lege das delay(1000) in eine Funktion mit dem Namen Pause.
Wenn Du das hast, versuche den Teil der sich in der For-Schleife zwischen den {} befindet in eine eigene Funktion mit dem Namen Ausgabe zu packen. Dazu musst Du die Variabe i mit übergeben.


noiasca

Ich würde jetzt für  die Pumpen anstatt einem i am liebsten einen anderen Buchstaben verwenden, rein aus dem Grund damit man später auch nachvollziehen kann, dass es sich hierbei ja um einen Ausgang oder neuer Anschluss oder wie auch immer, handelt. Macht man das so?
für derartige Iterationen ist das i schon ok und durchaus üblich. Wenn du weitere Schleifen innhalber dieser Schleifen machst, kannst du mit j, k,... weitere anlegen.

how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

Joggel67

Ich bin mir ABSOLUT nicht sicher ob ich das jetzt richtig gemacht habe:
Code: [Select]

int SensorPin[] = {36, 39};
const int nass[]={1500, 1900};
const int trocken[]={2900, 2900};
bool nass_stat[] = {LOW, LOW};
bool trocken_stat[] = {LOW, LOW};
int SensorStatus[] = {0};

void setup()
{
  Serial.begin(115200);
  {
    for (int SensorStatus = 0; SensorStatus < 2; SensorStatus++)
    {
      analogRead(nass_stat[SensorStatus]);
      analogRead(trocken_stat[SensorStatus]);
    }
  } 
}

void loop()
{
  for (int i = 0; i < 2; i++)
  {
    Serial.print("Sensorwert ");
    Serial.print(i + 1);
    Serial.print(": ");
    Serial.println(analogRead(SensorPin[i]));
  }
  delay(1000);
}


Andereseits wird ja im Setup nur einmalig darauf hingewiesen oder gelesen...... Weiß nicht wie ich es richtig machen soll....

my_xy_projekt

#96
Apr 12, 2020, 04:25 pm Last Edit: Apr 13, 2020, 09:13 am by my_xy_projekt
Ich bin mir ABSOLUT nicht sicher ob ich das jetzt richtig gemacht habe:
Nein ist es nicht.
Ich habe Dich gebeten den Sketch aus #89 weiterzuentwickeln.
Warum machst Du das nicht?

Anbei meine fertige Lösung - ich weiss nicht, wie ich Dich dahin bringen kann, wenn Du nicht mitmachst..
Wenn Du die Arrayprüfung rausnimmst und die Serielle Ausgabe zur Kontrolle, sind es ca. 120 Zeilen

Code: [Select]
//  Für ESP PIN's wieder anpassen
// HIER DIE ANZAHL DER KREISE ANGEBEN
const int Kreise = 2;

// Für jeden Kreis ab hier einen Wert angeben!
// Hier die Angabe der PIN
const int SensorPin[] = {A0, A1};
const int PumpePin[] = {46, 48};

// Hier die Angabe für die Grenzwerte
const int nass[] = {300, 300};
const int trocken[] = {1000, 1000} ;

// Zeitvariablen init immer 0
unsigned long PumpeStart[] = {0, 0};
unsigned long SperreStart[] = {0, 0};

// Statusvariable init
bool nass_stat[] = {LOW, LOW};
bool trocken_stat[] = {LOW, LOW};
// Ende Eintrag Werte

// *INDENT-OFF*
void setup()
  {
  Serial.begin(115200);
  if (!Arraypruefung())              // Prüfung der Array-Elemente
    {                                // Frage kam im Thread nach #70 auf
    Serial.println(F("Arraypruefung fehlgeschlagen! - Angehalten!"));
    while (1);
    }
  for (int i = 0; i < Kreise; i++)
    {
    pinMode(PumpePin[i], OUTPUT);
    }
  }
// *INDENT-ON*

// *INDENT-OFF*
void loop()
  {
  Testausgabe();                     // Ausgabe als Alternative für Zeilen im Code
  //                                 // Kann dann direkt als csv aus dem seriellen Monitor kopiert werden
  for (int i = 0; i < Kreise; i++)
    {
    Sensor(i);                       // Abfrage Sensor und Einstellung Pumpe
    Nachlauf(i);                     // Prüfung ob Pumpen im Zwangsmodus, ggfls ausmachen
    Sperre(i);                       // Prüfung ob Auswertesperre gesetzt, ggfls loeschen
    }
  Webausgabe();                      // Wenn alles vorbereitet ist Ausgabe als Website
  }                                  // ENDE loop()
// *INDENT-ON*

void Webausgabe()
  {
  // Hier kommt der Kopf der Webausgabe rein
  //
  for (int i = 0; i < Kreise; i++)
    {
    // Hier kommt der Code für die Website rein
    // PIN/Sensorwerte werden direkt gelesen
    // Statusvariablen sind global
    }
  }
// *INDENT-OFF*
void Sensor(int S)
  {
  // Extremwert nass
  if ((analogRead(SensorPin[S]) <= nass[S]) && (!nass_stat[S]))   
    {   // Pruefung ob nass UND vorher nicht nass
    nass_stat[S] = HIGH;                                        // Jetzt ist nass
    trocken_stat[S] = LOW;                                      // Jetzt ist nicht trocken
    SperreStart[S] = millis();                                  // Merker für Auswertungssperre
    digitalWrite(PumpePin[S], LOW);                             // Pumpe aus!
    Serial.print(F("Dem Sensor ")); Serial.print(S+1); Serial.println(F(" ist es zu feucht"));   // Ausgabe
    }
  //
  // Extremwert trocken
  if ((analogRead(SensorPin[S]) >= trocken[S]) && (!trocken_stat[S]))
    { // Pruefung ob trocken UND vorher nicht trocken
    trocken_stat[S] = HIGH;                                      // Jetzt ist trocken
    nass_stat[S] = LOW;                                          // Jetzt ist nicht nass
    PumpeStart[S] = millis();                                    // Start Laufzeit Pumpe
    SperreStart[S] = millis();                                   // Merker für Auswertungssperre
    Serial.print(F("Dem Sensor ")); Serial.print(S+1); Serial.println(F(" ist es zu trocken")); // Ausgabe
    digitalWrite(PumpePin[S], HIGH);                             // Pumpe an!
    }
  //
  // Normalbetrieb
  if ((analogRead(SensorPin[S]) > nass[S]) && (analogRead(SensorPin[S]) < trocken[S]) && (!trocken_stat[S] && !nass_stat[S]))// Prüfung ob im Regelbereich
    { // groesser als nass UND kleiner als trocken UND kein Status trocken UND kein Status nass
    if (millis() % 12000 < 6000)
      {
      if (!digitalRead(PumpePin[S]))                             // Wenn Pumpe aus UND
        digitalWrite(PumpePin[S], HIGH);                         // Modulo passt? - Pumpe an
      }
    else
      {
      if (digitalRead(PumpePin[S]))                              // Wenn Pumpe an UND
        digitalWrite(PumpePin[S], LOW);                          // Modulo passt nicht? - Pumpe aus
      }
    }
  }
// *INDENT-ON*

// *INDENT-OFF*
void Sperre(int s)
  { // Übergeben wird der Kreis für welchen die Bedingung geprüft wird
  /* Zwangsweises sperren der Sensorabfragen aufheben
     Es ist auch möglich für jeden Zweig eine eigene Sperrzeit zu setzen
     kommt darauf an, wie flexibel man sein möchte */
  const unsigned long Sperrzeit = 15000;                         // Sperrzeit für Prüfung auf Extremwerte Zweig
  if ((millis() - SperreStart[s] > Sperrzeit) && (nass_stat[s] || trocken_stat[s]))
    { // Sperrzeit abgelaufen UND entweder Status nass ODER Status trocken erfüllt
    trocken_stat[s] = LOW;                                       // Setze status zurück
    nass_stat[s] = LOW;
    Serial.print(F("Sperrzeit ")); Serial.print(s+1); Serial.println(F(" beendet"));
    }
  }
// *INDENT-ON*

// *INDENT-OFF*
void Nachlauf(int N)
  { // Übergeben wird der Kreis für welchen die Bedingung geprüft wird
  /* Zwangseinschaltung bei zu trockenem Sensor! Es ist auch möglich für jeden Zweig eine
     eigene Einschaltzeit zu setzen kommt darauf an, wie flexibel man sein möchte
     const unsigned long Einschaltzeit[]={9000, 13000];  // Vorsicht Anzahl Elemente muss stimmen!
     Abruf dann mit [Einschaltzeit[N]                    // bzw. zusätzliche Prüfung einbauen!
  */                 
  const unsigned long Einschaltzeit = 9000;                      // Zwangseinschaltzeit für Pumpe
  if ((millis() - PumpeStart[N] > Einschaltzeit) && (digitalRead(PumpePin[N]) && (trocken_stat[N])))
    {                                                            // Bedingung für Pumpe erfüllt
    digitalWrite(PumpePin[N], LOW);                              // Pumpe aus
    Serial.print(F("Pumpe ")); Serial.print(N+1); Serial.println(F(" Nachlauf abgeschaltet"));    // Ausgabe
    SperreStart[N] = millis();                                   // Sperrzeit für Wiederanlauf starten
    }
  }
// *INDENT-ON*

// *INDENT-OFF*
void Testausgabe()
  {
  static unsigned long lastmillis = 0; //Speichervariable
  unsigned long Laufzeit = 250;        // etwa alle 1/4 Sekunde ausgeben
  if ((millis() - lastmillis) >= Laufzeit)
    {
    lastmillis = millis();
    for (int p = 0; p < Kreise; p++)
      {Serial.print(F("Kreis;")); Serial.print(p+1); Serial.print("; ");
      if (analogRead(SensorPin[p]) < nass[p]) {Serial.print(F("nass; "));}
      else if (analogRead(SensorPin[p]) > trocken[p]) {Serial.print(F("trocken; "));}
      else {Serial.print(F("normal; "));}
      Serial.print(F("Pumpe;")); Serial.print(digitalRead(PumpePin[p]));
      Serial.print(F("; Trocken?;")); Serial.print(trocken_stat[p]);
      Serial.print(F("; Nass?;")); Serial.print(nass_stat[p]);
      Serial.println("; ");  // Wenn alle Werte in eine Zeile, dann .print!
      }
    Serial.println();}
  }
// *INDENT-ON*

// *INDENT-OFF*
bool Arraypruefung()
  {
  if (
    (Kreise == sizeof(trocken_stat)) &&                         // sizeof gibt die Anzahl belegter bytes zurück
    (Kreise == sizeof(nass_stat)) &&                            // ein int z.B. belegt 2 Bytes,
    (Kreise == sizeof(PumpePin) / sizeof(int)) &&               // 2 Einträge würde 4 ausgeben
    (Kreise == sizeof(SensorPin) / sizeof(int)) &&              // um die tatsächliche Anzahl der Einträge
    (Kreise == sizeof(nass) / sizeof(int)) &&                   // zu erhalten, wird durch die Belegung dividiert
    (Kreise == sizeof(trocken) / sizeof(int)) &&                // errechnet aus dem typ des Eintrages
    (Kreise == sizeof(PumpeStart) / sizeof(unsigned long)) &&   // gut erklärt:
    (Kreise == sizeof(SperreStart) / sizeof(unsigned long))     // http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/011_c_arrays_004.htm
     )
    {
    Serial.println(F("passt"));
    return HIGH;
    }
  else
    {
    Serial.println(F("passt nicht"));
    return LOW;
    }
  }
// *INDENT-ON*

Joggel67

#97
Apr 12, 2020, 05:07 pm Last Edit: Apr 12, 2020, 06:21 pm by Joggel67
Jetzt bitte ich schon vielmals um Entschuldigung,
aber der Sketch aus #89 sieht so aus:
Code: [Select]
int SensorPin[] = {46,48};

void setup()
 {
 Serial.begin(115200);
 }

void loop()
 {
 for (int i = 0; i < 2; i++)
   {
   Serial.print("Sensorwert ");
   Serial.print(i+1);
   Serial.print(": ");
   Serial.println(analogRead(SensorPin[i]));
   }
   delay(1000);
 }


Und noch eine Kleinigkeit, abgesehen dass ich die Funktion vergessen habe:
Quote
Nimm den 10 Zeiler, und lege das delay(1000) in eine Funktion mit dem Namen Pause.
Ergo gehe ich von Sketch #89 aus, so wie er da steht....

https://forum.arduino.cc/index.php?topic=673884.75

Joggel67

Aber wie ich sehen kann, bist du auf meine Anfrage bezüglich den Variablen von #92 eingegangen ;)
Ich komme damit ganz gut zurecht, schaue mich noch etwas um und dann nehme ich noch die Änderungen in den Ein- und Ausschaltzeiten vor, denn das war ja schon immer ein Kriterium welches ich verfolgt habe......

Go Up