Guten Tag liebes Forum,
ich möchte für die Modelleisenbahn eine Steuerung entwickeln, mit der ich Lichtsignale schalten kann oder besser gesagt, ich möchte, dass sie beim Einschalten hochdimmen und beim Ausschalten runterdimmen.
Da der Arduino an sich nur recht wenig PWM Pins hat, habe ich mir die I2C Erweiterung mit PCA9685 angeschaut.
Nun habe ich ein Programm erstellt, mit dem ich 2 Leds im Wechsel dimmen kann. Das funktioniert so weit gut.
Dann habe ich das Programm auf 16 Leds erweitert und schon braucht er viel länger beim dimmen.
Offensichtlich habe ich was falsch gemacht oder nicht beachtet.
Ich komme aber auch derzeit nicht auf eine bessere Lösung.
Es wäre cool, wenn ihr euch das mal anschauen könnt.
Und ja, ich weiß, dass man es auch "Lichtsteuerung" auch in einer For Schleife aufrufen könnte, aber das macht keinen Unterschied.
/***************************************************
das Programm soll mal für 5 PCA9685 mit je 16 LEDs funktionieren, deswegen habe ich es schon dafür vorbereitet.
****************************************************/
bool soll[1][16] = {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
bool soll_alt[1][16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
long zeit[1][16];
uint16_t helligkeit[1][16];
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
void setup() {
Serial.begin(115200);
Serial.println("GPIO Test an Pins 0 und 1 vom Board!");
pwm.begin();
pwm.setPWMFreq(1000); // Set to whatever you like, we don't use it in this demo!
Wire.setClock(400000);
}
uint16_t x = 0;
uint16_t y = 0;
void loop() {
Lichtsteuerung(0,0);
Lichtsteuerung(0,1);
/*Lichtsteuerung(0,2);
Lichtsteuerung(0,3);
Lichtsteuerung(0,4);
Lichtsteuerung(0,5);
Lichtsteuerung(0,6);
Lichtsteuerung(0,7);
Lichtsteuerung(0,8);
Lichtsteuerung(0,9);
Lichtsteuerung(0,10);
Lichtsteuerung(0,11);
Lichtsteuerung(0,12);
Lichtsteuerung(0,13);
Lichtsteuerung(0,14);
Lichtsteuerung(0,15);*/
test();
}
int State;
long zeit_test = 0;
void test()
{
if(millis() - zeit_test > 10000)
{
zeit_test = millis();
switch(State)
{
case 0: soll[0][0] = 1;soll[0][1] = 0;State = 1;break;
case 1: soll[0][0] = 0;soll[0][1] = 1;State = 0;break;
}
}
}
void Lichtsteuerung(int dev,int nr)
{
if(soll[dev][nr] != soll_alt[dev][nr])
{
zeit[dev][nr] = millis();
soll_alt[dev][nr] = soll[dev][nr];
}
if(soll[dev][nr] == 0)
{
if(helligkeit[dev][nr] > 1)
{
helligkeit[dev][nr]--;
}
else
{
helligkeit[dev][nr] = 0;
}
}
else if(soll[dev][nr] == 1 && millis()- zeit[dev][nr] > 1800)
{
if(helligkeit[dev][nr] < 4095)
{
helligkeit[dev][nr]++;
}
else
{
helligkeit[dev][nr] = 4095;
}
}
if(dev == 0)
{
pwm.setPWM(nr, 0, helligkeit[dev][nr]);
}
}
Ich habe auch mal ein Video hochgeladen: PWM Test PCA9685 - YouTube
Da könnt ihr euch mal anschauen, wie das Verhalten ist.
Die Funktion ist so, dass er alle 10 Sekunden den Soll-Wert der LED wechselt. Also 1 oder 0 (Einschalten oder Ausschalten). Das wird in der Funktion test übernommen.
In der Funktion Lichtsteuerung wertet er aus, ob ein neuer Sollwert vorhanden ist. Wenn Ja, dann wird die Zeit Variable gesetzt, damit das Einschalten der LED um 1,8s verzögert wird. Dann je nach Soll Wert wird der Helligkeitswert reduziert oder erhöht bis zum Maximum.
Das ganz natürlich flexibel gehalten, damit später bis zu 16 LEDs je PCA gesteuert werden könnten.
Bei Rückfragen stehe ich gern zur Verfügung.
Vielen Dank für eure Hilfe.
LG
Daniel