Regentonnen Füllstandsanzeige +

Hallo zusammen,
Leider habe ich in der Suche nichts passendes gefunden. So muss ich Euch doch mal fragen.
Ich habe vor meine Regenwassertanks mit dem nano zu überwachen. Zu Füllstandsanzeige und Co habe ich auch viel gefunden. Nun ist bei meiner Anlage die Besonderheit, dass der Regenwassersammler im Fallrohr der Dachrinne auf einer Höhe von ca 3 Metern angebracht ist. Um ein Überlaufen zu verhindern muss man einen Kugelhahn einfach abdrehen. Naja, einfach heißt halt immer mit Leiter....
Jetzt meine Idee : wenn ich den Füllstand ja schon kenne kann ich das auch automatisch machen lassen.
Ich habe mir deshalb einen motorisierten Kugelhahn gekauft U.S. Solid 1" Motorkugelhahn Messing 2 Wege Elektrische Zonenventil, 9-24V AC/DC, 3 Drähte : Amazon.de: Baumarkt
Der hat eine 3-draht Verkabelung und kann lt. Schaltbild einfach mit einem Kippschalter gesteuert werden.
Nun die Frage : Wie mach ich das?
IRF520 sind raus. Normale Relais auch, oder?
Ich dachte an ein Wechslerrelais. Aber ich finde nichts was sich mit den 3V des nano steuern lässt.
Der Motor braucht 9-24v DC bei max. 2W Leistung. Also relativ geringer Strom.
Könnt ihr mir sagen ob es solche Wechslerrelais gibt oder ob ich das ganz anders lösen soll?
Ich bin für jeden Tipp dankbar.

Gruß Frank

PS sorry, falls ich Infos nicht genannt habe. Keine Absicht sondern Unwissenheit....

Wieso 3Volt am Nano ?
Welchen Nano hast du ?
Der übliche Nano liefert 5V. Allerdings reicht der Strom nicht, um gängige Relais zu steuern.
Dafür brauchst du dann noch Transistoren oder ein Relaismodul.

Dafür reichen zwei Transistoren oder ein ULN2003 Chip.

In der Tat reichen da BC337-40 aus.
Das geht dann auch bei 3V Steuerspannung.

Relais steuert man nie direkt mit einem µC an. Sondern über einen Transistor. Nicht nur wegen dem Spulenstrom, sondern auch wegen der Sicherheit.

Ja, wer nicht nur lesen kann sondern dieses Können dann auch noch anwendet ist klar im Vorteil.
Ich hab den nano V3 (nicht 3V!)

Die von Euch genannten Bauteile schau ich mir mal an und überlege wie ich das hinbekommen kann.

Danke Euch für die schnelle Antwort.

Um deine Titelfrage zu beantworten, ja, wäre sinnvoll. Ist der gerinste Aufwand. Der Kugelhahn schaltet ja selbstständig ab in der jeweiligen Endlage.
Du kannst aber auch zwei Einzelrelais nehmen. Die musst du dann per Software gegeneinander verriegeln.

Ja, aber ich wollte mich nicht nur auf die Software verlassen. Bei zwei Relais wäre theoretisch bei Fehlfunktion die Zerstörung des Motors die Folge. Deswegen mein Gedanke mit dem Wechslerrelais. Da habe ich (wenn ich es richtig verstanden habe) einen entweder oder Zustand. Somit kaum Gefahr für den Kugelhahn...
Aber wie gesagt : ich finde so ein Bauteil einfach nicht...

Willst du uns jetzt verarschen, oder was soll diese Bemerkung.
In keinem Satz hast du geschrieben, welchen Nano du verwendest. Also wo sollen wir was lesen ?

Dann nimm einfach einen Kippschalter.

Nein, um Gottes Willen. Das war auf mich bezogen. Ich habe V3 mit 3 volt verwechselt!!!

Dann schreib das bitte auch so.
Ok....nimm 2 Transistoren, wie schon beschrieben und gut ist.

Und wenn nicht mit Transistoren, dann nimm ein übliches Relais-Modul für 5Volt und dann geht das auch.

Dieses hier.
Eins davon reicht,nur als Beispiel.

Sorry nochmal. Das nächste Mal bin ich eindeutiger. Ich schau mir das mit den Transistoren an. Hab mich nur gewundert, weil die Spannung die ich steuern will ja höher ist und da dachte ich ich brauch automatisch ein Relais...
Gut dass ich gefragt hab. Wenn das einfacher auch geht ist es mir lieber...

Danke nochmal für die Hilfe

Hatte zum Relais noch etwas geschrieben.

