Ankündigung

Einklappen
Keine Ankündigung bisher.

[Konnekting] Idee: BodenfeuchteSensor

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    #16
    Moin,

    so, der Sensor ist angekommen. Ich denke, Donnerstag kommt der Rest.
    Zeit sich mit der Programmierung zu beschäftigen!

    Gruß,
    Hendrik

    Kommentar


      #17
      Je nachdem wie genau Du es machen willst, könntest Du die Bodentemperatur noch mitmessen und damit den Wert korrigieren. Ist für Gartenbewässerung nicht wirklich notwendig... Die Formel ist: (4,093+3,213*X)/(1-0,009733*X-0,01205*Y) wobei X der Widerstand in Ohm /1000 ist und Y die Temperatur in Grad Celsius.

      Kommentar


        #18
        Zitat von tuxedo Beitrag anzeigen
        Schließe den Spannungsteiler am einen Ende an einen Digitalen Pin "A" an und am anderen Ende an einem digitalen Pin "B".

        Wenn du nun A=1 und B=0 machst und kurze Zeit später abwechselst --> A=0 und B=1, kannst du die Polarität im Spannungsteiler jeweils umkehren. Somit hast du eine Rechteck-Wechselspannung.

        Weiter ist im Datenblatt ein 18k Widerstand für den Spannungsteiler empfohlen.
        Also so, wie im Anhang (einmal pur Bodenfeuchte, einmal mit Vorbereitung für i2c und 1wire)

        Gruß,
        Hendrik
        Angehängte Dateien
        Zuletzt geändert von henfri; 11.06.2016, 11:30.

        Kommentar


          #19
          P.S:
          Darf ich D2&D3 eigentlich nutzen?
          Ich sehe gerade, dass die am Prog-Switch hängen könnten.

          Kommentar


            #20
            Du solltest andere Pins nehmen dafür. D2 und D3 sind interrupt Pins und auch für den Prog-Switch gedacht ja.
            www.smart-mf.de | KNX-Klingel | GardenControl | OpenKNX-Wiki

            Kommentar


              #21
              Ok, habe ich geändert.

              Habe den Code jetzt soweit fertig. Ungetestet, denn ich bekomme keine Verbindung zw. Suite und Hardware via KNX, siehe hier.
              Ich habe den Code und die XML angehängt und würde mich über Feedback freuen.
              Hier mal der betreffende Teil Inline:
              Code:
              //Bodenfeuchte
              // ********** Get Bodenfeuchte***********
                      // WatermarkPin =   D7;     // select the pin watermark Sensor
                      // sensorPin =      A3;    // select the input pin for Voltage Reading (mid of Voltage divider)
                      // ResistorPin =    D6;  // select the pin for the 18k Resistor
              
              
                      if ((currentTime - previousTimeBF) >= intervalBFUser) {
                          digitalWrite(WatermarkPin, LOW);
                          digitalWrite(ResistorPin,   HIGH);
                          delay(100);
                          long start = micros();
                          int currentVoltage = analogRead(sensorPin);
                          long end = micros();
                          //convert Voltage to Resistance
                          unsigned int   R=18;
                          float U=3.3;  //Should we better measure the voltage?
                          float currentR  = R/(U/currentVoltage-1) *1000;  // current resistance of Watermark Sensor in Ohm
                          
                          //convert Resistance to Feuchtigkeit
                          float soilTemp=10;
                          float currentBF=-((4.093+3.213*currentR)/(1-0.009733*currentR-0.01205*soilTemp))*10;  //unit hPa, convert to positive Values
                          
                          
              #ifdef DEBUG 
                          DEBUG.print("currentV: ");
                          DEBUG.println(currentVoltage);
                          DEBUG.print("currentR: ");
                          DEBUG.println(currentR);
                          DEBUG.print("currentBF: ");
                          DEBUG.println(currentBF);
                          DEBUG.print("time: ");
                          DEBUG.println((end-start));
              #endif
                          if (currentBF < 900) {
                              
                              switch (typeBF) {
                                  case 0:
                                      Knx.write(7, currentBF);
                                      break;
                                  case 1:
                                      if (abs(currentBF * 100 - previousBF * 100) >= diffBFUser * 100) {
                                          Knx.write(7, currentBF);
                                          previousBF = currentBF;
                                      }
                                  default:
                                      break;
                              }
                              limitReached(currentBF, limitBFMin, limitBFMax, 8, 9, valueBFMin, valueBFMax);
                              previousTimeBF = currentTime;
                          }
                      }
                      //invert the Voltage
                      unsigned int WatermarkPinStatus=digitalRead(WatermarkPin);
                      digitalWrite(WatermarkPin, !WatermarkPinStatus);
                      digitalWrite(ResistorPin,   WatermarkPinStatus);
              
              //End Bodenfeuchte
              Eine Frage hätte ich: Die Spannung wird ja durch die letzten drei Zeilen invertiert. Kann das die Messung stören, sprich: brauche ich das delay(100)?

              Viele Grüße,
              Hendrik
              Angehängte Dateien

              Kommentar


                #22
                Ein gewisses delay brauchst du schon... Aber du kannst nicht einfach die CPU 100ms schlafen legen. Denn in der Zeit kann kein KNX Telegramm verarbeitet werden.

                Kommentar


                  #23
                  Hallo,

                  danke. Ich habe es jetzt so gemacht, dass ich einen Zähler habe, der von 0 bis 4000 zählt und dann bei 0 anfängt.
                  Von 0 bis 2000 ist die polarität richtig für's messen. Bei 2000 wird umgepolt.

                  Gemessen wird nur zwischen 200 und 2000, das heißt, dass 200 Zyklen für's 'einschwingen' da sind.
                  Beim Betrachten des Output fällt auf, dass der Output zunächst sehr schnell kommt, später aber sehr langsam wird. Ist das normal, oder mache ich etwas falsch?
                  Die ersten ~1100 Zyklen laufen in 20ms je Zyklus, während dann ein Sprung auf 340ms kommt; bei dieser Zyklus-Zeit bleibt es dann.

                  Woran kann das liegen?

                  Gruß,
                  Hendrik
                  Angehängte Dateien

                  Kommentar


                    #24
                    Ich denke dein zyklus ist zu schnell, so dass sich ein Puffer bei der Ausgabe aufschaukelt und das dann bremst.

                    Ändere den Code nochmal:

                    Statt eines Zählers merkst du dir initiell die Zeit und läuftst durch deine loop() durch. Pro duerchlauf checkst du wieviel zeit vergangen ist (aktuelle zeit - initielle Zeit). Wenn 500ms vergangen sind wechselst du die Polung und merkst dir erneut die initielle Zeit.

                    Du kannst das auch über Timer regeln, ist vom Code her ein wenig aufwendiger, aber geht eigentlich "besser". Da aber die meisten Timer an einem Interrupt hägen, _kann_ dir das u.U. ein KNX Telegramm abwürgen.

                    Wenn du nicht auf das ultimative Stromsparen aus bist, reicht das mit dem messen der Zeit.

                    Und nicht vergessen: Wenn deine loop() recht lange (>400µs) läuft, dann solltest du schauen dass du öfters Knx.task() aufrufst, so dass du im Idealfall <400µs zwischen zwei Knx.task() aufrufen hast. Wenn du mehr als 400µs hast, dann können Telegramme verschluckt werden. Siehe auch: https://github.com/KONNEKTING/Konnek...ice_library.md

                    Kommentar


                      #25
                      Hallo,

                      danke für den Impuls. So geht es viel einfacher, als zuvor:
                      Code:
                              if ((currentTime - previousTimeBF) <= (intervalBFUser/2) ) {
                                //first half of Interval: invert voltage
                                if (measureReady) { // only change if needed, i.e. if not WatermarkPin=HIGH already ; We store this in a variable in order to prevent a read.
                                  digitalWrite(WatermarkPin, HIGH);
                                  digitalWrite(ResistorPin,   LOW);
                                measureReady=0;
                                }
                              }
                              else {
                                if (!measureReady) {  // only change if needed, i.e. if not WatermarkPin=LOW already
                                voltageFlipTime=millis();
                                digitalWrite(WatermarkPin, LOW);
                                digitalWrite(ResistorPin, HIGH);
                                measureReady=1;
                                }
                              }
                              if (  ( (currentTime - previousTimeBF) >= intervalBFUser ) && (currentTime-voltageFlipTime > 200) ) { 
                      // hier die Messung
                      Was hältst du davon?


                      Gruß,
                      Hendrik

                      Kommentar


                        #26
                        So auf den ersten Blick: Okay... Bin gerade auf dem Sprung und habs nur überflogen.

                        Kommentar


                          #27
                          Danke. Hängt jetzt draußen und macht seinen Dienst. :-o

                          Kommentar


                            #28
                            Super. Bin auf den Langzeit-Erfahrungsbericht gespannt, wenn das Ding mal 6 Monate gelaufen ist...

                            Kommentar


                              #29
                              Moin,

                              hier schon einmal die ersten 24h.
                              Finde ich noch nicht überzeugend... Ich habe den Sensor in ein sehr nasses Loch in ca 40cm Tiefe eingebaut. Es macht also erstmal Sinn, dass der Wert negativer (=trockener) wird. Es hat allerdings auch geregnet, so dass ich heute nicht Wässern würde. Das sieht der Sensor noch nicht.

                              So weit erstmal zum Ergebnis des Sensors.
                              Die Messung an sich wirkt recht verrauscht (~10%) Das ist mir eigentlich zu viel :-( Woran kann das liegen?
                              Ich tendiere dazu, mal einen Referenz-Widerstand zu messen.

                              Gruß,
                              Hendrik

                              Kommentar


                                #30
                                liegt vielleicht an der Sensor-Art?

                                Oder gibt's Probleme mit dem Lesen der Wertes mit dem Arduino? Kannst ja mal statt mit dem Arduino den Sensor mit einem Multimeter messen. ist ja nix weiter wie ein Widerstand.

                                Wie hast du denn den Sensor eingebaut? Wie hier in der PDF beschrieben mit einem "Belüftungsrohr"?

                                --> http://www.irrometer.com/pdf/sensors...%20%20Web5.pdf

                                Kommentar

                                Lädt...
                                X