MP3 Ansage / Aulösung durch IR Sensor / Anzeige

Genau. Die Auslöse-Empfindlichkeit kann man mit dem Trimmpoti auf der Sensorplatine einstellen bis es für alle deine Fahrzeuge passt.
Jetzt zum nächsten Teil deiner Aufgabe:

  • wie ist der Sensor am Arduino angeschlossen,.. mit DO (digital Output) oder AO (analog Output) an Pin 6?
  • was sagt die Ausgabe im Seriellen Monitor? wird "ausgelöst?" angezeigt, wenn Hindernis erkannt wird oder wenn der Sensor frei ist?

Hallo

Ich habe den Sketch noch einmal auf das Arduino UNO R3 geladen

constexpr byte pitPin {6};
constexpr bool ausgeloest {HIGH};

bool lastState;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  pinMode(pitPin, INPUT);
  lastState = digitalRead(pitPin);
  Serial.println(lastState);
}

void loop()
{
  if (digitalRead(pitPin) != lastState)
  {
    lastState = !lastState;
    Serial.print(F("Neuer Status: "));
    Serial.println(lastState);
    if (lastState == ausgeloest)
    { Serial.println(F("ausgelöst?")); }
    delay(100);
  }
}

DO ist am Digitalen Ausgang 6 angeschlossen.

Musste die Baudrate noch umstellen da sonst nur Sonderzeichen angezeigt worden sind.

Ich bekomme die Anzeige: Neuer Status: 0 Gegenstand befindet sich vor dem Sensor;
Neuer Status: 1 Gegenstand hat den Bereich vom Sensor verlassen
ausgelöst?

Gruß

Ok.
Befindet sich der Gegenstand zu dem Zeitpunkt auch davor, dann ist der auslösende Pegel LOW.
Dann ist die zweite Zeile im Code aus #16 zu ändern in

constexpr bool ausgeloest {LOW};

Und dann schaun wa, ob der geht und was daran noch zu ändern ist.

Hallo

Ich habe es auf LOW gesetzt. Nun kommt die Meldung " Neuer Status 0 und ausgelöst wenn ich meine Hand vor dem Sensor halte. Danach kommt Neuer Status 1 wenn ich meine Hand entferne.

Habe gerade den kompletten Sketch hochgeladen und siehe da, ein Riesenerfolg.

Gruß

Hallo

Mega einen großen Schritt weiter gekommen.
Die Auslösung funktioniert.
IR Sensor wird ausgelöst und das LCD und die Matrix schalten sich ein.
Nach ca. 15 Sekunden verschwindet die Schrift. Matrix bleibt leider noch an.

  1. LCD Schrift verschwindet aber die Hintergrundbeleuchtung bleibt an. Kann man das auch noch ändern ?

Änderung: Nach mehrmaligen Testen bleibt leider auch die Schrift manchmal stehen.

  1. Die Matrix behält den letzten Stand ( bei mir ein Pfeil oder Kreuz ) bei und geht nicht aus.
    Mein Wunsch wäre es noch wenn die Matrix komplett aus geht.

Nochmals vielen Dank !!!

Hier nochmal mein kompletter Sketch

// LCD BLINKEDE SCHRIFT MIT 8x8 MATRIX
// SOLL DEMNÄCHST DURCH EINEN IR-SENSOR AUSGELÖST WERDEN
// SKETCH IST NOCH NICHT AUFGRÄUMT
// ICH WEISS, DASS ES UNGÜNSTIG MIT DEM DELAY IST ABER ICH BEKOOME ES ZUR ZEIT NOCH NICHT ANDERS HIN (milsec)


#include <LiquidCrystal.h> //LCD-Bibliothek laden

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //In dieser Zeile wird festgelegt, welche Pins des Mikrocontrollerboards für das LCD verwendet wird (Am besten erstmal nicht verändern).

#define PIN_DIN 13   // ANSCHLÜSSE 8x8 MATRIX
#define PIN_CLK 10
#define PIN_CS  9
#define NUM_DEVICES 1

#include <LedControl.h>

// Test
int sensorPin1 = 6;                      // an diesem Pin ist ein Abstandssensor angeschlossen
// Tent ende

LedControl lc = LedControl(PIN_DIN, PIN_CLK, PIN_CS, NUM_DEVICES);

byte frames[3][8] =
{
  {
    B00011000,
    B00011000,
    B00011000,
    B00011000,
    B10011001,
    B01011010,
    B00111100,
    B00011000
  },
  {
    B10000001,
    B01000010,
    B00100100,
    B00011000,
    B00011000,
    B00100100,
    B01000010,
    B10000001
  },
  {
    B00011000,
    B00011000,
    B00011000,
    B00011000,
    B10011001,
    B01011010,
    B00111100,
    B00011000
  }
};

constexpr byte pitPin {6};
constexpr bool ausgeloest {LOW};
constexpr uint32_t pitIntervall {25000};
uint32_t pitInTime;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  lcd.begin(16, 2); //Im Setup wird angegeben, wie viele Zeichen und Zeilen verwendet werden. Hier: 16 Zeichen in 2 Zeilen.
  lcd.print(F("PITSTOP")); // change this text to whatever you like. keep it clean.
  lcd.setCursor(0, 1); // set cursor to column 0, row 1
  lcd.print(F("IN PROGRESS"));
  lc.shutdown(0, false);
  // intensity level (0..15)
  lc.setIntensity(0, 2);
  lc.clearDisplay(0);
  pinMode(pitPin, (ausgeloest ? INPUT : INPUT_PULLUP));

  //Test
  pinMode(sensorPin1, INPUT);
  // Test ende
}

void loop()
{
  if (pitIncomming())
  {
    pitStop();
    switchDisplay();
  }
}

void pitStop()
{
  static byte frame = 0;
  static uint32_t lastSwitch = 0;
  constexpr uint32_t intervall {350};
  if (millis() - lastSwitch > intervall)
  {
    for (int dot = 0; dot < 8; dot++)
    { lc.setRow(0, dot, frames[frame][dot]);  }
    frame++;
    if (frame >= 3)
    { frame = 0; }
    lastSwitch += intervall;
  }
}

void switchDisplay()
{
  static uint32_t lastDisplay = 0;
  static bool isActive = false;
  constexpr uint32_t intervall {350};
  if (millis() - lastDisplay > intervall)
  {
    lastDisplay += intervall;
    isActive = !isActive;
    isActive ? lcd.display() : lcd.noDisplay();
  }
}

bool pitIncomming()
{
  bool isPit = false;
  if (digitalRead(pitPin) == ausgeloest)
  { pitInTime = millis(); }
  if (millis() - pitInTime < pitIntervall)
  { isPit = true; }
  return isPit;
}

Gruß

Gut. Dann hast Du ein LOW wenn der Sensor auslöst.
Den Code mal auf das geringste runtergebrochen.
Das einfahrende Auto löst eine Meldung auf dem SerMon aus.(Evtl. auch mehr als eine)

// LCD BLINKEDE SCHRIFT MIT 8x8 MATRIX
// SOLL DEMNÄCHST DURCH EINEN IR-SENSOR AUSGELÖST WERDEN
// SKETCH IST NOCH NICHT AUFGRÄUMT
// ICH WEISS, DASS ES UNGÜNSTIG MIT DEM DELAY IST ABER ICH BEKOOME ES ZUR ZEIT NOCH NICHT ANDERS HIN (milsec)


#include <LiquidCrystal.h> //LCD-Bibliothek laden

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //In dieser Zeile wird festgelegt, welche Pins des Mikrocontrollerboards für das LCD verwendet wird (Am besten erstmal nicht verändern).

constexpr byte PIN_DIN {13};   // ANSCHLÜSSE 8x8 MATRIX
constexpr byte PIN_CLK {10};
constexpr byte PIN_CS  {9};
constexpr byte NUM_DEVICES {1};

#include <LedControl.h>

LedControl lc = LedControl(PIN_DIN, PIN_CLK, PIN_CS, NUM_DEVICES);

byte frames[3][8] =
{
  {
    B00011000,
    B00011000,
    B00011000,
    B00011000,
    B10011001,
    B01011010,
    B00111100,
    B00011000
  },
  {
    B10000001,
    B01000010,
    B00100100,
    B00011000,
    B00011000,
    B00100100,
    B01000010,
    B10000001
  },
  {
    B00011000,
    B00011000,
    B00011000,
    B00011000,
    B10011001,
    B01011010,
    B00111100,
    B00011000
  }
};

constexpr byte pitPin {6};
constexpr bool ausgeloest {LOW};
constexpr uint32_t pitIntervall {15000};
uint32_t pitInTime;
bool pitActive = false;
void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  lcd.begin(16, 2); //Im Setup wird angegeben, wie viele Zeichen und Zeilen verwendet werden. Hier: 16 Zeichen in 2 Zeilen.
  lcd.print(F("PITSTOP")); // change this text to whatever you like. keep it clean.
  lcd.setCursor(0, 1); // set cursor to column 0, row 1
  lcd.print(F("IN PROGRESS"));
  lc.shutdown(0, false);
  // intensity level (0..15)
  lc.setIntensity(0, 2);
  lc.clearDisplay(0);
  pinMode(pitPin, INPUT);
}

void loop()
{
  pitIncomming();
  pitStop();
  switchDisplay();
}

void pitStop()
{
  static byte frame = 0;
  static uint32_t lastSwitch = 0;
  constexpr uint32_t intervall {350};
  uint32_t myMillis = millis();
  if (myMillis - pitInTime < pitIntervall)
  {
    if (myMillis - lastSwitch > intervall)
    {
      for (int dot = 0; dot < 8; dot++)
      { lc.setRow(0, dot, frames[frame][dot]);  }
      frame++;
      if (frame >= 3)
      { frame = 0; }
      lastSwitch = myMillis;
    }
  }
  else
  {
    lc.clearDisplay(0);
  }
}
//
void switchDisplay()
{
  if (millis() - pitInTime > pitIntervall)
  {
    lcd.display();
  }
  else
  {
    lcd.noDisplay();
  }
}
//
void pitIncomming()
{
  if (digitalRead(pitPin) == ausgeloest)
  {
    Serial.println(F("Incomming car"));
    pitInTime = millis();
  }
}

Hi

Ja der Sensor löst aus und zeigt "incomming Car" an solange ich meine Hand vor dem Sonsor halte.

Jetzt geht die Matrix nach der Voreingestellten Zeit aus und bleich auch aus ( perfekt )

Dann muss auch die Anzeige für den Pfeil funktionieren....
Beim Display hab ich das > drin, das muss < sein.

Hi

Der Verlauf ist jetzt folgender.

Im LCD Display steht die Schrift " Pitstop in Progress. Sensor wird ausgelöst. Schrift verschwindet und Matrix fängt an zu blinken. Nach Ablauf der Zeit bleit die Matrix dunkel ( sehr gut ) und auf dem LCD Display erschein wieder " Pitstop in Progress".

Also Display blinkt nicht wie vorher mit dem Schriftzug und es bleibt an.

Ja! Darum hab ich gesagt, Du sollst das > umdrehen in <
Dann geht der aus.
Und jetzt bastel ich Dir das blinken wieder rein udn gut ist.

Das wär dann der hier:

// LCD BLINKEDE SCHRIFT MIT 8x8 MATRIX
// SOLL DEMNÄCHST DURCH EINEN IR-SENSOR AUSGELÖST WERDEN
// SKETCH IST NOCH NICHT AUFGRÄUMT
// ICH WEISS, DASS ES UNGÜNSTIG MIT DEM DELAY IST ABER ICH BEKOOME ES ZUR ZEIT NOCH NICHT ANDERS HIN (milsec)


#include <LiquidCrystal.h> //LCD-Bibliothek laden

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //In dieser Zeile wird festgelegt, welche Pins des Mikrocontrollerboards für das LCD verwendet wird (Am besten erstmal nicht verändern).

constexpr byte PIN_DIN {13};   // ANSCHLÜSSE 8x8 MATRIX
constexpr byte PIN_CLK {10};
constexpr byte PIN_CS  {9};
constexpr byte NUM_DEVICES {1};

#include <LedControl.h>

LedControl lc = LedControl(PIN_DIN, PIN_CLK, PIN_CS, NUM_DEVICES);

byte frames[3][8] =
{
  {
    B00011000,
    B00011000,
    B00011000,
    B00011000,
    B10011001,
    B01011010,
    B00111100,
    B00011000
  },
  {
    B10000001,
    B01000010,
    B00100100,
    B00011000,
    B00011000,
    B00100100,
    B01000010,
    B10000001
  },
  {
    B00011000,
    B00011000,
    B00011000,
    B00011000,
    B10011001,
    B01011010,
    B00111100,
    B00011000
  }
};

constexpr byte pitPin {6};
constexpr bool ausgeloest {LOW};
constexpr uint32_t pitIntervall {15000};
uint32_t pitInTime;
bool pitActive = false;
void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  lcd.begin(16, 2); //Im Setup wird angegeben, wie viele Zeichen und Zeilen verwendet werden. Hier: 16 Zeichen in 2 Zeilen.
  lcd.print(F("PITSTOP")); // change this text to whatever you like. keep it clean.
  lcd.setCursor(0, 1); // set cursor to column 0, row 1
  lcd.print(F("IN PROGRESS"));
  lc.shutdown(0, false);
  // intensity level (0..15)
  lc.setIntensity(0, 2);
  lc.clearDisplay(0);
  pinMode(pitPin, INPUT);
}

void loop()
{
  pitIncomming();
  pitStop();
  switchDisplay();
}

void pitStop()
{
  static byte frame = 0;
  static uint32_t lastSwitch = 0;
  constexpr uint32_t intervall {350};
  uint32_t myMillis = millis();
  if (myMillis - pitInTime < pitIntervall)
  {
    if (myMillis - lastSwitch > intervall)
    {
      for (int dot = 0; dot < 8; dot++)
      { lc.setRow(0, dot, frames[frame][dot]);  }
      frame++;
      if (frame >= 3)
      { frame = 0; }
      lastSwitch = myMillis;
    }
  }
  else
  {
    lc.clearDisplay(0);
  }
}
//
void switchDisplay()
{
  static uint32_t lastDisplay = 0;
  static bool isActive = false;
  constexpr uint32_t intervall {350};
  uint32_t myMillis = millis();
  if (myMillis - pitInTime < pitIntervall)
  {
    if (myMillis - lastDisplay > intervall)
    {
      lastDisplay = myMillis;
      isActive = !isActive;
      isActive ? lcd.display() : lcd.noDisplay();
    }
  }
  else
  {
    lcd.noDisplay();
  }
}
//
void pitIncomming()
{
  if (digitalRead(pitPin) == ausgeloest)
  {
    Serial.println(F("Incomming car"));
    pitInTime = millis();
  }
}

Perfekt !!!

Nochmal danke :+1:

Eine letzte Kleinigkeit :upside_down_face:

Kann man die Hintergrundbeleuchtung am LCD auch ausstellen ?

Jetziger Verlauf.

LCD Hintergrundbeleuchtung ist dauerhaft an.
IR Sensor wird ausgelöst.
Schrift wird auf dem LCD Display angezeigt und Matrix geht auch an.
Nach der vorgegebenen Zeit geht beides aus :+1:
Hintergrundbeleuchtung LCD bleibt an.

Danke auch für deine Geduld mit mir :rofl:

Theoretisch ja.
Welches Display hast Du?
(Link)

Hi

Joy-it SBC-LCD16x2 Display-Modul 6.6 cm (2.6 Zoll) 16 x 2 Pixel

https://www.google.com/shopping/product/2606683193960215841?client=opera&hs=WjY&sca_esv=587665533&sxsrf=AM9HkKlZUEsegzJmYyjqSDyQTSkj_dPLUg:1701699246648&q=arduino+lcd+display+16x2&biw=1386&bih=836&dpr=1.5&prds=eto:10015427736534729169_0,pid:9615557597773046299,rsk:PC_5298561511748066320&sa=X&ved=0ahUKEwia6bbv-_WCAxWpg_0HHfCoC6wQ8wII0Qg

Und so ist es angeschlossen.

Gruß

Das rote Drähtchen von der Hintergrundbeleuchtung aus dem Steckbrett ziehen und auf PIN 7 stecken.

// LCD BLINKEDE SCHRIFT MIT 8x8 MATRIX
// SOLL DEMNÄCHST DURCH EINEN IR-SENSOR AUSGELÖST WERDEN
// SKETCH IST NOCH NICHT AUFGRÄUMT
// ICH WEISS, DASS ES UNGÜNSTIG MIT DEM DELAY IST ABER ICH BEKOOME ES ZUR ZEIT NOCH NICHT ANDERS HIN (milsec)


#include <LiquidCrystal.h> //LCD-Bibliothek laden

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //In dieser Zeile wird festgelegt, welche Pins des Mikrocontrollerboards für das LCD verwendet wird (Am besten erstmal nicht verändern).
constexpr byte backlight {7};

constexpr byte PIN_DIN {13};   // ANSCHLÜSSE 8x8 MATRIX
constexpr byte PIN_CLK {10};
constexpr byte PIN_CS  {9};
constexpr byte NUM_DEVICES {1};

#include <LedControl.h>

LedControl lc = LedControl(PIN_DIN, PIN_CLK, PIN_CS, NUM_DEVICES);

byte frames[3][8] =
{
  {
    B00011000,
    B00011000,
    B00011000,
    B00011000,
    B10011001,
    B01011010,
    B00111100,
    B00011000
  },
  {
    B10000001,
    B01000010,
    B00100100,
    B00011000,
    B00011000,
    B00100100,
    B01000010,
    B10000001
  },
  {
    B00011000,
    B00011000,
    B00011000,
    B00011000,
    B10011001,
    B01011010,
    B00111100,
    B00011000
  }
};