Danke. Ich brauche jetzt erstmal ein wenig Zeit um das alles zu verarbeiten.
Wie bereits erwähnt herrscht bei mir großes Unwissen. Das muss ich jetzt erst mal ändern und mich weiter einlesen. Das geht bei mir nicht so schnell, weil halt alles neu ist und ich keine Erfahrung mit der Hardware habe.
Danke nochmal für die Hilfe. Ich lass das Thema mal offen und melde mich dann wieder, wenn ich eine Lösung gefunden habe die funktionieren sollte. Dann kann jemand anderes ggf auch davon profitieren.

Hallo Zusammen,

so, Hardware ist jetzt alles da. Welche ich einsetze weiß ich noch nicht. Ich hab auf jeden Fall mal die Transistoren mit Basiswiderständen und Freilaufdioden aufs Breadboard gesteckt.
Jetzt kam mir nur gerade die Idee das Sketch erstmal mit zwei LEDs zu testen.
Und siehe da: Ich bring es nicht hin.

Verwendete Hardware ist übrigens: Nano CH340, OLED 128x64 I2C mit SH1106 Treiber...

Aber wie gesagt jetzt soll's erstmal um die Software gehen.

Der Code ist überwiegend von Reichelt.de aus dem Füllstand sketch.
Hier habe ich nur von SSD1306 auf das SH1106 Display umgestellt.

Dann habe ich weiter versucht abhängig vom levelpercent (Füllstand in Prozent) die LEDs auf PIN 7 und 8 für eine bestimmte Zeit zu steuern. (Der Kugelhahn braucht ca. 5 Sekunden für einen Schaltvorgang von offen zu geschlossen und ist danach stromlos. deswegen will ich die PINs nach 6 Sekunden ausschalten.)

Ich habs mit If schleifen Probiert und mit switch-case...
ich bring es einfach nicht hin.

Das Problem scheint mir, dass ich einen Logikfehler habe so wie ich die millis() Funktion einsetze.
Wie kann ich mit millis() einen Vorgang einmalig ausführen lassen in Abhängigkeit von zwei Variablen (Füllstand% und Zustand Kugelhahn)?
Ich schaffe es die LEDs dauerhaft 6 Sekunden blinken zu lassen oder beim ersten Durchlauf des Loop einmalig 6s an und dann nie mehr....

hier der code:

#include <SPI.h>
#include <Wire.h>                //fuer I2C Kommunikation
#include <Adafruit_GFX.h>        //fuer OLED
#include <Adafruit_SH1106.h>     //fuer OLED
#include <NewPing.h>             //fuer Ultraschall-Sensor

#define LEVELFULL 100            //Hoehe Wassersaeule wenn voll (=100%) in cm
#define LEVELEMPTY 100           //Abstand Boden zu Sensor in cm
#define VOLUME 2000              //Volumen des zu messenden Mediums bei 100% in l
#define OLED_RESET     -1        //Reset pin beim SH1106 nicht vorhanden
#define trigPin  2               //Trigger Pin
#define echoPin  3               //Echo Pin
#define MAX_DISTANCE 320         //Begrenzung fuer Ultraschallsensor
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2

Adafruit_SH1106 display(OLED_RESET);



float duration;
int lefty, distance, levelact, levelpercent, volumeact;
long unsigned int currentMillis;          //Startwert Zähler
long unsigned int previousMillis = 0;     //
const long interval = 6000;               //6 Sekunden Dauer für Vorgang Oeffnen oder Schliessen d. Kugelhahns
bool statusOpen;                          //aktueller Status Kugelhahn offen
bool statusClosed;                        //aktueller Status Kugelhahn geschlossen
bool offen;                               //Reserve für Erweiterung d. Funktion
bool geschlossen;                         //Reserve für Erweiterung d. Funktion
bool levelFull;                           //Grenzwert zum Auslösen des Schaltvorgangs
int Zustand;                              //var fuer switch-case


NewPing sonar(trigPin, echoPin, MAX_DISTANCE); // NewPing Setup

void setup() {
  Serial.begin(9600); // nur fuer Debugzwecke
  pinMode(8, OUTPUT); // fuer rotes Kabel Kugelhahn (schliessen)
  pinMode(7, OUTPUT); // fuer blaues Kabel Kugelhahn (oeffnen)
//  statusOpen=true;
//  statusClosed=false;

  display.begin(SH1106_SWITCHCAPVCC, 0x3C);

}

