Follow along with the video below to see how to install our site as a web app on your home screen.
Anmerkung: This feature may not be available in some browsers.
Aber warum dann für den Arduino und nicht direkt für den ATmega? Gerade bei mehreren lohnt eine externe Programmiereinheit.und ein Leiterplatten Layout mit Target 3001! erstellt.
// Analog Pins
const int GBMPin = 3; //Pin Eingang GleisBesetztMelder Sensordioden
const int VFahrPin = 1; // Pin Eingang heruntergeteilte ~(5:1)Fahrspannung
const int VBlockPin = 0; // Pin Eingang heruntergeteilte ~(5:1)Blockspannung
const int VMinPin = 4; // Pin Eingang PotiWert für Mindestspannung 0-5V
const int BremsWegPin = 2; // Pin Eingang PotiWert für Bremsweg
// Digital Pins
const int MelEingPin = 11; // Pin SignalEingang vom folgenden Block 0 = BESETZT, 1 = FREI
const int MelAusgPin = 10; // Pin SignalAusgang zum vorherigen Block 0 = BESETZT, 1 = FREI
const int PWMPin = 9; // Pin Ausgang für das PWM-Signal
const int SignalPin = 5; // Pin Ausgang zum Steuern des Relais für Signal und Halteabschnitt, 0 = ROT, 1 = GRÜN
// Variablen
int GBMschwelle = 100; //Schwellwert für die GBMDioden
int VFahr = 0; // Variable für eingelesene Fahrspannung
int VMin = 0; // Variable für eingelesene Mindestspannung
int PWMmin = 0; // Variable für den Mindest PWM-Wert
int PWMmax = 255; // Variable für den Maximalen PWM-Wert
float PWMcur = 0; // Variable für aktuellen PWM-Wert
int GBM = 0; // Variable für GBM
float BremsWeg = 0; // Variable für Bremsweg
float inkr = 0; // Variable zum Verringer/Erhöhen
void setup() {
TCCR2B=TCCR2B&B11111000|B00000110; // Vorteiler auf 256 für ~123Hz PWM
Serial.begin(9600);
pinMode(SignalPin, OUTPUT);
pinMode(MelAusgPin, OUTPUT);
pinMode(MelEingPin, INPUT_PULLUP);
digitalWrite(SignalPin, LOW);
digitalWrite(MelAusgPin, LOW);
analogWrite(PWMPin, 0);
delay(100); // Pause zum reagieren des Relais
}
void loop () {
GBM = analogRead(GBMPin); // Wert über 100, Gleis Besetzt, unter 101, Gleis Frei
VFahr = map(analogRead(VFahrPin), 0, 1023, 0, 2500)+60; // Fahrspannung 0-2500 für 0,00-25,00V // BSP: 1600
VMin = map(analogRead(VMinPin), 0, 1023, 0, 500)+60; // Mindestspannung 0-500 für 0,00-5,00V // BSP: 300
if (VMin > VFahr) VMin = VFahr; // Wenn die Mindestspannung größer als die Fahrspannung ist, dann ist die Mindestspannung gleich der Fahrspannung // pasiert wenn man den Fahrregler unter die Mindestspannung regelt
BremsWeg = analogRead(BremsWegPin)/2; // Wert zwischen 0-511, je größer um so länger der Bremsweg
inkr = (VFahr - VMin)/BremsWeg; // Wert zum Verringern/Erhöhen // BSP: (1600-300)/250
PWMmin = map(VMin,0, VFahr, 0, 255); // Mindest PWM-Signal analog zur Eingestellten Mindestspannung in Abhängigkeit zur Fahrspannung // BSP: 250, 0, 1600, 0, 255 -> 39.84375 -> 39
PWMcur = constrain(PWMcur,PWMmin,PWMmax); // PWMSignal zwischen PWMMin und PWMMax begrenzen
digitalWrite(SignalPin, digitalRead(MelEingPin)); // Wenn folgender Block Frei meldet, setze Halteabschnitt und Signal auf Fahrt (High) ansonsten setze Halteabschnitt und Signal auf Halt (Low)
if (GBM <= GBMschwelle) { // Wenn sich kein Zug im Block befindet,
PWMcur = PWMmax; // ist die Blockspannung gleich Maximale Spannung im Block
digitalWrite(MelAusgPin, HIGH); // Meldet vorherigem Block "FREI"
}
if ((GBM > GBMschwelle) && (digitalRead(MelEingPin) == HIGH)) { // Wenn sich ein Zug im Block befindet und der Folgende Block "FREI" ist
PWMcur = PWMcur + inkr; // Eröht den aktuellen PWM-Wert um den errechneten Erhöhungs/Verringerunswert
PWMcur = constrain(PWMcur,PWMmin,PWMmax); // PWMSignal zwischen PWMMin und PWMMax begrenzen
digitalWrite(MelAusgPin, LOW); // Meldet vorherigem Block "BESETZT"
}
if ((GBM > GBMschwelle) && (digitalRead(MelEingPin) == LOW)) { // Wenn sich ein Zug im Block befindet und der Folgende Block "BESETZT" ist
PWMcur = PWMcur - inkr; // Vermindert den aktuellen PWM-Wert um den errechneten Erhöhungs/Verringerunswert
PWMcur = constrain(PWMcur,PWMmin,PWMmax); // PWMSignal zwischen PWMMin und PWMMax begrenzen
digitalWrite(MelAusgPin, LOW); // Meldet vorherigem Block "BESETZT"
}
analogWrite(PWMPin, PWMcur); //schreibt den PWMWert an den Ausgangspin
delay(100);
Serial.println(GBM);
}
Kannst Du jeden IRF mit einem etwa 4-10 kOhm Widerstand überbrücken.