MP3 Ansage / Aulösung durch IR Sensor / Anzeige

Hallo

Nochmals vielen Dank für die tolle Unterstützung bei meinem anderen Projekt.

Nun habe ich eine neue Idee :grinning:

Ich möchte für meinen Boxenstopp mittels IR Sensor eine Durchsage starten lassen und zusätzlich auf eine kleine Anzeige den Text Boxenstopp anzeigen lassen

Mein Material was zur Verfügung steht ist folgendes :grinning:

DFPlayer Mini MP3 Player
TCRT5000 Reflektierende IR Lichtschranke
Arduino R3
16×2 LCD nicht ic2
InduSKY 2 Stücke Lautsprecher 3 Watt 8 Ohm mit JST-PH2.0 Schnittstelle für Arduino

Hat da evtl jemand einen Lösungsansatz ?

Ich möchte, wenn jemand durch die Lichtschranke fährt, dass die Ansage gestartet wird. Z.B. Ansage: Boxenstopp. Zeitgleich soll auf dem LCD Boxenstopp für ca. 10 Sekunden angezeigt werden. Danach ein beliebiger Text.

Ist das möglich ?

Die Idee kommt aus diesem Projekt.

Link:

Ja.

Baue Dir einen Sketch, der erstmal gesichert die Zustände Deiner Lichtschranke zurück gibt.
Dann schaust Du in die Beispile vom DF-Player und laässt Dir immer nur den ersten Titel ausgeben.
Und wenn das geschafft ist, lässt Du den Display folgen.
Fertig.

Hallo @MadMax2017

dieses Userforum funktioniert so:

Man postet einen Code und stellt spezifische Fragen zu diesem Code.
Diese spezifischen Fragen bekommt man dann garantiert beantwortet.

Wenn die Frage sehr allgemein gehalten ist, dann bekommt man auch nur eine allgemein gehaltene Antwort.

Du scheinst durch indirekte Fragen dazu aufzufordern "Schreibt mir mal ein Programm das ..."

Ne! So läuft das nicht ! Wie oben geschehen gibt man dir dann Antworten die Häppchenweise dafür sorgen, dass du programmieren lernst.

Du kannst also lieber gleich direkt Programmierfragen stellen.

@my_xy_projekt hat als Startpunkt vorgeschlagen:
Schaltzustand der Lichtschranke einlesen und Schaltzustand anzeigen lassen.

Jetzt stelle die spezifischen Fragen die dabei auftauchen.

Beispiele wie spezifische Fragen beginnen
Wie .........
Welche .........
Wo kann ich ........

Die Pünktchen stehen für das Wort oder den Satzteil aus der Projektbeschreibung / Aufgabenbeschreibung zu denen du eine Frage hast.

vgs

Hallo

Ich habe die Idee etwas abgewandelt und ein bisschen angefangen.
Wie gesagt bin totaler Anfänger und werde es wohl auch bleiben. Packe mir die Sketche so zusammen, dass sie laufen.

Zum Projekt. Habe bis jetzt eine 8x8 Matrix LED und ein 16x2 LCD mit blinkender Schrift zum laufen gebracht.

Ich habe mit "Delay´s" gearbeitet und bis jetzt reicht es ja auch aus.

Als nächstes möchte ich, dass beide Sensoren durch z.B. ein IR- Sensor ausgelöst wird.
Gerne benutze ich die IR Sensor TCRT5000 ( Sind noch vorhanden ).

Könntet ihr mir einen Tipp geben wie ich das umgesetzt bekomme ?

Hier mein 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>

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
  }
};


void setup() 
{
lcd.begin(16, 2); //Im Setup wird angegeben, wie viele Zeichen und Zeilen verwendet werden. Hier: 16 Zeichen in 2 Zeilen.
// Test
lcd.clear();
lcd.setCursor(0,0); // set cursor to column 0, row 0 (the first row)
lcd.print("PITSTOP"); // change this text to whatever you like. keep it clean.
lcd.setCursor(0,1); // set cursor to column 0, row 1
lcd.print("IN PROGRESS");
// Test ende
lc.shutdown(0, false);
// intensity level (0..15)
lc.setIntensity(0, 2);

lc.clearDisplay(0);



}

void loop() 
{
//lcd.setCursor(0, 0); //Startposition der Darstellung auf dem LCD festlegen. lcd.setCursor(0,0) bedeutet: Erstes Zeichen in der ersten Zeile.
//lcd.print("Pitstop"); //Dort soll der Text erscheinen. Der Befehl lcd.setCursor ist dem Mikrocontrollerboard durch das Aufrufen der Bibliothek bekannt.
//lcd.setCursor(0, 1); // lcd.setCursor(0,1) bedeutet: Erstes Zeichen in der zweiten Zeile.
//lcd.print("in progress"); //Dort soll dann der Text auftauchen.

//test
// Turn off the blinking cursor:
lcd.noDisplay();
delay(250);
// Turn off the blinking cursor:
lcd.display();
delay(250);
// Test ende


for (int frame=0; frame<3; frame++) {
for (int dot=0; dot<8; dot++) {
lc.setRow(0, dot, frames[frame][dot]);
}
delay(350);
}
}





Moin Moin

Ich würde so anfangfen

int sensorPin1 = 6;                      // an diesem Pin ist ein Abstandssensor angeschlossen
int sensorPin2 = 7;                      // an diesem Pin ist ein Abstandssensor angeschlossen
pinMode(sensorPin1, INPUT);
pinMode(sensorPin2, INPUT);

Hm.. ein wenig verworren...
Was willst Du durch was auslösen?

Hi

Ein Auto fährt durch den IR Sensor und löst dadurch die beiden anderen Sensoren ( 8x8 Matrix und das LCD Display) für 15 Sekunden aus. Danach sollen die Anzeigen wieder ausgehen bis zur nächsten Auslösung.

Das gleiche habe ich schön bei einem anderen Projekt ( Bahnübergang) dank eurer Hilfe realisiert

Aahhhh...

Das wären dann Aktoren.
Nenne es einfach Funktionen - das vereinfacht die Kommunikation :wink:

Ich habe Deinen delaySketch mal aufgelöst.
Der sollte noch immer genau das Gleiche machen.
Und wenn ja, kommen die beiden Funktionen aus dem loop() in eine eigene Bedingung - Fertig.

// 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>

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
  }
};


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);
}

void loop()
{
  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();
  }
}

Hi

@ my_xx_projekt

Vielen Dank :+1:

Das mit dem LCD Display sieht jetzt auch ein bisschen besser ( geschmeidiger ) aus.

Am WE versuche ich mal die Ansteuerung / Auslösung per IR-Sensor.

Gruß

// 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>

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));
}

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;
}

Einfach den PIN 6 mit einem Stück Draht auf auf LOW ziehen.

WE = Wochenende

:grinning: Ja einfach Pin 6 auf low ziehen :grinning:

Für dich wahrscheinlich ein Kinderspiel für mich eine Wochenendaufgabe :upside_down_face:

Hey, alles ab Wochenmitte ist Wochenende.
Na dann.
Sollte Dein Sensor nicht nach LOW ziehen, kannst Du die Zeile

constexpr bool ausgeloest {LOW};

in HIGH ändern.
Hab im setup() noch was dazu nachgetragen.

Hallo

Ich mal kurz dabei und habe deinen Sketch aufgespielt.

Wenn ich das richtig verstanden habe, hast du meinen IR-Senso mit aufgenommen ?

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

pinMode(pitPin, (ausgeloest ? INPUT : INPUT_PULLUP));

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

Ich habe zusätzlich noch im Header int sensorPin1 = 6; eingesetzt
und im Setup pinMode( sensorPin1, Input);

Ich bekomme es nicht hin.
Mein ziel ist es , dass wenn ein Auto durch die Lichtschranke fährt, die Matrix und das LCD für 15 Sekunden angehen und dann wieder aus. Sobald der IR Sensor wieder unterbrochen / angesprochen wird wiederholt sich das ganze.

Hier nochmal mein Sketch mit den beiden Änderungen ( Test / Test ende )

// 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 {HIGH};
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;
}

Was verstehe ich nicht oder was mache ich falsch ?

Gruß

Ja.
Das ist bei mir der pitPin. -> Ich hab das als pitStopLane verstanden, was Du da baust.

Von daher war schon alles vorbereitet.
Um das mal sinnvoller zu gestalten schau ich mal wie der Sensor arbeitet und bau das dann passend.
Rest hatte ich verstanden - ich kommentier das mal. War gestern nur ein Schnellschuß zum WE :slight_smile:

Hi

Habe den Sketch noch einmal aufgespielt und den IR Sensor TCRT500 an Pin 6 angeschlossen. Die Programm läuft ohne Änderung wie vorher.

Was Habe ich übersehen ?

Gruß

ich weiss es nicht.
Erstmal müssen wir zurück auf Anfang und sehen, was Dein Sensor wann macht.
Kurzcode:

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);
  }
}

Wenn die Lichtschranke ihren Status wechselt, gibt es eine Ausgabe.
Und es gibt eine Ausgabe, wenn ich vermute, wann das Fahrzeug erkannt wird.

Wenn das stimmt, sind wir einen Schritt weiter.
Danach schau ich, ob noch was im Code anzupassen ist.

Moin

Ja genau so ist es. Die Lichtschranke / IR-Sensor wird durch ein RC-Auto ausgelöst.
Die Lichtschranke soll dann die 8x8 Matrix und das LCD Display für ca. 15 Sekunden einschalten. Dann soll beides wieder ausgehen. Und beim nächsten Durchgang wieder von vorne.

Gruß und einen schönen Sonntag noch

Moin Moin

Ich bin leider noch nicht weiter gekommen.
Mein IR Sensor löst nicht wie gewünscht das LCD Display und die 8x8 Matrix aus.

Ich habe mit den Sketch noch einmal angeschaut.
Ich verstehe ihn nicht wirklich und finde den Verweis auch nicht. Kann mir einer das evtl noch mal erklären?

Also ich möchte, dass wenn ein Auto durch einen IR-Sensor durchfährt, dass dann das Display und die Matrix angeschaltet für ca. 15 Sekunden angeschaltet werden.danach sollen beide wieder ausgehen. Bei der nächsten Durchfahrt soll sich das Ganze wiederholen.

Danke und Gruß Max

Auf LCD-Display und 8x8-Matrix kann mit dem von my-xy-projekt geposteten Sketch ja noch nichts passieren. Der dient einzig dazu, das Verhalten des Sensors zu überprüfen:
(1) Ist der Sensor richtig angeschlossen und liefert überhaupt Werte?
(2) Welche Werte (High - 1 oder Low - 0) liefert der Sensor, wenn (k)ein Objekt erkannt wird?
Erst wenn das funktioniert und klargestellt ist, kann man darauf aufbauen und die Ausgabe auf LCD- & LED-Display umsetzen.
D.h. wir benötigen lediglich die Ausgaben des seriellen Monitors, wenn du ein am Sensor vorbeifahrendes Fahrzeug simulierst.

Moin

Also ich habe den Sensor verkabelt und wenn ich mit der Hand vor dem Sensor bin geht die 2,LED am Sensor an. Das sollte ja bedeuten, dass der Sensor auslöst, oder nicht ?

Eingebunden habe ich den Sensor ja auch schon ;

int sensorPin1 = 6;               // an diesem Pin ist ein Abstandssensor angeschlossen
pinMode(sensorPin1, INPUT);

Gruß