Hallo Arduino profs,
Ik begin de aanhef maar zo, aangezien ik al twee dagen (!!) bezig ben met het aanpassen van een code en dat lukt me niet. Ik ben absoluut geen prof en met de vele voorbeelden op websites en youtube, kom ik er helemaal niet meer uit. Onderstaande code zal voor menig Arduino-ist rommelig overkomen, maar het werkt, althans, ten delen.
Wat er nu gebeurt en wat er moet gebeuren...
Als butPin1 en butPin2 worden geschakeld, gaat er een trein vertrekken. Via een random nummer wordt er één van de 11 sporen gekozen en vrijgegeven. Na 20 seconde worden de wissels geschakeld naar het spoor waar de trein is vertrokken. De trein doet een rondje over de modelspoorbaan, komt terug het station in en activeert een volgende trein, ook weer met een random nummer via randomSeed.
Wat er NU gebeurt is dat een trein best nóg een keer geselecteerd kan worden uit die 11 random nummers. Gevolg is dat dezelfde trein nóg een keer een ronde maakt.
Wat er eigenlijk móet gebeuren is dat de voorgaande 4 random-nummers (treinen), worden onthouden zodat deze niet achter elkaar gaan rijden. Er blijven dan nog 7 random nummers over.
Hoe die ik dit nu? Ik heb via-via en via internet een code in elkaar gezet, dat werkt, ik krijg alleen die vergelijkingen niet gedaan en de sketch onthoud ook niks. Ik heb gekeken naar een array, maar dat gaat mijn programmeerkennis helemáál te boven, ik snap er werkelijk geen hout van. Ik had gehoopt met INT wat waardes te kunnen wijzigen IN de loop, maar blijkbaar kan dit niet, werkt dit niet of wellicht is het uitgesloten dat dat kan.
Nou, met angst en beven, dé code...
#define AAN LOW // Definities omkeren, AAN is LOW
#define UIT HIGH // Definities omkeren, UIT is HIGH
#define ON true // Definities, ON is True
#define OFF false // Definities, OFF is False
#include <LiquidCrystal_I2C.h> //Library voor LCD-display
LiquidCrystal_I2C lcd(0x27, 20, 4); //Display-grootte opgeven met 0x27 als standaard adres
#include <EEPROM.h> //Library voor RandomSeed
const uint8_t butPin1 = 2; //Rijsensor M-rails vóór inrit van het schaduwstation
const uint8_t butPin2 = 4; //Rijsensor M-rails vóór inrit van het schaduwstation
uint8_t butState1 = AAN; //Status rijcontact 1
uint8_t butState2 = AAN; //Status rijcontact 2
uint8_t traceFlag = OFF; //Traceflag standaard uit
const uint8_t seed_addr = 0;
unsigned long seed;
int randNum = 0;
int randNumOld = 0;
int randNumOld2 = 0;
int randNumOld3 = 0;
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(1, 0); // Plaats de cursor op de eerste lijn (O) en op positie 1.
lcd.print("* Schaduwstation *"); // Print deze tekst
lcd.setCursor(1, 1); // Plaats de cursor op de tweede lijn en op positie 1.
lcd.print("by Roland"); // Print deze tekst
lcd.setCursor(1, 3); // Plaats de cursor op de vierde lijn en op positie 1.
lcd.print("v3.6 - 08-09-2022"); // Print deze tekst vóórdat er een trein vertrekt
pinMode(butPin1, INPUT_PULLUP);
pinMode(butPin2, INPUT_PULLUP);
for ( uint8_t thisPin = 22; thisPin < 54; thisPin++) { //Selectie van pinnen voor output (LET OP: één meer dan er fysieke pinnen zijn!)
digitalWrite(thisPin, UIT); //Pinnen (relais) moeten UIT blijven/staan
pinMode(thisPin, OUTPUT); //Alle geselecteerde pinnen dienen als output
}
seed = EEPROM.read(seed_addr);
EEPROM.write(seed_addr, seed+1);
randomSeed(seed);
}
void loop() {
butState1 = digitalRead(butPin1);
butState2 = digitalRead(butPin2);
int randNumOld2 = randNumOld3;
int randNumOld1 = randNumOld2;
int randNumOld = randNumOld1;
int randNum = randNumOld;
if ((butState1 == AAN && butState2 == AAN) && (traceFlag == OFF)) {
//HIERONDER: Random output van 42 TOT MAXIMAAL 53. LET OP...!!! Eén nummer HOGER dan aantal actieve sporen!!!
//ATTENTIE! Bij gebruik van minder dan 11 sporen, het laatste getal wijzigen!
//Dus, 7 sporen in gebruik, dan 42 t/m 49 invullen, bij 9 sporen is het 42 t/m 51.
//Bij 3 sporen wordt het dus 42 t/m 45.
randNum = random(42, 53); //Selecteer een willekeurig nummer tussen deze twee
if ((randNum == randNumOld) or (randNum == randNumOld1) or (randNum == randNumOld2) or (randNum == randNumOld3)) {
randNum = random(42, 53);
} // 1
if ((randNum == randNumOld) or (randNum == randNumOld1) or (randNum == randNumOld2) or (randNum == randNumOld3)) {
randNum = random(42, 53);
} // 2
if ((randNum == randNumOld) or (randNum == randNumOld1) or (randNum == randNumOld2) or (randNum == randNumOld3)) {
randNum = random(42, 53);
} // 3
if ((randNum == randNumOld) or (randNum == randNumOld1) or (randNum == randNumOld2) or (randNum == randNumOld3)) {
randNum = random(42, 53);
} // 4
if ((randNum == randNumOld) or (randNum == randNumOld1) or (randNum == randNumOld2) or (randNum == randNumOld3)) {
randNum = random(42, 53);
} // 5
digitalWrite(randNum, AAN); //Willekeurig relais aan
traceFlag = ON; //TraceFlag aan
//Hier onder is 20 seconde wachttijd ingebouwd.
//Het display telt af van 20 naar 0, dus elke seconde een bericht naar LCD-display.
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 20 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 19 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 18 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 17 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 16 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 15 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 14 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 13 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 12 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 11 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 10 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 9 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 8 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 7 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 6 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 5 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 4 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 3 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 2 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0); // Plaats de cursor op de eerste lijn (O) en op positie 0.
lcd.print("Trein komt binnen!"); // Print deze tekst
lcd.setCursor(0, 1);
lcd.print("Trein vertrekt...");
lcd.setCursor(0, 3);
lcd.print("Wachttijd: 1 sec.");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Trein vertrokken.");
lcd.setCursor(0, 1);
lcd.print("Geen actie meer.");
lcd.setCursor(0, 3);
lcd.print("Wissels schakelen...");
digitalWrite(randNum, UIT); //Willekeurig relais weer uit
delay(1500);
if (randNum == 42){ //ALS willekeurig nummer 42 is...dan...
delay(50); //Delay vóóraf, (test of nu alle relais worden meegenomen)
digitalWrite(23, AAN); //Spanning wissel x inschakelen
delay(150); //Tijd dat de wissels bekrachtigd worden (ca. 150ms is genoeg)
digitalWrite(23, UIT); //Spanning wissel x uitschakelen
delay(50);
digitalWrite(24, AAN);
delay(150);
digitalWrite(24, UIT);
delay(50);
digitalWrite(27, AAN);
delay(150);
digitalWrite(27, UIT);
delay(50);
digitalWrite(28, AAN);
delay(150);
digitalWrite(28, UIT);
delay(50);
digitalWrite(30, AAN);
delay(150);
digitalWrite(30, UIT);
delay(50);
digitalWrite(32, AAN);
delay(150);
digitalWrite(32, UIT);
// lcd.clear();
// lcd.setCursor(0, 1);
// lcd.print("WISSELS GESCHAKELD");
// delay(1000);
}
else if (randNum == 43){
delay(50);
digitalWrite(23, AAN);
delay(150);
digitalWrite(23, UIT);
delay(50);
digitalWrite(24, AAN);
delay(150);
digitalWrite(24, UIT);
delay(50);
digitalWrite(27, AAN);
delay(150);
digitalWrite(27, UIT);
delay(50);
digitalWrite(28, AAN);
delay(150);
digitalWrite(28, UIT);
delay(50);
digitalWrite(30, AAN);
delay(150);
digitalWrite(30, UIT);
delay(50);
digitalWrite(33, AAN);
delay(150);
digitalWrite(33, UIT);
// lcd.clear();
// lcd.setCursor(0, 1);
// lcd.print("WISSELS GESCHAKELD");
// delay(1000);
}
else if (randNum == 44){
delay(50);
digitalWrite(23, AAN);
delay(150);
digitalWrite(23, UIT);
delay(50);
digitalWrite(24, AAN);
delay(150);
digitalWrite(24, UIT);
delay(50);
digitalWrite(27, AAN);
delay(150);
digitalWrite(27, UIT);
delay(50);
digitalWrite(28, AAN);
delay(150);
digitalWrite(28, UIT);
delay(50);
digitalWrite(31, AAN);
delay(150);
digitalWrite(31, UIT);
delay(50);
digitalWrite(34, AAN);
delay(150);
digitalWrite(34, UIT);
// lcd.clear();
// lcd.setCursor(0, 1);
// lcd.print("WISSELS GESCHAKELD");
// delay(1000);
}
else if (randNum == 45){
delay(50);
digitalWrite(23, AAN);
delay(150);
digitalWrite(23, UIT);
delay(50);
digitalWrite(24, AAN);
delay(150);
digitalWrite(24, UIT);
delay(50);
digitalWrite(27, AAN);
delay(150);
digitalWrite(27, UIT);
delay(50);
digitalWrite(28, AAN);
delay(150);
digitalWrite(28, UIT);
delay(50);
digitalWrite(31, AAN);
delay(150);
digitalWrite(31, UIT);
delay(50);
digitalWrite(35, AAN);
delay(150);
digitalWrite(35, UIT);
// lcd.clear();
// lcd.setCursor(0, 1);
// lcd.print("WISSELS GESCHAKELD");
// delay(1000);
}
else if (randNum == 46){
delay(50);
digitalWrite(23, AAN);
delay(150);
digitalWrite(23, UIT);
delay(50);
digitalWrite(24, AAN);
delay(150);
digitalWrite(24, UIT);
delay(50);
digitalWrite(27, AAN);
delay(150);
digitalWrite(27, UIT);
delay(50);
digitalWrite(29, AAN);
delay(150);
digitalWrite(29, UIT);
// lcd.clear();
// lcd.setCursor(0, 1);
// lcd.print("WISSELS GESCHAKELD");
// delay(1000);
}
else if (randNum == 47){
delay(50);
digitalWrite(23, AAN);
delay(150);
digitalWrite(23, UIT);
delay(50);
digitalWrite(24, AAN);
delay(150);
digitalWrite(24, UIT);
delay(50);
digitalWrite(26, AAN);
delay(150);
digitalWrite(26, UIT);
delay(50);
digitalWrite(36, AAN);
delay(150);
digitalWrite(36, UIT);
// lcd.clear();
// lcd.setCursor(0, 1);
// lcd.print("WISSELS GESCHAKELD");
// delay(1000);
}
else if (randNum == 48){
delay(50);
digitalWrite(23, AAN);
delay(150);
digitalWrite(23, UIT);
delay(50);
digitalWrite(24, AAN);
delay(150);
digitalWrite(24, UIT);
delay(50);
digitalWrite(26, AAN);
delay(150);
digitalWrite(26, UIT);
delay(50);
digitalWrite(37, AAN);
delay(150);
digitalWrite(37, UIT);
// lcd.clear();
// lcd.setCursor(0, 1);
// lcd.print("WISSELS GESCHAKELD");
// delay(1000);
}
else if (randNum == 49){
delay(50);
digitalWrite(23, AAN);
delay(150);
digitalWrite(23, UIT);
delay(50);
digitalWrite(25, AAN);
delay(150);
digitalWrite(25, UIT);
delay(50);
digitalWrite(41, AAN);
delay(150);
digitalWrite(41, UIT);
delay(50);
digitalWrite(38, AAN);
delay(150);
digitalWrite(38, UIT);
// lcd.clear();
// lcd.setCursor(0, 1);
// lcd.print("WISSELS GESCHAKELD");
// delay(1000);
}
else if (randNum == 50){
delay(50);
digitalWrite(23, AAN);
delay(150);
digitalWrite(23, UIT);
delay(50);
digitalWrite(25, AAN);
delay(150);
digitalWrite(25, UIT);
delay(50);
digitalWrite(41, AAN);
delay(150);
digitalWrite(41, UIT);
delay(50);
digitalWrite(39, AAN);
delay(150);
digitalWrite(39, UIT);
// lcd.clear();
// lcd.setCursor(0, 1);
// lcd.print("WISSELS GESCHAKELD");
// delay(1000);
}
else if (randNum == 51){
delay(50);
digitalWrite(23, AAN);
delay(150);
digitalWrite(23, UIT);
delay(50);
digitalWrite(25, AAN);
delay(150);
digitalWrite(25, UIT);
delay(50);
digitalWrite(40, AAN);
delay(150);
digitalWrite(40, UIT);
// lcd.clear();
// lcd.setCursor(0, 1);
// lcd.print("WISSELS GESCHAKELD");
// delay(1000);
}
else if (randNum == 52){
delay(50);
digitalWrite(22, AAN);
delay(150);
digitalWrite(22, UIT);
// lcd.clear();
// lcd.setCursor(0, 1);
// lcd.print("WISSELS GESCHAKELD");
// delay(1000);
}
}
//Reset het boeltje
if (traceFlag == ON) {
digitalWrite(randNum, UIT);
traceFlag = OFF;
lcd.clear();
lcd.setCursor(1, 0);
lcd.print("* Schaduwstation *");
lcd.setCursor(1, 1); // Plaats de cursor op de tweede lijn en op positie 1.
lcd.print("by Roland"); // Print deze tekst
lcd.setCursor(0, 3); // Plaats de cursor op de vierde lijn en op positie 0.
lcd.print("Wacht op trein..."); // Print deze tekst
}
}
Zou iemand mij kunnen helpen met het onthouden van de laatste 4 random nummers? Deze moeten voordat er een NIEUW random-nummer wordt gegenereerd, eerst worden vergeleken met de voorgaande 4 en (indien hetzelfde random nummer wordt getrokken) moet er dan een nieuw random-nummer worden gegenereerd.
Ik hoop dat iemand me op weg kan helpen, ik kan het niet vinden...