/************************************* * Kerstboomshield voor Arduino * Author: Michel Bats * Website: www.batssoft.nl * Version: 1.0.0 * Revision: 20141216 *************************************/ // Bibliotheken #include #include #include #include // Bepalingen int ledPin[] = { 6 ,9 ,10,11}; // Uitgangen met PWM-mogelijkheden int randomLed[] = { 0 ,0 ,0 ,0 }; // Variabele om te gebruiken bij het aftellen tot het moment van omschakelen int countLedUp[] = { 0 ,0 ,0 ,0 }; // Variabele waarbij bij 1 de LED feller moet gaan branden en bij 0 zwakker int currentLedPwm[] = { 0 ,0 ,0 ,0 }; // Variabele waarin de huidige PWM-waarde is opgeslagen (0-255) int ledCount = 4; // Aantal aangesloten LED's (of LED-arrays) int delayPot = A5; // Ingang potmeter // Bepalingen Display #define OLED_ADDR 60 // 60 = 0x3C / 61 = 0x3D #define SCREEN_WIDTH 128 // OLED-scherm breedte, in pixels #define SCREEN_HEIGHT 64 // OLED-scherm hoogte, in pixels #define OLED_RESET 4 // Aanmaken benodigde variabelen int temp0; int currentLedPwmDisp; // Initialisatie Adafruit_SSD1306 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); void setup() { // Start Display display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR,HEX); display.clearDisplay(); // Loop om door het aantal volgens ledCount te gaan for (int i=0; i <= (ledCount-1); i++){ // eerst initialisatie van de PWM-puls op de uitgangen analogWrite(ledPin[i], currentLedPwm[i]); } } void loop() { // Uitlezen potmeter voor instelling vertraging (delay()) int delayPotValue = analogRead(delayPot); // Gegevens potmeter omzetten naar 1 t/m 25ms voor de delay() int delayPotValueMap = map(delayPotValue, 0, 1023, 1, 25); // Loop om door het aantal volgens ledCount te gaan for (int i=0; i <= (ledCount-1); i++){ // Controleren of randomLed 0 of kleiner is zodat deze een nieuwe waarde kan krijgen (random() tussen max in de nieuwe richting en de helft van max en huidige waarde) if (randomLed[i] <= 0){ // Waarde countLedUp omdraaien countLedUp[i] = map (countLedUp[i], 1, 0, 0, 1); // Controleren of countLedUp nu 1 of 0 is. if (countLedUp[i] == 1) { // In geval van een 1: temp0 vullen met de maximaal aantal stappen tussen currentLedPwm en de maximale PWM-puls-waarde (255). temp0 = 255 - currentLedPwm[i]; } else { // In geval van een 0: temp0 vullen met currentLedPwm aangezien dat de stappen zijn tot de minimale waarde voor een PWM-puls (0). temp0 = currentLedPwm[i]; } // radom() waarde aanmaken tussen het maximale verschil en de helft daarvan. randomLed[i] = random(temp0/2, temp0); } // Controleren of de LED(-array) feller of zwakker moet gaan branden op basis van countLedUp if (countLedUp[i] == 1) { // currentLedPwm met 1 ophogen. currentLedPwm[i]++; } else { // currentLedPwm met 1 verlagen. currentLedPwm[i]--; } // randomLed met 1 verlagen. randomLed[i]--; // De waarde van currentLedPwm wegschrijven naar de uitgang van de LED(-array) analogWrite(ledPin[i], currentLedPwm[i]); currentLedPwmDisp = map(currentLedPwm[i], 0, 255, 0, 127); // Lijnen tekenen voor visuele weergave (op het scherm) van de gegevens display.drawLine(0, (16*(i))+7, 127, (16*(i))+7, WHITE); display.drawLine(0, (16*(i)), 0, (16*(i))+14, WHITE); display.drawLine(127, (16*(i)), 127, (16*(i))+14, WHITE); display.drawLine(currentLedPwmDisp, (16*(i))+4, currentLedPwmDisp, (16*(i))+10, WHITE); //display.fillRect(currentLedPwmDisp, (16*(i)), currentLedPwmDisp, (16*(i))+14, WHITE); } // Uitvoer display display.display(); display.clearDisplay(); // Pauze inlassen met het aantal ms volgens delayPotValueMap delay(1); }