Füllstandsanzeige für Zisterne

Hallo Markus,

das mit dem Rasen ist echt blöd, hoffentlich wird nicht der ganze Rasensamen weggespült ... ist ja nicht nur Arbeit, sondern kostet ja auch einiges :(

Deine Füllstandsanzeige für die Zisterne sieht toll aus, diese könntest du ja auch eigentlich dem Hersteller der Zisterne anbieten, ich kann mir schon vorstellen, dass hier eventuell Interesse besteht :)

Grüße,
Dirk
 
Hallo Ihr,
es ist Interessant zu verfolgen, welch doch so einfache und genialen Erfindungen immer wieder mit immensem Aufwand versucht getoppt zu werden.
1. Elektronik, egal in welcher Form in einer unterirdischen Zisterne führt wegen Umwelteinflüssen ( Wasserdampf und Kondansation) zum Totalausfall der el. Komponenten in kurzer Zeit.

Mit welchem Honorar würde man wohl eine Konstruktion bedenken müssen, welche nahezu unbegrenzte Lebensdauer und größtmögliche Anzeigegenauigkeit verbindet.

Vorschlag:
Man verlege ein Kunststoffrohr aus PE ca. 5mm bis zum Grund der Zisterne. lege das Ende an einen geschützen Ort ( Keller, Abstellraum) und verbinde dieses mit einem Drucksensor. Desweiteren davor ein T-Stück mit Rückschlagventil und einer Mini-Luftpumpe aus einem Blutdruckmessgerät z.b.
Jetzt pumpe man den Schlauch voll Luft, egal wie lange, nur die Luft muss unten rusblubbern. Jezt schaltet man auf Messmodus und registriert den anstehenden Luftdruck am Sensor.
Ratz Fatz - das Ergebnis in eine Formel eingesetzt und das Ergebnis in mm/Ws oder m3 oder Liter angezeigt.
Minimaler Aufwand für XXL Ergebnis

viele Grüsse Dieter
 
zum Füllstandssensor

Also ich muss sagen den Vorschlag von Diegeb nutze ich schon seit Jahren. Allerdings vollmechanisch ohne elektrisch. Ich habe eine alte Blutdruckmesspumpe mit angebautem Manometer (in mmQuecksilber geeicht) und der Anfang des Druckschlauches hängt bis zum Grund der Zisterne. Wenn ich pumpe bleibt irgendwann der Zeiger zwischen 0 (schlecht) und 136 (gut) mmQS stehen und ich weis wie hoch das Niveau in der Zisterne steht. Einperlung nannte man das früher in der Mess & Regeltechnik. Dann schaue ich auf meine Tabelle und kann ablesen Füllhöhe in % oder mm oder Liter. Dann weis ich ob ich meinen Garten giesen kann.
Ja und wenn man's dann elektronisch will hängt man ein T-Stück rein und baut nen Drucksensor ran wie der Vorredner schon mal erklärt hat.
schönen Tag noch von Uli
 
Hallo Dieter!

es ist Interessant zu verfolgen, welch doch so einfache und genialen Erfindungen immer wieder mit immensem Aufwand versucht getoppt zu werden.
1. Elektronik, egal in welcher Form in einer unterirdischen Zisterne führt wegen Umwelteinflüssen ( Wasserdampf und Kondansation) zum Totalausfall der el. Komponenten in kurzer Zeit.

Ja, tolle Idee, nur ist die Idee für mich nicht neu. Hatte ich auch schon im Kopf und mit dem Thema habe ich mich auseinander gesetzt.
Ich habe mich aber bei der Umsetzung für den Ultraschallsensor entschieden.
Dabei geht es mir nicht darum irgendwen irgendwas zu toppen und dafür immensen Aufwand zu treiben oder total super ultimativ geniale Dinge zu entwickeln die 1000 Jahre halten müssen und mit denen man zum Mond fliegen kann.

Ich bastle aus Spass an der Freude und um mir das ein oder andere Thema mal näher anzusehen. Als Mittel zum Zweck quasi.

