Hola, buenas tardes. Soy nuevo aquí y estoy desarrollando un controlador dmx para tachos led de 6 canales. El código lo tengo probado y funcionando, pero quisiera saber si lo puedo reducir utilizando algún tipo de array o intervalos.
Les dejo el código en cuestión, desde ya muchismas gracias.
/*************************************************************************************************************
*
* Title : Controlador DMX par led 6 canales
* Version : v 1.0
* Last updated : 11/09/2017
* Target : Arduino mega 2560, Arduino mega 1280, Arduino UNO, Arduino nano
* Author : Pablo Damián Morazzo
* Basado en el código : Tony Merino www.deskontrol.net/blog
*
*
* Mini controlador DMX512 basado en Arduino UNO
* Este codigo lee los valores de 6 potenciometros conectados a 6 entradas analogicas y los envía a cada canala DMX
* Seleccionando las entradas digitales 2 (DMX 1) a 12 (DMX61) envía las señales de los potenciomentros a las posiciones 1 a 6 a equipos de 6 canales
* Se pueden manejar hasta 10 equipos independientes, utilizando las entradas 2 a 12, el pin 13 pone 0 a todas los DMX.
*
**************************************************************************************************************/
#include <lib_dmx.h> // libreria DMX 4 universos // deskontrol four universes DMX library - www.deskontrol.net/blog
#define DMX512 (0) // (250 kbaud - 2 to 512 channels) Standard USITT DMX-512
#define DMX1024 (1) // (500 kbaud - 2 to 1024 channels) Completely non standard - TESTED ok
#define DMX2048 (2) // (1000 kbaud - 2 to 2048 channels) called by manufacturers DMX1000K, DMX 4x or DMX 1M ???
uint8_t buffer[6]; // buffer DMX data
void setup()
{
// configurar pines arduino del 2 al 13 como entradas con pullup, (cuando se pulsa el boton = 0 si no = 1)
// Los pines por defecto están configurados como entradas; por lo tanto, bastará con ponerlos en estado alto
PORTD = B11111100;
PORTC = B00111111;
// PORTD tiene los pines del 0 al 7, por eso ponemos en 1 (estado alto) los bits que corresponden a los pines 2 al 7.
// PORTC tiene los pines del 8 al 13 (los que sobran están ocupados por el oscilador externo de 16 MHz)
//for (byte i=2;i<14;i++) pinMode(i,INPUT_PULLUP);
// Lo mismo de lo anterior, pero se comenta porque es más lento y ocupa más espacio en la memoria del programa.
ArduinoDmx0.set_tx_address(1); // poner aqui la direccion de inicio de DMX
ArduinoDmx0.set_tx_channels(100); // poner aqui el numero de canales a transmitir
ArduinoDmx0.init_tx(DMX512); // iniciar transmision universo 0, modo estandar DMX512
} //end setup()
void loop()
{
// seis entradas con potenciometros que envian valores DMX entre 0 y 255 a los canales 1 al 6, cuando se presiona el pulsador
for (byte i = 0; i < 6; i++) buffer[i] = analogRead(A0 + i) >> 2; // copiar valor de la entrada analogica Ai al canal DMX i+1
for (byte i = 0; i < 11; i++) if (!digitalRead(i + 2)) memcpy(ArduinoDmx0.TxBuffer + (i * 6), buffer, 6);
// Breve explicación: Cuando el botón esté presionado, se copiaran los valores del buffer a sus respectivos canales DMX
//Puesta a 0
if (!digitalRead(13)) memset(ArduinoDmx0.TxBuffer, 0, 66);
} //end loop()
Quizá al ser un principiante te explote la cabeza al ver lo que acabo de hacer, pero el truco está en que un código de Arduino es básicamente en lenguaje C++; el cual hereda de este último funciones útiles para el manejo de cadenas de caracteres y arrays (las cuales no están documentadas en Arduino aunque sí en el propio C++).
En este caso necesitábamos copiar y borrar arrays, las cuales vienen siendo memcpy y memset respectivamente.
Para poder comprender cómo funcionan estas simplificaciones, primero tendrías que tener claro el concepto de puntero de memoria y qué es un array para la memoria.
PD: lo del setup se discute con el tema de “manipulación de puertos y registros”.