Moin!
kürzlich hatte ich schon einmal meinen Code für meine Geschwindigkeitsmessung mit zwei Messpunkten gepostest. Der Abstand sollte über einen Poti eingestellt werden.
Nun habe ich nochmal von Anfang an begonnen, dass ich irgendwie nicht weiter kam. Nun soll es so sein, dass über einen Taster zwischen dem Messmodi und dem Modus für die Streckenlängendefinition gewechselt werden soll.
Dabei habe ich festgestellt, dass nicht immer richtig auf den Taster reagiert wurde und so bin ich zu INTERRUPT gekommen.
Derzeit ist an meinem Arduino nur eine 16x2 LCD und ein Taster angeschlossen. Die Variablendefinitionen habe ich nicht alle entfernt. Vielleicht etwas unübersichtlich....
Vom Gedanken soll es eine Variable MODUS geben mit folgenden Werten:
0 ...Programmstart
-1 ... Def der Strecke
1 ... Messung
Über den Taster soll zwischen 1 und -1 gewechselt werden können und dafür habe ich die Interrupt-Funktion definiert.
Meinen aktuellen Sketch stelle ich ans Ende. Derzeit wird nur die Init angezeigt und wenn ich den Taster drücke, dann reagiert der nur einmal.
Nach meiner Auffassung müsste dieser nach jeder Betätigung doch den Wert ändern und dann auch eine Ausgabe in dem Monitor machen.
Kann mir einer weiterhelfen ?
Gruß Jan
// Lichtschranke für Zugeschwindigkeit in Verbindung mit Seriellen Monitor
//
// Einbinden der LCD-Funktionen derzeit noch inaktiv
// #include <LiquidCrystal_I2C.h>
// LiquidCrystal_I2C lcd(0x27, 16,2) // ?????
//
#include <Wire.h> // Comes with Arduino IDE
#include <LiquidCrystal_I2C.h>
/*-----( Declare Constants )-----*/
/*-----( Declare objects )-----*/
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address
/*-----( Declare Variables )-----*/
//NONE
unsigned long start, finished, elapsed;
int modus=-1; // Programmstart 0 / Def der Strecke =-1 / Messung = 1
int act=0; // Messung läuft 1 / beendet oder nicht gestartet 0
int tstatus=0; // Tasterstatus
int T1=7; // 1. IR #7
int T2=8; // 2. IR #8
const byte interruptPin = 2;
volatile byte Taster = LOW;
int P1=A1; // ANALOG für Poti
// Werteabfrage
// IR
// aktueller Status
int cT1=-1; // Status IR 1
int cT2=-1; // Status IR 2
// vorheriger Status
int oT1=-1; // Status IR 1
int oT2=-1; // Status IR 2
int maxTime=0; // Kennung für die Zeitüberschreitung
// Poti
int cP=0; // Wert am Poti
// Werte für die Messstrecke (1/10mm)
int Svon = 3500; // 50 cm
int Sbis = 4500; // 60cm
int oDist =0; // alter Streckenwert
char Ausgabe;
void setup() {
// Hier fehlt die Initalisierung des LCD
Serial.begin(9600); // öffnen der Seriellen Schnittstelle für die Überwachung
attachInterrupt(digitalPinToInterrupt(interruptPin), changeModus, CHANGE);
lcd.begin(16,2); // initialize the lcd for 16 chars 2 lines, turn on backlight
lcd.setCursor(0,0); //Start at character 4 on line 0
lcd.print("Lichtschranke");
lcd.setCursor(0,1);
lcd.print("bereit ...");
delay(2000);
modus=-1;
Serial.println("Setup abgeschlossen ....");
}
void loop() {
// Meldung beim Starten des Programmes
if (modus==0) {
//lcd.clear();
lcd.setCursor(0,0); //Start at character 4 on line 0
lcd.print("Lichtschranke");
Serial.println("Lichtschranke bereit");
lcd.setCursor(0,1); //Start at character 4 on line 0
lcd.print("bereit ...");
modus=-1; // zuerst die Strecke definieren
}
// Definition der Strecke
if (modus==-1) {
lcd.setCursor(0,1); //Start at character 4 on line 0
lcd.print("Definition");
} else { // durchführen der Messung
lcd.setCursor(0,1); //Start at character 4 on line 0
lcd.print("Messung");
}
}
// Modus-Wechsel
void changeModus(){
//Serial.println("++++ INTERRUPT +++++");
modus=modus*-1;
Serial.println(modus);
lcd.clear();
}