Go Down

Topic: Automatische Bewässerung mit Capacitiven Sensoren u. Nextion Display (Read 1 time) previous topic - next topic

Da_Real_Snake

Also was ich bisher nun herausgefunden habe, es scheint an diesen Zeilen im Code zu liegen:

Code: [Select]
int SensorIST;
SensorIST = (CP1AW); // Wert von Sensor 1 , alle fast gleich (0-1023)
Serial1.print("n6.val=");
Serial1.print(SensorIST);
Serial1.write(0xff);
Serial1.write(0xff);
Serial1.write(0xff);

int NassSens;
NassSens = EEPROM.read(2);
Serial1.print("n7.val=");
Serial1.print(SensorIST);
Serial1.write(0xff);
Serial1.write(0xff);
Serial1.write(0xff);

int TrockenSens;
TrockenSens = EEPROM.read(3);
Serial1.print("n8.val=");
Serial1.print(SensorIST);
Serial1.write(0xff);
Serial1.write(0xff);
Serial1.write(0xff);



Wenn ich diese aus dem Code rausnehme läuft komischerweise alles wie vorher  :smiley-confuse:

BIS AUF ^^

Wenn ich z.b erst sagen wir 15 Sekunden mit dem Button B0 einstelle und dann auf Kalibrieren drücke um auf die Seite zu kommen und dann auf zurück gehe zählt er hoch.
Klicke ich auf Bewässerung macht er da das selbe,das gilt für hoch und runter, was ich halt als letztes nehme.

Ich check nichts mehr ^^

Das muss ja irgentwas damit zu tun haben das ich mehrere Seiten hinzugefügt habe ?!
Hab ich schon von Skoby bei Tipps gelesen das man dann eventuell auf beiden Seite ne Variable erstellen muss damit er auf beiden Seiten empfangen kann, aber das hat auch nicht geklappt.

Da_Real_Snake

Hey Leute,

da mir keiner mehr geantwortet hat und ich seit 1. Woche es vergeblich versucht habe es so zum laufen zu bringen und es nicht geklappt hat, habe ich leider erstmal die Nextion Libary nutzen müssen.

Hiermit funktioniert nun alles Einwandfrei, also der Seitenwechsel, das einstellen der Bewässerungszeiten und ab wieviel Prozent, sowie das umschalten auf die Kalibrierungsseite, mit der Kalibration der Sensoren per Knopfdruck.

Alles wird natürlich auch im EEprom gespeichert.

Ich poste trz. mal den Code auch wenn ich weiß das Ihr die Libary hasst, falls es überhaupt jem. interessiert, da ja eh keine Antworten mehr kamen.


Code: [Select]
//----------------------------------FESTLEGUNG-VON-VARIABLEN--------------------------------------------------

#include <Nextion.h>
#include <Wire.h>
#include <EEPROM.h>


unsigned long startZeit;     // Startzeit des Millis Timers
int SecInMS = 1000;          // Variable 1 Sekunde in Milli Sekunden

const int RELAIS1 = 2; // Arduino Pin 2, Relais für Pumpe
const int CP1 = A0; // Capacitiver Sensor 1
const int CP2 = A1; // Capacitiver Sensor 2
const int CP3 = A2; // Capacitiver Sensor 3


int NassSens;     // Zu Kalibrieren in feuchter Erde
int TrockenSens;  // Zu Kalibrieren in trockener Erde

int CP1SW = 0;  // Reiner Sensor Wert (0-1023)
int CP1AW;      // Sensor Wert der Benutzt oder Ignoriert werden kann
int CP1PW;      // Prozent Wert basieren auf dem Sensor Wert (0-1023 / 0-100%)

int CP2SW = 0;  // Reiner Sensor Wert (0-1023)
int CP2AW;      // Sensor Wert der Benutzt oder Ignoriert werden kann
int CP2PW;      // Prozent Wert basieren auf dem Sensor Wert (0-1023 / 0-100%)

int CP3SW = 0;  // Reiner Sensor Wert (0-1023)
int CP3AW;      // Sensor Wert der Benutzt oder Ignoriert werden kann
int CP3PW;      // Prozent Wert basieren auf dem Sensor Wert (0-1023 / 0-100%)

int countBB; // Counter für Bewässerung bei(% / Standard beim Start 20%)
int countBZ;  // Bewässerungszeit in Sec  (Standard beim Neustart 1Sec. )

int FeuchtigkeitDG; // Durchnitts Prozent Wert der 3 Sensoren
int SensorIST;      // Durchscnitts Wert der 3 Sensoren (0-1023)

bool relStatus = false; // Status des Relais

//-----------------------------------Nextion Abfragen Festlgung------------------------------------------------

NexButton b0 = NexButton(0, 1, "b0");
NexButton b1 = NexButton(0, 2, "b1");
NexButton b2 = NexButton(0, 9, "b2");
NexButton b3 = NexButton(0, 10, "b3");
NexButton b9 = NexButton(1, 4, "b9");
NexButton b10 = NexButton(1, 5, "b10");


NexTouch *nex_listen_list[] = {
  &b0,
  &b1,
  &b2,
  &b3,
  &b9,
  &b10,
  NULL
};

void b0PushCallback(void *ptr) {
 
    Serial.println("ButtonB0 gedrückt");
    countBZ++;
    EEPROM.write(1,countBZ);                 // Sekunden in den EEPROM schreiben
    Serial.println(countBZ);
}

void b1PushCallback(void *ptr) {
 
    Serial.println("ButtonB1 gedrückt");
    countBZ--;
    EEPROM.write(1,countBZ);                 // Sekunden in den EEPROM schreiben
    Serial.println(countBZ);
}

void b2PushCallback(void *ptr) {
 
    Serial.println("ButtonB2 gedrückt");
    countBB++;
    EEPROM.write(0,countBB);                 // Prozent in den EEPROM schreiben
    Serial.println(countBB);
}

void b3PushCallback(void *ptr) {
 
    Serial.println("ButtonB3 gedrückt");
    countBB--;
    EEPROM.write(0,countBB);                // Prozent in den EEPROM schreiben
    Serial.println(countBB);
}

void b9PushCallback(void *ptr) {
 
    int NassSens = analogRead(0) / 4;
    EEPROM.write(2,NassSens);
    Serial.println("ButtonB9 gedrückt");
    Serial.println(NassSens);
}

void b10PushCallback(void *ptr) {
 
    int TrockenSens = analogRead(0) / 4;
    EEPROM.write(3,TrockenSens);
    Serial.println("ButtonB10 gedrückt");
    Serial.println(TrockenSens);
}



//-------------------------------------------SETUP PART--------------------------------------------------------

void setup() {

  Serial.begin(9600);
  Serial1.begin(9600);
  pinMode(CP1, INPUT);
  pinMode(CP2, INPUT);
  pinMode(CP3, INPUT);
  pinMode(RELAIS1, OUTPUT);
  digitalWrite(RELAIS1,HIGH);
 
  countBB = EEPROM.read(0);     
 
  countBZ = EEPROM.read(1);     
 
  NassSens = EEPROM.read(2) * 4;   
 
  TrockenSens = EEPROM.read(3) * 4;
 

//-----------------------------Nextion Functionen........................................................

 b0.attachPush(b0PushCallback, &b0);
 b1.attachPush(b1PushCallback, &b1);
 b2.attachPush(b2PushCallback, &b2);
 b3.attachPush(b3PushCallback, &b3);
 b9.attachPush(b9PushCallback, &b9);
 b10.attachPush(b10PushCallback, &b10);

 
  delay(500);
}

//----------------------------------PROGRAM-PART SENSOREN AUSLESEN---------------------------------------------

void loop() {

// Sensor 1
 
CP1AW = analogRead(CP1);
if (abs(CP1SW - CP1AW) > 10) {   // Dies ist damit der Wert nicht ständig herum springt
  CP1SW = CP1AW;
}

CP1PW = map(CP1SW, NassSens, TrockenSens, 100, 0);
Serial1.print("n2.val=");
Serial1.print(CP1PW);
Serial1.write(0xff);
Serial1.write(0xff);
Serial1.write(0xff);

// Sensor 2

CP2AW = analogRead(CP2);
if (abs(CP2SW - CP2AW) > 10) {
  CP2SW = CP2AW;
}

CP2PW = map(CP2SW, NassSens, TrockenSens, 100, 0);
Serial1.print("n3.val=");
Serial1.print(CP2PW);
Serial1.write(0xff);
Serial1.write(0xff);
Serial1.write(0xff);
 
// Sensor 3

CP3AW = analogRead(CP3);
if (abs(CP3SW - CP3AW) > 10) {
  CP3SW = CP3AW;
}

CP3PW = map(CP3SW, NassSens, TrockenSens, 100, 0);
Serial1.print("n4.val=");
Serial1.print(CP3PW);
Serial1.write(0xff);
Serial1.write(0xff);
Serial1.write(0xff);

// Durchschnitt aller Sensoren

int FeuchtigkeitDG;
FeuchtigkeitDG = ((CP1PW + CP2PW + CP3PW) / 3); // Feuchtigkeits Durchschnitt der 3 Sensoren
Serial1.print("n5.val=");
Serial1.print(FeuchtigkeitDG);
Serial1.write(0xff);
Serial1.write(0xff);
Serial1.write(0xff);

//-------------------------------------Anzeigen der Kalibrierungswerte----------------------------------------------------


int SensorIST;
SensorIST = CP1AW; // Feuchtigkeits Durchschnitt der 3 Sensoren
Serial1.print("n6.val=");
Serial1.print(SensorIST);    // Messdaten
Serial1.write(0xff);
Serial1.write(0xff);
Serial1.write(0xff);



int NassSens;
NassSens = EEPROM.read(2) * 4;
Serial1.print("n7.val=");
Serial1.print(NassSens);
Serial1.write(0xff);
Serial1.write(0xff);
Serial1.write(0xff);

int TockenSens;
TrockenSens = EEPROM.read(3) * 4;
Serial1.print("n8.val=");
Serial1.print(TrockenSens);
Serial1.write(0xff);
Serial1.write(0xff);
Serial1.write(0xff);

//-------------------------------STEUERN-DER-BEWÄSSERUNGSZEITEN/PROZENT------------------------------------------

// Bewässerung bei so und soviel Prozent

int FeuchtigkeitBEI;
FeuchtigkeitBEI = (countBB);
Serial1.print("n1.val=");
Serial1.print(FeuchtigkeitBEI);
Serial1.write(0xff);
Serial1.write(0xff);
Serial1.write(0xff);


// Bewässerung so und soviele Sekunden

int SecInMS;
SecInMS = ((countBZ * 1000));
Serial1.print("n0.val=");
Serial1.print(countBZ);
Serial1.write(0xff);
Serial1.write(0xff);
Serial1.write(0xff);


//------------------------------------------STEUERN DES RELAIS ----------------------------------------------------

// Ansteuerung des Relais für die Pumpe

// Einschalten
 
  if (FeuchtigkeitDG <= countBB)
  if (!relStatus) {
    relStatus = true;
    startZeit = millis();
    digitalWrite(RELAIS1,LOW);
  }

// Ausschalten

if (relStatus && millis() - startZeit >= SecInMS) {
  relStatus = false;
  digitalWrite(RELAIS1,HIGH);
}

nexLoop(nex_listen_list);

}


//----------------------------------PROGRAMENDE----------------------------------------------



Als nächstes werde ich mich an die Diagram / Tagesübersichtsfunktion machen / versuchen.

MFG Stefan


Da_Real_Snake

Hey, ich hab jetzt soweit alles alleine hinbekommen, zwar mit der Lib aber naja.


Da er mir sagt wenn ich den Code posten will das die Nachricht zu lang ist, hab ich alles mal in ein Archiv gepackt falls es jem. was bringt:


https://mega.nz/#!9UJhTQQI!udiue6-rBENM7oMAXOGNVxP4aKFONkpoEjqgg4lxPgY



Bilder:








Tommy56

Du kannst das Archiv auch hier als Anhang anhängen, da geht es nicht verloren.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

SkobyMobil

Hallo,
englisches Diagram in deutscher Oberfläche?
Gruß und Spaß
Andreas
die zweite Maus bekommt den Speck...

Da_Real_Snake

Du kannst das Archiv auch hier als Anhang anhängen, da geht es nicht verloren.

Gruß Tommy
Ahh alles klar hab das mal zusätzlich gemacht ^^ Die Nextion Files gehen nicht da merkert er, beim Archiv auch.


Hallo,
englisches Diagram in deutscher Oberfläche?
Gruß und Spaß
Andreas
Wie meinste das ? Ist nen ganz normales xy Diagram.


MFG Stefan

Tommy56

Die Nextion Files gehen nicht da merkert er, beim Archiv auch.
Zip-Archive sind erlaubt.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Da_Real_Snake

Zip-Archive sind erlaubt.

Gruß Tommy
Ahh xD , mein Fehler hatte ein WinRar Archiv versucht ^^

SkobyMobil