Weil ich das Thema mit dem Ultraschallmindestens doppelt so spannend fand als das Thema mit dem Drucksensor wollte ich eben die Messung mit dem Ultraschalsensor machen. Luft durch ein Rohr pusten kann jeder!

1. Ein Bekannter hat seit fast 10 Jahren in seiner Zisterne einen Ultraschallsensor am Laufen und bisher funktioniert die Elektronik ohne Probleme. Es kommt immer darauf an wie man die Elektronik verpackt!

2. Ich hatte heute durch Zufall zum Reinigen meine Zisterne offen und ich kann Dir sagen, dass der Sensor noch aussieht wie am ersten Tag. Mal sehen wie lange er durchält.

3. Wenn die Elektronik irgendwann ihren Geist aufgiebt. Ja und, dann greife ich zum Lötkolben und löte mir einen. Dann gibt es eben Ersatz. Ja und!
Eine weitere PCB und ein Sensor liegen schon zur Sicherheit in der Schublade.

Have fun!

Schon bei der Entwicklung des Dings fand ich es total spannend mit dem ultraschallsensor in der Wohnung herumzurennen und Entfernungen zu messen. Ganz spannend waren die Echos .....


Doch genug. Aber ich freue mich auch über andere gute Einfälle. Was hältst Du von der Idee, Deinen Vorschlag in die Tat umzusetzen und die Elektronik sowie den Code in einem eigenen Thread hier im Forum vorzustellen.

Grüße,
Markus
 
Hallo zusammen,

mit folgender privater Nachricht wand sich ein Mitglied unseres Forums an mich. Weil ich der Meinung bin, dass es auch andere interessieren könnte werde ich in diesem Thread auch eine Antwort auf die Frage geben.

ich habe Probleme die Programmierung deiner Füllstandsanzeige zu verstehen. Es geht mir um den Master / Slave Teil. Kannst du mir eine vereinfachte Zusammenstellung geben, wie ich Daten von einem AVR zum anderen schicke? Ich will 2 Atmega32 mit einem Bus verbinden und einer davon soll nur Steuern und Regeln.

Ich beantworte die Frage natürlich gerne wie folgt:

* Für die Verbindung beider ATmegas in meiner Schaltung verwende ich die HW RS232 die auf den Bausteinen via HW vorhanden und von BASCOM auch unterstützt wird.

* Ich übertrage die Daten mit einer Geschwindigkeit von 38400 Baud über jeweils COM1.

* Da beide Systeme asynchron arbeiten und es dadurch auch zu zeitlichen Verschiebungen kommen kann habe ich für den Master noch einen Empfangsbuffer für den seriellen Empfang von Slave-Daten aktiviert. Damit stelle ich sicher, dass ich auf jeden Fall die Antwort des Slaves mitbekomme. Gemacht wird das z.B. wie folgt:


CodeBox Bascom
' Hardware RS232 Kanal 1 konfigurieren = interne RS232
Config Com1 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Config Serialin = Buffered , Size = 128
Open "com1:" For Binary As #1


* Das Funktionsprinzip für den Datenaustausch ist ganz einfach. Alles was im System passiert wird vom Master gesteuert. Der Master sendet je nachdem was gerade gemacht wird Botschaften (Befehle die ich selbst definiert habe und die aus Byte-Werten (Buchstaben) bestehen) an den Slave.

* Der Slave empfängt die Botschaft vom Master. Da der Slave nur zur Abarbeitung der Master-Kommandos programmiert ist hört der Slave immer auf der RS232 in Empfangsrichtung nach Kommandos. Wird ein Kommando empfangen wird die jeweilige Aufgabe abgearbeitet und das Ergebnis erneut über RS232 vom Slave an den Master gesendet.

* Der Master empfängt die Ergebnisbytes in der Empfangsqueue. Nach dem Absenden der Kommandos vom Master zum Slave wartet der Master auf eine Antwort vom Slave und verarbeitet diese. Das Warten auf ein Zeichen vom Slave mache ich wie folgt über den Empfangsbuffer:


CodeBox Bascom
      ' RS232 Buffer lesen
Temp_byte_1 = Ischarwaiting(#1)


* Parallel ziehe ich einen Sekundentimer auf den ich für den fall setzte, dass der Slave nicht antwrotet. Bedeutet, ich warte nur einem bestimmte Zeit x auf den Empfang eines Zeichens vom Slave und verarbeite sonst den Fehlerfall.

* Das Senden von Botschaften vom Master zum Slave und vice versa funktioniert über den normalen Print-Befehlt. Z.B. so:


CodeBox Bascom
   ' Messkommando an Slave senden
Print "{001}" ' Füllstand messen


* Beim Messen des Füllstands übertrage ich z.B. nach Messwertanforderung durch den Master das gesamte Array vom Slave zum Master in dem ev. auch vorhadene Echos beinhaltet sind. Das mache ich z.B. so:


CodeBox Bascom
            ' Messwerte an Master übertragen
For Temp_byte_1 = 1 To 17
Print #1 , Srf_result_struct(temp_byte_1) ' Word-Werte
Next Temp_byte_1

Man sieht hier, dass auch das Array einfach als Print in einer For-Schleife zum Master gesendet wird.

* Da bei einem normalen Print noch Zeichen wie CR + LF übertragen werden behandle ich diese Zeichen separat. Weiter sendet der Print Zeichen und keine Ziffern. Bedeutet ein Bytewert 128 geht als text "128" über die Leitung und kann nicht direkt wieder in eine Byte-Variable geladen werden. Das mache ich im Programmcode so, dass ich die empfangenen Zeichen "parse" und mir meine Zahlen wieder zusammensetze. So:


CodeBox Bascom
      Do                                                    ' Zeichen-Schleife
Temp_byte_2 = Waitkey(#1) ' Zeichen von Kanal #1 lesen

' Ist Zeichen <CR> oder <LF>
If Temp_byte_2 <> 10 And Temp_byte_2 <> 13 Then ' Auf CR und LF prüfen
' NEIN, Zeichen ist normales Zeichen

' Damit kann Zeichen dem Ergebisstring angehängt werden
Temp_string_1 = Temp_string_1 + Chr(temp_byte_2)

Else ' CR / LF Prüfung
' CR wird mit diesem Konstrukt überlesen und bei LF wird Datenübernahme
' gestartet

' Wurde <LF> erkannt?
If Temp_byte_2 = 10 Then
' JA

' Ergebnisstring in Integer-Variable wandeln und speichern
Temp_messwert = Val(temp_string_1)
' Ergebnisstring zurücksetzen
Temp_string_1 = ""

End If ' LF Prüfung
End If ' Cr / Lf Prüfung
Loop Until Temp_byte_2 = 10 ' Zeichenschleife wiederholen bis LF


* In BASCOM gibt es noch die Befehle PRINTBIN und INPUTBIN mit denen es möglich ist auch binäre Daen also direkte Variableninhalte zu senden. Das kann man machen, ich habe mich halt für diesen Lösungsweg entschieden.


Sooooo, ich glaube das ist das ganze Hexenwerk für das es sicherlich min. noch 5 andere Lösungen gibt. Ich betrachte meine Lösung als sehr einfach. Ich habe auch den vorteil, dass ich mit einem Tool wie z.B. Breakout usw. ganz einfach auf der RS232 mithören/mittracen kann, was gerade über die Lieutn geht. und dadurch dass ich Print verwende kann ich das auch gleich im Klartext lesen ohne es umrechnen zu müssen.

Ich hoffe damit die Frage geklärt und erklärt zu haben und wünsche allen weiter viel Spass beim tüfteln und basteln.

Grüße,
Markus
 
Serielle Kopplung

Hallo,

Danke Markus für die super Erklärung und den sehr gut dokumentierten SourceCode.

Ich sitze derzeit vor dem selben Problem. Es beschäftigt mich nun schon 2 Tage, ohne dass ich zu einem Ergebnis komme.

Folgende Situation:
Mega 644P mit zwei UARTs
UART 1 kommuniziert per serieller Schnittstelle mit dem PC. Darüber laufen Trace-Ausgaben, hauptsächlich, das was ich auch an UART2 Printe
UART 2 ist mit einem Mega8 UART verbunden (gekreuzt). Die Ausgaben vom 644er sollen am 8er verarbeitet werden. Nur leider gelingt es mir nicht die Zeichen einzulesen. Am 8er habe ich noch einen Software UART konfiguriert, worüber Traces ausgegeben werden. Dort kann ich auch Eingaben machen.

Den 8er kann ich per SW UART bedienen. Nach einer Sendung vom 644er kann ich am 8er das notwendige Rückmeldesignal per Terminalsession erzeugen. Der 644er liest dies auch ein.

Jetzt habe ich versuchsweise am 8er HW und SW UART getauscht. Dann kann ich auch Eingaben einlesen. Ist es möglich, dass der 8er Defekt ist, oder gibt es irgend eine Fuse-Einstellung die das Einlesen am UART verhindert?

Hat jemand eine Idee?

Anbei der Code vom 644er:
Code:
Select Case Key_buffer
      Case 40:                                              ' ok = Übernehmen
            #if Main_testmodus                              ' Trace
            Print #1 , "Funktion: Lebenszeichen von Slave abfragen"
            #endif                                          ' Trace
            Print #1 , "AT"
            Print #2 , "AT"                      '

            ' Arbeitsstring vorbereiten
            Rueckmeldung = ""

            Do
               ' RS232 Buffer lesen
               Temp_byte_1 = Ischarwaiting(#2)
               Clear Serialin1
               ' Prüfen ob Zeichen wartet
               If Temp_byte_1 <> 0 Then
                  ' JA es wartet ein Zeichen
                  ' Wenn Konstante gesetzt Trace Output schreiben
                  #if Main_testmodus                        ' Trace
                     Print #1 , "Zeichen wartet"
                  #endif
                  Exit Do
               End If                                       ' Pürfung ob Zeichen wartet
            Loop Until Temp_byte_1 = 0                      ' Timeout
            Temp_byte_2 = Waitkey(#2)
            Rueckmeldung = Chr(temp_byte_2)
            Print #1 , "Zeichen Empfangen:" ; Rueckmeldung
            State = Loadlabel(s521)

Und der Code vom 8er
Code:
Do
      Temp_byte_1 = Inkey(#3)
      If Temp_byte_1 > 0 Then
        Select Case Temp_byte_1:


            'Taste                                             'a'
           Case 97:
              Print #2 , "Funktion: Abfrage ok"
              Print #1 , "o"                                ' Leerzeile ausgeben

           ' Taste 'b'
           Case 98:
              Print #2 , "Funktion: noch offen 1"
              Print #1 , "k"                                ' Leerzeile ausgeben

           ' Taste 'c'
           Case 99:
              Print #2 , "Funktion: noch offen 2"
              Print #1 , "i"                                ' Leerzeile ausgeben

           ' Taste 'd'
           Case 100:
              Print #2 , "Funktion: noch offen 3"
        End Select
      End If
         ' --- Funktionen welche vom Master aufgerufen werden ---


      Temp_byte_1 = Ischarwaiting(#1)
      If Temp_byte_1 = 1 Then
        Do
          Temp_byte_2 = Inkey(#1)
          If Temp_byte_2 <> 0 Then
             Print #2 , Chr(temp_byte_2)                      ' Ja, Zeichen wartet
          End If
          If Temp_byte_2 <> 10 And Temp_byte_2 <> 13 Then
              Temp_string_1 = Temp_string_1 + Chr(temp_byte_2)
          Else
           If Temp_byte_2 = 10 Then
              Eingabe = Temp_string_1
              Temp_string_1 = ""
           End If
          End If
        Loop Until Temp_byte_2 = 10
        Clear Serialin


      Eingabe = Temp_string_1
      Print #2 , "Eingelesener String: " ; Eingabe
      At_string = Left(eingabe , 2)
      Print #2 , At_string
      If At_string = "AT" Then
         Ziel_string = Mid(eingabe , 4 , 3)
         Befehl_string = Mid(eingabe , 8 , 1)
         Wert_string = Mid(eingabe , 10 , 5)
         Print #2 , Ziel_string
         Print #2 , Befehl_string
         Print #2 , Wert_string
      End If
     End If


   Loop

Nachtrag:
Ich habe mal versucht die HW UART des Mega8 mit dem PC zu verbinden. Ausgaben kommen am PC an, Eingaben des PC werden jedoch nicht verarbeitet.
Es scheint also der Wurm im RXD des UART des Mega8 zu sein.
 
Hi,

schick mir bitte noch ein Schaltbild damit ich sehe wie Du die Komponenten miteinander verschaltet hast und damit ich den Signalfluss nachvollziehen kann.
Setzt Du einen MAX232 ein?

Grüße,
Markus
 
Hallo,

@Markus: Vielen Dank für Deine Rückmeldung.

Ich habe den Fehler noch weiter eingrenzen können.
Ich bin jetzt mal auf einen ganz einfachen Aufbau zurück gegangen.
Testboard und einen Mega8. Anbindung über einen SerialPort (mit einem Tiny2313 simuliert) über USB an einen PC.

Die Eingabe von Daten funktioniert... aber
Sobald ich einen Buffered Mode für Com1 einrichte mit:
Code:
Config Serialin = Buffered , Size = 10
funktioniert der Ischarwaiting nicht mehr, sprich ich kann keine Eingaben machen. Ohne den Buffered Mode kann ich nicht ausreichend Zeichen übertragen. Von einem String mit mehr als 2 Zeichen kommen nur die ersten 2 Zeichen an.

Hier der Codeblock zum Einlesen der Zeichen:
Code:
Temp_byte_1 = Ischarwaiting()
      If Temp_byte_1 = 1 Then
         Print "Temp_Byte gesetzt"
        Do
          Temp_byte_2 = Inkey()
          If Temp_byte_2 <> 0 Then
             Print "Eingelesenes Zeichen: " ; Temp_byte_2   ' Ja, Zeichen wartet
          End If
          If Temp_byte_2 <> 10 And Temp_byte_2 <> 13 Then
              Temp_string_1 = Temp_string_1 + Chr(temp_byte_2)
              Print "Temp_String: " ; Temp_string_1
          Else
           If Temp_byte_2 = 10 Then
              Eingabe = Temp_string_1
              Temp_string_1 = ""
           End If
          End If
        Loop Until Temp_byte_2 = 10
        'Clear Serialin

      Print "Eingelesener String: " ; Eingabe
      At_string = Left(eingabe , 2)
      Print "AT_String: " ; At_string
      'If At_string = "AT" Then
         Ziel_string = Mid(eingabe , 4 , 3)
         Befehl_string = Mid(eingabe , 8 , 1)
         Wert_string = Mid(eingabe , 10 , 5)
         Print "Ziel_String: " ; Ziel_string
         Print "Befehl_String: " ; Befehl_string
         Print "Wert_String: " ; Wert_string
      'End If
     End If

Und das verstehe ich nicht. Hat dazu jemand eine Idee? Muß ich den Extendes UART evtl mit Fuses aktivieren?

Chip ist ein Mega 8-16 PU

Gruß
Christian
 
So,

und nun habe ich den Fehler gefunden. Wenn ich den Serialin mit Buffer einrichte muss ich Global Interrupts zulassen.

Danke an alle für die Hilfe.

Gruß
Christian
 
Wow, da hätte ich mir ja jetzt echt den Wolf gesucht. Zum glück hast Du es selbst gefunden.

Code:
Enable Interrupts

Ja, anders funktioniert es nicht.

Aber noch etwas! Wenn Du mit COM1 usw. eine RS232 einrichtest auf einen Datenstrom #1 oder #2 so musst Du wirklich konsequent bei allen ISCHARWAITING oder PRINT usw. immer auch den channel angeben.

Bei der Verwendung des Mega128 musst Du auf den 108 Kompatibilitätsmodus aufpassen. Im KomMod kann der mega128 die 2. RS232 nicht.

Grüße,
Markus
 
Hallo Markus,

danke für die Infos zu den Angaben zum Channel, das hatte ich aber drin.

... und ich habe mir den Wolf gesucht.

Gruß
Christian
 
Hallo, jupp meine ich. Natürlich 103, sorry, war in Tippfehler!

Grüße,
Ma
 
Slave modifizieren

Hallo Markus,

meinst Du man könnte Deine Schaltung auf den SRF02 umstricken ?
Der ist wesentlich günstiger, und hat auch gleich eine RS232 Schnittstelle !

Viele Grüße

Alexander :)
 
Hallo Alexander,

natürlich kannst Du - ich denke sogar mit wenig Aufwand - meine Software auf den SRF02 anpassen. Dadurch, dass in meiner SW alles sehr strukturiert ist und die eigentlichen Funktionen gekapselt sind ist das leicht möglich.

Zunächst musst Du Dich aber dafür entscheiden, ob Du den I2C oder den RS232 Modus betreiben möchtest.

Ich hatte mich damals für das größere Modul entschieden da mich die Reflexionen in der Zisterne im Testbetrieb interessiert haben. Außerdem habe ich ja eine Master-Slave-Konstruktion entwickelt, weil ich neben dem Füllstand eben auch noch die Teperatur im Tank messen wollte. Damit erschien mir der Ansatz als vernünftig. Würde ich heute auch noch so machen.

Bei Dir kommt es darauf an, wie viel Meter Kabel Du benötigst. Vermutlich kommst Du nicht darum herum die RS232 zu verwenden.

Wenn Du keinen Master-Slave machst sondern alles mit einer Elektronik dann kannst Du die beiden Programme SLAVE und MASTER miteinander "verschmelzen" und die relevanten Code-Teile übernehmen.
Die für Dich wichtigste Funktion welche Du an den SRF02 anpassen musst ist die Funktion "Srf_measurement:". Dort mache ich die eigentliche Kommunikation dem dem SRF-Modul.

Die Steuerung zur Messung und zur Kommunikation mit meinem Master ist in der Hauptschleife von ZFA_SLAVE enthalten.

Ich hoffe das hilft Dir zunächst etwas weiter. Wenn Du mehr Hilfe benötigst dann teile es mir einfach mit. Allerdings benötige ich von Dir dann auch etwas mehr Info wie Deine HW aussehen soll und wie Du Dir die Umsetzung vorgestellt hast.

Im Datenblatt zum SRF02 ist ja sogar schon ein BASCOM-Beispiel für die Ansteuerung enthalten.

Allerdings solltest Du Dir wirklich nochmals Gedanken darüber machen, ob Du wirklich den SRF02 einsetzen möchtest. Bei meinem SRF08 kann man die Sendeleistung des US-Signals und die Empfangsverstärkung einstellen. Ich musste bei beiden Variablen sehr kleine Werte eistellen, damit ich in dem geschlossenen Körper "Zisterne" nicht tausende Echos und Überlagerungs-Echos bekommen habe. Bedeutet, kleine Sendeleistung, kurze Reichweite und Eingrenzung der Empfindlichkeit durch geringe Empfangsversärkung zur Reduktion von ungewollten Störechos und Reflexionen.

Ich würde - wenn Du auch in der Zisterne arbeiten möchtest - mit dem SRF02 Probleme erwarten da dieser mit einem Festen Wert für Sendeleistung und Empfangsverstärkung arbeitet. Jedenfalls habe ich nichts gefunden, wo man das einstellen kann.

Grüße,
Markus
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)