Dag/Nacht simulatie
12 berichten
• Pagina 1 van 2 • 1, 2
Dag/Nacht simulatie
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);
}
}
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
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Dag/Nacht simulatie
Staat er gewoon in hoor: https://github.com/FastLED/FastLED/wiki/Pixel-reference
Re: Dag/Nacht simulatie
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);
}
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);
}
Re: Dag/Nacht simulatie
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.
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
shooter@home.nl
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Dag/Nacht simulatie
Voor meer lineaire fading kun je ofwel gebruik maken van:
a) een formule :
cpp code
b) een tabel :
cpp code
Deze tabel gebruik ik inmiddels al wat jaren om een lineair fading effect te geven. Dit tot tevredenheid van meerdere klanten.
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.
Re: Dag/Nacht simulatie
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
@ 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
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Dag/Nacht simulatie
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
in de setup()
cpp code
in de loop()
cpp code
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]);
}
}
Re: Dag/Nacht simulatie
kijk dat is nico weer
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.
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
shooter@home.nl
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Dag/Nacht simulatie
cpp code
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
//
// 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
Re: Dag/Nacht simulatie
Ach arme man, heeft geen haren meer
ben wel benieuwd naar het diorama, en treintjes rijden door gans het land.
ben wel benieuwd naar het diorama, en treintjes rijden door gans het land.
paul deelen
shooter@home.nl
shooter@home.nl
12 berichten
• Pagina 1 van 2 • 1, 2
Wie is er online?
Gebruikers in dit forum: uyeocorixabq en 41 gasten