Aqui esta mi aporte, agregue al receptor de Niht un canal para efectos especiales... en el caso mio no utilizo el canal de blanco, por eso es de 6 canales de esta forma; canal 1 dimmer, canal 2 Red, canal 3 Green, canal 4 Blue, canal 5 strobo y canal 6 efectos o shows.
hay configurados 6 shows en el canal 6 así:
0 - 42 Show 1 fade Automatico veocidad 1 ;
43 - 85 Show 2 fade Automatico velocidad 2 ;
86 - 127 Show 3 fade Automatico velocidad 3 ;
128 - 170 Show 4 Secuencial paso a paso velocidad 1 ;
171 - 212 Show 5 Secuencial paso a paso velocidad 2 ;
213 - 255 Show 6 Audioritmico RGB ;
Al puerto A0 del arduino se le conecta un sensor de sonido como el de la imagen adjunta, al pin A0 del mismo.
aqui el codigo:
hay configurados 6 shows en el canal 6 así:
0 - 42 Show 1 fade Automatico veocidad 1 ;
43 - 85 Show 2 fade Automatico velocidad 2 ;
86 - 127 Show 3 fade Automatico velocidad 3 ;
128 - 170 Show 4 Secuencial paso a paso velocidad 1 ;
171 - 212 Show 5 Secuencial paso a paso velocidad 2 ;
213 - 255 Show 6 Audioritmico RGB ;
Al puerto A0 del arduino se le conecta un sensor de sonido como el de la imagen adjunta, al pin A0 del mismo.
aqui el codigo:
Código:
// 12/05/2017
// RECEPTOR DMX 6 CANALES
// 1 DIMMER GENERAL, 2 ROJO, 3 VERDE, 4 AZUL, 5 STROBO, 6 EFECTOS
// Implementacion de Canal efectos especiales
// Djsound
// 28/04/2017
// RECEPTOR DMX 6 CANALES
// 1 DIMMER GENERAL, 2 ROJO, 3 VERDE, 4 AZUL, 5 BLANCO, 6 STROBO
// Implementacion de Canal Strobo
// Niht Gonzalez C.
// 30/01/2013
// Set y visualización de la dirección DMX para controlador DMX Arduino
// Leer datos de la dirección DMX y salida PWM
// Primer Canal = dimmer general (multiplicador)
// http://www.city416.ru/
// http://www.mathertel.de/License.aspx
// Acuerdo de licencia de software (Licencia BSD)
// Copyright (C) 2005 a 2014 de Matthias Hertel, http://www.mathertel.de/
// Todos los derechos reservados.
// La redistribución y el uso en formas de fuente y binario, con o sin modificaciones, están permitidos siempre que se cumplan las siguientes condiciones:
// • Las redistribuciones del código fuente deben conservar el aviso de copyright anterior, esta lista de condiciones y la siguiente renuncia.
// • Las redistribuciones en formato binario deben reproducir el aviso de copyright anterior, esta lista de condiciones y la siguiente renuncia en la documentación y / u otros materiales proporcionados con la distribución.
// • Ni el nombre de los propietarios de derechos de autor ni los nombres de sus colaboradores pueden usarse para apoyar o promocionar productos derivados de este software sin el consentimiento previo por escrito.
// ESTE SOFTWARE SE PROPORCIONA LOS PROPIETARIOS DEL COPYRIGHT Y SUS COLABORADORES "tal cual" y EXPRESA O IMPLÍCITAS, INCLUYENDO,
// PERO NO LIMITADO A, LAS GARANTÍAS DE COMERCIALIZACIÓN Y APTITUD PARA UN FIN DETERMINADO. IN NO CASO EL PROPIETARIO COPYRIGHT O COLABORADORES responsables de daños directos,, INCIDENTAL, O INDIRECTOS ESPECIALES,
// EJEMPLARES DERIVADOS (INCLUYENDO, pero no limitado a, ADQUISICIÓN DE BIENES O SERVICIOS; PÉRDIDA DE USO, DATOS O GANANCIAS; O INTERRUPCIÓN COMERCIAL) CAUSADOS Y EN CUALQUIER TEORÍA DE RESPONSABILIDAD, SEA CONTRACTUAL,
// RESPONSABILIDAD ESTRICTA O AGRAVIO (INCLUYENDO NEGLIGENCIA) DERIVADOS DE CUALQUIER FORMA DE USO DE ESTE SOFTWARE, AUNQUE advertido de la posibilidad DE TAL DAÑO.
#include <TM1637.h> // display TM1637 libreria
#include <EEPROM.h> // EEPROM libreria
#include <DMXSerial.h> // DMXSerial library: http://www.mathertel.de/Arduino/DMXSerial.aspx //
#define MODEPIN 7 // entrada para Boton Modo
#define UPPIN 8 // entrada para Boton incrementa direccion DMX
#define DOWNPIN 12 // entrada para Boton decrementa direccion DMX
#define SETPIN 1 // entrada boton ok
#define KEYSPEED 100 // buttons action trheshold, 200 ms
#define KEEPDMXDISP 30 // keep DMX address on screen, sec
#define PWM1 3 //red // Pines de Salidas para el PWM
#define PWM2 5 //green
#define PWM3 6 //blue
#define PWM4 9
#define delayTime1 5
#define delayTime2 2
#define delayTime3 1
TM1637 tm1637(2,4); // CLK & DIO salidas para Display TM1637
int strobo=0; // Strober
int fx=0; // efectos
int threshold =532; //sensibilidad de audio
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
unsigned long 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(0,0x0d);
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); //red // Iniciar pines de salida
pinMode(PWM2,OUTPUT); //green
pinMode(PWM3,OUTPUT); //blue
pinMode(PWM4,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();
}
int redVal; // rojo
int blueVal; // azul
int greenVal; // verde
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();
}
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();
}
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();
}
mult = DMXSerial.read(dmxaddr); // Letura de canales DMX
analogWrite(PWM1,(DMXSerial.read(dmxaddr+1)*mult/256)); // Canal Rojo 2
analogWrite(PWM2,(DMXSerial.read(dmxaddr+2)*mult/256)); // Canal Verdde 3
analogWrite(PWM3,(DMXSerial.read(dmxaddr+3)*mult/256)); // Canal Azul 4
// analogWrite(PWM4,(DMXSerial.read(dmxaddr+4)*mult/256)); // Canal Blanco 5
strobo = (DMXSerial.read(dmxaddr+4)); // Canal Strobo 6
int stroboporcent = map(strobo, 0, 255, 400, 10);
if ( strobo > 1 ) {
analogWrite(PWM1,(DMXSerial.read(dmxaddr+1)*mult/256));
analogWrite(PWM2,(DMXSerial.read(dmxaddr+2)*mult/256));
analogWrite(PWM3,(DMXSerial.read(dmxaddr+3)*mult/256));
delay (stroboporcent);
analogWrite(PWM1, 0);
analogWrite(PWM2, 0);
analogWrite(PWM3, 0);
delay(stroboporcent);
}
fx = (DMXSerial.read(dmxaddr+5));
int show = map(fx, -42, 256,0,7); // SELECCION 6 SHOWS
if ( show == 1 ){ // SHOW1 FADE VEL1
int redVal = 255;
int blueVal = 0;
int greenVal = 0;
for( int i = 0 ; i < 255 ; i += 1 ){
greenVal += 1;
redVal -= 1;
analogWrite( PWM2, 255 - greenVal );
analogWrite( PWM1, 255 - redVal );
delay( delayTime1 );
}
redVal = 0;
blueVal = 0;
greenVal = 255;
for( int i = 0 ; i < 255 ; i += 1 ){
blueVal += 1;
greenVal -= 1;
analogWrite( PWM3, 255 - blueVal );
analogWrite( PWM2, 255 - greenVal );
delay( delayTime1 );
}
redVal = 0;
blueVal = 255;
greenVal = 0;
for( int i = 0 ; i < 255 ; i += 1 ){
redVal += 1;
blueVal -= 1;
analogWrite( PWM1, 255 - redVal );
analogWrite( PWM3, 255 - blueVal );
delay( delayTime1 );
}
}
if ( show == 2 ){ // SHOW FADE VEL2
int redVal = 255;
int blueVal = 0;
int greenVal = 0;
for( int i = 0 ; i < 255 ; i += 1 ){
greenVal += 1;
redVal -= 1;
analogWrite( PWM2, 255 - greenVal );
analogWrite( PWM1, 255 - redVal );
delay( delayTime2 );
}
redVal = 0;
blueVal = 0;
greenVal = 255;
for( int i = 0 ; i < 255 ; i += 1 ){
blueVal += 1;
greenVal -= 1;
analogWrite( PWM3, 255 - blueVal );
analogWrite( PWM2, 255 - greenVal );
delay( delayTime2 );
}
redVal = 0;
blueVal = 255;
greenVal = 0;
for( int i = 0 ; i < 255 ; i += 1 ){
redVal += 1;
blueVal -= 1;
analogWrite( PWM1, 255 - redVal );
analogWrite( PWM3, 255 - blueVal );
delay( delayTime2 );
}
}
if ( show == 3 ){ // SHOW FADE VEL3
int redVal = 255;
int blueVal = 0;
int greenVal = 0;
for( int i = 0 ; i < 255 ; i += 1 ){
greenVal += 1;
redVal -= 1;
analogWrite( PWM2, 255 - greenVal );
analogWrite( PWM1, 255 - redVal );
delay( delayTime3 );
}
redVal = 0;
blueVal = 0;
greenVal = 255;
for( int i = 0 ; i < 255 ; i += 1 ){
blueVal += 1;
greenVal -= 1;
analogWrite( PWM3, 255 - blueVal );
analogWrite( PWM2, 255 - greenVal );
delay( delayTime3 );
}
redVal = 0;
blueVal = 255;
greenVal = 0;
for( int i = 0 ; i < 255 ; i += 1 ){
redVal += 1;
blueVal -= 1;
analogWrite( PWM1, 255 - redVal );
analogWrite( PWM3, 255 - blueVal );
delay( delayTime3 );
}
}
if ( show == 4 ){ // SHOW secuencia 1
analogWrite(PWM1, 255);
analogWrite(PWM2, 0);
analogWrite(PWM3, 0);
delay(500);
analogWrite(PWM1, 0);
analogWrite(PWM2, 255);
analogWrite(PWM3, 0);
delay(500);
analogWrite(PWM1, 0);
analogWrite(PWM2, 0);
analogWrite(PWM3, 255);
delay(500);
}
if ( show == 5 ){ // SHOW secuencial 2
analogWrite(PWM1, 255);
analogWrite(PWM2, 0);
analogWrite(PWM3, 0);
delay(150);
analogWrite(PWM1, 0);
analogWrite(PWM2, 255);
analogWrite(PWM3, 0);
delay(150);
analogWrite(PWM1, 0);
analogWrite(PWM2, 0);
analogWrite(PWM3, 255);
delay(150);
}
if ( show == 6 ){ // SHOW AUDIO RITMICO
int sensorValue = analogRead(A0); //A0 es la entrada a la que se conecta el módulo
if(sensorValue<=threshold){
digitalWrite(PWM1, HIGH);
digitalWrite(PWM2, HIGH);
digitalWrite(PWM3, HIGH); //
delay(50);
digitalWrite(PWM1, LOW);
digitalWrite(PWM2, LOW);
digitalWrite(PWM3, LOW);}
}
} // final final
}
Adjuntos
Última edición: