dmx управление светодиодами
- Войдите на сайт для отправки комментариев
Есть код для управления светодиодами с возможностью установки адреса кнопками и отображения адреса на экране, но в этом коде реализована возможность управления только яркостью, необходимо на дополнительный адрес вписать функцию стробоскопа для всех цветов, например 0 - сторбоскоп выключен 1-255 строб включен и от 1 до 255 регулируется скорость. есть примеры кода со стобоскопом но без возможности установки адреса
вот исходный код:
// Set and display DMX address for Arduino DMX controller
// Read DMX data from DMX address and PWM output
// First = all brightless together (multiplicator)
// 30/01/2013
#include <TM1637.h> // display TM1637 lib
#include <EEPROM.h> // EEPROM lib
#include <DMXSerial.h> // DMX512 lib
TM1637 tm1637(2,4); // CLK & DIO input pin from TM1637
#define MODEPIN 7 // mode input pin
#define UPPIN 8 // increment DMX address input pin
#define DOWNPIN 12 // decrement DMX address input pin
#define SETPIN 1 // set input pin
#define KEYSPEED 200 // buttons action trheshold, ms
#define KEEPDMXDISP 30 // keep DMX address on screen, sec
#define PWM1 3 // outputs PWM
#define PWM2 5
#define PWM3 6
#define PWM4 9
#define PWM5 10
#define PWM6 11
boolean setaddr=false, // DMX process/set address flag
btn_up=true, // button flags
btn_down=true,
btn_set=true,
btn_mode=true;
unsigned long last_btn; // buttons press timestamps
// last_disp=millis(); // last screen update timestamp
byte ticks, // movement buttons handled actions
deltadmx; // movement step
int dmxaddr=1, // DMX address
mult=0; // all channels light multiplicator
uint8_t dmxh,dmxl; // EEPROM DMX record
int8_t brightness=4; // screen brightness level
void dmxdisp(){
int tmp; // temp
int8_t digit[3]; // address output
tmp=dmxaddr-(dmxaddr%100);
digit[0]=tmp/100;
tmp=dmxaddr-(dmxaddr%10)-(digit[0]*100);
digit[1]=tmp/10;
digit[2]=dmxaddr-(digit[0]*100)-(digit[1]*10);
if(setaddr){
tm1637.display(0,0x0A); // setup address
tm1637.display(1,digit[0]);
tm1637.display(2,digit[1]);
tm1637.display(3,digit[2]);
}else{
tm1637.display(1,digit[0]); // display address
tm1637.display(2,digit[1]);
tm1637.display(3,digit[2]);
}
}
void processmovestep(){
ticks++;
if(ticks>10) deltadmx=10; // increase step
if(ticks>20) deltadmx=50;
if(ticks>30){ // reset step
deltadmx=1;
ticks=0;
}
dmxdisp();
}
void setup(){
pinMode(PWM1,OUTPUT); // init output pins
pinMode(PWM2,OUTPUT);
pinMode(PWM3,OUTPUT);
pinMode(PWM4,OUTPUT);
pinMode(PWM5,OUTPUT);
pinMode(PWM6,OUTPUT);
pinMode(SETPIN,INPUT_PULLUP); // init input key pins
pinMode(MODEPIN,INPUT_PULLUP);
pinMode(UPPIN,INPUT_PULLUP);
pinMode(DOWNPIN,INPUT_PULLUP);
tm1637.init(); // LDM init
tm1637.set(brightness);
DMXSerial.init(DMXReceiver);
dmxh=EEPROM.read(0x00); // restore DMX
dmxl=EEPROM.read(0x01);
if(dmxh!=0xFF) dmxaddr=(dmxh*256)+dmxl;
dmxdisp();
}
void loop(){
if(setaddr){
if(btn_up && btn_down && btn_set && btn_mode){ // read movement keys from idle mode
btn_up=digitalRead(UPPIN);
btn_down=digitalRead(DOWNPIN);
btn_set=digitalRead(SETPIN);
btn_mode=digitalRead(MODEPIN);
last_btn=millis();
ticks=0;
deltadmx=1;
if(!btn_up && !btn_down) btn_down=true;
}
if(!btn_mode){ // back to DMX process mode
btn_mode=true; // change mode
setaddr=false;
dmxh=EEPROM.read(0x00); // restore DMX
dmxl=EEPROM.read(0x01);
if(dmxh!=0xFF) dmxaddr=(dmxh*256)+dmxl;
tm1637.init(); // reset screen
delay(500);
dmxdisp();
// last_disp=millis();
}
if(!btn_set){ // store DMX
if(dmxaddr>255){
if(EEPROM.read(0x00)!=0x01) EEPROM.write(0x00,0x01);
dmxl=dmxaddr-256;
}else{
if(EEPROM.read(0x00)!=0x00) EEPROM.write(0x00,0x00);
dmxl=dmxaddr;
}
if(EEPROM.read(0x01)!=dmxl) EEPROM.write(0x01,dmxl);
btn_set=true; // change mode
setaddr=false;
tm1637.init(); // reset screen
delay(500);
dmxdisp();
// last_disp=millis();
}
if(!btn_up) btn_up=digitalRead(UPPIN); // read movement keys from moving mode
if(!btn_down) btn_down=digitalRead(DOWNPIN);
if(!btn_up && millis()-last_btn>=KEYSPEED){ // move DMX up
last_btn=millis();
dmxaddr+=deltadmx;
if(dmxaddr>512) dmxaddr=1;
processmovestep();
}
if(!btn_down && millis()-last_btn>=KEYSPEED){ // move DMX down
last_btn=millis();
dmxaddr-=deltadmx;
if(dmxaddr<1) dmxaddr=512;
processmovestep();
}
}else{
if(digitalRead(MODEPIN)==0){ // enter set address mode
setaddr=true; // change mode
tm1637.init(); // reset screen
delay(500);
dmxdisp();
}
// if(millis()-last_disp>=KEEPDMXDISP*1000) tm1637.init(); // clear screen if no buttons pressed
//================= main DMX programm ================================
mult = DMXSerial.read(dmxaddr); // read from DMX
analogWrite(PWM1,(DMXSerial.read(dmxaddr+1)*mult/256)); // channel 1
analogWrite(PWM2,(DMXSerial.read(dmxaddr+2)*mult/256)); // channel 2
analogWrite(PWM3,(DMXSerial.read(dmxaddr+3)*mult/256)); // channel 3
analogWrite(PWM4,(DMXSerial.read(dmxaddr+4)*mult/256)); // channel 4
// analogWrite(PWM5,(DMXSerial.read(dmxaddr+5)*mult/256)); // channel 5
// analogWrite(PWM6,(DMXSerial.read(dmxaddr+6)*mult/256)); // channel 6
//====================================================================
}
}
а вот код со стробоскопом но без возможности установки адреса и индикации
/* DMX_LED_Strips Copyright (c) 2015, Matthew Tong https://github.com/mtongnz/DMX_LED_Strips http://www.instructables.com/id/DMX-LED-Strips/ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/ This sketch takes the DMX input and controls 5 RGB LED strips. Channel allocation is red, green, blue, strobe for each output (20 channels total). Strobe: 0-19 off 20 - 189 slow - fast 190 - 205 slow random 206 - 219 fast random 220 - 255 off Libraries Used: ShiftPWM by Elco Jacobs. www.elcojacobs.com DMXSerial by Mat Hertel. www.mathertel.de */ // ShiftPWM settings const int ShiftPWM_latchPin=8; const bool ShiftPWM_invertOutputs = false; const bool ShiftPWM_balanceLoad = true; #include <DMXSerial.h> #include <ShiftPWM.h> // ShiftPWM settings unsigned char maxBrightness = 255; unsigned char pwmFrequency = 125; unsigned int numRegisters = 2; unsigned int numOutputs = numRegisters*8; // Status LED pin const int statusLEDPin = 5; // Output settings const int numRGBS = 5; const int dmxNumChan = numRGBS * 4; // DMX address. const int dmxStartAddr = 1; // unit 1 & 2 = 61, unit 3 & 4 = 81 // Counter variables int strobeCount[numRGBS]; int randStrobeCount[numRGBS]; int timerCount; void setup(){ int x; // Random Seed randomSeed(analogRead(0)); // Setup DMX receiver DMXSerial.init(DMXReceiver); // Setup PWM output ShiftPWM.SetAmountOfRegisters(numRegisters); ShiftPWM.Start(pwmFrequency,maxBrightness); // set all channels to 0 default ShiftPWM.SetAll(0); // Setup status LED pinMode(statusLEDPin, OUTPUT); digitalWrite(statusLEDPin, 1); // Set counters to zero for (x = 0; x < numRGBS; x++) { strobeCount[x] = 0; randStrobeCount[x] = random(5, 200); } timerCount = 0; //set timer0 interrupt at 200Hz cli(); // disable interupts TCCR0A = 0; // set entire TCCR0A register to 0 TCCR0B = 0; // same for TCCR0B TCNT0 = 0; // initialize counter value to 0 OCR0A = 78; // set compare match register for 200hz increments TCCR0A |= (1 << WGM01); // turn on CTC mode TCCR0B |= (1 << CS02) | (1 << CS00); // Set CS02 and CS00 bits for 1024 prescaler TIMSK0 |= (1 << OCIE0A); // enable timer compare interrupt sei(); // enable interupts } // Timer0 interupt handler. Increments all the counters. ISR(TIMER0_COMPA_vect){ int x; for (x = 0; x < numRGBS; x++) strobeCount[x]++; timerCount++; } void loop() { int x, y, s; if (timerCount >= 100) { // Blink status LED if DMX receiving if (DMXSerial.noDataSince() < 1000) { digitalWrite(statusLEDPin, digitalRead(statusLEDPin) ^ 1); // Turn status LED red if no DMX received }else digitalWrite(statusLEDPin, 1); timerCount = 0; } // Turn off all outputs if we haven't received DMX in 10 seconds if (DMXSerial.noDataSince() > 10000) ShiftPWM.SetAll(0); else { // loop through each of the 'y' RGB leds for (y = 0; y < numRGBS; y++) { s = DMXSerial.read(dmxStartAddr + (y * 4)); // strobe mode if (s > 20 && s <= 220) { int t; // random strobe if (s > 190) { t = (40 - (s - 190)) * 10; s = randStrobeCount[y]; } // strobe on if (strobeCount[y] >= ( (192 - s) + 5) && strobeCount[y] < 500) { for (x = 0; x < 3; x++) ShiftPWM.SetOne((y*3) + x, DMXSerial.read(dmxStartAddr + (y * 4) + x + 1)); strobeCount[y] = 500; TCNT0 = 0; //clear timer } // strobe off if (strobeCount[y] >= 501 ) { for (x = 0; x < 3; x++) ShiftPWM.SetOne((y*3) + x, 0); strobeCount[y] = 0; randStrobeCount[y] = random(1, t); } // non strobe mode } else { strobeCount[y] = 0; // Get DMX values and set outputs for (x = 0; x < 3; x++) ShiftPWM.SetOne((y*3) + x, DMXSerial.read(dmxStartAddr + (y * 4) + x + 1)); } } } }
отпишите кто нибудь в лс или сюда https://vk.com/andy.rock
буду благодарен если кто поможет, делаю в основном для себя(работаю светорежиссером и появилось желание внести немного креатива в работу и попробовать собрать пару самодельных девайсов), но могу оплатить вашу работу
так же сам только знакомлюсь с основами програмирования, до этого занимался в основном аналоговым оборудованием(радиолюбитель с 15 летним стажем), поэтому паралелльно ищу человека, который поможет в написании кода под световые приборы, или поможет в освоении языка. уже разобрался как прописывать выходы, перенумеровывать. менять частоту и т.д. но вот пока с такими вещами как вписать стробоскоп или какие то программы переключения в зависимости от адреса пока еще не получается
В этих примерах нет большой ценности. Все проще написать с нуля. Ну скажем от 5000 рублей, если нужно неспешно. brokly(at)mail.ru