- LiFePO4 Speicher Test         
Ergebnis 1 bis 9 von 9

Thema: Sensor Wert mehrfach abfragen, erst dann...

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.02.2006
    Beiträge
    221

    Sensor Wert mehrfach abfragen, erst dann...

    Anzeige

    Powerstation Test
    Hallo,
    ich bin ein Neuling in Sachen Arduino und habe eine Frage:
    Wie kann ich einen Spannungswert mehrfach abfragen (z. B. innherhalb von 10 Sekunden) und erst, wenn der Wert jedesmal innerhalb dieses 10-Sekundenintervalles einen definierten Schwellenwert unterschreitet eine Aktion durchführen?
    Es geht um einen Akku, der wenn er entladen ist, abgeschalten werden soll, aber nicht wenn der Schwellwert nur kurzzeitig unterschritten wird.
    Danke!

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    dafür gibt es statistische und arithmetische mittel, weist du denn wie du deinen wert überhaupt bekommst? oder brauchst du da auch schon hilfe für?
    das kam aus deiner frage jetzt nicht unbedingt so klar heraus
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  3. #3
    HaWe
    Gast
    Zitat Zitat von xxrider Beitrag anzeigen
    Hallo,
    ich bin ein Neuling in Sachen Arduino und habe eine Frage:
    Wie kann ich einen Spannungswert mehrfach abfragen (z. B. innherhalb von 10 Sekunden) und erst, wenn der Wert jedesmal innerhalb dieses 10-Sekundenintervalles einen definierten Schwellenwert unterschreitet eine Aktion durchführen?
    Es geht um einen Akku, der wenn er entladen ist, abgeschalten werden soll, aber nicht wenn der Schwellwert nur kurzzeitig unterschritten wird.
    Danke!
    wie Ceos schon schrieb, arithmetische Mittel gehen und finde ich auch ausreichend.

    Direkt am Analogpin misst du einen Rohwert zwischen 0...1024, das ist dein Messbereich (Achtung! darf direkt am Arduino Pin hächstens 5V sein, bei manchen Arduinos sogar nur 3.3V!);

    Du musst ihn dann in float umwandeln und nimmst einfach das Mittel zwischen dem bisherigen Durchschnittswert und deinem aktuellen:

    float Durchschnitt;

    Durchschnitt = (Durchschnitt + (float)analogRead(MessPin) ) /2;

    kurze kleine Ausreißer werden nicht viel ausmachen, mit der Zeit wird dann bei dauerhaft niedrigem Messwert auch deine Schwelle unterschritten.
    Ansonsten ist bei häufigen starken Ausreißern ein anderes Verfahren nötig (z.B. Median) - das ist aber deutlich komplizierter.
    Das ganze packst du in deine Arduino-Funktion loop().

    Zwischen die einzelnen Messungen kommen dann am einfachsten delay(ms-Anzahl), bei 10 s also delay(10000);
    es reicht aus zum testen, auch dafür gibt es elegantere Methoden.

    Für absolute Anfänger empfehle ich allerdings: mach erst mal ein Arduino Tutorial!

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.02.2006
    Beiträge
    221
    Ich habe mich wohl mißverständlich ausgedrückt:
    Ich will keinen Mittelwert.
    Ich will sagen wir mal 5 Werte abfragen innerhalb eines Zeitraumes von 10 Sekunden.
    Wenn ALLE Werte UNTERHALB eines Schwellenwertes sind, dann soll eine Aktion erfolgen.
    Wenn nicht, dann soll wieder von vorne abgefragt werden (5x).

    Den Wert mit Spannungsteiler und Analogeingang zu ermitteln ist kein Problem.
    Nur die Logik und Syntax für diese Aufgabe, da fehlt mir etwas das Verständnis...

  5. #5
    HaWe
    Gast
    Zitat Zitat von xxrider Beitrag anzeigen
    Ich habe mich wohl mißverständlich ausgedrückt:
    Ich will keinen Mittelwert.
    Ich will sagen wir mal 5 Werte abfragen innerhalb eines Zeitraumes von 10 Sekunden.
    Wenn ALLE Werte UNTERHALB eines Schwellenwertes sind, dann soll eine Aktion erfolgen.
    Wenn nicht, dann soll wieder von vorne abgefragt werden (5x).

    Den Wert mit Spannungsteiler und Analogeingang zu ermitteln ist kein Problem.
    Nur die Logik und Syntax für diese Aufgabe, da fehlt mir etwas das Verständnis...
    ok, aber auch nicht so schwer...:
    Code:
    void loop() {
      volatile static int counter=0;
      
      int wert = analogRead(messPin);
      if (wert<Schwelle) counter++;
      else 
      counter=0;
      
      if(counter>=5) {
         bingo();
      }
      delay(2000);
    }
    so als erste Idee...

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.02.2006
    Beiträge
    221
    danke das muss ich mir näher zu gemüte führen.

    Muss ich da unbedingt so seltsam definieren:
    volatile static int counter=0;

    oder geht nicht auch einfach mit
    int...?

  7. #7
    HaWe
    Gast
    Zitat Zitat von xxrider Beitrag anzeigen
    danke das muss ich mir näher zu gemüte führen.

    Muss ich da unbedingt so seltsam definieren:
    volatile static int counter=0;

    oder geht nicht auch einfach mit
    int...?
    kurze Antwort: probier's aus!
    lange Antwort:
    ich bin bei Arduino mit seinen verschiedenen Compiler-settings für verschiedene Zielplattformen (AVR, SAM, SAMD, ESP8266) vorsichtig geworden.
    Die loop() Funktion ist mir da besonders suspekt.
    volatile: man weiß nie, was der Code-optimizer rausschmeißt, für welche Zielplattform auch immer, wenn mit den Werten nicht groß was passiert. Ich ging hier im Testcode auf Nummer Sicher, damit es bei dir auch wirklich sicher funktioniert, darauf verzichten kann man nach Test immer noch, aber dieser Punkt ist wschl am unkritischsten.
    static: es ist eine lokale Funktion mit einer lokalen Variablen, die innerhalb der Funktion in verschiedenen Durchläufen hochgezählt oder wieder resettet wird. Gerade mit solchen Werten habe ich bereits schlechte Erfahrungen in loop() gemacht, wenn sie nicht als static deklariert waren, insb. Arduino Due (SAM) mit Scheduler und ESP8266.

    Aber wie gesagt, muss vlt alles nicht unbedingt sein, probier's einfach aus.

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    27.02.2006
    Beiträge
    221
    Das dumme ist - ausprobieren geht grad nicht weil ich mein Board durch Falschpolung heute geschrottet hab! Ein Neues ist aber unterwegs...

    Noch eine Frage:
    die Zuweisung von 0 an den counter
    (volatile static int counter=0)

    befindet sich doch innerhalb der schleife. Also dürfte der Wert doch niemals >1 werden weil er bei jedem Durchgang wieder auf 0 gesetzt wird,
    oder seh ich da was falsch???

  9. #9
    HaWe
    Gast
    nein, eben nicht, weil er static ist und in loop nur beim ersten Durchlauf zu Beginn initialisiert wird.
    Ist auch so eine auf den ersten Blick seltsame und nicht ganz transparente loop-Eigenheit, eben Arduinoisch, nicht echt C++, auch deshalb gehe ich hier immer auf Nummer Sicher.
    Wie es in C++ umgeformt hieße, führt hier aber jetzt zu weit.

Ähnliche Themen

  1. Hackaday Prize 2015: Erst die Welt retten und dann ins Weltall
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 10.03.2015, 08:20
  2. Pin's abfragen und als Hex Wert ausgeben
    Von elkokiller im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 03.12.2006, 13:14
  3. Ausgang beim Atmaga8 springt erst auf -1,9V und dann auf 5V
    Von Micha G. im Forum AVR Hardwarethemen
    Antworten: 6
    Letzter Beitrag: 27.11.2006, 17:20
  4. Erst bohren, dann belichten?
    Von mrroboto im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 3
    Letzter Beitrag: 26.11.2006, 13:13
  5. Bedingung abfragen "von bis dann ...."
    Von sachse im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 01.10.2005, 16:29

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress