Lüftersteuerung will nicht so wie ich will

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    • Lüftersteuerung will nicht so wie ich will

      Hallo Männer!
      Habe meine Aquariumsteuerung inzwischen etwas erweitert. Bis auf die Erweiterung der Lüftersteuerung passt alles.
      Folgende Aufgabenstellung:
      Die Ventilatoren sollen sich zweimal pro Tag für mind. 1 Stunde einschalten. Sinn und Zweck ist dass das in der Abdeckung gesammelte Kondenswasser entfernt wird. (Funktioniert auch)
      Gleichzeitig habe ich aber die Lüfter vorgesehen um bei zu hoher Wassertemperatur diese dadurch wieder zu senken. (Funktioniert auch)
      Nun mein Problem:
      Ich schaffe es einfach nicht dass diese beiden Funktionen einwandfrei miteinander Funktionieren!
      Derzeit ist es so dass wenn die Wassertemperatur nicht zu hoch ist, dann schalten sich die Ventilatoren zu den vorgesehenen Zeiten gar nicht ein! Ist mir auch klar warum!
      Wenn ich es so programmiere dass die Ein- und Ausschaltzeiten richtig funktionieren, dann wird die Fan_off Temperatur ignoriert.
      Das heisst:
      Bei 25,6 °C werden die Vantilatoren eingeschaltet und bei 25,5 °C wieder aus. Nicht wie vorgesehen bei der Fan_off Temperatur von 25,4 °C (= Solltemperatur)
      Desshalb schaltet sich der Fan andauerd ein und aus. Hat ja nun keine Hysterese mehr!
      Hat jemand eine Lösung für mein Problem?
      Es ist warscheinlich nur eine Kleinigkeit, aber ich sitze seit zwei Tagen und komm nicht auf die Lösung!!!
      AQ_anti_Schimmel.bas
    • Zwei Sachen sind mir im Programm aufgefallen.

      1. Du hast ein einzelnes Return nach der Hauptschleife Do Loop stehen und
      2. ein End ganz am Ende den Programms

      Das Return gehört dort nicht hin und das End muss nach Do Loop stehen.
      Erst nach dem End folgen dann deine Unterprogramme.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Source Code

      1. Fansteuerung:
      2. If _hour >= Hour_ein_3 And _hour < Hour_aus_3 Or _hour >= Hour_ein_4 And _hour < Hour_aus_4 Then
      3. Fan = 1
      4. Else
      5. If Dg >= Fan_on_i Then
      6. Fan = 1
      7. Else
      8. Fan = 0
      9. End If
      10. End If
      11. Return
      Display All
      Wo kommt nun die Ausschalttemperatur hinein?
      Weil ohne Berücksichtigung der Ausschalttemperatur habe ich wieder keine Hysterese!

      The post was edited 1 time, last by avralfred ().

    • avralfred wrote:

      Wo kommt nun die Ausschalttemperatur hinein?
      Ich komm mit deinem Aküfi nicht zurecht, ichversuch das mal mit sprechenden Namen.

      Source Code

      1. If (die Zeit in der die Lüfter 1h laufen sollen) Then
      2. Fan = 1
      3. Else
      4. If Ist_Temperatur > Einschalttemperatur Then
      5. Fan = 1
      6. End If
      7. If Ist_Temperatur < Ausschalttemperatur Then
      8. Fan = 0
      9. End if
      10. End If
      Als Einschalttemperatur legst du 25,6 und als Ausschalttemperatur deine 25,4 fest, oder was du als Hysterese willst.

      Natürlich solltest du dein Programm erstmal aufräumen, Return z.B. mitten im If-Else geht nicht gut, das gehört ans Ende der Sub.
    • avralfred wrote:

      Die Hauptschleife ist auch eine Sub! Main:
      Die Hauptschleife ist eine Hauptschleife und keine Sub. Also lass das Main: und Return weg.

      Mein Ansatz wäre folgender:

      BASCOM Source Code

      1. Dim Stunde As Word , Fan_on As Bit , Fan_one_hour As Bit
      2. Stunde = 3600 'In Sekunden
      3. Fan_one_hour = 0
      4. Fan_on = 0
      5. Do
      6. If _hour = _hour_ein And _min = 0 And _sec = 0 Then
      7. Stunde = 3600
      8. Fan_one_hour = 1
      9. End If
      10. If Stunde = 0 Then Fan_one_hour = 0
      11. If Ist_temp > Soll_temp Then Fan_on = 1
      12. If Ist_temp <= Soll_temp Then Fan_on = 0
      13. If Fan_one_hour = 1 Or Fan_on = 1 Then
      14. Fan = 1
      15. Else
      16. Fan = 0
      17. End If
      18. Loop
      19. End
      20. Sectic:
      21. If Fan_one_hour = 1 Then Decr Stunde
      22. Return
      Display All
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • Keine Ahnung wo ich das mit dem "Delay" her hatte???
      War der Meinung damit kann ich mir das waitms 50 zur Tastenentprellung "sparen"- und macht doch viel mehr her!

      Nun habe ich in der Hilfe gelesen:

      Use DELAY to wait for a short time.
      The delay time is ca. 1000 microseconds.

      Also habe ich jetzt "Delay" wieder durch "waitms 50" ersetzt und dabei gleich welche entfernt die sinnlos waren.

      Das Config Debounce = 30 brauche ich in diesem Forum sicher nicht erklären!

      Michael wrote:

      Ich würde Zeile 1424 und Zeile 1425 tauschen. Damit der Wert erst begrenzt wird und danach ausgegeben.
      Im Betrieb fällt es zwar nicht wirklich auf dass die beiden Zeilen vertauscht sind, aber dein Vorschlag macht Sinn!

      The post was edited 1 time, last by avralfred ().

    • avralfred wrote:

      Also habe ich jetzt "Delay" wieder durch "waitms 50" ersetzt und dabei gleich welche entfernt die sinnlos waren.

      Das Config Debounce = 30 brauche ich in diesem Forum sicher nicht erklären!
      Das verstehe ich jetzt nicht. Config Debounce = 30 sind 30ms Prellzeit.
      Config debounce = 50 sind 50ms Prellzeit,damit entfällt Waitms 50
      zB. Waitms:

      If Pina.1 = 0 Then
      Waitms 50
      if Pina.1 = 0 Then "Gosub machwas"
      End if
      Also Debounce oder Waitms zur Tasterentprellung.
    • djmsc wrote:

      Nein. Du musst doch nach der Wartezeit prüfen, ob dein Taster immer noch NULL ist.
      Das ist Ansichtssache!
      Muss man nicht unbedingt Prüfen! - Kann man aber!
      Eine Taste die kürzer als 50 ms gedrückt wird gilt bei mir nicht als wirklich gedrückt. Das würde ich dann eher als kurz unabsichtlich berührt einstufen.
      Aber das ist wie gesagt Geschmackssache.
      Ich mache es jedenfalls immer so und bin mehr als zufrieden damit!
    • Das Entprellen ist doch nur interessant wenn der folgende code so kurz ist, dass er ein weiteres Mal durchlaufen werden könnte, wenn nach der Flanke gefragt wird. Im Normalfall mache ich nach dem code, den der Tastendruck auslöst, eine Abfrage, ob die Taste wieder losgelassen wurde, dann ist Entprellen auch kein Thema, der code wird dann pro Tastendruck durchlaufen.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch wrote:

      Im Normalfall mache ich nach dem code, den der Tastendruck auslöst, eine Abfrage, ob die Taste wieder losgelassen wurde, dann ist Entprellen auch kein Thema, der code wird dann pro Tastendruck durchlaufen.
      Ja - in den meisten Fällen ist das wohl die beste Lösung!
      Wenn man aber z.B. einen Wert um VIEL erhöhen will und bei jedem Tastendruck der Wert um 1 erhöht wird, ist es praktischer wenn man gleich auf der Taste bleiben kann bis der gewünschte Wert erreicht ist.
      Da funktinoniert diese Methode nicht - oder?
    • Debounce bietet erst mal keine repeat-Funktionalität. Da wird wirklich geprüft, ob die Taste wieder losgelassen wurde, bevor der code erneut ausgeführt wird. Wenn man das selbst in der Hand hat, ist man natürlich flexibler.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------