void loop() {
  delay(50); // Wartezeit zwischen Pings (ca. 20 pings/sec). nicht kleiner als 29ms!

  //Messung mit Mittelung
  int iterations = 5;
  duration = sonar.ping_median(iterations);      //duration = sonar.ping() ohne Mittelung
  distance = int((duration / 2) * 0.0343);       //Abstand in cm

  //Fuellstand berechnen
  levelact = (LEVELEMPTY - distance);

  //Fuellstand in Prozent berechnen
  levelpercent = (levelact * 100 / LEVELFULL);

  //Berechnung Volumen
  volumeact = ((VOLUME / 100) * levelpercent);

  //Steuerung Kugelhahn


 if (levelpercent >= 95){                            //um nur wahr oder falsch als Bedingung zu haben
  levelFull = true;
 }
  else 
    levelFull = false;
    
 if (levelFull == true && statusOpen == true){      //zur Definitionen der Cases
  Zustand = 1;
  }

 if (levelFull == false && statusClosed == false){
  Zustand = 2;
  }

  switch (Zustand){
    case 1:
        digitalWrite(8, HIGH);                    //öffnet den Hahn bzw LED rot geht an
        currentMillis = millis();                 //Startzeitpunkt
      if (millis() - currentMillis >= interval){  //aktuelle Zeit - Startzeitpunkt sollte doch das sein was ich brauche um es mit dem Interval (6000ms) zu vergleichen
          digitalWrite(8, LOW);                   //macht den Hahn wieder zu (LED rot aus)
          statusOpen = false;                     //Marker ob Hahn offen oder geschlossen
          statusClosed = true;
        }
    break;

    case 2:                                       //alles "seitenverkehrt"
        digitalWrite(7, HIGH);
        currentMillis = millis();
      if (millis() - currentMillis >= interval){
          digitalWrite(7, LOW);
          statusOpen = true;
          statusClosed = false;
        }
    break;
    }

 

  display.clearDisplay(); // Clear display buffer

  //Ueberschrift
  display.setTextSize(2);      // Schriftgroesse
  display.setTextColor(WHITE); // Textfarbe
  display.setCursor(0, 0);     // obere linke Ecke
  display.print("Levelmeter");

  //Fuellstand in Prozent
  display.setTextSize(2);      // Schriftgroesse
  display.setTextColor(WHITE); // Textfarbe
  display.setCursor(50, 24);   // obere linke Ecke
  display.print(levelpercent);
  display.print(" %");

  //Fuellstand in Litern
  display.setTextSize(2);
  display.setCursor(50, 48);
  display.print(volumeact);
  display.print(" l");

  //Balkenanzeige
  levelpercent = constrain(levelpercent, 0, 100);  //um nur Werte zwischen 0 und 100 zu erhalten
  lefty = map(levelpercent, 0, 100, 63, 16);       //Hoehe des Balkens ermitteln

  //aeusserer Rahmen zeichnen
  display.drawRect(0, 16, 38, 48, WHITE);

  //Balken zeichnen
  display.fillRect(0, lefty, 38, 48, WHITE);

  //Display anzeigen
  display.display();



}

Habt Ihr einen Hinweis an welcher Stelle ich hänge?
Das würde mich sehr freuen.

Und wie kann ich das Problem mit den 49,.. Tagen umgehen? der Nano soll das ganze Jahr laufen und den Hahn steuern. (Winterschaltung ist noch in Planung...)

Und wie schließe ich bei Wellen (oder anderen schnellen Leveländerungen von 95% +/-) aus, dass beide Pins gleichzeitig HIGH werden?

Schonmal vorab danke für Eure Kommentare.
Ich hoffe ich habe diesmal keine relevanten Infos vergessen. (Schaltplan hab ich noch nicht)

Besten Gruß
Frank

So kann das nix werden :frowning:

Die millis() haben keine Chance, richtig größer als currentMillis zu werden.

Hast Du vielleicht currentMillis und lastMillis verwechselt? Üblicherweise wird lastMillis am Anfang des Intervalls gesetzt, und dann mit millis() oder currentMillis verglichen.

Oder soll das if ein while sein? Dann wäre aber delay() einfacher zu benutzen.

Hallo Doc,

Oh man. Das stimmt natürlich.
Das habe ich schon nicht mehr gesehen...

Ich hatte vorher vor dem If currentmillis=millis()
If (currentmillis-previousmillis >= interval) {
Pinmode(8,HIGH) ;
previousmillis=currentmillis;
...
}
Wobei previousmillis im setup auf 0 gesetzt wurden.
Das führt aber dazu, dass die LED blinkt.

Ich müsste den Endzeitpunkt irgendwie berechnen können...

Delay ist raus, weil sonst die Sensorwerte Müll sind..

Gruß Frank

Warum?
Der Endzeitpunkt ist: aktuelleZeit - startZeit >= intervall

millis()-previousMillis>=intervall
{
  previuosMillis=millis();
}

Der Endzeitpunkt ist doch Startzeitpunkt + Intervall.
Ob man den Startzeitpunkt lastMillis oder previousMillis nennt ist egal. Wichtig ist nur, daß diese Variable beim Einschalten des Ausgangs gesetzt wird, dann wenn die Wartezeit loslaufen soll.