Dag/Nacht simulatie

Arduino specifieke Software
Berichten: 10
Geregistreerd: 11 Feb 2014, 10:40

Dag/Nacht simulatie

Berichtdoor viaferrum » 20 Nov 2014, 13:15

Hallo,

Voor mijn modelspoordiorama wil ik met behulp van leds tot een dag/nacht simulatie komen. Omdat ik met verschillende kleuren per led wil werken heb ik gekozen voor Neopixel leds.
De bedoeling is dat bij het indrukken van knop 1 de dagverlichting wordt opgestart en bij het indrukken van knop 2 de nachtverlichting.
Om het een en ander te testen heb ik een proefopstelling gemaakt van 8 Neopixel leds en de onderstaande sketch geschreven, die zeker fraaier en sneller zal kunnen. Zeker als je uitgaat van 60 leds die aangestuurd moeten worden.
Nu doet zich echter het probleem voor dat de proefopstelling niet reageert op de knoppen. Verder is per led de overgang van de ene naar de andere kleur tamelijk abrupt en zou ik die graag meer vloeiender willen hebben.
Een bijkomende vraag is of de brichtness per led kan worden ingesteld? Ik heb dit niet in de documentatie kunnen vinden.
Iedere hulp is welkom.

Groeten,

Adri

Gebruikte sketch:

#include "FastLED.h"
#define NUM_LEDS 8
#define DATA_PIN 6
#define BRIGHTNESS 25
int Button1 = 5;
int Button2 = 7;
int statusDag = 0;
int statusNacht = 0;
// Define the array of leds
CRGB leds[NUM_LEDS];

void setup() {
FastLED.addLeds<NEOPIXEL, DATA_PIN, RGB>(leds, NUM_LEDS);
FastLED.setBrightness( BRIGHTNESS );
pinMode(Button1, INPUT_PULLUP);
pinMode(Button2, INPUT_PULLUP);
}

void loop(){
//Status Buttons
statusDag = digitalRead(Button1);
statusNacht = digitalRead(Button2);
if (statusNacht == HIGH && statusDag == LOW) // Beide knoppen bekijken op waarde, bij tegelijk 2 knoppen indrukken mag er niets gebeuren
{
delay(50);
// Turn the LED on, then pause
leds[0].setRGB(255,255,153);
leds[1].setRGB(255,255,153);
FastLED.show();
delay(500);
// Turn the LED on, then pause
leds[0].setRGB(255,255,204);
leds[1].setRGB(255,255,204);
FastLED.show();
delay(500);
// Turn the LED on, then pause
leds[0].setRGB(153,204,255);
leds[1].setRGB(153,204,255);
FastLED.show();
delay(500);
// Turn the LED on, then pause
leds[0].setRGB(102,178,255);
leds[1].setRGB(102,178,255);
FastLED.show();
delay(500);
}
if (statusNacht == LOW && statusDag == HIGH) // Beide knoppen bekijken op waarde, bij tegelijk 2 knoppen indrukken mag er niets gebeuren
{
delay(50);
// Turn the LED on, then pause
leds[0].setRGB(180,255,153);
leds[1].setRGB(180,255,153);
FastLED.show();
delay(500);
// Turn the LED on, then pause
leds[0].setRGB(180,255,204);
leds[1].setRGB(180,255,204);
FastLED.show();
delay(500);
// Turn the LED on, then pause
leds[0].setRGB(140,204,255);
leds[1].setRGB(140,204,255);
FastLED.show();
delay(500);
// Turn the LED on, then pause
leds[0].setRGB(80,178,255);
leds[1].setRGB(80,178,255);
FastLED.show();
delay(500);
}
}

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Dag/Nacht simulatie

Berichtdoor nicoverduin » 21 Nov 2014, 01:02

Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 10
Geregistreerd: 11 Feb 2014, 10:40

Re: Dag/Nacht simulatie

Berichtdoor viaferrum » 22 Jan 2015, 11:39

Hallo,

Om te kunnen experimenteren met helderheid c.q. kleur heb ik de onderstaande sketch geschreven en deze voldoet aan mijn verwachtingen.
Alleen de overgang van de ene helderheid c.q. kleur naar de andere vind ik iets te abrupt. Graag zou ik deze wat vloeiender willen hebben (fade in, fade out)
Ik ben op internet gaan rondneuzen en heb m. i. wel wat gevonden http://danne.stayskal.com/software/fastfader/ maar ik snap de programmeerregels niet en weet ze dus ook niet toe te passen in mijn sketch.
Of zijn er nog andere oplossingen?
Alvast bedankt voor het meedenken.

Groeten,

Adri

Experimenteer sketch:

#include "FastLED.h"


// How many leds in your strip?
#define NUM_LEDS 8
// For led chips like Neopixels, which have a data line, ground, and power, you just
// need to define DATA_PIN. For led chipsets that are SPI based (four wires - data, clock,
// ground, and power), like the LPD8806 define both DATA_PIN and CLOCK_PIN
#define DATA_PIN 6
#define BRIGHTNESS 30
// Define the array of leds
CRGB leds[NUM_LEDS];

void setup() {
FastLED.addLeds<NEOPIXEL, DATA_PIN, RGB>(leds, NUM_LEDS);
FastLED.setBrightness( BRIGHTNESS );
}

void loop(){
// Turn the LED off, then pause
leds[0].setRGB(0,0,0);
leds[1].setRGB(0,0,0);
leds[2].setRGB(0,0,0);
leds[3].setRGB(0,0,0);
leds[4].setRGB(0,0,0);
leds[5].setRGB(0,0,0);
leds[6].setRGB(0,0,0);
leds[7].setRGB(0,0,0);
FastLED.show();
delay(2000);
// Turn the LED on, then pause
leds[0].setRGB(60,0,20);
leds[1].setRGB(60,0,20);
leds[2].setRGB(60,0,20);
leds[3].setRGB(60,0,20);
leds[4].setRGB(60,0,20);
leds[5].setRGB(60,0,20);
leds[6].setRGB(60,0,20);
leds[7].setRGB(60,0,20);
FastLED.show();
delay(5000);
// Turn the LED on, then pause
leds[0].setRGB(120,0,40);
leds[1].setRGB(120,0,40);
leds[2].setRGB(120,0,40);
leds[3].setRGB(120,0,40);
leds[4].setRGB(120,0,40);
leds[5].setRGB(120,0,40);
leds[6].setRGB(120,0,40);
leds[7].setRGB(120,0,40);
FastLED.show();
delay(5000);
// Turn the LED on, then pause
leds[0].setRGB(180,0,60);
leds[1].setRGB(180,0,60);
leds[2].setRGB(180,0,60);
leds[3].setRGB(180,0,60);
leds[4].setRGB(180,0,60);
leds[5].setRGB(180,0,60);
leds[6].setRGB(180,0,60);
leds[7].setRGB(180,0,60);
FastLED.show();
delay(5000);
// Turn the LED on, then pause
leds[0].setRGB(240,0,80);
leds[1].setRGB(240,0,80);
leds[2].setRGB(240,0,80);
leds[3].setRGB(240,0,80);
leds[4].setRGB(240,0,80);
leds[5].setRGB(240,0,80);
leds[6].setRGB(240,0,80);
leds[7].setRGB(240,0,80);
FastLED.show();
delay(5000);
}

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Dag/Nacht simulatie

Berichtdoor shooter » 22 Jan 2015, 12:21

allereerst je hebt eigenlijk een prima start gemaakt hoor.

uiteraard een paar opmerkingen:
delay is heel mooi in begin, maar gaat erg storen als je wat meer wil.

voor de dag/nachtschakeling zou ik een analoge ingang (voor testen) gebruiken, later een tijd die een analoge waarde langzaam laat heen en weer gaan.
dus bijvoorbeeld nacht is potmeter in stand 0
dag is stand 1024

nachtstand is 60,0,20 bijvoorbeeld
dagstand is 240,200,180 bijvoorbeeld
nachtr=60
nachtg=0
nachtb=20
dagr=240
dagg=200
dagb=180


r=map(pos,0,1024,nachtr,dagr)
g=...
b=...

om alle leds te bedienen
for teller= 1 tot einde
{leds[teller].setrgb (r,g,b);
}
dan kun je met een potmeter dus gewoon vloeiend van dag naar nacht.

als je dat automatisch wilt, zet je een schakelaartje om en dan gaat er elke seconde bijvoorbeeld een tellertje++ tot 1023 zodra bereikt tellertje omdraaien en tot 0 gaan.
1024 seconden is 17 minuten, is wat langzaam maar werkt wel. als je tellertje +2 doet duurt het 8 minuten enz.

om de hand/auto overgang te verbeteren, moet je de analoge waarde in de teller zetten, en andersom de teller door laten lopen tot de waardes gelijk zijn.

het lijkt mij wel mooier als je de kleur verandert in de dag en nachtstand. dus meer blauw in de nacht of zo. vraagt wat experimenteer. ligt aan de type led en ook aan wat er aangestraald wordt.
en bovenal stuur een foto van het geheel, ik doe in spoor Z.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Dag/Nacht simulatie

Berichtdoor nicoverduin » 22 Jan 2015, 14:02

Voor meer lineaire fading kun je ofwel gebruik maken van:
a) een formule :
cpp code
1/(1+EXP(((n/21)-6)*-1))*255. Waarbij n loopt van 0 tot 255

b) een tabel :
cpp code
/** array with nice fading settings from 0 to max */
byte fadeArray[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 18, 22, 26,
30, 35, 40, 45, 50, 56, 62, 68, 74, 81, 88, 95, 102, 110, 118, 126, 135,
143, 152, 161, 170, 180, 190, 200, 210, 221, 232, 243, 249, 254 };

Deze tabel gebruik ik inmiddels al wat jaren om een lineair fading effect te geven. Dit tot tevredenheid van meerdere klanten.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 10
Geregistreerd: 11 Feb 2014, 10:40

Re: Dag/Nacht simulatie

Berichtdoor viaferrum » 22 Jan 2015, 14:41

Hallo,

@ Paul en Nico,

Bedankt voor jullie reactie. Ik snap de programmeerregels maar ik heb nog een (misschien wel domme) vraag:

Waar en hoe plaats ik deze regels in mijn sketch?

Wellicht basiskennis maar mijn programmeer ervaring ligt in een ver verleden en was vooral database gericht (Clipper) en is daarom wat roestig.

Groeten,

Adri

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Dag/Nacht simulatie

Berichtdoor nicoverduin » 22 Jan 2015, 15:44

De tabel kun je gewoon boven in het programma zetten na de includes. Het is niet meer dan een variabele.

Voor de fading is het gewoon een kwestie wanneer je het wilt doen. Stel je wilt getimed faden:
gebruik van een timer

bij de andere globale variabelen:
cpp code
byte fadeArray[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 18, 22, 26,
30, 35, 40, 45, 50, 56, 62, 68, 74, 81, 88, 95, 102, 110, 118, 126, 135,
143, 152, 161, 170, 180, 190, 200, 210, 221, 232, 243, 249, 254 };

int16_t fadeIndex=0; // index in de fade tabel
unsigned long fadeTimer; // timer om van stap naar stap te springen
#define FADE_TIJD 100 // verspringen van sterkte 1 x per 100 msec
bool richting = 1; // beginnen met oplopen van fading effect


in de setup()
cpp code
fadeTimer = millis();


in de loop()

cpp code
//
// kijk of de fade timer loopt
//
if (fadeTimer != 0) {
//
// timer loopt dus controleer of deze is verlopen
//
if (millis() - fadeTimer > FADE_TIJD){
//
// timer is verlopen dus nu kijken of we op of neer moeten gaan
//
if (richting == 1){
//
// oplopend dus verhoog de fade index
//
fadeIndex++;
//
// en kijk of we op het maximum zitten
//
if (fadeIndex == sizeof(fadeArray) {
//
// we zitten op de top dus richting omzetten en aflopen
//
richting = !richting;
fadeIndex--; // op de hoogste positie van de tabel
}
} else {
//
// richting is aflopend dus verlaag de index
//
if (fadeIndex == -1){
//
// we hebben de laatste index bereikt dus gaan we weer omhoog
//
richting = !richting;
fadeIndex = 0; // op de laagste positie van de tabel
}
}
//
// nu nog de output wegschrijven
//
analogWrite(PWM_PIN, fadeArray[fadeIndex]);
}
}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Dag/Nacht simulatie

Berichtdoor shooter » 23 Jan 2015, 09:22

kijk dat is nico weer :lol:
je bent fadeindex-- vergeten??
nou ja het werkt niet hoor.
jij houd zeker van treintjes?

Ik wilde het niet voorkauwen, kijk maar eens hoe een functie werkt.
en dan waar de analogwrite staat een call naar jouw functie doen.
Zoals je ziet ga ik heel ergens anders vanuit, dus gewoon een nieuw programma schrijven, en ook bewaren onder een andere naam.
paul deelen
shooter@home.nl

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Dag/Nacht simulatie

Berichtdoor nicoverduin » 23 Jan 2015, 11:10

cpp code
//
// kijk of de fade timer loopt
//
if (fadeTimer != 0) {
//
// timer loopt dus controleer of deze is verlopen
//
if (millis() - fadeTimer > FADE_TIJD){
//
// timer is verlopen dus nu kijken of we op of neer moeten gaan
//
if (richting == 1){
//
// oplopend dus verhoog de fade index
//
fadeIndex++;
//
// en kijk of we op het maximum zitten
//
if (fadeIndex == sizeof(fadeArray) {
//
// we zitten op de top dus richting omzetten en aflopen
//
richting = !richting;
fadeIndex--; // op de hoogste positie van de tabel
}
} else {
//
// richting is aflopend dus verlaag de index
//
fadeIndex--;
//
// kijk of we onderaan de array zitten
//
if (fadeIndex == -1){
//
// we hebben de laatste index bereikt dus gaan we weer omhoog
//
richting = !richting;
fadeIndex = 0; // op de laagste positie van de tabel
}
}
//
// nu nog de output wegschrijven
//
analogWrite(PWM_PIN, fadeArray[fadeIndex]);
//
// en zet de timer opnieuw
//
fadeTimer = millis();
}
}

Krijg je als je zo uit het blote hoofd ff zit te typen.....

En nee ik heb helemaal niks met treintjes... Maar dat zal wel iets "Brabants" zijn.... of zo
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4067
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Dag/Nacht simulatie

Berichtdoor shooter » 23 Jan 2015, 17:51

Ach arme man, heeft geen haren meer :mrgreen:
ben wel benieuwd naar het diorama, en treintjes rijden door gans het land.
paul deelen
shooter@home.nl

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: uyeocorixabq en 41 gasten