Arduino DMX512 consulta código

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.

DMX_led_6_canales.ino (19.3 KB)

No me vas a creer lo simplificado que quedaría:

/*************************************************************************************************************
*
*   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”.

Una corrección:

Antes:

PORTC = B00111111;

Ahora:

PORTB = B00111111;

El puerto B es el que maneja los pines del 8 al 13. El puerto C corresponde a las entradas analógicas que evidentemente ya tienes ocupadas.

Muchisimas gracias, me voy a poner a refrescar la memoria, hace años que no programo. En el día lo programo, lo pruebo y mando video de las luces.