INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Wasser-Sensor
23.02.2019, 15:57
Beitrag #9
RE: Wasser-Sensor
Du hast in Deinem Programm sehr gute Ansätze verwendet (const byte usw.). Das ist bei Anfängern selten so.
Dein Problem sind die Zeitsteuerungen über while und einige delay beim Backlight.
Du hast nach meiner Ansicht millis() noch nicht wirklich verstanden. Schau Dir nochmal BlinkWithoutDelay, die Nachtwächtererklärung und die Erklärung zu millis in Tutorials und Literatur an.

Der Grundaufbau bei der Nutzung von millis ist immer gleich:
Code:
uint32_t lastMillis = 0;
uint32_t intervall = 60 * 1000UL; // 60 Sekunden
...
im Loop:
uint32_t aktMillis = millis();
if (aktMillis - lastMillis >= intervall) { // immer in dieser Reihenfolge, die funktioniert auch über den Überlauf hinaus
  lastMillis = aktMillis;
  // tue etwas z.B. Hahn zu
}
Wahrscheinlich brauchst Du auch noch Statusvariablen, um zu wissen, was Du gerade machst.
In Funktionen kannst Du die lastMillis auch statisch machen:
Code:
// die Intervalle für Ablauf 1
uint32_t zeiten1 = {0, 30000UL, 60000UL};

byte ablauf1() {
static byte status = 0;
static uint32_t lastMillis = 0;
uint32  aktMillis = millis();
  if (status == 0) { // Anfangen  1. Spülung
    digitalWrite(Ventil1,HIGH);
    lastMillis = aktMillis;
    status = 1;
  }
  if (status == 1 && aktMillis - lastMillis >= zeiten1[status]) {  // zweite Spülung
    lastMillis = aktMillis;
    digitalWrite(Ventil1,LOW);
    digitalWrite(Ventil2,HIGH);
    status = 2;
  }
  if (status == 2 && aktMillis - lastMillis >= zeiten1[status]) {  // fertig
    digitalWrite(Ventil2,LOW);
    status = 0;
  }
}

Mit dieser Funktion steuerst Du eine Zeit von 90 Sekunden und sie ist immer nur wenige Mikrosekunden beschäftigt.

Auf diese Weise kannst Du auch lange Zeiten ohne Blockieren steuern.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.02.2019, 16:33
Beitrag #10
RE: Wasser-Sensor
Danke für die Blumen am Anfang.

Millis schaue ich mir noch einmal genau an.
Die Status-Geschichte ist interessant - Danke.

Dann werde ich mal hirnen müssen, wie ich meinen Code umschreibe oder besser neu schreibe.

Ich denke, soweit verstehe ich deinen Code, habe aber noch eine Frage:
uint32_t intervall = 60 * 1000UL;
Du deklarierst interval als unsigned long.
Was macht dabei UL in der Multiplikation...UL ist doch unsigned long, also ein Datentyp?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.02.2019, 22:24 (Dieser Beitrag wurde zuletzt bearbeitet: 23.02.2019 22:25 von Tommy56.)
Beitrag #11
RE: Wasser-Sensor
Wenn ich schreibe
Code:
uint32_t intervall = 60 * 1000;  // 60000?
Dann kommt die Grundregel für das Rechnen mit ganzen Zahlen zum Tragen und die heißt: Es wird standardmäßig in int gerechnet. int (bei 16 Bit) ist maximal 32767 groß. Es wird also nie 60000 erreicht.
Wenn ich einem Wert die Kennung UL verpasse (= Das ist eine unsigned long Zahl), sagt das dem Kompiler: Rechne in unsigned long und dann passt es.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.02.2019, 22:32 (Dieser Beitrag wurde zuletzt bearbeitet: 23.02.2019 22:33 von Lite.)
Beitrag #12
RE: Wasser-Sensor
...das bedeutet, daß die am Anfang stattfindende Datentyp-Deklaration der Variable "interval" als unsigned long BEI BERECHNUNGEN nicht ausreicht?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.02.2019, 22:38
Beitrag #13
RE: Wasser-Sensor
(23.02.2019 22:32)Lite schrieb:  ...das bedeutet, daß die am Anfang stattfindende Datentyp-Deklaration der Variable "interval" als unsigned long BEI BERECHNUNGEN nicht ausreicht?
Es wird erst der Teil rechts vom = berechnet (ohne UL in int - da interessiert ihn das links vom = überhaupt noch nicht) und das Ergebnis wird der Variablen links vom = zugewiesen.
Das kannst Du Dir ganz leicht im Seriellen Monitor anschauen, indem Du den Wert der Variablen ausgibst. Einmal mit UL und einmal ohne.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.02.2019, 22:46
Beitrag #14
RE: Wasser-Sensor
OK, besten Dank für die Info.
Das hab ich in der Referenz so nicht gefunden (S. 29)....zumindest nicht für mich klar.

Es reicht also, wenn ich die letzte Zahl (dein Code) mit UL versehe oder alles, was rechnerisch über die Grenze von int geht?

Also:
uint32_t intervall = 60 * 10 * 2 * 1 * 100UL;
oder
uint32_t intervall = var * var1 * var2 * var3 * var4UL;
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.02.2019, 22:49 (Dieser Beitrag wurde zuletzt bearbeitet: 23.02.2019 22:51 von Tommy56.)
Beitrag #15
RE: Wasser-Sensor
Code:
uint32_t intervall = 60 * 10 * 2 * 1 * 100UL; <---- ja
oder
uint32_t intervall = var * var1 * var2 * var3 * var4UL; <-- nein
uint32_t intervall = 1UL * var * var1 * var2 * var3 * var4; <-- so
UL geht nur an Zahlen-Literalen. Bei float dann * 1.0

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
23.02.2019, 22:54
Beitrag #16
RE: Wasser-Sensor
Danke Tommy, guter Tag heute....hab einiges gelernt.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Rauchmelder-Sensor Aredon 4 523 19.04.2019 14:13
Letzter Beitrag: Aredon
  Frage zum AJ-SR04M Sensor Franz54 22 6.713 23.02.2019 22:51
Letzter Beitrag: Franz54
  Health-Solution mit Arduino: AD8232 Analog Heart Rate Sensor dilbert 4 1.018 15.01.2019 14:59
Letzter Beitrag: dilbert
  Wasser in einen Ht-Rohr dedektieren Fips 19 3.202 30.11.2018 11:06
Letzter Beitrag: Fips
  Hall Sensor Traktor 26 4.824 11.02.2018 15:49
Letzter Beitrag: Tommy56
  Temperatursensor von Seeed Grove - High Temperature Sensor donut 9 2.267 05.06.2017 23:00
Letzter Beitrag: Bitklopfer
  Touch Sensor als EIN-AUS Schalter HDT 15 4.333 23.04.2017 16:24
Letzter Beitrag: HDT
  Optische Maus als Sensor? Binatone 9 4.204 07.04.2017 13:55
Letzter Beitrag: Binatone
  Doppel Hall Sensor? Binatone 2 1.874 03.01.2017 06:50
Letzter Beitrag: Binatone
  Details zu Laser Sensor WS87005 Franz54 1 2.554 13.12.2016 18:04
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste