/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - S e r v o W i s s e l S t e l l e r Testprogramma voor het omzetten van een modelspoorwissel m.b.v. een modelbouw servo. Te testen: - 2 losse drukknoppen voor recht en afbuigend - 2 optocoupler ingangen; funtioneel als schakelaar, bedoeld voor besturing vanuit HCC!m-systeem of Dinamo OC32 - 1 van de optocouplers moet later ook DCC kunnen verwerken Er wordt gebruik gemaakt van 2 servo's Ten behoeve van hartstukpolarisatie zijn er per servo 2 relais Werking per wissel: - na een wisselcommando valt eerst het aangetrokken relais af - daarna loopt het wissel om (servo) - dan komt het andere relais op Bij opstarten gebeurt er niets. Het hartstuk van het wissel heeft geen spanning en de servo staat in een ongedefinieerde stand. De gebruikte Arduino is een Pro Mini, 5V met ATmega328. Gebruikte libraries en voorbeelden: - code uit het Debounce-voorbeeld bestand van Arduino.cc http://www.arduino.cc/en/Tutorial/Debounce - Servo library uit Arduino - omgeving - adServo van Timo Engelgeer Created: 30-04-2015 By: Cees Baarda Modified: By: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // - - - - - L i b r a r i e s i n g e b r u i k : #include <Servo.h> // hiermee besturen we de servo's// - - - - - C o n s t a n t e n :// De pinnummers en vaste waarden een naam geven // - - - - - voor wissel 1 const int optoIn_1 = 3; // voor externe aansturing met 0 of 1 const int servo_1 = 9; // - - - - - t.b.v puntstukpolarisatie const int relaisR_1 = 7; const int relaisG_1 = 8; // - - - - - t.b.v. bediening met knoppen const int knopR_1 = 6; // input; toets wissel recht leggen const int knopG_1 = 5; // input; toets wissel gebogen leggen// - - - - - voor wissel 2 const int optoIn_2 = 2; // voor externe aansturing met 0 of 1 const int servo_2 = 10; // output; Servo 2 // - - - - - t.b.v puntstukpolarisatie const int relaisR_2 = 11; // output; t.b.v. relais bij recht gelegd wisssel const int relaisG_2 = 12; // output; t.b.v. relais bij gebogen gelegd wisssel // - - - - - t.b.v. bediening met knoppen const int knopR_2 = A2; // input; toets wissel recht leggen const int knopG_2 = A0; // input; toets wissel gebogen leggen // - - - - - beide wissels met DCC, nog niet in gebruik // const int DCC_in = 2; // input; de DCC-railspanning gaat hier aan const int LED = A1; // LED op de print// - - - - - nog niet in gebruik, zijn bedoeld voor extra print aan 8 polige// connector // const int LEDarduino = 13; // LED op de arduino // const int LEDextern_1 = A2; // evt. extra LED op externe print (pin 4) // const int LEDextern_2 = A3; // evt. extra LED op externe print (pin 5) // const int externKnop_1 = A2; // evt. extra knop op externe print (pin 4) // const int externKnop_1 = A3; // evt. extra knop op externe print (pin 5) const long servoWacht = 500;// - - - - - G l o b a l e V a r i a b e l e n :// Servo wisselServo1; // 2 objecten van het type Servo Servo wisselServo2; // - - - - - voor wissel 1 int relaisR1StateRecht = LOW; // de huidige staat van de output pin int relaisG1StateGebogen = LOW; // * int knopG_1State; // de huidige waarde van de input pin int lastknopG_1State = LOW; // de vorige waarde van de input pin int knopR_1State; // de huidige waarde van de input pin int lastknopR_1State = LOW; // de vorige waarde van de input pin int optoIn1State = HIGH; // de huidige waarde van de input pin int lastoptoIn1State = HIGH; // de vorige waarde van de input pin // - - - - - voor wissel 2 int relaisR2StateRecht = LOW; // de huidige waarde van de output pin int relaisG2StateGebogen = LOW; // * int knopG_2State; // de huidige waarde van de input pin int lastknopG_2State = LOW; // de vorige waarde van de input pin int knopR_2State; // de huidige waarde van de input pin int lastknopR_2State = LOW; // de vorige waarde van de input pin int optoIn2State = HIGH; // de huidige waarde van de input pin int lastoptoIn2State = HIGH; // de vorige waarde van de input pin // de volgende variabelen zijn 'long', omdat de tijd gemeten in milliseconden // snel de max waarde van een 'int' zal overschrijden. // - - - - - voor wissel 1 long lastDebounceTimeRecht_1 = 0; // het laatste tijdstip waarop de ingang is veranderd long lastDebounceTimeGebogen_1 = 0; // * long lastDebounceTimeoptoIn_1 = 0; // * // - - - - - voor wissel 2 long lastDebounceTimeRecht_2 = 0; // het laatste tijdstip waarop de ingang is veranderd long lastDebounceTimeGebogen_2 = 0; // * long lastDebounceTimeoptoIn_2 = 0; // * const long debounceDelay = 50; // de debounce tijd; hoger maken als de uitgang knippert// - - - - - setup, 1 x doorlopen//void setup(){// - - - - - setup input en output // - - - - - voor wissel 1 pinMode(knopG_1, INPUT_PULLUP); pinMode(relaisR_1, OUTPUT); pinMode(knopR_1, INPUT_PULLUP); pinMode(relaisG_1, OUTPUT); pinMode(optoIn_1, INPUT); // - - - - - voor wissel 2 pinMode(knopG_2, INPUT_PULLUP); pinMode(relaisR_2, OUTPUT); pinMode(knopR_2, INPUT_PULLUP); pinMode(relaisG_2, OUTPUT); pinMode(optoIn_2, INPUT); // - - - - - LED's pinMode(LED, OUTPUT);// - - - - - zet relais uit // - - - - - voor wissel 1 digitalWrite(relaisR_1, relaisR2StateRecht); digitalWrite(relaisG_1, relaisG2StateGebogen); // - - - - - voor wissel 2 digitalWrite(relaisR_2, relaisR2StateRecht); digitalWrite(relaisG_2, relaisG2StateGebogen); // - - - - - testen van werking (moet later weg?) digitalWrite(LED, HIGH); }// - - - - - eindeloos doorgaanvoid loop(){// - - - - - lokale variabelen voor inlezen 'knoppen' // - - - - - voor wissel 2 int readingKnopG2; int readingKnopR2; int readingOptoIn2; int readingKnopG1; int readingKnopR1; int readingOptoIn1; // - - - - - lees de knoppen in readingKnopG2 = digitalRead(knopG_2); readingKnopR2 = digitalRead(knopR_2); readingOptoIn2 = digitalRead(optoIn_2); readingKnopG1 = digitalRead(knopG_1); readingKnopR1 = digitalRead(knopR_1); readingOptoIn1 = digitalRead(optoIn_1);// check to see if you just pressed the button // (i.e. the input went from LOW to HIGH), and you've waited // long enough since the last press to ignore any noise: // If the switch changed, due to noise or pressing: if (readingKnopG1 != lastknopG_1State) { lastDebounceTimeRecht_1 = millis(); // reset the debouncing timer } if (readingKnopR1 != lastknopR_1State) { lastDebounceTimeGebogen_1 = millis(); // reset the debouncing timer } if (readingOptoIn1 != lastoptoIn1State) { lastDebounceTimeoptoIn_1 = millis(); // reset the debouncing timer } if (readingKnopG2 != lastknopG_2State) { lastDebounceTimeRecht_2 = millis(); // reset the debouncing timer } if (readingKnopR2 != lastknopR_2State) { lastDebounceTimeGebogen_2 = millis(); // reset the debouncing timer } if (readingOptoIn2 != lastoptoIn2State) { lastDebounceTimeoptoIn_2 = millis(); // reset the debouncing timer } // - - - - - zet wissel 1 gebogen met knop if ((millis() - lastDebounceTimeGebogen_1) > debounceDelay) { // whatever the readingKnopG2 is at, it's been there for longer // than the debounce delay, so take it as the actual current state: // if the button state has changed: if (readingKnopG1 != knopG_1State) { knopG_1State = readingKnopG1; if (knopG_1State == LOW) { wisselServo1.attach(servo_1,1000,2500); // zet servo aan digitalWrite(relaisG_1, LOW); // relais valt af, hartstuk stroomloos digitalWrite(relaisR_1, LOW); // relais valt af, hartstuk stroomloos wisselServo1.write(1832); // zet servo om delay(servoWacht); // wacht op omlopen wissel digitalWrite(relaisR_1, HIGH); // andere relais op, hartstuk krijgt juiste spanning //digitalWrite(LED, LOW); // LED gaat uit (kan na testen weg) wisselServo1.detach(); // zet servo uit, o.a. jitter voorkomen } } }// - - - - - zet wissel 1 recht met knop if ((millis() - lastDebounceTimeRecht_1) > debounceDelay) { // whatever the readingKnopR1 is at, it's been there for longer // than the debounce delay, so take it as the actual current state: // if the button state has changed: if (readingKnopR1 != knopR_1State) { knopR_1State = readingKnopR1; // only toggle the LED if the new button state is HIGH if (knopR_1State == LOW) { wisselServo1.attach(servo_1,1000,2500); // zet servo aan digitalWrite(relaisR_1, LOW); // relais valt af, hartstuk stroomloos digitalWrite(relaisG_1, LOW); // relais valt af, hartstuk stroomloos wisselServo1.write(1260); // zet servo om delay(servoWacht); // wacht op omlopen wissel digitalWrite(relaisG_1, HIGH); // andere relais op, hartstuk krijgt juiste spanning //digitalWrite(LED, HIGH); // LED gaat aan (kan na testen weg) wisselServo1.detach(); // zet servo uit, o.a. jitter voorkomen } } }// - - - - - zet wissel 1 om met schakelaar if ((millis() - lastDebounceTimeoptoIn_1) > debounceDelay) { // if the button state has changed: if (readingOptoIn1 != optoIn1State) { optoIn1State = readingOptoIn1; wisselServo1.attach(servo_1,1000,2500); // zet servo aan // only toggle the LED if the new button state is HIGH if (optoIn1State == LOW) { digitalWrite(relaisG_1, LOW); // zie commentaar bij digitalWrite(relaisR_1, LOW); // wisselServo1.write(1832); // zet wissel 1 gebogen met knop delay(servoWacht); digitalWrite(relaisR_1, HIGH); digitalWrite(LED, HIGH); } else { digitalWrite(relaisR_1, LOW); // zie commentaar bij digitalWrite(relaisG_1, LOW); // wisselServo1.write(1260); // zet wissel 1 recht met knop delay(servoWacht); digitalWrite(relaisG_1, HIGH); digitalWrite(LED, LOW); } wisselServo1.detach(); // zet servo uit } }// - - - - - zet wissel 2 gebogen met knop if ((millis() - lastDebounceTimeGebogen_2) > debounceDelay) {// whatever the readingKnopG2 is at, it's been there for longer// than the debounce delay, so take it as the actual current state:// if the button state has changed: if (readingKnopG2 != knopG_2State) { knopG_2State = readingKnopG2;// only toggle the LED if the new button state is HIGH if (knopG_2State == LOW) { wisselServo2.attach(servo_2,1000,2500); // zie commentaar bij digitalWrite(relaisG_2, LOW); // zet wissel 1 gebogen met knop digitalWrite(relaisR_2, LOW); wisselServo2.write(1161); delay(servoWacht); digitalWrite(relaisR_2, HIGH); digitalWrite(LED, LOW); wisselServo2.detach(); } } }// - - - - - zet wissel 2 recht met knop if ((millis() - lastDebounceTimeRecht_2) > debounceDelay) { // whatever the readingKnopR2 is at, it's been there for longer // than the debounce delay, so take it as the actual current state: // if the button state has changed: if (readingKnopR2 != knopR_2State) { knopR_2State = readingKnopR2; if (knopR_2State == LOW) { wisselServo2.attach(servo_2,1000,2500); // zie commentaar bij digitalWrite(relaisR_2, LOW); // zet wissel 1 gebogen met knop digitalWrite(relaisG_2, LOW); wisselServo2.write(1760); delay(servoWacht); digitalWrite(relaisG_2, HIGH); digitalWrite(LED, HIGH); wisselServo2.detach(); } } }// - - - - - zet wissel 2 om met schakelaar if ((millis() - lastDebounceTimeoptoIn_2) > debounceDelay) { // if the button state has changed: if (readingOptoIn2 != optoIn2State) { optoIn2State = readingOptoIn2; wisselServo1.attach(servo_2,1000,2500); // only toggle the LED if the new button state is HIGH if (optoIn2State == LOW) { digitalWrite(relaisG_2, LOW); // zie commentaar bij digitalWrite(relaisR_2, LOW); wisselServo1.write(1161); // zet wissel 1 recht met knop delay(servoWacht); digitalWrite(relaisR_2, HIGH); digitalWrite(LED, HIGH); } else { digitalWrite(relaisR_2, LOW); // zie commentaar bij digitalWrite(relaisG_2, LOW); wisselServo1.write(1790); // zet wissel 1 gebogen met knop delay(servoWacht); digitalWrite(relaisG_2, HIGH); digitalWrite(LED, LOW); } wisselServo1.detach(); } } // save the readings. Next time through the loop, // it'll be the last_XXX_state: lastknopG_1State = readingKnopG1; lastknopR_1State = readingKnopR1; lastoptoIn1State = readingOptoIn1; lastknopG_2State = readingKnopG2; lastknopR_2State = readingKnopR2; lastoptoIn2State = readingOptoIn2;}
define NrRelais sizeof(relaisMap)...const byte relaisMap[] = {7, 8, 12, 11}; // Pins van de relais (2 per servo) CB... in setup() // Maak de pinnen voor de relais OUTPUT - CB for(byte i = 0; i < NrRelais; i++) { pinMode(relaisMap[i], OUTPUT); }... in loop() servoControl.gotoEndPos(i / 2, 0); //go to position A digitalWrite(relaisMap[i / 2], LOW); // laat beide relais afvallen digitalWrite(relaisMap[i / 2 + 1], LOW); // CB numButtons += 1;.. servoControl.gotoEndPos(i / 2, 1); //go to position B digitalWrite(relaisMap[i / 2], LOW); // laat beide relais afvallen digitalWrite(relaisMap[i / 2 + 1], LOW); // CB numButtons += 1;... aan het eind van loop() // zet juiste relais weer aan if (servoControl.isAtEndPos(0, 0)) {digitalWrite(relaisMap[0], HIGH);} if (servoControl.isAtEndPos(0, 1)) {digitalWrite(relaisMap[1], HIGH);} if (servoControl.isAtEndPos(1, 0)) {digitalWrite(relaisMap[2], HIGH);} if (servoControl.isAtEndPos(1, 1)) {digitalWrite(relaisMap[3], HIGH);}
Nog een vraag voor de modelspoorders:Ik rijd N en wil gaan voorontkoppelen bij het uitrangeren op de Inglenook. Waar zouden jullie een ontkoppelvoorziening maken? Op ieder van de 3 opstelsporen aan het begin of slechts 1 voor het eerste verdelende wissel.
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - S e r v o W i s s e l S t e l l e r Testprogramma voor het omzetten van twee modelspoorwissels m.b.v. een modelbouw servo. Te testen: - 4 losse drukknoppen voor recht en afbuigend - 2 optocoupler ingangen; funtioneel als schakelaar, bedoeld voor besturing vanuit HCC!m-systeem of Dinamo OC32 - 1 van de optocouplers moet later ook DCC kunnen verwerken Er wordt gebruik gemaakt van 2 servo's Ten behoeve van hartstukpolarisatie zijn er per servo 2 relais Werking per wissel: - na een wisselcommando vallen eerst beide relais af - daarna loopt het wissel om (servo) - dan komt het juiste relais op Bij opstarten gebeurt er niets. Het hartstuk van het wissel heeft geen spanning en de servo staat in een ongedefinieerde stand. De gebruikte Arduino is een Pro Mini, 5V met ATmega328. Gebruikte libraries en voorbeelden: - code uit het Debounce-voorbeeld bestand van Arduino.cc http://www.arduino.cc/en/Tutorial/Debounce - ServoExtend library van Timo Engelgeer - ServoControl library van Timo Engelgeer Created: 30-04-2015 By: Cees Baarda Eerste opzet met gebruikmaking van de library Servo uit de Arduino- omgeving. Modified: 15-07-2015 By: Cees Baarda Aangepast aan gebruik met de libraries van Timo Engelgeer De servo's starten nu op in de middenstand, ongeacht de stand van schakelaars. De relais blijven afgevallen tot het eerste wisselstel commando. Nadeel: Je moet het wissel 2 keer stellen als je het wissel in de stand van de schakelaar wilt hebben. Je kunt de drukknoppen en schakelaars door elkaar gebruiken. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // - - - - - L i b r a r i e s i n g e b r u i k :#include <ServoExtend.h>#include <ServoControl.h>#include <Wire.h>#include <LiquidCrystal_I2C.h>// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *// - - - - - C o n s t a n t e n :// De pinnummers en vaste waarden een naam geven // - - - - - voor wissel 1 const int optoIn_1 = 3; // voor externe aansturing met 0 of 1 const int servo_1 = 9; const int servo1_endPosR = 10; // voorlopig hard coderen, later uit EEPROM const int servo1_endPosG = 1002; // voorlopig hard coderen, later uit EEPROM // - - - - - t.b.v puntstukpolarisatie const int relaisR_1 = 7; const int relaisG_1 = 8; // - - - - - t.b.v. bediening met knoppen const int knopR_1 = 6; // input; toets wissel recht leggen const int knopG_1 = 5; // input; toets wissel gebogen leggen// - - - - - voor wissel 2 const int optoIn_2 = 2; // voor externe aansturing met 0 of 1 const int servo_2 = 10; // output; Servo 2 const int servo2_endPosR = 10; // voorlopig hard coderen, later uit EEPROM const int servo2_endPosG = 1002; // voorlopig hard coderen, later uit EEPROM // - - - - - t.b.v puntstukpolarisatie const int relaisR_2 = 11; // output; t.b.v. relais bij recht gelegd wisssel const int relaisG_2 = 12; // output; t.b.v. relais bij gebogen gelegd wisssel // - - - - - t.b.v. bediening met knoppen const int knopR_2 = A2; // input; toets wissel recht leggen const int knopG_2 = A0; // input; toets wissel gebogen leggen// - - - - - beide wissels met DCC, nog niet in gebruik // const int DCC_in = 2; // input; de DCC-railspanning gaat hier aan const int servoSnelheid = 30; const int servoStepInterval = 1; const int LED = A1; // LED op de print// - - - - - nog niet in gebruik, voor servo instelmodus// encoder: common moet aan GND, andere aan pin 5 en 6// const int pgmEncA = 6;// const int pgmAncB = 5;// const int pgmOK = A0; // kan losse knop of knop van de encoder zijn// - - - - - nog niet in gebruik, zijn bedoeld voor extra print aan 8 polige// connector // const int LEDarduino = 13; // LED op de arduino // const int LEDextern_1 = A2; // evt. extra LED op externe print (pin 4) // const int LEDextern_2 = A3; // evt. extra LED op externe print (pin 5) // const int externKnop_1 = A2; // evt. extra knop op externe print (pin 4) // const int externKnop_1 = A3; // evt. extra knop op externe print (pin 5) // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *// - - - - - G l o b a l e V a r i a b e l e n :// ServoControl wisselServos; // 1 object van het type ServoControl // - - - - - voor wissel 1 int knopG_1State; // de huidige waarde van de input pin int lastknopG_1State = LOW; // de vorige waarde van de input pin int knopR_1State; // de huidige waarde van de input pin int lastknopR_1State = LOW; // de vorige waarde van de input pin // door de huidige PIN-waarde in te lezen wordt het wissel niet direct gesteld in een // stand na opstarten int optoIn1State = digitalRead(optoIn_1); // de huidige waarde van de input pin int lastoptoIn1State = digitalRead(optoIn_1); // de vorige waarde van de input pin // - - - - - voor wissel 2 int knopG_2State; // de huidige waarde van de input pin int lastknopG_2State = LOW; // de vorige waarde van de input pin int knopR_2State; // de huidige waarde van de input pin int lastknopR_2State = LOW; // de vorige waarde van de input pin // door de huidige PIN-waarde in te lezen wordt het wissel niet direct gesteld in een // stand na opstarten int optoIn2State = digitalRead(optoIn_2); // de huidige waarde van de input pin int lastoptoIn2State = digitalRead(optoIn_2); // de vorige waarde van de input pin // de volgende variabelen zijn 'long', omdat de tijd gemeten in milliseconden // snel de max waarde van een 'int' zal overschrijden. // - - - - - voor wissel 1 long lastDebounceTimeRecht_1 = 0; // het laatste tijdstip waarop de ingang is veranderd long lastDebounceTimeGebogen_1 = 0; // * long lastDebounceTimeoptoIn_1 = 0; // * // - - - - - voor wissel 2 long lastDebounceTimeRecht_2 = 0; // het laatste tijdstip waarop de ingang is veranderd long lastDebounceTimeGebogen_2 = 0; // * long lastDebounceTimeoptoIn_2 = 0; // * const long debounceDelay = 50; // de debounce tijd; hoger maken als de uitgang knippert// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *// - - - - - prototypes// void servoInstellen();// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *// - - - - - setup, 1 x doorlopen//void setup(){// - - - - - setup input en output // - - - - - voor wissel 1 pinMode(knopG_1, INPUT_PULLUP); pinMode(relaisR_1, OUTPUT); pinMode(knopR_1, INPUT_PULLUP); pinMode(relaisG_1, OUTPUT); pinMode(optoIn_1, INPUT); // - - - - - voor wissel 2 pinMode(knopG_2, INPUT_PULLUP); pinMode(relaisR_2, OUTPUT); pinMode(knopR_2, INPUT_PULLUP); pinMode(relaisG_2, OUTPUT); pinMode(optoIn_2, INPUT); // - - - - - LED's pinMode(LED, OUTPUT);// - - - - - zet relais uit // - - - - - voor wissel 1 digitalWrite(relaisR_1, LOW); digitalWrite(relaisG_1, LOW); // - - - - - voor wissel 2 digitalWrite(relaisR_2, LOW); digitalWrite(relaisG_2, LOW);// - - - - - initialiseer de servo's // voor wissel 1 wisselServos.setEndPos(0, 0, servo1_endPosR); wisselServos.setEndPos(0, 1, servo1_endPosG); wisselServos.setSpeed(0, servoSnelheid, servoStepInterval); wisselServos.init(0, servo_1); // voor wissel 2 wisselServos.setEndPos(1, 0, servo2_endPosR); wisselServos.setEndPos(1, 1, servo2_endPosG); wisselServos.setSpeed(1, servoSnelheid, servoStepInterval); wisselServos.init(1, servo_2); // zet beide servo's in de middenstand wisselServos.gotoPos(0,511); wisselServos.gotoPos(1,511); wisselServos.update();// - - - - - testen van werking (moet later weg?)// digitalWrite(LED, HIGH);}// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *// - - - - - eindeloos doorgaanvoid loop(){// - - - - - lokale variabelen voor inlezen 'knoppen' // - - - - - voor wissel 2 int readingKnopG2; int readingKnopR2; int readingOptoIn2; // - - - - - voor wissel 1 int readingKnopG1; int readingKnopR1; int readingOptoIn1; // - - - - - lees de knoppen in readingKnopG2 = digitalRead(knopG_2); readingKnopR2 = digitalRead(knopR_2); readingOptoIn2 = digitalRead(optoIn_2); readingKnopG1 = digitalRead(knopG_1); readingKnopR1 = digitalRead(knopR_1); readingOptoIn1 = digitalRead(optoIn_1);// check to see if you just pressed the button // (i.e. the input went from LOW to HIGH), and you've waited // long enough since the last press to ignore any noise: // If the switch changed, due to noise or pressing: if (readingKnopG1 != lastknopG_1State) { lastDebounceTimeRecht_1 = millis(); // reset the debouncing timer } if (readingKnopR1 != lastknopR_1State) { lastDebounceTimeGebogen_1 = millis(); // reset the debouncing timer } if (readingOptoIn1 != lastoptoIn1State) { lastDebounceTimeoptoIn_1 = millis(); // reset the debouncing timer } if (readingKnopG2 != lastknopG_2State) { lastDebounceTimeRecht_2 = millis(); // reset the debouncing timer } if (readingKnopR2 != lastknopR_2State) { lastDebounceTimeGebogen_2 = millis(); // reset the debouncing timer } if (readingOptoIn2 != lastoptoIn2State) { lastDebounceTimeoptoIn_2 = millis(); // reset the debouncing timer } // - - - - - zet wissel 1 gebogen met knop if ((millis() - lastDebounceTimeGebogen_1) > debounceDelay) { // if the button state has changed: if (readingKnopG1 != knopG_1State) { knopG_1State = readingKnopG1; if (knopG_1State == LOW) { digitalWrite(relaisG_1, LOW); // relais valt af, hartstuk stroomloos digitalWrite(relaisR_1, LOW); // relais valt af, hartstuk stroomloos wisselServos.gotoEndPos(0,0); // zet servo om } } }// - - - - - zet wissel 1 recht met knop if ((millis() - lastDebounceTimeRecht_1) > debounceDelay) { // if the button state has changed: if (readingKnopR1 != knopR_1State) { knopR_1State = readingKnopR1; // only toggle the LED if the new button state is HIGH if (knopR_1State == LOW) { digitalWrite(relaisG_1, LOW); // relais valt af, hartstuk stroomloos digitalWrite(relaisR_1, LOW); // relais valt af, hartstuk stroomloos wisselServos.gotoEndPos(0,1); // zet servo om } } }/* - - - - - zet wissel 1 om met schakelaar--*/ if ((millis() - lastDebounceTimeoptoIn_1) > debounceDelay) { // if the button state has changed: if (readingOptoIn1 != optoIn1State) { optoIn1State = readingOptoIn1; // - - - - - Eerst het hartstuk stroomloos maken digitalWrite(relaisG_1, LOW); // relais valt af digitalWrite(relaisR_1, LOW); // relais valt af// - - - - - stuur servo alleen aan als die nog naar een nieuwe eindpositie moet if (optoIn1State == LOW) { if (!wisselServos.isAtEndPos(0,1)) wisselServos.gotoEndPos(0,1); } else { if (!wisselServos.isAtEndPos(0,0)) wisselServos.gotoEndPos(0,0); } } } // - - - - - zet wissel 2 gebogen met knop if ((millis() - lastDebounceTimeGebogen_2) > debounceDelay) {// if the button state has changed: if (readingKnopG2 != knopG_2State) { knopG_2State = readingKnopG2;// only toggle the LED if the new button state is HIGH if (knopG_2State == LOW) { digitalWrite(relaisG_2, LOW); // relais valt af, hartstuk stroomloos digitalWrite(relaisR_2, LOW); // relais valt af, hartstuk stroomloos wisselServos.gotoEndPos(1,0); // zet servo om } } }// - - - - - zet wissel 2 recht met knop if ((millis() - lastDebounceTimeRecht_2) > debounceDelay) { // whatever the readingKnopR2 is at, it's been there for longer // than the debounce delay, so take it as the actual current state: // if the button state has changed: if (readingKnopR2 != knopR_2State) { knopR_2State = readingKnopR2; if (knopR_2State == LOW) { digitalWrite(relaisG_2, LOW); // relais valt af, hartstuk stroomloos digitalWrite(relaisR_2, LOW); // relais valt af, hartstuk stroomloos wisselServos.gotoEndPos(1,1); // zet servo om } } }/* - - - - - zet wissel 2 om met schakelaar*/ if ((millis() - lastDebounceTimeoptoIn_2) > debounceDelay) { // if the button state has changed: if (readingOptoIn2 != optoIn2State) { optoIn2State = readingOptoIn2; digitalWrite(relaisG_2, LOW); // relais valt af, hartstuk stroomloos digitalWrite(relaisR_2, LOW); // relais valt af, hartstuk stroomloos // only toggle the LED if the new button state is HIGH if (optoIn2State == LOW) { if (!wisselServos.isAtEndPos(1,1)) wisselServos.gotoEndPos(1,1); // zet servo om } else { if (!wisselServos.isAtEndPos(1,0)) wisselServos.gotoEndPos(1,0); // zet servo om } } } wisselServos.update(); // zet juiste relais weer aan if (!wisselServos.isMoving(0)) // zorg eerst dat het servo stil staat, dan relais aan { if (wisselServos.isAtEndPos(0, 0)) {digitalWrite(relaisR_1, HIGH);} if (wisselServos.isAtEndPos(0, 1)) {digitalWrite(relaisG_1, HIGH);} } if (!wisselServos.isMoving(1)) // zorg eerst dat het servo stil staat, dan relais aan { if (wisselServos.isAtEndPos(1, 0)) {digitalWrite(relaisR_2, HIGH);} if (wisselServos.isAtEndPos(1, 1)) {digitalWrite(relaisG_2, HIGH);} } // save the readings. Next time through the loop, // it'll be the last_XXX_state: lastknopG_1State = readingKnopG1; lastknopR_1State = readingKnopR1; lastoptoIn1State = readingOptoIn1; lastknopG_2State = readingKnopG2; lastknopR_2State = readingKnopR2; lastoptoIn2State = readingOptoIn2;}Een update:// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *// - - - - - Servo instelmodusvoid servoInstellen(){ }