//In- uitschakelen van een knipperen de leds met een RC puls van een knuppel of een pulsschakelaar / Gerrit Volgers 5-5-02021 //Referentie De Modelbouwer 2021-5 const int MAX_PULSLENGTE =1000UL; //Definieert maximale pulsduur, hier kleiner dan 1s const int LINKS = 1; //Definieert pulsbeweging naar links const int RECHTS = 2; //Definieert pulsbeweging naar rechts const int MIDDEN = 3; //Definieert neutraalstand const int DREMPEL_LINKS = 1600; //RC puls lnks > 1,6ms const int DREMPEL_RECHTS = 1400; //RC puls rechts <1,4ms const int LED_LINKS = 9; //Linker richtingaanwijzwe op 9 (Dit is functie 1) const int LED_RECHTS = 11; //Rechter richtingaanwijzwe op 11 (Dit is functie 2) const int CH_4 = A2; //Kanaal dat gebruikt wordt voor omschakelen van functies const int KNIPPER_UIT = 0; const int KNIPPER_LINKS = 1; const int KNIPPER_RECHTS = 2; int ch4; //Definitie schakelkanaal int kortepuls; //Definitie variabele functiepuls int stand = MIDDEN,oude_stand = MIDDEN; //Definitie verandering stand knuppel, stand neutraal int knipperStand, knipperAktie = KNIPPER_UIT; // Definieert stand van de knipperaktie (uit) unsigned long currentMillis, beginMillis, knipperMillis;// Definitie puls timer en knippertimer // ------------------------------SET UP ----------------------------------------------------- void setup () { pinMode(CH_4,INPUT); pinMode(LED_LINKS, OUTPUT); pinMode(LED_RECHTS, OUTPUT); digitalWrite(LED_LINKS,0); digitalWrite(LED_RECHTS,0); } void loop() { // ------------------------------PULSDETECTIE--------------------------------------------- kortepuls = false; // Er is geen functiepuls waargenomen currentMillis = millis(); // De tijd wordt opgevraagd. ch4 = pulseIn(CH_4, HIGH, 50000); //Lees puls in van het schakelkanaaal if ( ch4 > DREMPEL_LINKS ) { //Als de RC puls van schakel> drempelwaarde... if (oude_stand != 1) beginMillis = currentMillis; //overgang van midden naar links, start timer stand = LINKS; //functie links geactiveerd } else { if ( ch4 < DREMPEL_RECHTS ) { //Als de RC puls van kanaal 4 < drempelwaarde.. if (oude_stand != RECHTS) beginMillis = currentMillis; // overgang van midden naar rechts, start timer stand = RECHTS; //functie rechts geactiveerd } else { // Als RC puls tussen de drempelwaardenis, zitten we in het midden if (oude_stand != MIDDEN) { // we komen vanuit een andere regio if (currentMillis - beginMillis < MAX_PULSLENGTE) { // Als de functiepuls korteris dan de maximum waarde.... kortepuls = true; // ... is er een korte puls gedetecteerd } } stand = MIDDEN; // middenstand is geactiveerd } } // ------------------------------FUNCTIES SCHAKELEN--------------------------------------------- if (kortepuls) { // Schakelen van functies na detectie van een korte puls switch (oude_stand) { // Functieschakelaar case LINKS: // Programma LINKS wordt uitgevoerd if (knipperAktie == KNIPPER_LINKS) { // Als knipperAktie niet 'KNIPPER_LINKS' is knipperAktie = KNIPPER_UIT; // dan is knipperstand 'uit' digitalWrite(LED_LINKS,0); // Richtingaanwijzer links is uit } else { knipperAktie = KNIPPER_LINKS; // Als knipperAktie 'KNIPPER_LINKS' is knipperStand = 1; // dan is knipperstand 1 digitalWrite(LED_LINKS,HIGH); // Richtingaanwijzer links is 'aan'; } break; // Terug naar het programma van de loop case RECHTS: // Programma van puls rechts wordt uitgevoerd if (knipperAktie == KNIPPER_RECHTS) { // Als kniperAktie niet 'KNIPPER_RECHTS' is knipperAktie = KNIPPER_UIT; // dan is knipperstand 'uit' digitalWrite(LED_RECHTS,0); //Richtingaanwijzer rechts is uit } else { knipperAktie == KNIPPER_RECHTS; // Als ledAktie 'KNIPPER_RECHTS' is knipperStand = 1; // is knipperstand 1 digitalWrite(LED_RECHTS,HIGH); // Richtingaanwijzer rechts is 'aan' } break; } } oude_stand = stand; // onthoud de huidige stand // -------------------------KNIPPEREN------------------------------------------------------------ if (knipperAktie) { if (currentMillis - knipperMillis > 500UL) { // is de tijdverlopen van de knippertijd? knipperStand ^= 1; // inverteer aan/uit if (knipperAktie == KNIPPER_LINKS) digitalWrite(LED_LINKS,knipperStand); // Zet het linker richtingaanwijzer aan/uit else digitalWrite(LED_RECHTS,knipperStand); // zet het rechter richtingaanwijzeret aan/uit knipperMillis = currentMillis; // reset de knippertijd } } }