Hilfe bei Radarfalle für Modellbahn

Hallo Zusammen

ich habe folgendes Problem und zwar möchte ich eine Radarfalle bauen, mit einem Sie Fahren Schild davor.
Zum Ablauf

zuerst wird die Geschwindigkeit gemessen, dieser Wert wird ermittelt und auf dem 7Segmentedisplay angezeigt, parallel dazu soll eine Radarfalle( LED) ausgelöst werden.
Jetzt mein Problem, ich weiß nicht wie ich die Radarfalle zum einmaligen Blinken bekommen soll, ohne das auch der Display blink.

Mein Wunsch wäre es, dass es Blink und anschließend, nach Zeitraum X auch das Display ausgeht.

Ich hoffe Ihr könnt mir Helfen.

#include <SevSeg.h>
SevSeg sevseg; 

// Digital 
#define SENSOR_L 4
#define SENSOR_R 5

const double distance = 150.0; 

int scale = 87;
int waitingtime = 12000;
long int deltatime, starttime;

void setup()  
{

  byte numDigits = 2;
  byte digitPins[] = {2, 3};
  byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12}; 
  sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins);
  
  pinMode(SENSOR_L, INPUT_PULLUP); 
  pinMode(SENSOR_R, INPUT_PULLUP);
  pinMode(A1,OUTPUT);
 
  Serial.begin(9600);

 
}

void loop()  {

   
  if (digitalRead(SENSOR_R)== LOW)
  {

    starttime = millis();
    

    while (digitalRead(SENSOR_L)== HIGH) {}
 
    deltatime = (millis() - starttime);
    
    sevseg.setNumber(scale*distance/deltatime*3.6, 0);
  }
    sevseg.refreshDisplay();
    sevseg.setBrightness(90);
  
    if (scale*distance/deltatime*3.6<50){
    digitalWrite(A1, HIGH);
  }
   else {  
   digitalWrite(A1,LOW);
  }

      
} 



void refresh_display() {
    

   Serial.println("");
   Serial.println("Deltatime:");
   Serial.print(deltatime);
   Serial.println(" ms");
   Serial.println("---------");
   Serial.println("Speed:");
   Serial.print(distance/deltatime);
   Serial.println(" m/s (real)");
   Serial.print(scale*distance/deltatime*3.6, 0);
   Serial.print(" km/h (scale 1/");
   Serial.print(scale);
   Serial.println(")");
}

madze90:
Ich hoffe Ihr könnt mir Helfen.

Bei was?
Beim Kommentieren des Codes?

Das machst Du bitte allein.

my_xy_projekt:
Bei was?

Dabei wie ich es schaffe das die LED nur kurz leuchtet und das Display an bleibt.
Mir fällt da leider nichts zu ein, wenn ich es versuche, Blinkt das Display mit.

madze90:
Dabei wie ich es schaffe das die LED nur kurz leuchtet und das Display an bleibt.
Mir fällt da leider nichts zu ein, wenn ich es versuche, Blinkt das Display mit.

Nochmal: Kommentiere Deinen Code!
Ich rate das Du am analog1 vermutlich irgendwas dran hast, was nur einmal ticken soll.

Ich MUSS wissen was Du willst.

my_xy_projekt:
Nochmal: Kommentiere Deinen Code!

So jetzt sorry. =)

#include <SevSeg.h>
SevSeg sevseg; 

// Digital 
#define SENSOR_L 4
#define SENSOR_R 5

const double distance = 150.0; 

//Your model scale 1/xx
int scale = 87;

//Waiting time for train, to move out of measurement array (ms)
int waitingtime = 12000;

//Name of variables for time and speed measuring
long int deltatime, starttime;


void setup()  
{

  byte numDigits = 2; //Hier wird die Anzahl der Ziffern angegeben
  byte digitPins[] = {2, 3}; //Die Pins zu den Ziffern werden festgelegt
  byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12}; //Die Pins zu den //Segmenten werden festgelegt
  sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins);
  
  //Sensor Input
  pinMode(SENSOR_L, INPUT_PULLUP); //Lichtschranke_L
  pinMode(SENSOR_R, INPUT_PULLUP); //Lichtschranke_R
  pinMode(A1,OUTPUT); // LED 
 
 

  //Interface baud rate
  Serial.begin(9600);

 
}

