Add LED dim code

This commit is contained in:
Alex Thomassen 2018-10-25 10:56:20 +02:00
parent 0137b4e009
commit 8de71e7b08
3 changed files with 173 additions and 0 deletions

View File

@ -0,0 +1,6 @@
{
"board": "arduino:avr:uno",
"port": "COM7",
"output": "C:\\Temp",
"sketch": "sketch_oct25a-LEDDimming.ino"
}

View File

@ -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
}

View File

@ -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 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 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);
}