Komme nicht mehr weiter... Will Signal- und Weichensteuerung über IR LM193 Sensor und Relaiskarte schalten. Funktioniert eigentlich alles. Aber: wenn ich ein Signal von Hand steuere, reagiert der Arduino unkontrolliert. Woran liegt das denn nun?
Elektromagnetischer Smog oder so was? Kann man das verhindern?
Grüße
Ich tippe auf fehlerhafte Zeile 42 in deinem Sketch.
Wie machst du das?
Naja...Handauflegen, wenn man das richtig macht, ist auch der Elektrosmog Geschichte. ![]()
Wie Du aus den bisherigen Antworten vielleicht bemerkt hast, ist Deine Frage nicht fundiert zu beantworten, weil du viel zu wenig Details über Deinen Schaltungsaufbau und deine verwendete Software preisgegeben hast.
Ich kann aus Deiner Beschreibung lediglich mutmaßen, dass deine „Handumschaltung“ die elektrische Schaltung in einen „ungültigen“ Zustand bringt, welcher durch die Programmierung und/oder evtl. auch durch die Verschaltung der einzelnen verwendeten Komponenten nicht abgefangen wird.
hier der Sketch:
unsigned long lastActivationTime[4] = {0, 0, 0, 0}; // Zeitstempel der letzten Aktivierung
unsigned long pinOnTime[4] = {0, 0, 0, 0}; // Zeitstempel, wann der Pin eingeschaltet wurde
bool isPinOn[4] = {false, false, false, false}; // Status, ob der Pin derzeit eingeschaltet ist
const unsigned long delayTimeShort = 300; // 300 ms für Einschalten
const unsigned long delayTimeLong = 5000; // 5 Sekunden Sperrzeit
const unsigned long debounceDelay = 50; // 50 ms für Entprellen
unsigned long lastDebounceTime[4] = {0, 0, 0, 0}; // Zeitstempel für Entprellen
void setup() {
// Ausgangspins
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
// Eingangspins
pinMode(6, INPUT_PULLUP);
pinMode(7, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
pinMode(9, INPUT_PULLUP);
// Alle Ausgänge zu Beginn ausschalten (HIGH)
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
digitalWrite(5, HIGH);
}
void loop() {
unsigned long currentTime = millis(); // Aktuelle Zeit
// Verarbeitung für Pin-Paare
processPinState(6, 2, lastActivationTime[0], pinOnTime[0], isPinOn[0], lastDebounceTime[0], currentTime);
processPinState(7, 3, lastActivationTime[1], pinOnTime[1], isPinOn[1], lastDebounceTime[1], currentTime);
processPinState(8, 4, lastActivationTime[2], pinOnTime[2], isPinOn[2], lastDebounceTime[2], currentTime);
processPinState(9, 5, lastActivationTime[3], pinOnTime[3], isPinOn[3], lastDebounceTime[3], currentTime);
}
void processPinState(int inputPin, int outputPin, unsigned long &lastActivationTime,
unsigned long &pinOnTime, bool &isPinOn,
unsigned long &lastDebounceTime, unsigned long currentTime) {
// Entprellen: Prüfen, ob Taster stabil LOW ist
if (digitalRead(inputPin) == LOW) {
if (currentTime - lastDebounceTime > debounceDelay) { // Entprellzeit abwarten
lastDebounceTime = currentTime; // Aktualisiere Entprellzeit
// Prüfe Sperrzeit (5 Sekunden)
if (!isPinOn && currentTime - lastActivationTime >= delayTimeLong) {
digitalWrite(outputPin, LOW); // Pin einschalten (aktiv LOW)
pinOnTime = currentTime; // Zeitpunkt merken
isPinOn = true; // Pin ist eingeschaltet
}
}
}
// Pin nach 300 ms ausschalten
if (isPinOn && currentTime - pinOnTime >= delayTimeShort) {
digitalWrite(outputPin, HIGH); // Pin ausschalten (inaktiv HIGH)
isPinOn = false; // Pin-Status aktualisieren
lastActivationTime = currentTime; // Sperrzeit startet jetzt
}
}
ich habe mir eine Schalttafel gebaut mit Taster zum Weichen und Signale zu steuern. HO Wechselstrom.
Mmmmm
Dann brauchen wir auch den Schaltplan.
Grüße Uwe
Also das ist ganz billig. Nur ein paar Taster eben. Nichts ist verbunden mit dem Digitalen Bereich. Alles ist über eine Relaiskarte getrennt.
Grüße aus Stuttgart
Ich wiederhole vorsorglich #2 bis #4 , da das, was Du uns bis jetzt gegeben hast, immernoch keinen Rückschlüsse auf Dein Projekt gibt.
Was haben der LM193 mit dem ganzen zu tun? der LM193 ist ein Komparator.
Grüße Uwe
PS nette Sandalen?
Ich vermute stark, dass der Kollege folgendes Teil meint:
@simonschorr Dir lege ich nahe, folgendes mal in aller Ruhe durchzulesen:
Frohe Weihnachten... ![]()
also pass auf, Mit den Infrarot Sensoren (LM193) erkenne ich ob eine Lok auf dem Gleis fährt. Dieser Sensor schaltet dann über den Arduino und die Relaiskarte eine Weiche. kommt der Zug wieder in seinem Bahnhof an, erkennt das ein weiterer IR Sensor. Dieser schaltet dann das andere Signal auf grün und die Weiche. So können zwei Züge abwechselnd fahren. Ich habe einen Kreis mit einem Bahnhof für zwei Gleise.
nun wünsche ich allen einen schönen Heiligabend!
Was willst du uns damit sagen ?
Reicht es nicht, das wir deine "nichtssagende Texte" lesen ?
Zeig uns ein richtiges Schaltbild, auf dem wir erkennen können, wie du es verdrahtet hast.
Bilder sagen mehr als dein Worte.
Schaltbilder
Hallo @anon96689131
Es gibt sehr viele Möglichkeiten so etwas zu realisieren was Du da beschreibst. Und es gibt auch sehr viele Möglichkeiten, dabei Fehler zu machen.
Leider können wir dir nicht über die Schulter schauen, um zu sehen, wie Du das gemacht hast.
Wenn wir dir helfen sollen, musst Du schon wirklich detailliert beschreiben, für welche Lösung Du dich entschieden hast, und wie Du das im Detail aufgebaut hast. Am besten mit einem Schaltplan, der alle verbauten Elemente enthält. Und wenn Du code postest, vergiss die Code-Tags nicht. Sonst verändert die Forumssoftware u.U. den Code, weil er Teile davon als Formatierungszeichen missversteht.
Lies dir bitte die von @Kai-R in #11 verlinkte Anleitung zur Forumsnutzung durch. Das ist wirklich wichtig, wenn Du Hilfe bekommen willst.
Schöne Weihnachten!
Also pass auf,
Das steht wol alles in deinem GehemCode. In dem was Du hier gepostet hast bestimmt nicht. Elektromagnetischer Smog wird deinen entsprechenden Code wohl gefressen haben.
Also pass auf, wie Du hier schreibst, die Jungs heben das Wissen was Du brauchen könntest.
Dennoch ein frohes Fest.
Das was du bei Handschalten einer Weiche beobachtest lässt sich präziser beschreiben als "reagiert unkontrolliert"
Und noch präziser wird es wenn man über die serielle Schnittstelle ausgeben lässt welche Variable welchen Wert und welche Bedingungen dann true/false sind und welche Aktionen das Programm dann ausführt.
Hast du den Handschaltetaster parallel zum LM139-Sensor an den Ardino angeschlossen?
Also ihr seid schon Super! Was ihr alles wisst. Ich weiß es nicht. Bin Anfänger.
Fand aber selbst die Lösung: ChatGPT hat mir geholfen und meine eigene Denke. Aber egal. Jetzt habe ich was für Euch.
Der folgende Scatch funktioniert. Aber ich möchte noch einbauen, dass der Nano 1 Sekunde wartet, bis er auslöst:
unsigned long lastActivationTime[4] = {0, 0, 0, 0}; // Zeitstempel der letzten Aktivierung
unsigned long pinOnTime[4] = {0, 0, 0, 0}; // Zeitstempel, wann der Pin eingeschaltet wurde
bool isPinOn[4] = {false, false, false, false}; // Status, ob der Pin derzeit eingeschaltet ist
const unsigned long delayTimeShort = 300; // 300 ms Einschaltzeit für den ersten Pin
const unsigned long delayTimeLong = 5000; // 5 Sekunden Sperrzeit
const unsigned long debounceDelay = 50; // 50 ms für Entprellen
const unsigned long delayTimeDelay = 2000; // 2000 ms (2 Sekunden) Verzögerung vor der Aktivierung
unsigned long lastDebounceTime[4] = {0, 0, 0, 0}; // Zeitstempel für Entprellen
unsigned long delayStartTime[4] = {0, 0, 0, 0}; // Zeitstempel für den Start der Verzögerung
// Zwei Output-Pins für einen Input-Pin
const int inputPins[4] = {7, 8, 9, 10}; // Eingangs-Pins
const int outputPins[4][2] = { {5, 6}, {11, 12}, {13, 14}, {15, 16} }; // Zwei Output-Pins für jeden Input-Pin
void setup() {
// Setze alle Eingangs- und Ausgangs-Pins
for (int i = 0; i < 4; i++) {
pinMode(inputPins[2], INPUT_PULLUP);
pinMode(outputPins[4][0], OUTPUT);
pinMode(outputPins[5][1], OUTPUT);
digitalWrite(outputPins[4,5][1], HIGH); // Alle Ausgänge initial auf HIGH
}
}
void loop() {
unsigned long currentTime = millis();
for (int i = 0; i < 4; i++) {
processPinState(inputPins[i], outputPins[i], lastActivationTime[i], pinOnTime[i], isPinOn[i], lastDebounceTime[i], delayStartTime[i], currentTime);
}
}
void processPinState(int inputPin, int outputPins[2], unsigned long &lastActivationTime,
unsigned long &pinOnTime, bool &isPinOn,
unsigned long &lastDebounceTime, unsigned long &delayStartTime,
unsigned long currentTime) {
// Entprellen: Prüfen, ob Taster stabil LOW ist
if (digitalRead(inputPin) == LOW) {
if (currentTime - lastDebounceTime > debounceDelay) { // Entprellzeit abwarten
lastDebounceTime = currentTime; // Entprellzeit aktualisieren
// Prüfe Sperrzeit (5 Sekunden)
if (!isPinOn && currentTime - lastActivationTime >= delayTimeLong) {
// Verzögerung vor der Aktivierung des Pins (2 Sekunden)
if (currentTime - delayStartTime >= delayTimeDelay) {
digitalWrite(outputPins[0], LOW); // Ersten Pin einschalten (aktiv LOW)
digitalWrite(outputPins[1], LOW); // Zweiten Pin ebenfalls einschalten (aktiv LOW)
pinOnTime = currentTime; // Zeitpunkt merken
isPinOn = true; // Pin ist eingeschaltet
} else if (delayStartTime == 0) {
delayStartTime = currentTime; // Verzögerung starten
}
}
}
}
// Beide Pins nach 300 ms ausschalten
if (isPinOn && currentTime - pinOnTime >= delayTimeShort) {
digitalWrite(outputPins[0], HIGH); // Beide Pins ausschalten (inaktiv HIGH)
digitalWrite(outputPins[1], HIGH); // Beide Pins ausschalten (inaktiv HIGH)
isPinOn = false; // Status zurücksetzen
lastActivationTime = currentTime; // Sperrzeit startet jetzt
}
}
Schafft ihr das?
unsigned long lastActivationTime[4] = {0, 0, 0, 0}; // Zeitstempel der letzten Aktivierung
unsigned long pinOnTime[4] = {0, 0, 0, 0}; // Zeitstempel, wann der Pin eingeschaltet wurde
bool isPinOn[4] = {false, false, false, false}; // Status, ob der Pin derzeit eingeschaltet ist
const unsigned long delayTimeShort = 300; // 300 ms Einschaltzeit für den ersten Pin
const unsigned long delayTimeLong = 5000; // 5 Sekunden Sperrzeit
const unsigned long debounceDelay = 50; // 50 ms für Entprellen
const unsigned long delayTimeDelay = 2000; // 2000 ms (2 Sekunden) Verzögerung vor der Aktivierung
unsigned long lastDebounceTime[4] = {0, 0, 0, 0}; // Zeitstempel für Entprellen
unsigned long delayStartTime[4] = {0, 0, 0, 0}; // Zeitstempel für den Start der Verzögerung
// Zwei Output-Pins für einen Input-Pin
const int inputPins[4] = {7, 8, 9, 10}; // Eingangs-Pins
const int outputPins[4][2] = { {5, 6}, {11, 12}, {13, 14}, {15, 16} }; // Zwei Output-Pins für jeden Input-Pin
void setup() {
// Setze alle Eingangs- und Ausgangs-Pins
for (int i = 0; i < 4; i++) {
pinMode(inputPins[2], INPUT_PULLUP);
pinMode(outputPins[4][0], OUTPUT);
pinMode(outputPins[5][1], OUTPUT);
digitalWrite(outputPins[4,5][1], HIGH); // Alle Ausgänge initial auf HIGH
}
}
void loop() {
unsigned long currentTime = millis();
for (int i = 0; i < 4; i++) {
processPinState(inputPins[i], outputPins[i], lastActivationTime[i], pinOnTime[i], isPinOn[i], lastDebounceTime[i], delayStartTime[i], currentTime);
}
}
void processPinState(int inputPin, int outputPins[2], unsigned long &lastActivationTime,
unsigned long &pinOnTime, bool &isPinOn,
unsigned long &lastDebounceTime, unsigned long &delayStartTime,
unsigned long currentTime) {
// Entprellen: Prüfen, ob Taster stabil LOW ist
if (digitalRead(inputPin) == LOW) {
if (currentTime - lastDebounceTime > debounceDelay) { // Entprellzeit abwarten
lastDebounceTime = currentTime; // Entprellzeit aktualisieren
// Prüfe Sperrzeit (5 Sekunden)
if (!isPinOn && currentTime - lastActivationTime >= delayTimeLong) {
// Verzögerung vor der Aktivierung des Pins (2 Sekunden)
if (currentTime - delayStartTime >= delayTimeDelay) {
digitalWrite(outputPins[0], LOW); // Ersten Pin einschalten (aktiv LOW)
digitalWrite(outputPins[1], LOW); // Zweiten Pin ebenfalls einschalten (aktiv LOW)
pinOnTime = currentTime; // Zeitpunkt merken
isPinOn = true; // Pin ist eingeschaltet
} else if (delayStartTime == 0) {
delayStartTime = currentTime; // Verzögerung starten
}
}
}
}
// Beide Pins nach 300 ms ausschalten
if (isPinOn && currentTime - pinOnTime >= delayTimeShort) {
digitalWrite(outputPins[0], HIGH); // Beide Pins ausschalten (inaktiv HIGH)
digitalWrite(outputPins[1], HIGH); // Beide Pins ausschalten (inaktiv HIGH)
isPinOn = false; // Status zurücksetzen
lastActivationTime = currentTime; // Sperrzeit startet jetzt
}
}
Vielleicht nochmal der Code
bitte im Forum How to nachlesen wie man code in code tags postet.
Nur so wird dein Code lesbar.
Schaffst du das?