void loop()  {

  //waiting for signal, sensor Right 
  if (digitalRead(SENSOR_R)== LOW)
  {
    //Sensor Right was activated, start time = system time (ms)
    starttime = millis();
    
    //waiting for signal sensor Left
    while (digitalRead(SENSOR_L)== HIGH) {}
  
    //Measured time in ms
    deltatime = (millis() - starttime);
    
    sevseg.setNumber(scale*distance/deltatime*3.6, 0); // Berechnung der Geschwindigkeit
  }
    sevseg.refreshDisplay();
    sevseg.setBrightness(90);
  
    if (scale*distance/deltatime*3.6<50){ // Geschwindigkeit größer X(50)dann LED an
    digitalWrite(A1, HIGH);
  }
   else {  
   digitalWrite(A1,LOW);
  }

      
} //End of loop


//Output on displayƒƒ
void refresh_display() {
    
   //Output on serial monitor
   Serial.println("");
   Serial.println("Deltatime:");
   Serial.print(deltatime);
   Serial.println(" ms");
   Serial.println("---------");
   Serial.println("Speed:");
   Serial.print(distance/deltatime);
   Serial.println(" m/s (real)");
   Serial.print(scale*distance/deltatime*3.6, 0);
   Serial.print(" km/h (scale 1/");
   Serial.print(scale);
   Serial.println(")");
}
   // Output

Mal als Tipp: Wenn das Ding irgendwie blitzt könnte das ein schwerwiegender Eingriff in den Straßenverkehr mit hohem Bußgeld sein.
Wenn dann noch dadurch ein Unfall passiert, hast Du richtig viel Geld als Schadenersatz an der Backe. Wenn da jemand auf Lebenszeit einen Schaden hat, sind das schell ein paar Hundertausend Euro, die Dir keine Versicherung zahlt.

Fazit: Lass das Blitzen weg.

Gruß Tommy

Hallo Tommy

Es geht hier um eine Radarfalle für den Modellbaubereich, sprich H0. :smiley:

Somit sollte doch nichts passieren :wink:

@my_xy_projekt

Ja an A1 ist eine LED die nur einmal kurz blitzen soll.

madze90:
Ja an A1 ist eine LED die nur einmal kurz blitzen soll.

So und nu?
Wie kurz? wann? Warum schreibst Du das nicht in den Code, was Du erwartest?
Wenn Du dann sagst, das die Erwatung nicht erfüllt wird, dann kann man darauf aufbauen.

Bisher wäre mein Einwand: A1 im code - ohne "sprechende" Variable - ist nicht zielführend.

Schau mal, ich bin schon weiter. Also nicht drumrumreden. Machen.

// Digital
const byte SENSOR_L = 4;
const byte SENSOR_R = 5;
const byte blitzLed = A1;
const double distance = 150.0;

const unsigned int scale = 87;
const unsigned int waitingtime = 12000;
unsigned long deltatime, starttime;

Ich hatte es so versucht, allerdings Blinkt dann dauerhaft alles.

  }
    sevseg.refreshDisplay();
    sevseg.setBrightness(90);
  
    if (scale*distance/deltatime*3.6<50){ // Geschwindigkeit größer X(50)dann LED an
    digitalWrite(A1, HIGH);
    delay(10)
    digitalWrite(A1, LOW);
  }
   else {  
   digitalWrite(A1,LOW);
  }

Was ja auch verständlich ist da ich den eigentlichen Wert nicht resette und er es immer ausführt und genau da liegt mein Problem, ich bekommen die Displayfunktion nicht gehalten.

Ob die LED ein- oder ausgeschaltet werden soll hängt nur von der Geschwindigkeit ab.

Wenn die Leuchtdauer anders sein soll als die Zeit, die dieser Wert gültig bleibt, müsstest Du eine eigene Zeitbedingung für die LED implementieren (Startzeit beim Einschalten nehmen, Zeit auf Ablauf prüfen, ggf. ausschalten).

Kürzer als die Meßzeit wirst Du wegen des Wartens auf Sensor links aber mit der aktuellen Programmstruktur nicht werden können; while(...) in Zeile 50 (im ersten Code) blockiert.

madze90:

  }

if (scaledistance/deltatime3.6<50){ // Geschwindigkeit größer X(50)dann LED an
    digitalWrite(A1, HIGH);
    delay(10)
    digitalWrite(A1, LOW);
  }

Also genau genommen ist es das, was ich versucht habe herauszukitzeln.
Deine LED geht AN wenn <50, soll aber wenn >50...
Damit ist die LED ständig an, wenn ein langsames ODER kein Fahrzeug vorbei fährt.

ich würde da mit einer Finite State Machine etwas Struktur in den Sketch bringen:

vieleicht mit folgenden Zuständen:

WARTEN_AUF_MESSUNG
MESSUNG
BLITZEN
ANZEIGE

madze90:
Es geht hier um eine Radarfalle für den Modellbaubereich, sprich H0. :smiley:

Es geht also um einen Radarfallen-Fake - ein Modellbau-Ding das aussieht, als sei es eine Radarfalle. Wäre schön gewesen, wenn dieses „Detail“ schon im Ursprungs-Posting genannt worden wäre ... sooo unwichtig ist das nun wirklich nicht.

Gruß

Gregor

gregorss:
Es geht also um einen Radarfallen-Fake - ein Modellbau-Ding das aussieht, als sei es eine Radarfalle. Wäre schön gewesen, wenn dieses „Detail“ schon im Ursprungs-Posting genannt worden wäre ... sooo unwichtig ist das nun wirklich nicht.

Scheinbar nicht, dachte es wäre klar das es sich nicht um eine Echte Handelt, aber verrückte gibt es ja genug ;-).

wno158:
Ob die LED ein- oder ausgeschaltet werden soll hängt nur von der Geschwindigkeit ab.

Richtig, ist die Geschwindigkeit größer 50km/h soll die Led kurz blinken, darunter passiert nicht.
Nur wie gesagt sie bleibt entweder komplett an, oder es blinkt alles.
Dann werde ich versuchen irgendwie eine Zeitliche Bedingung reinzubauen.

Na ja, bei "irgendwie" bekomme ich leicht Pickel :slight_smile:
Du solltest strukturiert vorgehen - so wie Werner das in Post #11 schon beschrieben hat.

Und damit Du nicht den Überblick verlierst, würde ich erstmal einzelne Sketche vorschlagen, wo die Aufgaben wie beim Display jeweils in einer Funktion stattfinden:

  • Einen nicht blockierenden Meßsketch (falls die Messung länger als ein paar Millisekunden dauert)
  • Einen der nix weiter tut als die LED für eine definierte Zeit anzuschalten.
  • Display-Ausgabe: Hast Du schon; die kannst Du lassen.

Die millis()-Funktion ist Dir ja bekannt und eine Startzeit nimmst Du beim Messen ja auch; das analog angewendet sollte Dich zum Ziel führen.
Beachte: loop() wird schon dauernd in einer Schleife aufgerufen, Du brauchst kein eigenes while( ) mehr.

madze90:
Nur wie gesagt sie bleibt entweder komplett an, oder es blinkt alles.

Hast Du gelesen, was ich Dir zu Deinem Vergleich in der Bedingung geschrieben habe?

Hallo,
das Übel ist mal wieder :

while (digitalRead(SENSOR_L)== HIGH) {};

warum machst Du das nicht mit if.. dann blockiert das Programm nicht. Dazu ein paar Statusmerker messenstart , messenende. Wenn das nur ein kurzer Blitz sein soll kannst Du den ja auch zur Not mit delay() machen. Erstelle mal einen Ablaufplan.

eventuell so

wenn sensor1 erkannt (eventuell Flanke erkennen )
startzeit=millis()
messenstart=true

wenn messenstart und sensor 2 erkannt
messzeit = millis()-startzeit
Speep berechnen
messenende =true

wenn messenstart und messenende
messenstart=false, messenende=false (restet beide Statusvariable )
wenn speed >50
led ein
delay(100)
led aus

Anzeigen

mit etwas Übung kannst Du fast aus jeder Textzeile eine codezeile machen. Eventuell must Du noch was vorsehen für den Fall das der 2. Sensor nicht kommt. (Max messzeit)

Heinz

@madze90
Kleiner Tipp am Rande:
Passe deinen Titel an, dann kann jeder gleich erkennen, was du bauen möchtest.
Beispiel: Hilfe bei Radarfalle für Modellbahn

Titel habe ich mal angepasst.

@my-xy_Projekt
Ja habe ich gelesen und eingefügt.

@Rentner
Meinst du so?

void loop()  {
  if (digitalRead(SENSOR_R)== LOW);{
    starttime = millis();
    starttime = true;
  }
    //waiting for signal sensor Left
  if(starttime = true, (digitalRead(SENSOR_L)== HIGH));{
    deltatime = (millis() - starttime);
    sevseg.setNumber(scale*distance/deltatime*3.6, 0);
    deltatime = true;
             }
    sevseg.refreshDisplay();
    sevseg.setBrightness(90);
 {
    if (scale*distance/deltatime*3.6<50){
    digitalWrite(blitzLed, HIGH);
    delay (29);
    digitalWrite(blitzLed, LOW);

  }
   else {  
   digitalWrite(blitzLed,LOW);

tut es was du willst? Dann ist es ok.

Wenn nicht, beschreibe was es nicht macht und stell einen ganzen Sketch ein der auch bei uns kompilieren würde...