Arduino Lichtschranke Zeitspanne

EDIT: MEINE FRAGE NOCHMAL MEHR AUSFORMULIERT:

Vieleicht kann mir jemand helfen bei meinem Projekt.
Ich möchte einen Boxautomaten bauen mit einer LM393 Lichtschranke und einem kleinen display.
Das mit dem Display sollte ich selber hinbekommen.
Nur ich bräuchte hilfe bei der programmierung für die Messung.
Es soll am Ende eine Zahl angezeigt werden von 0 - 999 wie stark der Schlag war, nur davor muss die Lichtschranke irgendwie die Zeit messen wie viele ms die Lichtschranke hier wie im GIF gezeigt hindurch kommt. Diese ms sollten dann irgendwie als Zahl von 0 - 999 angezeigt werden.
z.b. das 60ms ein schneller schlag war mit 987...

ScreenRecorderProject10_1-min

Hier ein Video dazu

[Beating 5 Scam Arcade Games with Science - YouTube] (Beating 5 Scam Arcade Games with Science - YouTube)

Bei Minute 11:53

Danke für jede hilfe.

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

1 Like

Ja....wenn du uns sagst, warum du eine Lichtschranke berühren musst.

ja

Zeig mal was du bis jetzt programmiert hast.

Ja:

  1. Flanke der Lichtschranke erkennen und Zeit merken.
  2. Flanke der Lichtschranke erkennen und Zeitdifferenz zur gemerkten Zeit bilden und anzeigen.
1 Like

// Forensketch Lichtschranke - Einschaltzeit errechnen
// https://forum.arduino.cc/t/arduino-lichtschranke-zeitspanne/1056412

constexpr byte sensorPin = 2;
bool merker = false;
uint32_t startTime, endTime;
void setup()
{
  Serial.begin(115200);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
  pinMode(sensorPin, INPUT);
}
void  loop()
{
  if (digitalRead(sensorPin) == LOW)
  {
    if (merker == false)
    {
      merker = true;
      digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
      digitalRead(LED_BUILTIN) ? startTime = millis() : endTime = millis();
    }
  }
  else
  {
    merker = false;
  }
  if (endTime - startTime != 0 && digitalRead(LED_BUILTIN) == LOW)
  {
    Serial.print(F("\r\nEinschaltzeit war: "));
    Serial.print(endTime - startTime);
    Serial.println(F(" Millisekunden"));
    startTime = 0;
    endTime = 0;
  }
}

Wobei jetzt in #1 die Anforderung mit dem Hölzchen kam...
Was für einen Pegel bekommst Du, wenn die Lichtschranke unterbrochen ist, als das Holz den Strahl unterbricht?

pulseIn()

Gibt es auch Antworten auf unsere Fragen ?

Mir werden ? Symbole angezeigt ��

Habe oben meine Frage bearbeitet

Ok, danke....wobei der Begriff "Berührungen" hier etwas unglücklich gewählt ist.

1 Like

Vermutlich, weil der SerMon falsch eingestellt ist.
Ich benutze standard 115200.
Entweder änderst Du das bei Dir im Sketch oder unten rechts im Seriellen Monitor.
Die beiden Größen müssen gleich sein.

Ah ja perfekt habs

Reine Gewöhnungssache :wink:
Im Übrigen bin ich nicht ganz sicher, ob ich die Anforderung richtig verstanden hatte - eigentlich hieß es ja das zwei gleiche Ereignisse auslösen sollten.
Bei Dir lösen aber zwei unterschiedliche Flanken aus.
Einmal wenn die LS nicht mehr unterbrochen und dann wieder, wenn unterbrochen.

Da ist das mit PulseIn schon richtig.
Die Zeit, die dort ausgegeben wird ist in microsekunden.
Um das in millisekunden umzurechen, wäre dann /1000.
Das ist dann nicht so kompliziert :wink:

1 Like

Ich möchte halt eine Art Boxautomaten bauen wo dann die Stärke des Schlages von 0 - 999 angezeigt wird. Jetzt ist halt die Frage ob es möglich ist die Werte so anzeigen zu lassen sodass wenn man jetzt gegen die Boxbirne schlägt und durch das oben gezeigte Teil mit dem schlitz jetzt zum Beispiel nur 60ms gemessen werden, das es dann eine Zahl von 940 z.b. angezeigt wird.

Oder das wie oben 330ms - 999 sind

danke für die hilfe

dann wäre es aber wesentlich einfacher wenn du nur eine Öffnung hast für die du die Zeit misst wie lange diese sichtbar ist und die restliche Zeit soll die Lichtschranke unterbrochen sein.

1 Like

Ja würde glaub mehr Sinn machen.

Hab gerade das Video darüber wieder gefunden:
[Beating 5 Scam Arcade Games with Science - YouTube] (Beating 5 Scam Arcade Games with Science - YouTube)

Bei Minute 11:53

Ok, jetzt hab ich das verstanden, was Du vor hast :wink:
Dann mal gleich vorab eine Logikfrage:
Wenn Du eine Zeit von 60ms auf eine Ausgabe von 999 mappen willst, dürfte nicht 0 auf 0 gemappt werden.
Die Ausgabe 1 erfolgt dann bei welcher Zeit? Also mal ein Ansatz wäre dann 500ms. Alles was darüber liegt, gibt 0 aus.

Womit wir wieder bei pulsein() sind.
Dort kannst Du ein "timeout" mit übergeben. Also einen Zeitwert, der dann zum Abbruch der Messung führt und 0 ausgibt.
Jeder andere Wert wird dann mit map() umgerechnet.
Codeansatz zur Berechnung:

// Forensketch Umrechnung mit map
// https://forum.arduino.cc/t/arduino-lichtschranke-zeitspanne/1056412/20

#include <Streaming.h>     // https://github.com/janelia-arduino/Streaming

void setup()
{
  Serial.begin(115200);
  uint16_t punch = 0;
  uint32_t punchTime = 500000;  // Zeit inµSekunden(!)
  for (; punchTime >= 60000; punchTime -= 500)
  {
    punch = map(punchTime, 60000, 500000, 999, 0);
    Serial << (F("Punchtime: ")) <<  _WIDTH(punchTime, 7) << _WIDTH(F(" Punchpunkte: "), 20) << _WIDTH(punch, 5) << endl;
  }
}
void  loop()
{
}
1 Like

? Ich noch nicht.
Je kürzer die Zeit, desto schneller (und härter) der Schlag, desto mehr Punkte.
Da gibt es prinzipiell mindestens zwei Möglichkeiten: max - x oder max / x
(Aber auch andere nichtlineare Kennlinien)