43 analoge Sensoren -Teil 2 - Zugvollständigkeitskontrolle - Gleisfreimeldung - mit Hall - Sensor
Gerhard Kruse Gerhard Kruse
1.38K subscribers
1,023 views
28

 Published On Sep 16, 2023

Mit diesem Aufbau werden 4 analoge Signale im Arduino eingelesen.
Mit wenig Hardware ist eine Gleisüberwachung mit Hall-Sensor Typ TLE4905L oder mit Gabellichtschranken Typ GP1S097HCZ0F ( als Achszähler) zu realisieren.

Software: ein fertiger Zählkreis
da spitze Klammern in der Videobeschreibung nicht zulässig sind,
habe ich sie mit einem X dargestellt.
Das Programm direkt im Arduino kopieren und dann das X mit der spitzen Klammer, entsprechend den 2 Bildern im Video ersetzen. Danach erst bei Bedarf aus dem Arduino kopieren, und evtl. in eine Word Datei speichern.
Es sind 18 X

3:54 Softwarebilder
4:04 Wichtige Hinweise

#include xWire.hx
#include xLiquidCrystal_I2C.hx
LiquidCrystal_I2C lcd(0x27, 20, 4); // Initialisiere das LCD-Display – 20 Stellen 4 Zeilen

int Impulse; // Impulse an der Lesestelle
int Achsen; // sind Achsen / 4 oder Magnete

const int analog1 = A0; // Definiere die Pins für die analogen Eingänge
const int analog2 = A1;
const int analog3 = A2; // Definiere die Pins für die analogen Eingänge
const int analog4 = A3;
int counter1 = 0; // Zähler für die inkrementalen Werte
int lastEncoded1 = 0; // Letzter kodierter Wert
int counter2 = 0; // Zähler für die inkrementalen Werte
int lastEncoded2 = 0; // Letzter kodierter Wert
int LS1; // Lichtschrankenbitt 1-4
int LS2;
int LS3;
int LS4;
void setup()
{

Wire.begin(); // Initialisiere den I2C-Bus
lcd.init(); // Initialisiere das LCD-Display
lcd.backlight();
//Serial.begin(9600); // Startet die serielle Kommunikation
pinMode(7, OUTPUT); // LED leuchtet wenn belegt
pinMode(8, OUTPUT); // LED leuchtet wenn frei

}
void loop() {
updateEncoder();
int Wert1 = analogRead(analog1); // Lese den Wert zw. 0-1023 am analogen Eingang A0
if (Wert1 x 20) LS1 = 1; else LS1 = 0; // wenn kleiner - dann 1 aktiv sonst 0
int Wert2 = analogRead(analog2); // Lese den Wert zw. 0-1023 am analogen Eingang A1
if (Wert2 x 20) LS2 = 1; else LS2 = 0; // wenn kleiner - dann 1 aktiv sonst 0
int Wert3 = analogRead(analog3); // Lese den Wert zw. 0-1023 am analogen Eingang A0
if (Wert3 x 20) LS3 = 1; else LS3 = 0; // wenn kleiner - dann 1 aktiv sonst 0
int Wert4 = analogRead(analog4); // Lese den Wert zw. 0-1023 am analogen Eingang A1
if (Wert4 x 20) LS4 = 1; else LS4 = 0; // wenn kleiner - dann 1 aktiv sonst 0


if (Impulse != 0) { digitalWrite(7,LOW); } else { digitalWrite(7,HIGH);}
if (Impulse == 0) { digitalWrite(8,LOW); } else { digitalWrite(8,HIGH);}

Impulse=counter1-counter2; // Impulse zwischen den Lesestellen
Achsen = Impulse/4;

lcd.setCursor(0, 0); lcd.print(" A0");lcd.print(" ") ;lcd.print("A1");lcd.print(" ");lcd.print("A2");lcd.print(" ");lcd.print("A3");
lcd.setCursor(0, 1);lcd.print(" "); lcd.print(Wert1);lcd.print(" ");lcd.print(Wert2);lcd.print(" ");lcd.print(Wert3);lcd.print(" ");lcd.print(Wert4);
lcd.setCursor(0, 2);lcd.print("Impulse ");lcd.print(Impulse);lcd.print(" ");lcd.setCursor(0, 3);lcd.print("Achsen ");lcd.print(Achsen);lcd.print(" ");
//Serial.println(Impulse); // Gibt den aktuellen Zählerstand aus
//Serial.println(Achsen); // Gibt die aktuellen Achsen aus
}
void updateEncoder() // Aktualisiert den Zähler
{
int encoded1 = (LS1 xx 1) | LS2; // Kodiert die beiden Signale in einen Wert xx ist der Links-Bitverschiebungsoperator
int encoded2 = (LS3 xx 1) | LS4;
int sum1 = (lastEncoded1 xx 2) | encoded1; // Summe atuellen kodierter Wert
int sum2 = (lastEncoded2 xx 2) | encoded2;
if(sum1 == 0b1101 || sum1 == 0b0100 || sum1 == 0b0010 || sum1 == 0b1011) counter1++; // zuzählen
if(sum1 == 0b1110 || sum1 == 0b0111 || sum1 == 0b0001 || sum1 == 0b1000) counter1--; // abzählen
if(sum2 == 0b1101 || sum2 == 0b0100 || sum2 == 0b0010 || sum2 == 0b1011) counter2++;
if(sum2 == 0b1110 || sum2 == 0b0111 || sum2 == 0b0001 || sum2 == 0b1000) counter2--;
lastEncoded1 = encoded1; // Speichert den aktuellen kodierten Wert
lastEncoded2 = encoded2;
}

show more

Share/Embed