Arduino mit FC-51

Hallo zusammen,

Ich benötige eure Hilfe,

Ich habe einen Arduino Nano mit einem FC-51 - Infrarot-Reflektionssensor,

Ich möchte zu diesem Code noch zwei Funktionen haben.

  1. Wenn die LED leuchtet soll die LED 500mS an sein und dann automatisch ausgehen auch wenn ein Hindernis vorhanden ist.
  2. Wenn die LED aus geht, soll die Messung in 2000mS erneut beginnen und das als Endlosschleife mit Punkt 1 zusammen

Kann mir jemand helfen?

Danke

#define IR_Sensor 2 /*D2 IR pin defined*/
#define LED 3       /*D3 LED Pin defined*/
int IR;             /*Variable that will store IR output status*/
void setup()
{
pinMode(IR_Sensor, INPUT);   /*IR Pin D2 defined as Input*/ 
pinMode(LED, OUTPUT);        /*D3 pin for LED is set as Output*/
}
void loop(){
  IR=digitalRead(IR_Sensor);  /*digital read function to check IR pin status*/
  if(IR==LOW){               /*If sensor detect any reflected ray*/
  digitalWrite(LED,HIGH);   /*LED will turn ON*/
}
else {
  digitalWrite(LED,LOW);  /*if no reflection detected LED will remain OFF*/
}
}

Hast du denn es schon mal selbst versucht so zu s hreiben ?
Leider sieht man nichts davon.

Warum willst Du hier eine Pause drin haben?
Ohne ist das doch viel einfacher.

constexpr byte sensorPin {2}; /*D2 IR pin defined*/
constexpr byte ledPin {3};       /*D3 LED Pin defined*/
bool sensorStatus;             /*Variable that will store IR output status*/
unsigned long ledStartTime;
void setup()
{
  pinMode(sensorPin, INPUT);   /*IR Pin D2 defined as Input*/
  pinMode(ledPin, OUTPUT);        /*D3 pin for LED is set as Output*/
}
//
void loop()
{
  checkSensorPin();
  setOutputLed();
}
void setOutputLed()
{
  if (sensorStatus == HIGH && millis() - ledStartTime < 500)
  {
    digitalWrite(ledPin, HIGH);
  }
  else
  {
    digitalWrite(ledPin, LOW);
  }
}
//
void checkSensorPin()
{
  if (digitalRead(sensorPin) == LOW) /*digital read function to check IR pin status*/
  {
    if (sensorStatus == HIGH)
    {
      ledStartTime = millis();
      sensorStatus = HIGH;
    }
  }
  else
  {
    sensorStatus = LOW;
  }
}

[edit] Im Auswerteteil das LOW gegen HIGH getauscht, damit die Logik stimmt [/edit]

Danke, die Ausgangs LED leuchtet nun garnicht mehr, obwohl sie ja definiert wurde?!

Kurze Info, für was ich den Code brauche.
Ich möchte gern ein "Blitzer" bauen, wenn ein z.B mein Modellauto an den Sensor vorbeifährt löst die Lichtschranke aus und die LED leuchtet deswegen die Zeit (500mS - variabel), zweitens bis das Modellauto vorbei gefahren ist würde die ganze Zeit die LED ja leuchten, und deswegen die Pause damit die Messung in ca 2000mS - variabel erneut gestartet werden kann.

Der Aufbau sieht so aus bei mir
Aufbau

Wieso versorgst Du den optischen Sesor über Vin? Da kommt nichts ordentlicher heraus wenn Du den NANO über USB versorgst.
Grüße Uwe

Hab es über 5V angeschlossen neben A7.

Hast Du mitbekommen, das ich die Logik zwischendurch verändert habe?
Macht aber nix, denn:

Ich hab mal zusammengekürzt und kommentiert.

constexpr byte sensorPin {2}; /*D2 IR pin defined*/
constexpr byte ledPin {3};       /*D3 LED Pin defined*/
unsigned long timeMerker = millis() - 2000; // stellt sicher, das sofort ausgelöst werden aknn

void setup()
{
  pinMode(sensorPin, INPUT);   /*IR Pin D2 defined as Input*/
  pinMode(ledPin, OUTPUT);        /*D3 pin for LED is set as Output*/
}
//
void loop()
{
  blitzer();
}
//
void blitzer()
{
  if (digitalRead(sensorPin) == LOW &&  // Sensor löst aus
      millis() - timeMerker > 2000)     // Wartezeit ist abgelaufen
  {
    timeMerker = millis();              // Auslösezeit merken
    digitalWrite(ledPin, HIGH);         // Mache an      }
  }
  if (millis() - timeMerker > 500)      // Zeit abgelaufen
  {
    digitalWrite(ledPin, LOW);          // Mache aus
    timeMerker = millis();              // Zeit merken
  }
}

Perfekt und danke für deine Mühe, aber die LED leuchtet nicht.

Also am Ausgang kommen 0V ob er schaltet oder nicht schaltet.

Ah, hab mal was eingefügt.
Zusätzlich gibts jetzt noch serielle Ausgaben.

constexpr byte sensorPin {2}; /*D2 IR pin defined*/
constexpr byte ledPin {3};       /*D3 LED Pin defined*/
unsigned long timeMerker = millis() - 2000; // stellt sicher, das sofort ausgelöst werden aknn

void setup()
{
  Serial.begin(9600);
  pinMode(sensorPin, INPUT);   /*IR Pin D2 defined as Input*/
  pinMode(ledPin, OUTPUT);        /*D3 pin for LED is set as Output*/
}
//
void loop()
{
  blitzer();
}
//
void blitzer()
{
  if (digitalRead(sensorPin) == LOW &&  // Sensor löst aus
      millis() - timeMerker > 2000)     // Wartezeit ist abgelaufen
  {
    timeMerker = millis();              // Auslösezeit merken
    digitalWrite(ledPin, HIGH);         // Mache an
    Serial.println("AN");
  }
  if (millis() - timeMerker > 500)      // Zeit abgelaufen
  {
    if (digitalRead(ledPin) == HIGH)
    {
      digitalWrite(ledPin, LOW);          // Mache aus
      timeMerker = millis();              // Zeit merken
      Serial.println("AUS");
    }
  }
}

Kannst Du Dir mit dem Seriellen Monitor anzeigen lassen.

Jetzt geht die LED immer Aus und Ein

Monitor zeigt:
AN
AUS
AN
AUS
Usw

Dann geht der auch an und aus :slight_smile:

Wie ist denn der Status, wenn der Sensor kein Element erkennt?
Und schalte mal bitte die Zeiten im Sermon mit ein, damit man die mitsieht und so ungefähr mitschätzen kann, was da passiert.

Nachtrag:
Der folgende reagiert nur mit einer Ausgabe auf dem Sermon.
Da kannst Du sehen, welcher Pegel bei einem erkannten / keinem erkanntenHindernis ausgegeben wird.
Im 100ms-takt kommt entweder 0 oder 1...

constexpr byte sensorPin {2}; /*D2 IR pin defined*/

void setup()
{
  Serial.begin(9600);
  pinMode(sensorPin, INPUT);   /*IR Pin D2 defined as Input*/
}
//
void loop()
{
  blitzer();
}
//
void blitzer()
{
  Serial.println(digitalRead(sensorPin));
  delay(100);
}

Also der Code funktioniert jetzt klasse! Aber ein müsste noch angepasst werden, wenn das Hindernis bleibt und die Zeit läuft runter löst es immer aus, ist das machbar?

das soll jetzt eigentlich genau so sein.
nach 500ms geht der Blitzer aus. merkt sich die Zeit und nach 2000ms und ausgelöstem Sensor blitzt es wieder....

Genau funktioniert auch so, aber wenn das Hindernis sich nicht mehr bewegt (bleibt am Sensor Athen) nach dem er geblitzt wurde löst es nach 2000mS erneut aus obwohl das Auto am Sensor steht..

Kann man eine Abfrage einbauen ob nach dem geblitzt wurde der Sensor sich abgeschaltet hat auf LOW? Wenn ja dann Sensor wieder scharf schalten ?

Ah, also Du willst eine Wiederholsperre.
Na das sollte gehen - Moment.
Vielleicht so

constexpr byte sensorPin {2}; /*D2 IR pin defined*/
constexpr byte ledPin {3};       /*D3 LED Pin defined*/
unsigned long timeMerker = millis() - 2000; // stellt sicher, das sofort ausgelöst werden aknn
bool ausgeloest = false;
void setup()
{
  Serial.begin(9600);
  pinMode(sensorPin, INPUT);   /*IR Pin D2 defined as Input*/
  pinMode(ledPin, OUTPUT);        /*D3 pin for LED is set as Output*/
}
//
void loop()
{
  blitzer();
}
//
void blitzer()
{
  if (digitalRead(sensorPin) == LOW)   // Sensor löst aus
  {
    if (millis() - timeMerker > 2000 &&     // Wartezeit ist abgelaufen
        ausgeloest == false)                // und vorher nicht ausgeloest
    {
      timeMerker = millis();                // Auslösezeit merken
      digitalWrite(ledPin, HIGH);           // Mache an
      ausgeloest = true;
      Serial.println("AN");
    }
  }
  else
  { ausgeloest = false; }              // sensor ist frei
  if (millis() - timeMerker > 500)        // Zeit abgelaufen
  {
    if (digitalRead(ledPin) == HIGH)
    {
      digitalWrite(ledPin, LOW);          // Mache aus
      timeMerker = millis();              // Zeit merken
      Serial.println("AUS");
    }
  }
}

Perfekt. Hat alles geklappt. DANKE

Dann stells auf gelöst.
Und schau, wie das funktioniert mit Code kommentieren - da gibt es dann schon ganz viel Informationen :slight_smile:

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