DCC_out_inv gaat nergens heen. Was meer een geheugensteun. De library CmdrArduino gebruikt die pin om een geïnverteerd DCC-signaal op te zetten. Dat gebruik ik niet, maar de pin wordt natuurlijk wel aangestuurd.
Die header voor de 2803 is bedoeld voor input aan de APM. Het zijn alle digitale poorten.
#include <DCCPacket.h>#include <DCCPacketQueue.h>#include <DCCPacketScheduler.h>#include <Bounce2.h>#include <EEPROM.h>
/* * * * * * * 4 lok-adressen invoeren. Deze zijn te kiezen m.b.v. een bcd-schakelaar of 2 jumpers. * De adressen mogen alleen korte adressen zijn (1..127) */ const byte lok1 = 99;const byte lok2 = 3;const byte lok3 = 3;const byte lok4 = 25;/* Einde lokadressen invoeren */byte lok[] = {lok4, lok3, lok2, lok1};byte lokAdres;byte lokIndex;
DCCPacketScheduler dps;char speed_byte, old_speed = 0, snelheid = 1;byte prev_state = 0;byte F0 = 0;/* * * * * * * Drukknoppen voor de besturing; * DK_xxx = de gebruikte Arduino pin */const byte DK_Vooruit = 3; // Drukknop vooruitconst byte DK_Achteruit = 4; // Drukknop achteruitconst byte DK_Stop = 5; // Drukknop stopconst byte Knoppenlijst[] = {DK_Vooruit, DK_Achteruit, DK_Stop}; // * Geef de posities in het array een naam const byte Vooruit = 0; const byte Achteruit = 1; const byte Stop = 2; #define Aantal_Knoppen sizeof(Knoppenlijst)// * * * * Einde Drukknoppen voor de besturingconst byte Speed_Potm = A0; // Instelling max. snelheidBounce Knoppen[Aantal_Knoppen] = Bounce();const byte Arduino_LED = 13;void setup(){ Serial.begin(115200); // voor debug, we gebruiken Pinnen 0 en 1 niet voor iets anders dps.setup(); //start de DCC packet schedular pinMode(Arduino_LED, OUTPUT); digitalWrite(Arduino_LED, LOW); /* * * * * * * * setup knoppen voor debounce */ for (byte i = 0; i < Aantal_Knoppen; i++) Knoppen[i].attach(Knoppenlijst[i], INPUT_PULLUP); // * * * * Einde setup knoppen
/* * * * * * * * Kies huidige locomotief * Aan de pinnen A1 en A2 komen voor dit programma 2 jumpers naar massa. * Zonder jumpers krijgt lokIndex de waarde 3. De jumpers verlagen de waarde met resp. 1 en 2. * Dus beide jumpers geplaatst geeft lokIndex de waarde 3 - 1 - 2 = 0. * * Als het programma eenmaal loopt kun je niet meer van DCC-adres wisselen. * Hiermee voorkom je eventuele 'missers' op bijv. een tentoonstelling. */ pinMode(A1, INPUT_PULLUP); pinMode(A2, INPUT_PULLUP); lokIndex = digitalRead(A1); // index wordt 0 of 1 lokIndex = lokIndex + 2 * digitalRead(A2); // index krijgt er 0 of 2 bij lokAdres = lok[lokIndex]; // * * * * Einde kies locomotief
if (digitalRead(DK_Vooruit) == 0) // werd de knop ingedrukt gehouden { stel_snelheid_in(); // stel dan de max. snelheid in } speed_byte = EEPROM.read(lokIndex); snelheid = 1; Serial.println(speed_byte, DEC);// if (speed_byte == 0 or speed_byte > 127) stel_snelheid_in();}void loop(){ /* * * * * * * * Knoppen afhandelen * Als 1 van de knoppen gedrukt wordt, gaat de trein rijden met de ingestelde snelheid of * wordt er gestopt. * Er zijn 3 knoppen: Vooruit - Stop - Achteruit */ for (byte i = 0; i < Aantal_Knoppen; i++) { Knoppen[i].update(); } if (Knoppen[Stop].fell()) { if (snelheid > 0) snelheid = 1; if (snelheid < 0) snelheid = -1; } if (Knoppen[Vooruit].fell()) { if (snelheid < -1) snelheid = -1; else snelheid = speed_byte; } if (Knoppen[Achteruit].fell()) { if (snelheid > 1) snelheid = 1; else snelheid = -speed_byte; } /* Einde knoppen afhandelen */ Serial.print("Ingestelde snelheid: "); // debug Serial.println(snelheid, DEC); // debug dps.setSpeed128(lokAdres,DCC_SHORT_ADDRESS,snelheid); // zet de gekozen snelhied klaar dps.update(); // en voer uit naar DCC-booster}void stel_snelheid_in(){ Knoppen[Stop].update(); while (!Knoppen[Stop].fell()) { digitalWrite(Arduino_LED, HIGH); int analoge_waarde = analogRead(0); speed_byte = (analoge_waarde >> 2)-127 ; // deel door vier en breng naar -126 tot 126 reeks if(speed_byte == 0) { if(old_speed > 0) speed_byte = 1; else speed_byte = -1; } old_speed = speed_byte; dps.setSpeed128(lokAdres,DCC_SHORT_ADDRESS,speed_byte); dps.update(); Knoppen[Stop].update(); } if (speed_byte < 0) speed_byte = -speed_byte; EEPROM.write(lokIndex, speed_byte); delay(500); // wacht tot zeker is dat EEPROM beschreven werd digitalWrite(Arduino_LED, LOW);}