Hallo,
wie stellst Du denn die "So" Werte da? Ich meine so eine Woche hat sieben Tage.
Dann würde ich bei der Anzahl von Messungen das Zeitraster ändern.
Mit 36min kann keiner etwas anfangen. Messe alle 30min, dann hat man auch einen Bezug.
Du weißt schon, das bei einem kapitalen Fehler am Donnerstag alle Werte verloren gehen?
Mal überlegt, es auf SD zu schreiben und von dort auch zu lesen.

Auf der Oberfläche des Nextion wird nicht viel zu sehen/erkennen sein.
Was hälst Du denn davon, wenn Du die Mo, Di, Mi... mit einem Hotspot abdeckt.
Dann legst Du für jeden Tag eine Waveform Seite an.
Du tippst Di an und zeigst auf der Seite Di den Tageslauf für diesen Tag an. Die Werte
stehen ja schon alle im Array an gleicher Stelle. Es ist also kein Problem den Di da
zu ziehen.
Nur mal so...
Gruß und Spaß
Andreas
die zweite Maus bekommt den Speck...

Da_Real_Snake

Hey Skoby,

die So Werte stell ich ganz normal wie die anderen da oder was meinste ? Ja das Problem mir der Zeit ist, ich hätte auch sonst nur jede 1Std. gemessen, das Ding ist so wie die Waveform gerade dargestellt wird ist sie 240px lang, und für jeden Pixel hast du ja 1 Datenpunkt, also musste ich diese 36min nehmen.

Wenn man die Daten auf SD schreibt brauchst du dann nicht zusätzlich nen Shield dafür ?

Das mit den einzel Seiten und dann eine Waveform für jeden Tag ist ne gute Idee, dann wär das auch etwas übersichtlicher und man könnte es sogar noch größer machen. Du meinst quasi auf z.b "Mo" Hotspot neue Seite, neue Waveform mit Daten für den Tag oder ?

Zwecks Datenerhalt bei Fehler würde ich Spontan sagen könnte man sonst auch für jeden Tag ein neues Array nehmen wenn man es ohne Shield machen will ?!?


Jetzt dachte ich gerade ich wäre fertig und du kommst wieder mit ner tolle Idee die man doch dann noch gerne umsetzten will xD Du Schlingel ^^

MFG Stefan

SkobyMobil

Hallo,
hat Dein Nextion kein SD-Schacht?

In #77 ist der Tagesverlauf abgebildet. Wenn ich das richtig verstehe, werden dort nur sechs Tage abgebildet.
Von Mo bist Di wird der Montag abgebildet, von Sa bis So der Samstag- richtig?
Meiner Meinung nach fehlt da noch, von So bis Mo- für den Sonntag.
Gruß und Spaß
Andreas
die zweite Maus bekommt den Speck...

Da_Real_Snake

Von Mo bist Di wird der Montag abgebildet, von Sa bis So der Samstag- richtig?
Meiner Meinung nach fehlt da noch, von So bis Mo- für den Sonntag.

OMG ! Stimmt ^^ ! Wie konnte ich das übersehen, Gott wie peinlich xD. Danke für den Hinweis das korrigier ich auf jeden Fall noch.

Hallo,
hat Dein Nextion kein SD-Schacht?


Ja, hat er, aber ist der nicht nur zum Beschreiben des Nextion ? Oder kann man dort auch eine SD drin lassen um Daten darauf zu schreiben ?


Aber mal was anderes vill weist du ne Lösung oder jem. anders. Oder ich übersehe da mal wieder was.
Ich hab nun für die einzelnen Tage die Hotspots und Seiten angelegt das sieht nun so aus:

[/URL]]

[/URL]]

[/URL]]


Wenn ich jetzt auf den Button Diagram drücke, wird folgender Code ausgeführt und das Diagram füllt sich bis zum Aktuellen Messpunkt das funktioniert Super:

