Hallo noiasca,
nachdem die hardwareseitigen Fragen prinzipiell geklärt sind, kann ich zum Programm (und meinen Schwierigkeiten) kommen.
Natürlich habe ich die Hardware schon mal auf einem Testboard einfachst mit digitalwrite getestet und eine Weiche hin und hergeschaltet.
Die Platine laut obigem Schaltplan ist, mangels Software, noch nicht getestet.
Das nachfolgende, garantiert nicht funktionierende Programm habe ich als Anfangspunkt von ChatGPT übernommen und rudimentär adaptiert.
Es ist erst einmal für einen Schattenbahnhof mit 9 Weichen vorgesehen. Die Erweiterung sollte dann leicht fallen.
Das die Programmierung mit "Klasse" funktionieren könnte, habe ich mir schon gedacht, aber an der Umsetzung in ein Programm bin ich gescheitert.
#include <Wire.h>
#include <Adafruit_MCP23017.h>
// Initialisierung der Portexpander für die Weichensteuerung
Adafruit_MCP23017 mcp1, mcp2, mcp3;
// Pindefinitionen für Gleise und LEDs
const int gleisPins[10] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
const int ledPins[10] = {22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
// Pindefinition für Portexpander, wie mach ich das, ist das hier nötig?
void setup() {
Serial.begin(9600);
// Initialisierung der Portexpander (nachdem nur 9 weichen, 18 Spulen zu stellen sind, werden beim mcp3 4 Ports umsonst initialisiert.)
mcp1.begin(0);
mcp2.begin(1);
mcp3.begin(2);
{
for (int i = 0; i < 3; i++)
mcp.begin(i); // Init MCP23017 at address 0x20;0x21;0x22
for (byte i=0; i<8; i++) {
mcp.pinMode(i, OUTPUT);
mcp.pinMode(i+8, inPUT pullup)
}
// Initialisierung der Gleise, LEDs und Weichen
for (int i = 0; i < 10; i++) {
pinMode(gleisPins[i], INPUT_PULLUP);
pinMode(ledPins[i], OUTPUT);
}
}
// Initialisierung der Weichenstellung
abfrageWeichenStellung();
}
void abfrageWeichenStellung() {
// Hier sollte Code für die Initialisierung der Weichenstellung über I²C hinzugefügt werden
// Die Implementierung hängt von den spezifischen Details deiner Hardware und Bibliotheken ab
// Das Ergebnis der Abfrage sollte in den binären Variablen für die Weichenstellung gespeichert werden
}
void weicheSchalten(int weichenPin) {
// Vor der Schaltung Stellung der Weiche kontrollieren
if (digitalRead(weichenPin) == LOW) {
// Weiche ist bereits richtig gestellt
return;
}
// Weiche schalten
digitalWrite(weichenPin, HIGH);
delay(200);
digitalWrite(weichenPin, LOW);
delay(100);
// Kontrolle, ob Weiche jetzt richtig gestellt ist
for (int i = 0; i < 3; i++) {
if (digitalRead(weichenPin) == LOW) {
// Weiche ist jetzt richtig gestellt
return;
}
delay(200);
}
}
void loop() {
// Abfrage der Gleistaster
for (int i = 0; i < 10; i++) {
if (digitalRead(gleisPins[i]) == LOW) {
// Gleis-Taster gedrückt, Weichen entsprechend schalten
int weichenIndex = i;
for (int j = 0; j <= weichenIndex; j++) {
weicheSchalten(weichenPins[j]);
digitalWrite(ledPins[j], HIGH);
}
break;
}
}
// Hier können weitere Funktionen oder Überwachungen eingefügt werden
}