Hallo Miteinander,
Ich Arbeite an einem Automodus für einen LED stripe und wenn die Adresse 0 ist soll er automatisch in den Auto Modus übergehen dafür habe ich folgenden Programm Code erstellt,
Arduino
#include <DMXSerial.h>
// Constants for demo program
int RedPin = 10; // PWM output pin for Red Light.
int GreenPin = 11; // PWM output pin for Green Light.
int BluePin = 9; // PWM output pin for Blue Light.
int localRead;
#define RedDefaultLevel 0
#define GreenDefaultLevel 0
#define BlueDefaultLevel 0
void setup () {
DMXSerial.init(DMXReceiver);
// setze einige Standardwerte
DMXSerial.write(1, 0);
DMXSerial.write(2, 0);
DMXSerial.write(3, 0);
DMXSerial.write(4,0);
DMXSerial.write(5,0);
for(int i = 2; i <=14; i++)
{
if(i < 9 || i > 11)
{
pinMode(i,INPUT);
digitalWrite(i, HIGH);
}
}
// PWM-Ausgänge aktivieren
pinMode(RedPin, OUTPUT); // sets the digital pin as output
pinMode(GreenPin, OUTPUT);
pinMode(BluePin, OUTPUT);
}
void loop() {
int Addr = 0;
// DIN Nummer 1 DIN Nummer 2 DIN Nummer 3 DIN Nummer 4 DIN Nummer 5 DIN Nummer 6 DIN Nummer 7 DIN Nummer 8 DIN Nummer 9
Addr = (!digitalRead(14) * 1) + (!digitalRead(12) * 2) + (!digitalRead(8) * 4) + (!digitalRead(7) * 8) + (!digitalRead(6) * 16) + (!digitalRead(5) * 32) + (!digitalRead(4) * 64) + (!digitalRead(3) * 128) + (!digitalRead(2) * 256);
int Addr2;
Addr2 = Addr + 1;
int Addr3;
Addr3 = Addr + 2;
int Addr4;
Addr4 = Addr + 3;
int Addr5;
Addr5 = Addr + 4;
// Berechnen Sie, wie lange kein Datenpaket empfangen wurde
unsigned long lastPacket = DMXSerial.noDataSince();
if (! Addr == 0) {
// Letzte DMX-Werte lesen und PWM-Pegel einstellen
uint16_t B = ((uint16_t)DMXSerial.read(Addr3) + 1) * ((uint16_t)DMXSerial.read(Addr4) + 1);
analogWrite(BluePin, ((B - 1) >> 8));
uint16_t G = ((uint16_t)DMXSerial.read(Addr2) + 1) * ((uint16_t)DMXSerial.read(Addr4) + 1);
analogWrite(GreenPin, ((G - 1) >> 8));
uint16_t R = ((uint16_t)DMXSerial.read(Addr) + 1) * ((uint16_t)DMXSerial.read(Addr4) + 1);
analogWrite(RedPin, ((R - 1) >> 8));
int strobeValue = DMXSerial.read(Addr5);
if (strobeValue >= 10)
{
//Map to 0,1 - 20 Hz
//Hz 0,1 => 10000ms
//Hz 20 => 50ms
int intervalInMs = map(strobeValue, 10, 255, 1000, 50);
int onTime = 30; //Define here. Can't be > 50!
int offTime = intervalInMs - onTime;
delay(onTime);
analogWrite(BluePin, 0);
analogWrite(GreenPin, 0);
analogWrite(RedPin, 0);
do {
if (offTime > 500) {
delay(500);
offTime -= 500;
}
else
{
delay(offTime);
break;
}
localRead = DMXSerial.read(Addr5);
} while (localRead == strobeValue);
}
}else{
Addr2 = 0;
Addr3 = 0;
Addr4 = 0;
Addr5 = 0;
DMXSerial.write(1, 0);
DMXSerial.write(2, 0);
DMXSerial.write(3, 0);
DMXSerial.write(4, 0);
DMXSerial.write(5, 0);
}
}
// End.
Display More
Das Problem das ich habe ist das, wenn ich die Adresse auf 0 setzte mein licht immer noch ein ist obwohl ich es mit DMXSerial.write(…..) auf 0 setze und so mit alle 5 kanäle für den Anfang aus sind.
Was kann man da machen ?
LG Julian