Code: [Select]
Serial.println("ButtonB14 gedrückt");
    String Toclear = "cle ";
    Toclear += 4;
    Toclear += ",";
    Toclear += 255;
    Serial1.print(Toclear);
    Serial1.write(0xff);
    Serial1.write(0xff);
    Serial1.write(0xff);

    Serial.println("Werte werden übertragen!");

    String sendpoints = "addt ";
    sendpoints += 4;
    sendpoints += ",";
    sendpoints += 0;
    sendpoints += ",";
    sendpoints += MessAnzahl;
    Serial1.print(sendpoints);

    for (int i = 0; i < MessAnzahl; i = i + 1) {
 
    Serial.println(Messwerte[i]);
    String Tosend = "add ";
    Tosend += 4;
    Tosend += ",";
    Tosend += 0;
    Tosend += ",";
    Tosend += Messwerte[i];
    Serial1.print(Tosend);
    Serial1.write(0xff);
    Serial1.write(0xff);
    Serial1.write(0xff);


Nun wollte ich das für den Hotspot so machen, da ich die Diagrame auf den Seiten im selben Größenverhältnis habe also 238px (wird natürlich noch geändert da ja den So. quasi vergessen ^^ )
habe ich diesen Code geschrieben:

Code: [Select]
Serial.println("ButtonMo gedrückt");
    String Toclear = "cle ";
    Toclear += 4;
    Toclear += ",";
    Toclear += 255;
    Serial1.print(Toclear);
    Serial1.write(0xff);
    Serial1.write(0xff);
    Serial1.write(0xff);

    Serial.println("Werte werden übertragen!");

    String sendpoints = "addt ";
    sendpoints += 4;
    sendpoints += ",";
    sendpoints += 0;
    sendpoints += ",";
    sendpoints += MessAnzahl;
    Serial1.print(sendpoints);

    for (int i = 0; i < 34; i = i + 1) {
    for (int x = 0; i <= 7;) {
    Serial.println(Messwerte[i]);
    String Tosend = "add ";
    Tosend += 4;
    Tosend += ",";
    Tosend += 0;
    Tosend += ",";
    Tosend += Messwerte[i];
    Serial1.print(Tosend);
    Serial1.write(0xff);
    Serial1.write(0xff);
    Serial1.write(0xff); 
    x++;
    } 
   }


Die Idee dahinter, da der Montag ja nur 34px groß ist, also 34 Messpunkte, sollte damit einfach jeder Messpunkt 7x übertragen werden, also 7x 1 / 7x2 / 7x3 etc. dadurch würde die Kurve einfach quasi in die Länge gezogen das Sie die gesamten 238px füllt für einen Tag , aber aus einem Grund der mir nicht ersichtlich ist, läuft die Schleife unendlich, also er übertragt immer weiter.


MFG Stefan

SkobyMobil

Hallo,
normal ist die MicroSD card ja einfach am Arduino mit 5/6 Strippen angeschlossen.
Ein Shield würde ich dafür nicht kaufen. Dein Arduino ist ja auch befestigt, also kannst
Du so ein MicroSD card breakout
https://www.exp-tech.de/module/speicher/4710/adafruit-microsd-card-breakout-board

einfach daneben befestigen.

Das SD des Nextion kannst Du einfach benutzen, es ist nur umständlicher, weil du es über das
Nextion ansprechen mußt. Nicht direkt mit dem Arduino darauf zugreifen kannst.

Dann diese WaveForm- ist ja eigentlich dazu da, um LifeWerte zu übertragen. Nicht um aus einem
Array statische vergangene Werte darzustellen.

Ich würde das Diagramm zeichnen. Das geht sehr viel einfacher. Die Werte kannst Du mit "map()"
genau setzen.

int NextionFeuchtigkeitMo = map(Feuchtigkeit,0,100,0,10);

"for (int x = 0; i <= 7;)"
Was soll das denn machen? X bleibt 0
Gruß und Spaß
Andreas


die zweite Maus bekommt den Speck...

Da_Real_Snake

Ich würde das Diagramm zeichnen. Das geht sehr viel einfacher. Die Werte kannst Du mit "map()"
genau setzen.

int NextionFeuchtigkeitMo = map(Feuchtigkeit,0,100,0,10);

"for (int x = 0; i <= 7;)"
Was soll das denn machen? X bleibt 0
Gruß und Spaß
Andreas



Ja das es für Lifewerte ist war mir klar, war halt für mich in dem moment die schnellste Lösung irgentwie ^^, Jaa manchmal ist schnell aber nicht gut.

Das sollte quasi den Wert 7x übertragen, dann den nächsten, ich hatte das vorher so:
"for (int i = 0; i <= 7;)" , da lief es auch ins unendliche.

MFG Stefan

Tommy56

Das sollte quasi den Wert 7x übertragen, dann den nächsten, ich hatte das vorher so:
"for (int i = 0; i <= 7;)" , da lief es auch ins unendliche.
Ja, klar. i wird ja nicht verändert.
Besser:
Code: [Select]

for (int i = 0; i <= 7;i++) {
  // mach was
}
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Go Up