Impulse Zählen und bei einem Schwellenwert ein Relay schalten

Hallo Zusammen,

zu mir nicht wundern Ich bin noch nicht lange in der Materie und habe ein Problem.
Ich würde gerne ein Relay schalten bei einem gewissen Impuls/Frequenz diese wird erfasst durch einen NPN Sensor der wird mit 13,8 Volt beaufschlagt und mittels Reihenschaltung zweier Wiederstände auf 5,1 Volt Digitales Eingangssignal zum Arduino Uno weitergeleitet.
Die Digitalschaltung Funktioniert Sensor bekommt etwas Magnetisches vorne ran Arduino bekommt Signal und Relay wird geschaltet.
Nun möchte Ich das aber erweitern durch ein Drehzahl Signal einer Kardanwelle diese hat 4 "Nocken" und soll bei 800 Umdrehung Pro Minute (ca10 km/h das Relay Schalten das die Rundumleuchte eingeschaltet wird.
daran Scheiter Ich Aktuell!!
Ich habe mich mit pulsIn ausprobiert, Ich bekomme ein Signal rein weiß aber nicht wie ich die "if" Bedingung schreiben soll

bedanke mich schonmal für die Unterstützung


int SchalterZustand;
int InputPin = 4;
int RelayPin = 13;
void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
pinMode(InputPin,INPUT);
pinMode(RelayPin,OUTPUT);
}

void loop() {
 // put your main code here, to run repeatedly:
SchalterZustand = digitalRead(InputPin);
Serial.println(SchalterZustand,DEC);

 if (SchalterZustand >= 1)
{
  digitalWrite(RelayPin,HIGH);
}
  if (SchalterZustand <= 0)
{
  digitalWrite(RelayPin,LOW);
}
}

Setze Deinen Code bitte in Codetags. Wie das geht, steht hier.

Außerdem wäre ein Link zu Deinem Sensor hilfreich.

Gruß Tommy

Hey Tommy
hier der Link für den Sensor

den Codetag füge ich gleich anders ein

Danke

Der schaltet nur mit dem NPN-Transistor nach GND. Desen Betriebsspannung kommt aus dem Ausgang nicht raus. Du musst den Eingang auf INPUT_PULLUP einstellen, damit der ein sauberes HIGH Signal bekommt.

Was willst Du nun genau erfassen? Am Besten wird es sein, wenn Du jeweils die fallende Flanke erfasst, also alten Wert merken, wenn ungleich alter Wert und LOW, dann zählen. Schau Dir mal das Beispiel StateChangeDetection aus der IDE an.

Gruß Tommy

Durch die änderung des Signales 5V 0V kann ich dieses doch Zählen und dadurch dann bei 3200 mal 800 Umdrehung x4 Nocken Signal Wechsel dann denn digitalWrite 13 ausgeben ?

Ja denn wert Habe ich auf LOW gesetzt das nur bei Kontakt mit Metall geschaltet wird
Ich möchte ein Schaltung machen die die Kardanwellen Drehzahl erfässt und bei 800 Umdrehen das Relay schaltet um eine Rundumleuchte zu betreiben

Ja, kannst Du.

Gruß Tommy

und wie mach ich das dem Arduino klar das der das Umsetzt :smiley:
das ist noch mein Problem

Was genau meinst du mit "Umsetzt" ?

/*
   gegeben: 800 UPM
   Messzeit: 2 Sek
   800/60 = 13,333~ Impulse / sekunde
   Startwert auf 25 Impulse / 2 Sekunden
   Mindestlaufzeit der Leuchte 5 sekunden
*/
const unsigned long messZeit = 2000; // Zeit in ms
const unsigned long sperrZeit = 3000;// Sperre für Ausschalten
const unsigned long minImpulse = 25; // Anzahl Impulse die auslösen
unsigned long laufZeit; // merker
unsigned long onStart;
unsigned long zaehler;
bool istgemessen = false;

const byte InputPin = 4;
const byte RelayPin = 13;

void setup()
{
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println(F("Start..."));
  pinMode(InputPin, INPUT_PULLUP);
  pinMode(RelayPin, OUTPUT);
}

void loop()
{
  messen();
  auswerten();
}

//
void auswerten()
{
  if (millis() - laufZeit >= messZeit)
  {
    if (zaehler >= minImpulse)
    {
      Serial.println(F("EIN"));
      digitalWrite(RelayPin, HIGH);
      onStart = millis();
    }
    zaehler = 0;
    laufZeit += messZeit;
  }
  if (millis() - onStart >= sperrZeit + messZeit)
  {
    if (digitalRead(RelayPin) == HIGH) Serial.println(F("AUS"));
    digitalWrite(RelayPin, LOW);
  }
}
//
void messen()
{
  if (digitalRead(InputPin) == LOW)
  {
    if (istgemessen == false)
    {
      zaehler++;
      Serial.print(F("Zaehle: "));
      Serial.println(zaehler);
      istgemessen = true;
    }
  }
  else istgemessen = false;
}

Ein versuch ins blaue.

Das der das so macht wie ich mir das vorstelle

@ my_xy_projekt

das werde ich morgen mal ausprobieren
werde euch dann informieren wenn ich was raus gefunden habe

Indem du das so programmierst.
Wo ist dein Problem ?

Die Programmierung ist das Problem

Ok, dann nimm das Beispiel, was dir schon gezeigt wurde.
Dennoch solltest du davon/damit lernen.

Ja das Mach ich sowieso das Teste ich aus und gebe dann Bescheid ob es Funktioniert
Natürlich lerne ich davon
Das ist ja der Sinn eines Forums!

So Ich hab es getestet und es Funktioniert!
Ich danke dir für deine Hilfe

Nun muss ich noch ein Schalter vor deinen Loop setzten das das nur anfängt wenn der Schalter an z.B pin 2 5V anliegen
aber das sollte ich hin bekommen

ich danke dir vielmals für deine schnelle und Kompetente Hilfe

Na dann mach das gleich richtig.
Der PIN geht an den Schalter und vom Schalter gehts nach GND.
Dann wird im Setup der interne Pullup aktiviert und gut ist.
Wenn Du das mit dem Schalter nach +5V machen willst, dann brauchst Du einen externen Pulldown-Widerstand.

Ist recht einfach gemacht. Bis zum loop:

/*
   gegeben: 800 UPM
   Messzeit: 2 Sek
   800/60 = 13,333~ Impulse / sekunde
   Startwert auf 25 Impulse / 2 Sekunden
   Mindestlaufzeit der Leuchte 5 sekunden
*/
const unsigned long messZeit = 2000; // Zeit in ms
const unsigned long sperrZeit = 3000;// Sperre für Ausschalten
const unsigned long minImpulse = 25; // Anzahl Impulse die auslösen
unsigned long laufZeit; // merker
unsigned long onStart;
unsigned long zaehler;
bool istgemessen = false;

const byte InputPin = 4;
const byte RelayPin = 13;
const byte schalterPin = 5;

void setup()
{
  // put your setup code here, to run once:
  Serial.begin(9600);
  Serial.println(F("Start..."));
  pinMode(InputPin, INPUT_PULLUP);
  pinMode(RelayPin, OUTPUT);
  pinMode(schalterPin, INPUT_PULLUP);
}

void loop()
{
  if (digitalRead(schalterPin) == LOW)
  {
    messen();
    auswerten();
  }
}

Rest bleibt wie es ist.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.