oke
Nieuwe poging : https://wokwi.com/projects/445530722430353409
Alleen brandt de led helemaal niet.
Maar eens even kijken vandaag hoe dat komt
oke
Nieuwe poging : https://wokwi.com/projects/445530722430353409
Alleen brandt de led helemaal niet.
Maar eens even kijken vandaag hoe dat komt
Ja dat is een stuk beter. Het einde van de fade komt niet helemaal goed denk ik, want stepCount blijft doortellen en de berekening blijft plaats vinden, hoewel het resultaat natuurlijk wel vast staat en je er geen verschil door zal zien.
byte redPin = 12;
is geen PWM pin, probeer pin 11 maar eens.
De groene hoort het wel te doen.
Heb de pin veranderd maar zie nog steeds geen kleur verschijnen.
Je hebt niet alle aders van de LED aangesloten, je verspringt 1 draad.
Daardoor ga je ook andere kleuren krijgen als het wel werkt.
Ik mis weer een debug die je zal helpen zelf uit te vinden wat wel en wat niet goed gaat.
Wanneer ik dat even snel er in bouw, zie ik wel iets dat mij aanwijzingen geeft om naar te kijken, dus ik raad je nog maar eens aan om dat ook te doen.
Hmm , dat was inderdaad iets te snel.
Ik dacht dat je alle LEDs ging bedienen maar dat is niet zo, je bedient alleen de groene LED om van rood naar geel te gaan.
Sorry voor de valse hoop, maar dan nog is een debug altijd het eerste dat je zou moeten doen.
Als ik de debug info toevoeg blijkt dat het niet aan het algoritme ligt
byte redPin = 11;
byte greenPin = 10;
byte bluePin = 9;
int steps = 40;
int stepCount = 0 ;
int currentRed = 255, currentGreen = 0, currentBlue = 0;
int targetRed = 255, targetGreen = 255, targetBlue = 0;
unsigned long lastFadeTime = 0;
unsigned long fadeInterval = 1000; // ms
void setup() {
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
Serial.begin(115200);
}
void loop() {
if (stepCount >= steps) return;
unsigned long now = millis();
if (now - lastFadeTime >= fadeInterval) {
lastFadeTime = now;
stepCount++;
Serial.print(stepCount, DEC);
int r = map(stepCount, 0, steps, currentRed, targetRed);
Serial.print(" ");
Serial.print(r, DEC);
int g = map(stepCount, 0, steps, currentGreen, targetGreen);
Serial.print(" ");
Serial.print(g, DEC);
int b = map(stepCount, 0, steps, currentBlue, targetBlue);
Serial.print(" ");
Serial.println(b, DEC);
analogWrite(redPin, r);
analogWrite(greenPin, g);
analogWrite(bluePin, b);
if (stepCount == steps) {
currentRed = targetRed;
currentGreen = targetGreen;
currentBlue = targetBlue;
}
}
}
Ik blijf ook van mening dat je ook direct millis() / verstreken tijd kan gebruiken in de map() functie voor een meer geleidelijke fade.
ik heb het probleem gevonden.
Ik moest de led veranderen van anode naar canode.
Hoe kan je dan millis gebruiken voor de fade
Kun je me dat laten zien.
Zoiets
byte redPin = 11;
byte greenPin = 10;
byte bluePin = 9;
int currentRed = 255, currentGreen = 0, currentBlue = 0;
int targetRed = 255, targetGreen = 255, targetBlue = 0;
unsigned long firstFadeTime;
int fadeTime = 30000; // map() gebruikt 'int'
void setup() {
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT);
firstFadeTime = millis();
}
void loop() {
unsigned int inFade = millis() - firstFadeTime;
if (inFade > fadeTime) {
analogWrite(redPin, targetRed);
analogWrite(greenPin, targetGreen);
analogWrite(bluePin, targetBlue);
while (1);
}
int r = map(inFade, 0, fadeTime, currentRed, targetRed);
int g = map(inFade, 0, fadeTime, currentGreen, targetGreen);
int b = map(inFade, 0, fadeTime, currentBlue, targetBlue);
analogWrite(redPin, r);
analogWrite(greenPin, g);
analogWrite(bluePin, b);
}
Lag toch redelijk voor de hand. Hou er rekening mee dat doordat map() met integers werk (16-bit signed) 32767 de maximale waarde is voor de 'roll-over' . Als je Fades wil die langer zijn dan dat dan zal je zelf een map functie moeten schrijven (goeie oefening ! ) of een 32-bit processor waarbij map 32-bit signed integers gebruikt, gebruiken.
oke
Klopt het dat je een fade van 30 seconden gebruikt of vertel ik me met de nullen.
en wat doet de while(1) in de code precies
Dat klopt, de originele 40 seconden was te groot voor map()
1 == waar, dus de conditie is altijd waar, en met de ; wordt het programma in een eindeloze loop gezet
Dank je ,
Ik moet dan even goed nadenken hoe dit te implementeren als de gebruiker nog een kleur invoert.
Met de while erin , gaat het denk ik niet lukken.
Nee in principe niet natuurlijk, maar dat was bij de vorige versie ook niet zo.
In principe moet je een functie maken die alleen uitgevoerd wordt indien er een fade aan de gang is.
zat ik ook aan te denken
En dan in de if then een return
Er zijn legio manieren om het te doen. Probeer maar wat.