constexpr byte pitPin {6};
constexpr bool ausgeloest {LOW};
constexpr uint32_t pitIntervall {15000};
uint32_t pitInTime;
bool pitActive = false;
void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  lcd.begin(16, 2); //Im Setup wird angegeben, wie viele Zeichen und Zeilen verwendet werden. Hier: 16 Zeichen in 2 Zeilen.
  lcd.print(F("PITSTOP")); // change this text to whatever you like. keep it clean.
  lcd.setCursor(0, 1); // set cursor to column 0, row 1
  lcd.print(F("IN PROGRESS"));
  lc.shutdown(0, false);
  // intensity level (0..15)
  lc.setIntensity(0, 2);
  lc.clearDisplay(0);
  pinMode(pitPin, INPUT);
  pinMode(backlight, OUTPUT);
  digitalWrite(backlight, LOW);
}

void loop()
{
  pitIncomming();
  pitStop();
  switchDisplay();
}

void pitStop()
{
  static byte frame = 0;
  static uint32_t lastSwitch = 0;
  constexpr uint32_t intervall {350};
  uint32_t myMillis = millis();
  if (myMillis - pitInTime < pitIntervall)
  {
    if (myMillis - lastSwitch > intervall)
    {
      for (int dot = 0; dot < 8; dot++)
      { lc.setRow(0, dot, frames[frame][dot]);  }
      frame++;
      if (frame >= 3)
      { frame = 0; }
      lastSwitch = myMillis;
    }
  }
  else
  {
    lc.clearDisplay(0);
  }
}
//
void switchDisplay()
{
  static uint32_t lastDisplay = 0;
  static bool isActive = false;
  constexpr uint32_t intervall {350};
  uint32_t myMillis = millis();
  if (myMillis - pitInTime < pitIntervall)
  {
    if (myMillis - lastDisplay > intervall)
    {
      lastDisplay = myMillis;
      isActive = !isActive;
      isActive ? lcd.display() : lcd.noDisplay();
      digitalWrite(backlight, HIGH);
    }
  }
  else
  {
    lcd.noDisplay();
    digitalWrite(backlight, LOW);
  }
}
//
void pitIncomming()
{
  if (digitalRead(pitPin) == ausgeloest)
  {
    Serial.println(F("Incomming car"));
    pitInTime = millis();
  }
}

Moin

Was soll ich sagen. Echt krass !! Genau so wollte ich es haben :+1:

Ich werde in den nächsten Wochen mal ein paar Bilder einstellen von dem was ich hier mit eurer Hilfe gebaut habe.

Alle Projekte sind für meine kleine private Kyosho Mini Z Bahn. ( Ferngesteuerte Auto´s im Maßstab 1:27 )

  1. Simulierte Boxenstopp. Durch Aktivierung einer Lichtschranke geht am Ende der Durchfahrt eine Schranke für 15 Sekunden zu.

  2. Ebenfalls durch Aktivierung einer Lichtschranke geht jetzt ein LCD-Display mit der Aufschrift " Pitstop in progress " an. Zusätzlich wird durch eine 8x8 LED Matrix angezeigt, dass die Boxeneinfahrt zur Zeit belegt ist.

  3. Ein Geschwindigkeitsmesser zum messen der Höchstgeschwindigkeit ( hier: schnellste Runde )

  4. Startampel Steuerung mit Arduino über eine Software Namens ZRound ( eigentliche Software zum Zeitmessen und grafische Darstellung)

Wie gesagt, wird ein paar Wochen dauern bis ich das alles vernünftig verkabelt habe.

Ich kann mich nur wiederholen.

Vielen lieben Dank für die super Unterstützung und Geduld mit mir.

Mach ein Erledigt ran.
Ich merke grad, Rennautos kann ich ganz gut.

Kann ich nur zu gut bestätigen :wink: :smiling_face_with_three_hearts:

Hej - so war das aber nicht gedacht. Hier einfach mal so ganz aus dem Hintergrund reinschneien. Da spickt doch nicht etwa einer :wink:
Hallo erstmal :grin: (Bin auch schon wieder weg - muss leider mich anderweitig beschäftigen)

Ne ne, der kommt hier ganz offiziell aus den Wolken, zumindest hier im Tal.... :joy:
Ich arbeite im Hintergrund, versuche gerade selbst mal was auf die Beine zu stellen.
Bin eigendlich zufrieden mit mir, aber es wird noch was auf euch zukommen das weiß ich ganz genau..... :wink:

Habt alle ne schöne Vorweihnachtszeit
Bis denne

Moin Moin

Ich wollte mal ein kleines Feedback geben.

Vielen lieben Dank noch einmal an alle die mir super geholfen haben.

In diesem Video sieht man schon, dass die Schranke auslöst und die Matrix angesprochen wird.

Die beiden Display muss ich noch verbauen.

Hier der Link zum Video;

Kyosho Mini Z mit Boxenstop

Gruß Max