Geschwindigkeitsmessanlage uno

Hallo ,
Muss für die schule ein projekt machen kenn mich leider nicht sehr gut mit programmieren aus ich habe von dommenik lokschuppen einen code für eine geschwindigkeitsmessanlage und wollte fragen woran es liegt das dieser nicht mit meinem board kompatibel ist obwohl er genau das gleiche board benutzt?
Ich beutze das arduino uno ,2TCRT5000 Infrarot Lichtschranken und ein LC Display HD44780 mit 2 X 16 Zeichen
Der code:

#include 
#include "TimerOne.h"

LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

int Sensor_A = A0;
int Sensor_B = A1;
int Sensor_1 = 900;
int Sensor_2 = 900;
int Zeitmesser = 0;
int Loeschen = 0;
int Start = 0;
int Stop = 0;
int Geschwindigkeit = 0;

void setup()
{
 lcd.begin(16,2);
 lcd.setCursor(3,0);
 lcd.print("Bereit f");
 lcd.setCursor(11,0);
 lcd.print(char(245));
 lcd.setCursor(12,0);
 lcd.print("r");
 lcd.setCursor(2,1);
 lcd.print("eine Messung");

 Timer1.initialize(50000);
 Timer1.attachInterrupt(Zeitkonstante);

 Serial.begin(9600);
}

void Zeitkonstante()
{
 // Start der Zeit
 if (Start == 1 || Start == 2 && Stop == 0)
 {
 Zeitmesser++;
 }

 // Zeit zum Löschen des Displays auf Grundstellung
 if (Loeschen > 0)
 {
 Loeschen++;
 }
/*
 // Ausgabe der Sensorwerte
 Serial.println("Sensor_1");
 Serial.println(Sensor_1);
 Serial.println("Sensor_2");
 Serial.println(Sensor_2);
*/
}

void loop()
{
 Sensor_1 = analogRead(Sensor_A);
 Sensor_2 = analogRead(Sensor_B);

 // Messung wenn Zug aus Richtung 1 kommt
 if (Sensor_1 < 500 && Sensor_2 > 500 && Start == 0)
 {
 Start = 1;
 lcd.begin(16,2);
 lcd.setCursor(4,0);
 lcd.print("Messung");
 lcd.setCursor(3,1);
 lcd.print("gestartet");
 }
 // Messung gestoppt
 if (Sensor_2 < 500 && Start == 1)
 {
 Stop = 1;
 }

 // Messung wenn Zug aus Richtung 2 kommt
 if (Sensor_2 < 500 && Sensor_1 > 500 && Start == 0)
 {
 Start = 2;
 lcd.begin(16,2);
 lcd.setCursor(4,0);
 lcd.print("Messung");
 lcd.setCursor(3,1);
 lcd.print("gestartet");
 }
 // Messung gestoppt
 if (Sensor_1 < 500 && Start == 2)
 {
 Stop = 1;
 }

 // Ausgabe der Geschwindigkeit
 if (Stop == 1 && Loeschen == 0)
 {
 // v = s / t; s = Streckenlänge (in cm) / 100 * Maßstab * 3,6 * 20 (Auflösung des Interrupts)
 Geschwindigkeit = 3182 / Zeitmesser;
 Zeitmesser = 0;
 Loeschen = 1;
 lcd.begin(16,2);
 lcd.setCursor(0,0);
 lcd.print("Geschwindigkeit:");
 if (Geschwindigkeit < 100)
 {
 lcd.setCursor(4,1);
 lcd.print(Geschwindigkeit);
 lcd.setCursor(7,1);
 lcd.print("km/h");
 }
 else
 {
 lcd.setCursor(4,1);
 lcd.print(Geschwindigkeit);
 lcd.setCursor(8,1);
 lcd.print("km/h");
 }
 }

 // Displays löschen, Grundstellung
 if (Loeschen > 150)
 {
 Start = 0;
 Stop = 0;
 Zeitmesser = 0;
 Loeschen = 0;
 lcd.begin(16,2);
 lcd.setCursor(3,0);
 lcd.print("Bereit f");
 lcd.setCursor(11,0);
 lcd.print(char(245));
 lcd.setCursor(12,0);
 lcd.print("r");
 lcd.setCursor(2,1);
 lcd.print("eine Messung");
 }

 // Ausgabe wenn beide Sensoren auslösen = Gleis ist belegt
 if (Sensor_1 < 500 && Sensor_2 < 500 && Start == 0)
 {
 Start = 3;
 lcd.begin(16,2);
 lcd.setCursor(0,0);
 lcd.print("Gleis ist belegt");
 }

 // beide Sensoren wieder in Grundstellung = Gleis ist nicht mehr belegt
 if (Sensor_1 > 500 && Sensor_2 > 500 && Start == 3)
 {
 Start = 0;
 Zeitmesser = 0;
 lcd.begin(16,2);
 lcd.setCursor(3,0);
 lcd.print("Bereit f");
 lcd.setCursor(11,0);
 lcd.print(char(245));
 lcd.setCursor(12,0);
 lcd.print("r");
 lcd.setCursor(2,1);
 lcd.print("eine Messung");
 }

 // wenn nach dem Auslösen des ersten Sensors eine Zeit von 40 Sekunden überschritten wird: Grundstellung und Ausgabe "Messung ungültig"
 if (Zeitmesser > 800)
 {
 Zeitmesser = 0;
 Loeschen = 1;
 lcd.begin(16,2);
 lcd.setCursor(3,0);
 lcd.print("Ung");
 lcd.setCursor(6,0);
 lcd.print(char(245));
 lcd.setCursor(7,0);
 lcd.print("ltige");
 lcd.setCursor(4,1);
 lcd.print("Messung");
 }

Versuch uns mal einige Links zur Hardware und zum Sketch zu geben.
Grüeß Uwe

In dieser Zeile

if (Start == 1 || Start == 2 && Stop == 0)

hast Du m.E. ein Problem. Lt. Operator Precedence ist das && höher priorisiert als das ||. Wenn das so gewollt ist, gut. Anderenfalls würde ich lieber einen Satz Klammern zuviel als zuwenig spendieren:

if ( ((Start == 1) || (Start == 2)) && (Stop == 0))

Gruß Walter

Zusätzlich solltest du genau beschreiben, was bei deinem Aufbau nicht funktioniert.
Auch hilft ein Schaltbild ungemein bei der Fehlersuche.

Mein problem ist das wenn ich den sketch überprüfen will das jedes mal eine fehlermeldung erscheint

Moritz2808:
Mein problem ist das wenn ich den sketch überprüfen will das jedes mal eine fehlermeldung erscheint

Diese Fehlermeldung können wir nicht sehen…warum postest du die nicht ?

Am obigen Sketch kann ich schon mal sehen, dass das erste “#include” zu viel ist und andere fehlen.
Z.B. “#include <LiquidCrystal.h>”

Zusätzlich solltest du mal über Groß und Kleinschreibung, sowie Punkte und Kommas nachdenken.

Poste doch bitte deine Fehlermeldungen hier ins Forum. Wir sind keine Hellseher.

Ich habe den Sketch an mein LCD angepaßt und an ein paar Stellen geändert. Der Compiler ist nun zufrieden und zu fubktionieren scheint es auch:

#include <Wire.h>
#include <hd44780.h> // include hd44780 library header file
#include <hd44780ioClass/hd44780_I2Cexp.h> // i/o expander/backpack class
hd44780_I2Cexp lcd; // auto detect backpack and pin mappings

#include "TimerOne.h"

int Sensor_A = A0;
int Sensor_B = A1;
int Sensor_1 = 900;
int Sensor_2 = 900;
int Zeitmesser = 0;
int Loeschen = 0;
int Start = 0;
int Stop = 0;
int Geschwindigkeit = 0;

void setup()
{
  lcd.begin(16, 2);
  lcd.setCursor(3, 0);
  lcd.print("Bereit f\xF5r");
  lcd.setCursor(2, 1);
  lcd.print("eine Messung");

  Timer1.initialize(50000);
  Timer1.attachInterrupt(Zeitkonstante);

  //Serial.begin(9600);
}

void Zeitkonstante()
{
  // Start der Zeit
  if ((Start == 1 || Start == 2) && Stop == 0)
  {
    Zeitmesser++;
  }

  // Zeit zum Löschen des Displays auf Grundstellung
  if (Loeschen > 0)
  {
    Loeschen++;
  }
  /*
  // Ausgabe der Sensorwerte
  Serial.print("Sensor_1: ");
  Serial.println(Sensor_1);
  Serial.print("Sensor_2: ");
  Serial.println(Sensor_2);
  Serial.println();
  */
}

void loop()
{
  Sensor_1 = analogRead(Sensor_A);
  Sensor_2 = analogRead(Sensor_B);

  // Messung wenn Zug aus Richtung 1 kommt
  if (Sensor_1 < 500 && Sensor_2 > 500 && Start == 0)
  {
    Start = 1;
    lcd.begin(16, 2);
    lcd.setCursor(4, 0);
    lcd.print("Messung");
    lcd.setCursor(3, 1);
    lcd.print("gestartet");
  }
  // Messung gestoppt
  if (Sensor_2 < 500 && Start == 1)
  {
    Stop = 1;
  }

  // Messung wenn Zug aus Richtung 2 kommt
  if (Sensor_2 < 500 && Sensor_1 > 500 && Start == 0)
  {
    Start = 2;
    lcd.begin(16, 2);
    lcd.setCursor(4, 0);
    lcd.print("Messung");
    lcd.setCursor(3, 1);
    lcd.print("gestartet");
  }
  // Messung gestoppt
  if (Sensor_1 < 500 && Start == 2)
  {
    Stop = 1;
  }

  // Ausgabe der Geschwindigkeit
  if (Stop == 1 && Loeschen == 0)
  {
    // v = s / t; s = Streckenlänge (in cm) / 100 * Maßstab * 3,6 * 20 (Auflösung des Interrupts)
    Geschwindigkeit = 3182 / Zeitmesser;
    Zeitmesser = 0;
    Loeschen = 1;
    lcd.begin(16, 2);
    lcd.setCursor(0, 0);
    lcd.print("Geschwindigkeit:");
    if (Geschwindigkeit < 100)
    {
      lcd.setCursor(4, 1);
      lcd.print(Geschwindigkeit);
      lcd.setCursor(7, 1);
      lcd.print("km/h");
    }
    else
    {
      lcd.setCursor(4, 1);
      lcd.print(Geschwindigkeit);
      lcd.setCursor(8, 1);
      lcd.print("km/h");
    }
  }

  // Displays löschen, Grundstellung
  if (Loeschen > 150)
  {
    Start = 0;
    Stop = 0;
    Zeitmesser = 0;
    Loeschen = 0;
    lcd.begin(16, 2);
    lcd.setCursor(3, 0);
    lcd.print("Bereit f\xF5r");
    lcd.setCursor(2, 1);
    lcd.print("eine Messung");
  }

  // Ausgabe wenn beide Sensoren auslösen = Gleis ist belegt
  if (Sensor_1 < 500 && Sensor_2 < 500 && Start == 0)
  {
    Start = 3;
    lcd.begin(16, 2);
    lcd.setCursor(0, 0);
    lcd.print("Gleis ist belegt");
  }

  // beide Sensoren wieder in Grundstellung = Gleis ist nicht mehr belegt
  if (Sensor_1 > 500 && Sensor_2 > 500 && Start == 3)
  {
    Start = 0;
    Zeitmesser = 0;
    lcd.begin(16, 2);
    lcd.setCursor(3, 0);
    lcd.print("Bereit f\xF5r");
    lcd.setCursor(2, 1);
    lcd.print("eine Messung");
  }

  // wenn nach dem Auslösen des ersten Sensors eine Zeit von 40 Sekunden überschritten wird: Grundstellung und Ausgabe "Messung ungültig"
  if (Zeitmesser > 800)
  {
    Zeitmesser = 0;
    Loeschen = 1;
    lcd.begin(16, 2);
    lcd.setCursor(3, 0);
    lcd.print("Ung\xF5ltige");
    lcd.setCursor(4, 1);
    lcd.print("Messung");
  }
}

Richtig glücklich macht mich dieser Sketch allerdings nicht, da wäre noch Luft nach oben :slight_smile:

agmue:
Richtig glücklich macht mich dieser Sketch allerdings nicht, da wäre noch Luft nach oben :slight_smile:

Der komplette Thread macht mich nicht glücklich.
Wieder einmal werden unsere Antworten komplett ignoriert.

Aber schön, dass du dir die Mühe gemacht hast, im den Sketch fertig zu schreiben.
Hoffen wir, er versteht es.

HotSystems:
Der komplette Thread macht mich nicht glücklich.

Mich auch nicht.

HotSystems:
Wieder einmal werden unsere Antworten komplett ignoriert.

Oder aber, wir sind zu schnell :slight_smile:

HotSystems:
Aber schön, dass du dir die Mühe gemacht hast, im den Sketch fertig zu schreiben.

War aus meiner Sicht Kleinkram :wink:

HotSystems:
Hoffen wir, er versteht es.

Ja oder ein stiller Mitleser :slight_smile:

Schonmal Entschuldigung das ich mich nichtmehr gemeldet habe habe deinen neuen Code probiert mir wird dennoch ein fehler angezeigt:

Arduino: 1.8.5 (Windows 10), Board: “Arduino/Genuino Uno”

C:\Users\moppe\Documents\Arduino\1_a\1_a.ino:2:60: fatal error: hd44780.h: No such file or directory

#include <hd44780.h> // include hd44780 library header file

^

compilation terminated.

exit status 1
Fehler beim Kompilieren für das Board Arduino/Genuino Uno.

Dieser Bericht wäre detaillierter, wenn die Option
“Ausführliche Ausgabe während der Kompilierung”
in Datei → Voreinstellungen aktiviert wäre.

und danke für eure mühe

Moritz2808:
…habe deinen neuen Code probiert mir wird dennoch ein fehler angezeigt:

Arduino: 1.8.5 (Windows 10), Board: “Arduino/Genuino Uno”

C:\Users\moppe\Documents\Arduino\1_a\1_a.ino:2:60: fatal error: hd44780.h: No such file or directory

#include <hd44780.h> // include hd44780 library header file

Du musst die Library auch installieren.

Dieser Bericht wäre detaillierter, wenn die Option
“Ausführliche Ausgabe während der Kompilierung”
in Datei → Voreinstellungen aktiviert wäre.

Und wenn du das machen würdest, was da steht, wüsstest du was falsch ist.

Manchmal sieht man auch den wald vor lauter bäumen nicht

Moritz2808:
Manchmal sieht man auch den wald vor lauter bäumen nicht

Wenn es dann funktioniert, ist es ja ok.

Und eine Rückmeldung lesen wir immer gern.

ich hätte mich wirklich mehr darüber informieren sollen was für ein projekt ich mir aussuche. Da ich mich viel zu wenig damit auskenne ich hoffe mir kann jemand sagen was ich bei diesem error machen soll

Arduino: 1.8.5 (Windows 10), Board: "Arduino/Genuino Uno"

sketch_jan29g:6: error: stray '\240' in program

^

sketch_jan29g:8: error: stray '\240' in program

^

sketch_jan29g:18: error: stray '\240' in program

^

sketch_jan29g:30: error: stray '\240' in program

^

sketch_jan29g:33: error: stray '\240' in program

^

sketch_jan29g:36: error: stray '\240' in program

^

sketch_jan29g:44: error: stray '\240' in program

^

sketch_jan29g:58: error: stray '\240' in program

^

sketch_jan29g:63: error: stray '\240' in program

^

sketch_jan29g:79: error: stray '\240' in program

^

sketch_jan29g:95: error: stray '\240' in program

^

sketch_jan29g:121: error: stray '\240' in program

^

sketch_jan29g:139: error: stray '\240' in program

^

sketch_jan29g:148: error: stray '\240' in program

^

sketch_jan29g:164: error: stray '\240' in program

^

exit status 1
stray '\240' in program

Dieser Bericht wäre detaillierter, wenn die Option
"Ausführliche Ausgabe während der Kompilierung"
in Datei -> Voreinstellungen aktiviert wäre.

Da hast Du Dir beim C&P ein blödes Zeichen in Deinen Code geholt.
Schau Dir mal die angegebenen Zeilen genau an, evtl. auch mal die Zeichenkodierung ändern (Externer Editor z.B. Notepad++) um sie zu sehen.

Das hatte ich auch mal in einem aus dem Browser kopierten Quelltext. Das war ein in UTF-8 nicht sichtbares Zeichen zwischn 2 Klammern. In ANSI konnte ich es sehen.

Gruß Tommy

Kann man diese einfach löschen ?

Da zeigt sich mal wieder, man sollte auch verstehen, was man kopiert und nicht einfach nur copy&paste durchführen.

Moritz2808:
Kann man diese einfach löschen ?

Wenn Du die Zeichen findest, ja. Aber nicht die ganze Zeile löschen :wink:
Gruuß Tommy

HotSystems:
Da zeigt sich mal wieder, man sollte auch verstehen, was man kopiert und nicht einfach nur copy&paste durchführen.

Die Dinger siehst Du nicht. Wie gesaht: Bei mir waren das Zeichen zwischen 2 schließenden Klammern, die auf dem Bildschirm hintereinander ohne Zwischenraum waren.
Erst das Spielen mit der Codierung der Datei brachte sie ans Licht.
An dieser Stelle ist nichts mit verstehen. Ansonsten gebe ich Dir Recht.
Gruß Tommy