#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_SSD1306.h>#define MSG1_PIN 2#define MSG2_PIN 3#define MSG3_PIN 4#define MSG4_PIN 5#define MSG5_PIN 6#define MSG6_PIN 7#define MSG7_PIN 8#define MSG8_PIN 9#define TMIN 5 // departure time of next train, minimum of random time#define TMAX 13 // departure time of next train, maximum of random time#define SCREEN_WIDTH 128 // OLED display width, in pixels#define SCREEN_HEIGHT 32 // OLED display height, in pixelsbyte hour, minute;byte msgnr,msgnr_old, msgflag, msghour, msgminute;// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);void calc_msg_time() { msgminute = minute + random(TMIN, TMAX); msghour = hour; if (msgminute > 59) { msghour = (msghour + 1) % 24; msgminute = msgminute - 60; }}void setup() { Serial.begin(115200); randomSeed (analogRead(0)); hour = random(7, 20); minute = random(0, 60); pinMode (MSG1_PIN, INPUT_PULLUP); pinMode(MSG2_PIN, INPUT_PULLUP); pinMode (MSG3_PIN, INPUT_PULLUP); pinMode (MSG4_PIN, INPUT_PULLUP); pinMode (MSG5_PIN, INPUT_PULLUP); pinMode (MSG6_PIN, INPUT_PULLUP); pinMode (MSG7_PIN, INPUT_PULLUP); pinMode (MSG8_PIN, INPUT_PULLUP); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address Serial.println(F("SSD1306 allocation failed")); for(;;); } delay(2000); display.clearDisplay(); }void loop() { // display time and messages if(!digitalRead(MSG1_PIN)) msgnr = 1; if(!digitalRead(MSG2_PIN)) msgnr = 2; if(!digitalRead(MSG3_PIN)) msgnr = 3; if(!digitalRead(MSG4_PIN)) msgnr = 4; if(!digitalRead(MSG5_PIN)) msgnr = 5; if(!digitalRead(MSG6_PIN)) msgnr = 6; if(!digitalRead(MSG7_PIN)) msgnr = 7; if(!digitalRead(MSG8_PIN)) msgnr = 8; if(msgnr != msgnr_old) { calc_msg_time(); msgnr_old = msgnr; } display.setTextSize(1); display.setTextColor(WHITE); switch (msgnr) { case 1://vitrains display.setCursor(5,0); display.println("BRUGGE"); display.setCursor(50,10); display.println("OOSTENDE"); display.setCursor(115,20); display.println("IC"); display.setCursor(0, 20); if(msghour < 10) display.print(" "); display.print(msghour); display.print(":"); if(msgminute < 10) display.print("0"); display.print(msgminute); display.display(); break; case 2://desiro display.setCursor(50,0); display.println("MECHELEN"); display.setCursor(5,10); display.println("ANTWERPEN-CENTRAAL"); display.setCursor(115,20); display.println("S"); display.setCursor(0, 20); if(msghour < 10) display.print(" "); display.print(msghour); display.print(":"); if(msgminute < 10) display.print("0"); display.print(msgminute); display.display(); break; case 3://benelux display.setCursor(5,0); display.println("ANTWERPEN-CENTRAAL"); display.setCursor(50,10); display.println("AMSTERDAM CS"); display.setCursor(115,20); display.println("IC"); display.setCursor(0, 20); if(msghour < 10) display.print(" "); display.print(msghour); display.print(":"); if(msgminute < 10) display.print("0"); display.print(msgminute); display.display(); break; case 4://m6 display.setCursor(5,0); display.println("BRUGGE"); display.setCursor(50,10); display.println("BLANKENBERGE"); display.setCursor(115,20); display.println("IC"); display.setCursor(0, 20); if(msghour < 10) display.print(" "); display.print(msghour); display.print(":"); if(msgminute < 10) display.print("0"); display.print(msgminute); display.display(); break; case 5://am54 display.setCursor(50,0); display.println("LEUVEN"); display.setCursor(5,10); display.println("LIEGE-GUILLEMINS"); display.setCursor(115,20); display.println("IC"); display.setCursor(0, 20); if(msghour < 10) display.print(" "); display.print(msghour); display.print(":"); if(msgminute < 10) display.print("0"); display.print(msgminute); display.display(); break; case 6://lsmodels display.setCursor(5,0); display.println("Brussel"); display.setCursor(50,10); display.println("Welkenraedt"); display.setCursor(115,20); display.println("IC"); display.setCursor(0, 20); if(msghour < 10) display.print(" "); display.print(msghour); display.print(":"); if(msgminute < 10) display.print("0"); display.print(msgminute); display.display(); break; case 7://classic display.setCursor(5,0); display.println("Yogyakarta"); display.setCursor(50,10); display.println("Jakarta"); display.setCursor(115,20); display.println("T"); display.setCursor(0, 20); if(msghour < 10) display.print(" "); display.print(msghour); display.print(":"); if(msgminute < 10) display.print("0"); display.print(msgminute); display.display(); break; case 8://lsmodels display.setCursor(5,0); display.println("Ettelbruck"); display.setCursor(50,10); display.println("Luxembourg"); display.setCursor(115,20); display.println("IR"); display.setCursor(0, 20); if(msghour < 10) display.print(" "); display.print(msghour); display.print(":"); if(msgminute < 10) display.print("0"); display.print(msgminute); display.display(); break; } display.clearDisplay(); }
Wat Nico bedoeld denk ik. Zodra je via de DCC next een poort digitaal hoog zet. En daarna een andere poort hoog zet, heb je twee poorten hoog staan. Zet je dan ook de derde poort hoog, dan heb je er al drie hoog staan. Ze vallen niet automatisch weer af naar laag. Zet je bijvoorbeeld poort 1 hoog en wil je daarna poort 2 hoog zetten, dan moet je dus eerst poort 1 af laten zetten en dan poort 2 hoog. Dat principe doe je ook met je draadje. De DCC Next moet echter ook een comando krijgen om een poort weer af te schakelen. Het kan zijn dat het daar fout gaat. Groet Alex
daar kan je met een aspect verschillende adressen schakelen
telkens alle poorten laag schakelen en 1 hoog