Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * Geschreven door Hannes Beem
- *
- * Dit programma is gratis software, het staat u vrij om het te verspreiden en / of aan te passen
- * onder de voorwaarden van de GNU General Public License zoals gepubliceerd door
- * the Free Software Foundation, versie 3 van de licentie of
- * welke latere versie dan ook.
- *
- * Dit programma is gemaakt in de hoop dat het u van nut zal zijn,
- * maar het is ZONDER ENIGE GARANTIE; Zonder ook maar de geimpliceerde garantie voor
- * verkoopbaarheid of geschiktheid voor een bepaald doel. Bekijk de
- * GNU General Public License voor meer details.
- *
- * Een kopie van het GNU General Public License kunt u hier vinden http://www.gnu.org/licenses/
- *
- * Deze software is gratis en het staat u vrij het te verspreiden.
- *
- * Met dank aan transcendtient voor zijn LiquidCrystal library gevonden op de Arduino.cc website. http://playground.arduino.cc/Main/LiquidCrystal
- * Met dank aan Alexander Brevig voor zijn MenuBackend library. http://www.arduino.cc/playground/uploads/Profiles/MenuBackend_1-4.zip
- * Met dank aan rafbuff voor de meest accurate encoder code gevonden op de Arduino.cc website. http://playground.arduino.cc/Main/RotaryEncoders
- * Met dank aan salsa (van Jeff's Arduino Blog) voor de code van de knop. http://jmsarduino.blogspot.be/2009/05/click-for-press-and-hold-for-b.html
- * Met dank aan Nico Verduin en Shooter van het Nederlandse Arduino forum http://arduinoforum.nl en PaulS van het http://www.arduino.cc forum.
- * Met dank aan PaulS van het Arduino.cc forum.
- * Met dank aan Michael McRoberts auteur van Beginning Arduino pdf.
- ! Belangrijk: om de menubackend library te kunnen gebruiken, moet je hem eerst hier downloaden: http://www.arduino.cc/playground/uploads/Profiles/MenuBackend_1-4.zip
- de volgende code moet toegevoegd worden aan het MenuBackend.h bestand op regel 195
- void toRoot() {
- setCurrent( &getRoot() );
- }
- */
- #include <SPI.h> // Noodzakelijk om de 74HC595 chip te kunnen gebruiken
- #include <MenuBackend.h> // MenuBackend library
- #include <LiquidCrystal.h> // LCD Display Library in combinatie met de 74HC595 chip
- // library aanspreken om gebruik te maken van de latch pin van de 74HC595
- LiquidCrystal lcd(10);
- //
- // Encoder pin toewijzingen
- //
- #define encoderPinA 2 // pin voor A
- #define encoderPinB 3 // pin voor B
- #define encoderButton 4 // pin voor drukknop
- //
- // PIN toewijzingen voor de LEDS
- //
- #define REDLEDPIN 5
- #define GREENLEDPIN 6
- #define BLUELEDPIN 9
- //
- // Finite State Machine Staten
- //
- #define presetleds 0
- #define blinking 1
- #define randommode 2
- #define blinkadjust 3
- #define whiteledstate 4
- #define redledstate 5
- #define greenledstate 6
- #define blueledstate 7
- #define purpleledstate 8
- #define yellowledstate 9
- #define coolblueledstate 10
- #define mintgreenledstate 11
- //
- // Preset kleuren
- //
- #define whitecolor 12
- #define purple1color 13
- #define purple2color 14
- #define purple3color 15
- #define blue1color 16
- #define blue2color 17
- #define blue3color 18
- #define yellow1color 19
- #define yellow2color 20
- #define orange1color 21
- #define orange2color 22
- #define green1color 23
- #define green2color 24
- #define green3color 25
- //
- // Encoder Variabelen
- //
- volatile unsigned int encoderPos = 30000; // zet de standaard posite op 30000, dit zal het midden zijn.
- unsigned int lastReportedPos = 1; // houdt de positie bij
- static boolean rotating=false; // debounce
- int reading; // leest de status van de knop
- int lastButtonState; // de laatste status van de knop
- long lastDebounceTime = 0; // houdt de tijd bij van de laatste keer dat de knop is ingedrukt geweest
- long debounceDelayButton = 50; // debounce tijd
- int buttonState; // de status van de knop
- #define holdTime 1000 // hoelang je de knop ingedrukt moet houden om te bevestigen
- int buttonVal = 0; // waarde van de knop
- int buttonLast = 0; // gebufferde waarde van de vorige status van de knop
- long btnDnTime; // hoelang de knop ingedrukt is
- long btnUpTime; // hoelang de knop al in losgelaten toestand verblijft
- boolean ignoreUp = false; // om te bepalen wat te doen als de knop niet langer ingedrukt is dan de holdTime
- // interrupt service routine variabelen
- boolean A_set = false;
- boolean B_set = false;
- //
- // Variabelen voor de FSM Staten
- //
- int moodmodes; // Switch variabele voor de Modi Preset Mode, Stroboscope Mode en Random Mode
- int ledstatecolors; // Switch variabele voor de Stroboscope kleuren
- int presetcolors; // Switch variabele voor de Preset kleuren
- //
- // Variabelen voor de Preset Modus en de Stroboscope modus
- //
- int ledState = LOW; // Zet de ledstatus voor de Stroboscope uit
- int x; // Variabele gebruikt in Randommode
- long on_time = 500; // De tijd in milliseconden die de led aanblijft tussen de flitstijden in
- long analog_value_multiplier = 1; // vermenigvuldigingsfactor variable, pas deze aan voor snellere flitstijden
- long minimum_delay = 5; // minimale pauze in milliseconden tussen flitsen
- long strobe_delay = 1000; // start variable die de snelheid voor het flikkeren in de stroboscope modus bepaalt.
- // Veranderd wanneer er een andere snelheid gekozen wordt.
- //
- // Strobescope & Random mode variabelen
- //
- float RGB[3]; // slaat de waarden die de pwm funktie geeft op
- float RGB1[3]; // slaat de waarden die de pwm funktie geeft op
- float RGB2[3]; // slaat de waarden die de pwm funktie geeft op
- float INC[3]; // slaat de waarde op de verhoogt of verlaagt wordt op
- int red, green, blue; // integers nodig voor de randommode
- int brightness = 0; // begin waarde voor de felheid van de LEDS
- int flashamount = 30; // begin waar voor de flikker snelheid van de stroboscope
- unsigned long delayCtr = 0L; // gebruikt om te bepalen wanneer een bepaalde actie uitgevoerd moet worden
- //
- //timers
- //
- unsigned long currentMillis = millis(); // gebruikt om te bepalen wanneer een bepaalde actie uitgevoerd moet worden
- long previousMillis = 0; // gebruikt om te bepalen wanneer een bepaalde actie uitgevoerd moet worden
- //
- // Menu setup
- //
- MenuBackend menu = MenuBackend(menuUsed,menuChanged); // menu backend
- // Onderstaande lijst bestaat uit de menuitems die nodig zijn om het menu op te bouwen
- MenuItem presetmode = MenuItem("Preset Mode ");
- MenuItem white = MenuItem("1. White ");
- MenuItem purple1 = MenuItem("2. Dark Purple ");
- MenuItem purple2 = MenuItem("3. Medium Purple");
- MenuItem purple3 = MenuItem("4. Light Purple ");
- MenuItem blue1 = MenuItem("5. Dark Blue ");
- MenuItem blue2 = MenuItem("6. Medium Blue ");
- MenuItem blue3 = MenuItem("7. Light Blue ");
- MenuItem yellow1 = MenuItem("8. Dark Yellow ");
- MenuItem yellow2 = MenuItem("9. Yellow ");
- MenuItem orange1 = MenuItem("10. Dark Orange ");
- MenuItem orange2 = MenuItem("11. Orange ");
- MenuItem green1 = MenuItem("12. Bright Green");
- MenuItem green2 = MenuItem("13. Medium Green");
- MenuItem green3 = MenuItem("14. Light Green ");
- MenuItem strobomode = MenuItem("Stroboscope Mode");
- MenuItem strobespeed = MenuItem("Adjust Speed? ");
- MenuItem flashadjust30 = MenuItem("Fastest Speed ");
- MenuItem flashadjust40 = MenuItem("S IF");
- MenuItem flashadjust50 = MenuItem("S I F");
- MenuItem flashadjust60 = MenuItem("S I F");
- MenuItem flashadjust70 = MenuItem("S I F");
- MenuItem flashadjust80 = MenuItem("S I F");
- MenuItem flashadjust90 = MenuItem("S I F");
- MenuItem flashadjust100 = MenuItem("S I F");
- MenuItem flashadjust120 = MenuItem("S I F");
- MenuItem flashadjust140 = MenuItem("S I F");
- MenuItem flashadjust160 = MenuItem("S I F");
- MenuItem flashadjust180 = MenuItem("S I F");
- MenuItem flashadjust200 = MenuItem("S I F");
- MenuItem flashadjust220 = MenuItem("S I F");
- MenuItem flashadjust240 = MenuItem("SI F");
- MenuItem flashadjust260 = MenuItem("Slowest Speed ");
- MenuItem strobowhite = MenuItem("White ");
- MenuItem strobored = MenuItem("Red ");
- MenuItem strobogreen = MenuItem("Green ");
- MenuItem stroboblue = MenuItem("Blue ");
- MenuItem strobopurple = MenuItem("Purple ");
- MenuItem stroboyellow = MenuItem("Yellow ");
- MenuItem strobocoolblue = MenuItem("Cool Blue ");
- MenuItem _randommode = MenuItem("Random Mode ");
- MenuItem randomspeed = MenuItem("Change Speed? ");
- MenuItem randomadjust30 = MenuItem("Fastest Speed ");
- MenuItem randomadjust40 = MenuItem("S IF");
- MenuItem randomadjust50 = MenuItem("S I F");
- MenuItem randomadjust60 = MenuItem("S I F");
- MenuItem randomadjust70 = MenuItem("S I F");
- MenuItem randomadjust80 = MenuItem("S I F");
- MenuItem randomadjust90 = MenuItem("S I F");
- MenuItem randomadjust100 = MenuItem("S I F");
- MenuItem randomadjust120 = MenuItem("S I F");
- MenuItem randomadjust140 = MenuItem("S I F");
- MenuItem randomadjust160 = MenuItem("S I F");
- MenuItem randomadjust180 = MenuItem("S I F");
- MenuItem randomadjust200 = MenuItem("S I F");
- MenuItem randomadjust220 = MenuItem("S I F");
- MenuItem randomadjust240 = MenuItem("SI F");
- MenuItem randomadjust260 = MenuItem("Slowest Speed ");
- void setup()
- {
- //
- // Encoder Setup
- //
- pinMode(encoderPinA, INPUT);
- pinMode(encoderPinB, INPUT);
- pinMode(encoderButton, INPUT);
- // zet de pullup weerstanden aan
- digitalWrite(encoderPinA, HIGH);
- digitalWrite(encoderPinB, HIGH);
- digitalWrite(encoderButton, HIGH);
- // encoder pin op interrupt 0 (pin 2)
- attachInterrupt(0, doEncoderA, CHANGE);
- // encoder pin op interrupt 1 (pin 3)
- attachInterrupt(1, doEncoderB, CHANGE);
- //
- // LED Setup
- //
- pinMode(REDLEDPIN, OUTPUT);
- pinMode(GREENLEDPIN, OUTPUT);
- pinMode(BLUELEDPIN, OUTPUT);
- //
- // LEDS uit bij het opstarten
- //
- analogWrite(REDLEDPIN, 0);
- analogWrite(GREENLEDPIN, 0);
- analogWrite(BLUELEDPIN, 0);
- //
- // LCD Menu Setup
- //
- lcd.begin(16, 2); // start de lcd display functies op. 16 karakters per regel, 2 regels in totaal
- lcd.setCursor(0,0); // zet de cursor in het lcd display op regel 0 en de eerste karakter positie (0)
- lcd.print("Mood Light"); // zet Mood Light neer op de eerste regel, helemaal links
- delay(2000); // wacht 2 seconden
- lcd.setCursor(0,1); // zet de cursor in het lcd display op regel 1 en de eerste karakter positie (0)
- lcd.print("Turn Encoder "); // zet Mood Light neer op de tweede regel, helemaal links
- }
- void loop()
- {
- moodlightModes(); // Finite State Machine moodlight Modes loop
- menuSetup(); // menu loop
- readButtons(); // lees de knop af en houdt de encoder in de gaten voor het geval eraan gedraaid wordt
- //
- // Encoder
- //
- rotating = true; // reset de debouncer
- if (lastReportedPos != encoderPos) {
- lastReportedPos = encoderPos;
- }
- if (digitalRead(encoderButton) == LOW ) {
- encoderPos = 30000;
- }
- }
- // Interrupt A 's veranderende status
- void doEncoderA(){
- // debounce
- if ( rotating ) delay (1); // wacht heel 1 milliseconde totdat het bouncen gedaan is
- // test of de verandering echt heeft plaatsgevonden
- if( digitalRead(encoderPinA) != A_set ) { // debounce nogmaals
- A_set = !A_set;
- // pas de teller omhoog aan + als A naar B leid
- if ( A_set && !B_set )
- encoderPos += 5; // verhoogd met een waarde van 5 vanaf 30000, het menu reageert door een menu optie naar boven te gaan
- rotating = false; // niet meer debouncen totdat de loop() opnieuw afgedraaid wordt
- }
- }
- // Interrupt op B's veranderde status, net zoals A hierboven deed
- void doEncoderB(){
- if ( rotating ) delay (1);
- if( digitalRead(encoderPinB) != B_set ) {
- B_set = !B_set;
- // pas de teller met - 1 aan as B naar A leid
- if( B_set && !A_set )
- encoderPos -= 5; // verlaagd met een waarde van 5 vanaf 30000, het menu reageert door een menu optie naar beneden te gaan
- rotating = false;
- }
- }
- void menuSetup()
- {
- // voeg het menu bestand toe aan de menu root
- menu.getRoot().add(presetmode); // de eerste menu optie is presetmode (Preset Mode)
- // Hoofd Menu setup
- presetmode.addAfter(strobomode);
- strobomode.addAfter(_randommode); // het was noodzakelijk om een underscore _ voor randommode neer te zetten, anders kreeg ik steeds een Error melding
- _randommode.addAfter(presetmode);
- // Mode menu setup
- presetmode.addRight(white);
- green3.addAfter(white);
- green2.addAfter(green3);
- green1.addAfter(green2);
- orange2.addAfter(green1);
- orange1.addAfter(orange2);
- yellow2.addAfter(orange1);
- yellow1.addAfter(yellow2);
- blue3.addAfter(yellow1);
- blue2.addAfter(blue3);
- blue1.addAfter(blue2);
- purple3.addAfter(blue1);
- purple2.addAfter(purple3);
- purple1.addAfter(purple2);
- white.addAfter(purple1);
- // vanuit iedere kleur optie in Preset mode willen we terug kunnen naar menuoptie Preset mode
- green3.addLeft(presetmode);
- green2.addLeft(presetmode);
- green1.addLeft(presetmode);
- orange2.addLeft(presetmode);
- orange1.addLeft(presetmode);
- yellow2.addLeft(presetmode);
- yellow1.addLeft(presetmode);
- blue3.addLeft(presetmode);
- blue2.addLeft(presetmode);
- blue1.addLeft(presetmode);
- purple3.addLeft(presetmode);
- purple2.addLeft(presetmode);
- purple1.addLeft(presetmode);
- white.addLeft(presetmode);
- strobomode.addRight(strobespeed);
- strobespeed.addRight(flashadjust30);
- flashadjust40.addAfter(flashadjust30);
- flashadjust50.addAfter(flashadjust40);
- flashadjust60.addAfter(flashadjust50);
- flashadjust70.addAfter(flashadjust60);
- flashadjust80.addAfter(flashadjust70);
- flashadjust90.addAfter(flashadjust80);
- flashadjust100.addAfter(flashadjust90);
- flashadjust120.addAfter(flashadjust100);
- flashadjust140.addAfter(flashadjust120);
- flashadjust160.addAfter(flashadjust140);
- flashadjust180.addAfter(flashadjust160);
- flashadjust200.addAfter(flashadjust180);
- flashadjust220.addAfter(flashadjust200);
- flashadjust240.addAfter(flashadjust220);
- flashadjust260.addAfter(flashadjust240);
- strobespeed.addAfter(strobowhite);
- strobowhite.addAfter(strobored);
- strobored.addAfter(strobogreen);
- strobogreen.addAfter(stroboblue);
- stroboblue.addAfter(strobopurple);
- strobopurple.addAfter(stroboyellow);
- stroboyellow.addAfter(strobocoolblue);
- strobocoolblue.addAfter(strobespeed);
- // vanuit iedere optie in het aanpassen van de snelheid in Stroboscope mode en het kiezen van een kleur willen we terug kunnen naar menuoptie stroboscope mode
- strobocoolblue.addLeft(strobomode);
- stroboyellow.addLeft(strobomode);
- strobopurple.addLeft(strobomode);
- stroboblue.addLeft(strobomode);
- strobogreen.addLeft(strobomode);
- strobored.addLeft(strobomode);
- strobowhite.addLeft(strobomode);
- flashadjust260.addLeft(strobespeed);
- flashadjust240.addLeft(strobespeed);
- flashadjust220.addLeft(strobespeed);
- flashadjust200.addLeft(strobespeed);
- flashadjust180.addLeft(strobespeed);
- flashadjust160.addLeft(strobespeed);
- flashadjust140.addLeft(strobespeed);
- flashadjust120.addLeft(strobespeed);
- flashadjust100.addLeft(strobespeed);
- flashadjust90.addLeft(strobespeed);
- flashadjust80.addLeft(strobespeed);
- flashadjust70.addLeft(strobespeed);
- flashadjust60.addLeft(strobespeed);
- flashadjust50.addLeft(strobespeed);
- flashadjust40.addLeft(strobespeed);
- flashadjust30.addLeft(strobespeed);
- strobespeed.addLeft(strobomode);
- _randommode.addRight(randomspeed);
- randomspeed.addRight(randomadjust30);
- randomadjust260.addAfter(randomadjust240);
- randomadjust240.addAfter(randomadjust220);
- randomadjust220.addAfter(randomadjust200);
- randomadjust200.addAfter(randomadjust180);
- randomadjust180.addAfter(randomadjust160);
- randomadjust160.addAfter(randomadjust140);
- randomadjust140.addAfter(randomadjust120);
- randomadjust120.addAfter(randomadjust100);
- randomadjust100.addAfter(randomadjust90);
- randomadjust90.addAfter(randomadjust80);
- randomadjust80.addAfter(randomadjust70);
- randomadjust70.addAfter(randomadjust60);
- randomadjust60.addAfter(randomadjust50);
- randomadjust50.addAfter(randomadjust40);
- randomadjust40.addAfter(randomadjust30);
- // vanuit iedere optie in het aanpassen van de snelheid in random mode willen we terug kunnen naar menuoptie Random mode
- randomadjust260.addLeft(_randommode);
- randomadjust240.addLeft(_randommode);
- randomadjust220.addLeft(_randommode);
- randomadjust200.addLeft(_randommode);
- randomadjust180.addLeft(_randommode);
- randomadjust160.addLeft(_randommode);
- randomadjust140.addLeft(_randommode);
- randomadjust120.addLeft(_randommode);
- randomadjust100.addLeft(_randommode);
- randomadjust90.addLeft(_randommode);
- randomadjust80.addLeft(_randommode);
- randomadjust70.addLeft(_randommode);
- randomadjust60.addLeft(_randommode);
- randomadjust50.addLeft(_randommode);
- randomadjust40.addLeft(_randommode);
- randomadjust30.addLeft(_randommode);
- }
- void menuChanged(MenuChangeEvent changed)
- {
- lcd.setCursor(0,0); // zet de cursor in het lcd display op regel 0 en de eerste karakter positie (0)
- printLine(0, "Menu change "); // wis de eerste regel en zet Menu Change neer
- lcd.setCursor(0,1); // zet de cursor in het lcd display op regel 1 en de eerste karakter positie (0)
- lcd.print(changed.from.getName()); // zet de naam neer van een vorige menukeuze optie waar je voor kunt kiezen
- lcd.print(" "); // sla 1 karakter positie over
- lcd.setCursor(0,1); // zet de cursor in het lcd display op regel 1 en de eerste karakter positie (0)
- lcd.print(changed.to.getName()); // zet de naam neer van de huidige menukeuze optie waar je voor kunt kiezen
- //
- // menukeuze opties en de opdracht die uitgevoerd moet worden (deze reageren al als er naartoe genavigeert wordt.
- // In het Use gedeelte reageren ze pas wanneer de knop langer ingedrukt is geweest dan opgegeven bij holdTime)
- //
- MenuItem newMenuItem=changed.to;
- if(newMenuItem.getName()==menu.getRoot()){
- }else if(newMenuItem.getName()=="Preset Mode "){
- }else if(newMenuItem.getName()=="Stroboscope Mode"){
- }else if(newMenuItem.getName()=="Random Mode "){
- }else if(newMenuItem.getName()=="Fastest Speed "){
- flashamount = 30;
- }else if(newMenuItem.getName()=="S IF"){
- flashamount = 40;
- }else if(newMenuItem.getName()=="S I F"){
- flashamount = 50;
- }else if(newMenuItem.getName()=="S I F"){
- flashamount = 60;
- }else if(newMenuItem.getName()=="S I F"){
- flashamount = 70;
- }else if(newMenuItem.getName()=="S I F"){
- flashamount = 80;
- }else if(newMenuItem.getName()=="S I F"){
- flashamount = 100;
- }else if(newMenuItem.getName()=="S I F"){
- flashamount = 120;
- }else if(newMenuItem.getName()=="S I F"){
- flashamount = 130;
- }else if(newMenuItem.getName()=="S I F"){
- flashamount = 140;
- }else if(newMenuItem.getName()=="S I F"){
- flashamount = 160;
- }else if(newMenuItem.getName()=="S I F"){
- flashamount = 180;
- }else if(newMenuItem.getName()=="S I F"){
- flashamount = 200;
- }else if(newMenuItem.getName()=="S I F"){
- flashamount = 220;
- }else if(newMenuItem.getName()=="SI F"){
- flashamount = 240;
- }else if(newMenuItem.getName()=="Slowest Speed "){
- flashamount = 260;
- }else if(newMenuItem.getName()=="White "){
- ledstatecolors = whiteledstate;
- }else if(newMenuItem.getName()=="Red "){
- ledstatecolors = redledstate;
- }else if(newMenuItem.getName()=="Green "){
- ledstatecolors = greenledstate;
- }else if(newMenuItem.getName()=="Blue "){
- ledstatecolors = blueledstate;
- }else if(newMenuItem.getName()=="Purple "){
- ledstatecolors = purpleledstate;
- }else if(newMenuItem.getName()=="Yellow "){
- ledstatecolors = yellowledstate;
- }else if(newMenuItem.getName()=="Cool Blue "){
- ledstatecolors = coolblueledstate;
- }else if(newMenuItem.getName()=="1. White "){
- presetcolors = whitecolor;
- }else if(newMenuItem.getName()=="2. Dark Purple "){
- presetcolors = purple1color;
- }else if(newMenuItem.getName()=="3. Medium Purple"){
- presetcolors = purple2color;
- }else if(newMenuItem.getName()=="4. Light Purple "){
- presetcolors = purple3color;
- }else if(newMenuItem.getName()=="5. Dark Blue "){
- presetcolors = blue1color;
- }else if(newMenuItem.getName()=="6. Medium Blue "){
- presetcolors = blue2color;
- }else if(newMenuItem.getName()=="7. Light Blue "){
- presetcolors = blue3color;
- }else if(newMenuItem.getName()=="8. Dark Yellow "){
- presetcolors = yellow1color;
- }else if(newMenuItem.getName()=="9. Yellow "){
- presetcolors = yellow2color;
- }else if(newMenuItem.getName()=="10. Dark Orange "){
- presetcolors = orange1color;
- }else if(newMenuItem.getName()=="11. Orange "){
- presetcolors = orange2color;
- }else if(newMenuItem.getName()=="12. Bright Green"){
- presetcolors = green1color;
- }else if(newMenuItem.getName()=="13. Medium Green"){
- presetcolors = green2color;
- }else if(newMenuItem.getName()=="14. Light Green "){
- presetcolors = green3color;
- }
- }
- void menuUsed(MenuUseEvent used)
- {
- lcd.setCursor(0,0); // zet de cursor in het lcd display op regel 0 en de eerste karakter positie (0)
- lcd.print("Menu use "); // zet Menu use neer op de eerste regel en begin helemaal links
- lcd.setCursor(0,1); // zet de cursor in het lcd display op regel 1 en de eerste karakter positie (0)
- lcd.print(used.item.getName()); // zet de naam neer die je gekozen hebt door de knop langer ingedrukt te houden dan opgegeven bij holdTime
- //
- // als de knop langer dan opgegeven bij holdTime ingedrukt wordt bevestig je 1 van de volgende menuopties
- //
- MenuItem choosenMenuItem=used.item;
- if(choosenMenuItem.getName()==menu.getRoot()){
- }else if(choosenMenuItem.getName()=="Preset Mode "){ // als je kiest voor Preset Mode dan
- moodmodes = presetleds; // wordt de case presetleds van de Finite State Machine geactiveerd
- }else if(choosenMenuItem.getName()=="Stroboscope Mode"){ // als je kiest voor Stroboscope Mode dan
- moodmodes = blinking; // wordt de case blinking van de Finite State Machine geactiveerd
- }else if(choosenMenuItem.getName()=="Random Mode "){ // als je kiest voor Random Mode dan
- moodmodes = randommode; // wordt de case randommode van de Finite State Machine geactiveerd
- }
- }
- void readButtons(){ // lees de knop af en of de encoder naar links of naar rechts wordt gedraaid. Voeg acties toe aan de encoder waarde.
- if (encoderPos <= 29995 ) { // als de encoder naar links gedraaid is en de waarde dus 29995 wordt
- menu.moveDown(); // navigeer dan naar beneden in het menu
- encoderPos=30000; // en zet daarna de waarde weer in het midden; 30000
- } else if (encoderPos >= 30005 ) { // als de encoder naar rechts gedraaid is en de waarde dus 30005 wordt
- menu.moveUp(); // navigeer dan naar boven in het menu
- encoderPos=30000; // en zet daarna de waarde weer in het midden; 30000
- } else {
- encoderPos=30000; // wordt er niets gedaan met de encoder dan blijft de waarde in het midden; 30000
- }
- // lees de status van de knop
- buttonVal = digitalRead(encoderButton);
- // test of de knop wordt ingedrukt en sla op hoelang de knop ingedrukt wordt
- if (buttonVal == LOW && buttonLast == HIGH && (millis() - btnUpTime) > long(debounceDelayButton))
- {
- btnDnTime = millis();
- }
- // testen of de knop ingedrukt is geweest en sla de tijd op hoelang dat heeft geduurd
- if (buttonVal == HIGH && buttonLast == LOW && (millis() - btnDnTime) > long(debounceDelayButton))
- {
- if (ignoreUp == false) {
- menu.moveLeft(); // naar links in het menu
- }else { ignoreUp = false;
- btnUpTime = millis();
- }
- }
- // Testen of de knop langer ingedrukt is dan opgegeven bij holdTime
- if (buttonVal == LOW && (millis() - btnDnTime) > long(holdTime))
- {
- menu.use(); // bevestigen
- menu.moveRight(); // naar rechts in het menu
- ignoreUp = true;
- btnDnTime = millis();
- }
- buttonLast = buttonVal;
- }
- // Dit stukje code zorgt ervoor dat wanneer je printLine gebruikt in plaats van lcd.print, de regel eerst volledig gewist wordt en er geen karakters van een vorig
- // lcd.print commando blijven staan. Voorbeeld: printLine(0, "Menu change "); 0 is de eerste regel op de display, 1 zou de tweede regel zijn.
- void printLine(uint8_t regel, char * text) {
- lcd.setCursor(0, regel);
- lcd.print(" ");
- lcd.setCursor(0, regel);
- lcd.print(text);
- }
- //
- // Finite State Machine MoodlightModi
- //
- void moodlightModes() {
- switch(moodmodes) {
- case presetleds:
- analogWrite(REDLEDPIN, 0);
- analogWrite(GREENLEDPIN, 0);
- analogWrite(BLUELEDPIN, 0);
- switch(presetcolors) {
- case whitecolor:
- analogWrite(REDLEDPIN, 255);
- analogWrite(GREENLEDPIN, 255);
- analogWrite(BLUELEDPIN, 255);
- break;
- case purple1color:
- analogWrite(REDLEDPIN, 255);
- analogWrite(GREENLEDPIN, 0);
- analogWrite(BLUELEDPIN, 255);
- break;
- case purple2color:
- analogWrite(REDLEDPIN, 255);
- analogWrite(GREENLEDPIN, 25);
- analogWrite(BLUELEDPIN, 255);
- case purple3color:
- analogWrite(REDLEDPIN, 255);
- analogWrite(GREENLEDPIN, 100);
- analogWrite(BLUELEDPIN, 255);
- case blue1color:
- analogWrite(REDLEDPIN, 0);
- analogWrite(GREENLEDPIN, 0);
- analogWrite(BLUELEDPIN, 255);
- break;
- case blue2color:
- analogWrite(REDLEDPIN, 0);
- analogWrite(GREENLEDPIN, 50);
- analogWrite(BLUELEDPIN, 255);
- case blue3color:
- analogWrite(REDLEDPIN, 255);
- analogWrite(GREENLEDPIN, 100);
- analogWrite(BLUELEDPIN, 255);
- case yellow1color:
- analogWrite(REDLEDPIN, 255);
- analogWrite(GREENLEDPIN, 255);
- analogWrite(BLUELEDPIN, 0);
- break;
- case yellow2color:
- analogWrite(REDLEDPIN, 255);
- analogWrite(GREENLEDPIN, 100);
- analogWrite(BLUELEDPIN, 0);
- break;
- case orange1color:
- analogWrite(REDLEDPIN, 255);
- analogWrite(GREENLEDPIN, 50);
- analogWrite(BLUELEDPIN, 0);
- break;
- case orange2color:
- analogWrite(REDLEDPIN, 255);
- analogWrite(GREENLEDPIN, 25);
- analogWrite(BLUELEDPIN, 0);
- break;
- case green1color:
- analogWrite(REDLEDPIN, 150);
- analogWrite(GREENLEDPIN, 255);
- analogWrite(BLUELEDPIN, 10);
- break;
- case green2color:
- analogWrite(REDLEDPIN, 100);
- analogWrite(GREENLEDPIN, 255);
- analogWrite(BLUELEDPIN, 10);
- break;
- case green3color:
- analogWrite(REDLEDPIN, 25);
- analogWrite(GREENLEDPIN, 255);
- analogWrite(BLUELEDPIN, 0);
- break;
- }
- break;
- case blinking:
- switch(ledstatecolors) {
- case whiteledstate:
- if (millis() > delayCtr) {
- analogWrite(REDLEDPIN, ledState);
- analogWrite(GREENLEDPIN, ledState);
- analogWrite(BLUELEDPIN, ledState);
- }
- break;
- case redledstate:
- if (millis() > delayCtr) {
- analogWrite(REDLEDPIN, ledState);
- analogWrite(GREENLEDPIN, LOW);
- analogWrite(BLUELEDPIN, LOW);
- }
- break;
- case greenledstate:
- if (millis() > delayCtr) {
- analogWrite(REDLEDPIN, LOW);
- analogWrite(GREENLEDPIN, ledState);
- analogWrite(BLUELEDPIN, LOW);
- }
- break;
- case blueledstate:
- if (millis() > delayCtr) {
- analogWrite(REDLEDPIN, LOW);
- analogWrite(GREENLEDPIN, LOW);
- analogWrite(BLUELEDPIN, ledState);
- }
- break;
- case purpleledstate:
- if (millis() > delayCtr) {
- analogWrite(REDLEDPIN, ledState);
- analogWrite(GREENLEDPIN, LOW);
- analogWrite(BLUELEDPIN, ledState);
- }
- break;
- case yellowledstate:
- if (millis() > delayCtr) {
- analogWrite(REDLEDPIN, ledState);
- analogWrite(GREENLEDPIN, ledState);
- analogWrite(BLUELEDPIN, LOW);
- }
- break;
- case coolblueledstate:
- if (millis() > delayCtr) {
- analogWrite(REDLEDPIN, LOW);
- analogWrite(GREENLEDPIN, ledState);
- analogWrite(BLUELEDPIN, ledState);
- }
- break;
- }
- flashamount = constrain(flashamount, 30, 260); // beperkt de waarde van flashamount tot een min. van 30 en een max. van 260
- strobe_delay = minimum_delay + flashamount * analog_value_multiplier; // deze waarden zijn aan te passen in de code boven void setup()
- currentMillis = millis(); // millis() is een telsysteem van de Arduino. Hij telt het aantal milliseconden vanaf dat de arduino aan gaat
- if(currentMillis - previousMillis > strobe_delay) {
- // sla de laatste keer dat de leds aan geweest zijn op
- previousMillis = currentMillis;
- // als de led aan is, zet hem uit en andersom
- if (ledState == LOW)
- brightness = 255;
- ledState = brightness;
- delayMicroseconds(on_time);
- }
- else
- {
- ledState = LOW; // anders, laat de led uit
- }
- if (strobe_delay > 10000){
- delay((strobe_delay - on_time) / 1000);
- }else{
- delayMicroseconds(strobe_delay - on_time);
- }
- break;
- case randommode:
- randomSeed(analogRead(6)); // neem de waarde van analoge ingang 5 als startpunt en genereer vanaf daar pseudo willekeurige getallen als basis voor de kleur
- if (millis() > flashamount) { // dit is een manier om millis te gebruiken in plaats van delay, zodat het menu goed blijft werken
- currentMillis = millis(); // en niet vertraagt. Anders moet je lang wachten voordat draaien aan de encoder effect heeft.
- if(currentMillis - previousMillis > (flashamount/3)) { // dit bepaalt de snelheid waarmee de leds van felheid en dus van kleur veranderen
- for (int x=0; x<3; x++) { // for loop, doe drie keer dit....
- INC[x] = (RGB1[x] - RGB2[x]) / 256; } // De verhogings, verlagingswaarde is afhankelijk van RGB1 - RGB2 gedeeld door 256, RGB2
- for (int x=0; x<256; x++) { // for loop, doe 256 keer dit.....
- red = int(RGB1[0]); // red = de waarde van RGB1[0]
- green = int(RGB1[1]); // green = de waarde van RGB1[1]
- blue = int(RGB1[2]); // blue = de waarde van RGB[2]
- analogWrite (REDLEDPIN, red); // laad de rode led branden afhankelijk van de waarde opgeslagen in red
- analogWrite (GREENLEDPIN, green); // laad de groene led branden afhankelijk van de waarde opgeslagen in green
- analogWrite (BLUELEDPIN, blue); // laad de blauwe led branden afhankelijk van de waarde opgeslagen in blue
- if (millis() > (flashamount)){ // dit bepaalt de snelheid van het overvloeien naar een andere kleur
- if(currentMillis - previousMillis > (flashamount/6)) {
- RGB1[0] -= INC[0]; // zorgt ervoor dat de leds overvloeien naar een andere kleur -= zorgt voor het verminderen van de waarde
- RGB1[1] -= INC[1];
- RGB1[2] -= INC[2];
- previousMillis = currentMillis;
- }
- }
- }
- for (int x=0; x<3; x++) { // dit gedeelte zorgt ervoor dat de kans groter wordt dat er ook af en toe primary kleur voorkomen
- RGB2[x] = random(556)-300; // en niet alleen pastel kleuren
- RGB2[x] = constrain(RGB2[x], 0, 255);
- }
- }
- }
- break;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement