diff --git a/Sketches/sketch_oct25a-LEDDimming/.vscode/arduino.json b/Sketches/sketch_oct25a-LEDDimming/.vscode/arduino.json new file mode 100644 index 0000000..e9df830 --- /dev/null +++ b/Sketches/sketch_oct25a-LEDDimming/.vscode/arduino.json @@ -0,0 +1,6 @@ +{ + "board": "arduino:avr:uno", + "port": "COM7", + "output": "C:\\Temp", + "sketch": "sketch_oct25a-LEDDimming.ino" +} \ No newline at end of file diff --git a/Sketches/sketch_oct25a-LEDDimming/.vscode/c_cpp_properties.json b/Sketches/sketch_oct25a-LEDDimming/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..fd99c76 --- /dev/null +++ b/Sketches/sketch_oct25a-LEDDimming/.vscode/c_cpp_properties.json @@ -0,0 +1,16 @@ +{ + "configurations": [ + { + "name": "Win32", + "includePath": [ + "C:\\Users\\Alex\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\**", + "C:\\Users\\Alex\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.6.21\\**" + ], + "forcedInclude": [ + "C:\\Users\\Alex\\AppData\\Local\\Arduino15\\packages\\arduino\\hardware\\avr\\1.6.21\\cores\\arduino\\Arduino.h" + ], + "intelliSenseMode": "msvc-x64" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/Sketches/sketch_oct25a-LEDDimming/sketch_oct25a-LEDDimming.ino b/Sketches/sketch_oct25a-LEDDimming/sketch_oct25a-LEDDimming.ino new file mode 100644 index 0000000..51d024b --- /dev/null +++ b/Sketches/sketch_oct25a-LEDDimming/sketch_oct25a-LEDDimming.ino @@ -0,0 +1,151 @@ +// Pin som LED er koblet til. +int LED_PIN = 10; +// "Increment" pin - altså pin'en som "increment" (pluss) knapp er koblet til. +int INC_PIN = 3; +// "Decrement" pin - altså pin som "decrement" (minus) knapp er koblet til. +int DEC_PIN = 2; + +void setup() +{ + // Sett LED som output og knapper som input med "pullup flagg" + pinMode(LED_PIN, OUTPUT); + pinMode(INC_PIN, INPUT_PULLUP); + pinMode(DEC_PIN, INPUT_PULLUP); +} + +/** + * Sett LED lysverdi til å være laveste gyldige verdi: 0. + */ +int LIGHT_LEVEL = 0; + +/** + * Sett en standard verdi for "increment/decrement" av LED. + * Dette er "dimmeverdien". + */ +int INCDEC_VALUE = 1; + +/** + * Lagre sist gang knappene ble trykket (ved hjelp av millis()). + */ +unsigned long INC_LASTPRESS = millis(); +unsigned long DEC_LASTPRESS = millis(); + +/** + * Lagre sist sjekka verdi om knappen allerede var trykt ned eller ikke. + * true = knapp er trykt ned. + * false = knapp er sluppet opp. + */ +bool INC_LASTSTATE = false; +bool DEC_LASTSTATE = false; + +/** + * Antall millisekunder som er max "differanse", slik at hvis knappen blir holdt ned i lenger enn LASTPRESS_DIFF (default er 500) ms, + * skal den dimme opp/ned lyset. + */ +int LASTPRESS_DIFF = 500; +void loop() +{ + // Definer et midlertidig variabel for å holde ny LED verdi. + int NEW_LIGHT_LEVEL = 0; + + /** + * shouldInc/Dec sjekker om den relaterte knappen er trykt ned. + * Verdiene på disse knappene, hvis de er trykket ned, vil være "LOW". + * + * Jeg har gjort et bevisst valg om å ikke bruke elseif/else. + * Dette vil resultere i at hvis begge knappene er trykt ned, vil den siste "if" overstyre den første. + */ + int shouldInc = digitalRead(INC_PIN); + int shouldDec = digitalRead(DEC_PIN); + + // Lagre millis() som et delt "currentTime". + unsigned long currentTime = millis(); + + // Sjekk om increment-knappen er trykket + if (shouldInc == LOW) + { + /** + * Sjekk LASTSTATE om at knappen allerede har blitt trykt ned. + * Hvis den IKKE var trykt ned, sett LASTPRESS til currentTime for å tracke + * millisekunder. + */ + if (!INC_LASTSTATE) { + INC_LASTPRESS = currentTime; + INC_LASTSTATE = true; + } + + // Ta gamle LIGHT_LEVEL verdi og legg til INCDEC_VALUE for å få LED til å lyse sterkere. + NEW_LIGHT_LEVEL = LIGHT_LEVEL + INCDEC_VALUE; + + /** + * Metoden min() setter variabelet til den laveste av de spesifiserte verdiene. + * Det vil si at hvis NEW_LIGHT_LEVEL er over 255, vil min() passe på at LIGHT_LEVEL + * bare blir satt til 255 og ikke noe høyere enn det. + * + * Noe lignende blir brukt med funksjonen max() lenger ned når lysverdien + * skal senkes med den andre knappen. + */ + LIGHT_LEVEL = min(NEW_LIGHT_LEVEL, 255); + } + else { + /** + * Sjekker om knappen ble sluppet mindre enn LASTPRESS_DIFF (500) millisekunder + * Hvis den ble det, sett lyset til max lysnivå (255). + */ + if ((currentTime - INC_LASTPRESS) < LASTPRESS_DIFF) { + LIGHT_LEVEL = 255; + } + + /** + * Knappen er ikke trykt lenger. + */ + INC_LASTSTATE = false; + } + + /** + * Dette sjekker om knappen for decrement er trykket. + * + * Dette vil også overstyre hvis både increment og decrement knappene er trykket. + * Som vil si at det blir ingen endring i lysstyrke. + */ + if (shouldDec == LOW) { + /** + * Sjekk LASTSTATE om at knappen allerede har blitt trykt ned. + * Hvis den IKKE var trykt ned, sett LASTPRESS til currentTime for å tracke + * millisekunder. + */ + if (DEC_LASTSTATE == LOW) { + DEC_LASTPRESS = currentTime; + DEC_LASTSTATE = true; + } + + // Ta gamle LIGHT_LEVEL verdi og trekk fra INCDEC_VALUE for å få LED til å lyse svakere. + NEW_LIGHT_LEVEL = LIGHT_LEVEL - INCDEC_VALUE; + + /** + * Lignende med metoden min() vil dette sette LIGHT_LEVEL til det høyeste av de spesifiserte verdiene. + * Om NEW_LIGHT_LEVEL er mindre enn 0 (altså negativt tall), vil det settes til 0 (av). + */ + LIGHT_LEVEL = max(NEW_LIGHT_LEVEL, 0); + } + else { + /** + * Sjekker om knappen ble sluppet mindre enn LASTPRESS_DIFF (500) millisekunder + * Hvis den ble det, sett lyset til minst lysnivå (0). + */ + if ((currentTime - DEC_LASTPRESS) < LASTPRESS_DIFF) + { + LIGHT_LEVEL = 0; + } + + /** + * Knappen er ikke trykt lenger. + */ + DEC_LASTSTATE = false; + } + + // Sett LED til ny lysverdi (0-255). + analogWrite(LED_PIN, LIGHT_LEVEL); + // Legg inn delay for at verdien ikke skal endres for fort. + delay(100); +}