Pages: [1]   Go Down
Author Topic: Impulse erfassen und zum Schalten verwenden???  (Read 595 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 1
Posts: 27
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo zusammen,

ich steh eben total auf dem Schlauch...
Wie bekomme ich es es hin das Arduino Impulse eines Durchflussmessers prüft und sobald keine Impulse mehr kommen einen Ausgang schaltet.
Das die Impulse je nach Durchflussmenge unterschiedlich sind komme ich grad nicht weiter wie ich das am besten hin bekommen.
Wenn 30 Sekunden lange keine Impulse mehr ankommen, einen Ausgang zu schalten.
Kann mir jemand den Wald zeigen den ich vor lauter Bäumen nicht mehr sehe?
Logged

Offline Offline
Faraday Member
**
Karma: 97
Posts: 3524
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Einen Zähler oder Timer programmieren der dir jede Sekunde von 30 runter zählt. Wenn ein Impuls kommt wieder auf 30 setzen. Und dann auf 0 abfragen. Oder anders herum.
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 249
Posts: 21193
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

interrupt der vom Durchflußmesser ausgelöst wird und der den millis() in einer unsigned long Variablen abspeichert und dann im loop die Zeit zwischen abgespeicherten Wert und aktuellen millis() Wert kontrollieren. Falls größer als 30000 dan Ausgang schalten. Das funktioniert für Zeiten ohne Impulse von ca 49,5 Tagen.

grüße Uwe
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 27
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Mit den Timern hab ich nocht nicht viel gemacht.
Ein Beispiel habt Ihr nicht zufällig?
Logged

Offline Offline
Faraday Member
**
Karma: 97
Posts: 3524
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Nimm den Vorschlag von uwefed. Das ist einfacher, da du dir einen Schritt sparst. Ist eigentlich offensichtlich, aber daran dass man konsequent millis() verwenden sollte muss ich mich noch gewöhnen. Dabei habe ich in meinem aktuellen Projekt eine Routine, die das LCD ausschaltet wenn 60 Sekunden lang nichts gedrückt wurde. Das ist das gleiche  smiley-roll

Code:
volatile unsigned long lastPulse = millis();

void setup()
{
      attachInterrupt(0, interrupt, RISING);   //0 = DigitalPin 2, 1 = DigitalPin 3
}

void loop()
{
     if(millis() - lastPulse > 30000)
     {
         //mach was
     }
}

void interrupt()
{
     lastPulse = millis();
}

Wobei millis() in Interrupt-Routinen nicht richtig updatet, da die Systemuhr selbst mit einem Interrupt läuft. Bei solch langsamen Ereignissen wie hier sollte das keine Rolle spielen, aber es ist nichts wenn man Präzision will.

« Last Edit: July 06, 2013, 03:54:41 pm by Serenifly » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 249
Posts: 21193
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich würde noch etwas hinzufügen.

Code:
void loop()
{
     if(millis() - lastPulse > 30000)
     {
         //setze LED
         //mach was
     }
    else
    {
        // lösche LED
    }
}
Grüße Uwe
« Last Edit: July 06, 2013, 03:50:48 pm by uwefed » Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 27
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich habe das jetzt so übernommen und die LED eingetragen um zu sehen was passiert.
Leider geht die LED nicht an???

volatile unsigned long lastPulse = millis();
const int ledPin =  13;      // the number of the LED pin
int ledState = LOW;   

Code:
void setup()
{
  attachInterrupt(0, interrupt, RISING);   //0 = DigitalPin 2, 1 = DigitalPin 3
  pinMode(ledPin, OUTPUT);
}

void loop()
{
     if(millis() - lastPulse > 1000)
     {
         ledState = LOW;       
       }
     else
     {
       ledState = HIGH;
     }
}

void interrupt()
{
     lastPulse = millis();
}
Logged

Offline Offline
Full Member
***
Karma: 6
Posts: 157
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Natürlich musst du die LED noch mit digitalWrite() anmachen.
Dein loop sollte dann z. B. so aussehen:

Code:
void loop()
{
     if(millis() - lastPulse > 1000)
     {
         ledState = LOW;       
       }
     else
     {
       ledState = HIGH;
     }
     digitalWrite(ledPin,ledState);
}
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 27
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Super vielen Dank.
Logged

Offline Offline
Newbie
*
Karma: 1
Posts: 27
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Jetzt hab ich doch noch eine Frage.
Läuft der Code auch in einem ATTiny 85?
Bei der Datei die den ATTiny Support in der Arduino IDE herstellt, kann ich zwar was zum millis() finden aber nix zum Interrupt Support. Lauten Datenblatt hat der ATTiny 85 aber Interrupt Eingänge.
Geht der Code somit trotzdem in ATTIny 85?
Logged

Pages: [1]   Go Up
Jump to: