如何利用DMX-512协议实现测试仪控制器的设计

通过dmx-512协议进行测试和灯光显示的控制工具,非常适合对固定或临时照明装置进行快速测试。该项目源于需要有一个用于快速测试照明装置的便携式系统,而无需在外部、敌对或难以访问的环境中安装照明控制台、接口或计算机。
硬件
4x20 lcd 背光和对比度由软件控制
usb、电池或外接电源供电
导航键盘
4x4 键盘
模拟控制电位器
开关机(不适用于usb电源)
来自接线端子、xlr 3 针和 5 针 xlr 的 dmx 输出
输出状态 led dmx
proteus v7.7 sp2 中的模拟
proteus v8.0 sp1 中的原理图和 pcb
示意图
印刷电路板
仿真器
使用酚醛板,加强铜砂纸水,循环变薄
使用 proteus 发送文件以打印印前醋酸盐底片(文件中有 pdf)
感光胶片的用途和方法
使用纸覆膜机薄膜完美粘附 pcb
在板和醋酸盐之间加一点水,使其不会移动并施加紫外线
应用氯化铁清洁并准备好
焊接元件
剥去电位器导轨
酚醛钻孔板放置电位器
我们转动旋钮并将引脚焊接到焊盘上
将它们放在顶部焊接顶部,用砂纸和水切割的销钉上方去除多余的
我们添加胶带双面胶带将键盘连接到板上
在这里有一个细节,头部被键盘的弯曲堵塞,切口
焊接键盘下方的接头并向后弯曲以横向连接键盘
把键盘放在液晶板上,这里有一个细节,max485的底座和键盘很贴合
在 arduino mega 的 usb 端口上添加一些胶带,以防止轨道之间发生短路
所有已安装的组件
我们在 arduino 上加载固件
代码
// ***************************************************************************************************************************
// ***************************************************************************************************************************
// **                                                                                                                        **
// **                                        arduino dmx-512 tester controller                                                **
// **                                                                                                                        **
// **    - firmware v0.6                                                                                                        **
// **    - hardware v0.0 - v0.2                                                                                                **
// **                                                                                                                        **
// **    - compilado en arduino ide v1.0.6                                                                                    **
// **        http://www.arduino.cc/en/main/oldsoftwarereleases                                                                **
// **    - compilado para arduino mega 2560 r3                                                                                **
// **        http://www.arduino.cc/en/main/arduinoboardmega2560                                                                **
// **    - libreria arduino cuatro universos dmx v0.3 - deskontrol.net                                                        **
// **        http://www.deskontrol.net/blog/libreria-arduino-cuatro-universos-dmx/)                                            **
// **    - libreria lcd v1.2.1 - francisco malpartida                                                                        **
// **        https://bitbucket.org/fmalpartida/new-liquidcrystal/wiki/home                                                    **
// **    - simulacion en proteus v7.7 sp2                                                                                    **
// **    - simulacion en proteus de arduino - microcontrolandos                                                                **
// **        http://microcontrolandos.blogspot.mx/2012/12/arduino-componentes-para-o-proteus.html                            **
// **                                                                                                                        **
// **    autor:                                                                                                                **
// **                                                                                                                        **
// **    daniel roberto becerril angeles                                                                                        **
// **    daniel3514@gmail.com                                                                                                **                                                                                                        **
// **    https://github.com/daniel3514/arduino-dmx-512-tester-controller/                                                    **
// **                                                                                                                        **
// **    licenciamiento:                                                                                                        **
// **                                                                                                                        **
// **    gnu general pubic licence version 3                                                                                    **
// **        https://www.gnu.org/copyleft/gpl.html                                                                            **
// **                                                                                                                        **
// ***************************************************************************************************************************
// ***************************************************************************************************************************
null
// librerias
    #include     // libreria para lcd
    #include 
    #include 
    #include 
    #include           // libreria dmx 4 universos deskontrol four universes dmx library  - http://www.deskontrol.net/blog
// dmx library
    #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 ?
null
// puertos, variables
    // dmx
        //int dmx_data_flux         = 2;    // control de flujo de datos para dmx, 0 por default 
        int  dmx_values [515];          // array de valores actuales dmx
        int  canal_actual         = 1;
    // botones cursor
        int  boton_up             = 51; 
        int  boton_down           = 45;    
        int  boton_left           = 53;    
        int  boton_right          = 49;    
        int  boton_center        = 47;    
        byte lcd_col_pos         = 0;    // posicion en tiempo real de lcd
        byte lcd_row_pos         = 0;    // posicion en tiempo real de lcd
        byte cursor_conf[4][20] = {{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},        // config de posiciones de lcd col row
                                   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                                   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
                                   {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}};        
    // botones numerico array
        int  boton_array_1        = 36;
        int  boton_array_2        = 34;
        int  boton_array_3        = 32;
        int  boton_array_4        = 30;
        int  boton_array_a        = 44;    
        int  boton_array_b        = 42;
        int  boton_array_c       = 40;
        int  boton_array_d       = 38;
        byte boton_calc         = 17;    // valor calculado    # e * f, 17 sin valor calculado
        byte num_col_pos          = 0;    // posicion en tiempo real de lcd
        byte num_row_pos         = 0;    // posicion en tiempo real de lcd
        int  num_val            = 0;    // valor generado al calculo
        long boton_delay_teclado = 100;    // delay de lectura de boton
    // potenciometro
        int  pot                = a15;    // entrada de potenciometro
    // lcd
        int  lcd_rs             = 8;    // puertos de conexion de lcd
        int  lcd_e              = 9;
        int  lcd_d4             = 10;
        int  lcd_d5             = 11;
        int  lcd_d6             = 12;
        int  lcd_d7                = 13;
        liquidcrystal lcd(lcd_rs, lcd_e, lcd_d4, lcd_d5, lcd_d6, lcd_d7);  //lcd setup
        int  back_light_pwm        = 3;    // salida para pwm de back light de lcd
        int  contrast_pwm        = 4;    // salida para pwm de contraste de lcd
        byte back_light_on_off    = 0;    // saber si esta encendida o apagada
null
void setup() 
    {
        // dmx
            //pinmode(dmx_data_flux,         output);
        // botones cursor
            pinmode(boton_up,              input_pullup);
            pinmode(boton_down,            input_pullup);
            pinmode(boton_left,            input_pullup);
            pinmode(boton_right,           input_pullup);
            pinmode(boton_center,          input_pullup);
        // botones numerico
            pinmode(boton_array_1,         output);
            pinmode(boton_array_2,         output);
            pinmode(boton_array_3,         output);
            pinmode(boton_array_4,        output);
            pinmode(boton_array_a,         input_pullup);
            pinmode(boton_array_b,         input_pullup);
            pinmode(boton_array_c,         input_pullup);
            pinmode(boton_array_d,         input_pullup);
            digitalwrite(boton_array_1, high);
            digitalwrite(boton_array_2, high);
            digitalwrite(boton_array_3, high);
            digitalwrite(boton_array_4, high);
        // lcd
            pinmode(lcd_rs,             output);
            pinmode(lcd_e,              output);
            pinmode(lcd_d7,             output);
            pinmode(lcd_d6,             output);
            pinmode(lcd_d5,             output);
            pinmode(lcd_d4,             output);
            pinmode(back_light_pwm,        output);
            lcd.begin(20, 4);                            //tamaño de lcd                
        // dmx
            arduinodmx0.set_tx_address(1);              // poner aqui la direccion de inicio de dmx 
            arduinodmx0.set_tx_channels(512);           // poner aqui el numero de canales a transmitir 
            arduinodmx0.init_tx(dmx512);                // iniciar transmision universo 0, modo estandar dmx512
        // no conectados
            pinmode(5, output);
            digitalwrite(5, low);
            pinmode(6, output);
            digitalwrite(6, low);
            pinmode(7, output);
            digitalwrite(7, low);
            pinmode(22, output);
            digitalwrite(22, low);
            pinmode(23, output);
            digitalwrite(23, low);
            pinmode(24, output);
            digitalwrite(24, low);
            pinmode(25, output);
            digitalwrite(25, low);
            pinmode(26, output);
            digitalwrite(26, low);
            pinmode(27, output);
            digitalwrite(27, low);
            pinmode(28, output);
            digitalwrite(28, low);
            pinmode(29, output);
            digitalwrite(29, low);
            pinmode(31, output);
            digitalwrite(31, low);
            pinmode(33, output);
            digitalwrite(33, low);
            pinmode(35, output);
            digitalwrite(35, low);
            pinmode(37, output);
            digitalwrite(37, low);
            pinmode(39, output);
            digitalwrite(39, low);
            pinmode(41, output);
            digitalwrite(41, low);
            pinmode(43, output);
            digitalwrite(43, low);
            pinmode(46, output);
            digitalwrite(46, low);
            pinmode(48, output);
            digitalwrite(48, low);
            pinmode(50, output);
            digitalwrite(50, low);
            pinmode(52, output);
            digitalwrite(52, low);
            pinmode(a0, output);
            digitalwrite(a0, low);
            pinmode(a1, output);
            digitalwrite(a1, low);
            pinmode(a2, output);
            digitalwrite(a2, low);
            pinmode(a3, output);
            digitalwrite(a3, low);
            pinmode(a4, output);
            digitalwrite(a4, low);
            pinmode(a5, output);
            digitalwrite(a5, low);
            pinmode(a6, output);
            digitalwrite(a6, low);
            pinmode(a7, output);
            digitalwrite(a7, low);
            pinmode(a8, output);
            digitalwrite(a8, low);
            pinmode(a9, output);
            digitalwrite(a9, low);
            pinmode(a10, output);
            digitalwrite(a10, low);
            pinmode(a11, output);
            digitalwrite(a11, low);
            pinmode(a12, output);
            digitalwrite(a12, low);
            pinmode(a13, output);
            digitalwrite(a13, low);
            pinmode(a14, output);
            digitalwrite(a14, low);
    }    
null
void loop()
    {
        digitalwrite(2, high);                            // max 485 como salida
        back_light_init();
        contrast_init();
        gui_about();
        gui_memory_init();
    }
null
void back_light_init()
    {
        // ultimo estado del back light
            byte back_light_value = eeprom.read(513);
            analogwrite(back_light_pwm, back_light_value);
            if (back_light_value == 0)
                {
                    back_light_on_off = 0;
                }
            if (back_light_value > 0)
                {
                    back_light_on_off = 1;
                }
    }
void contrast_init()
    {
        // ultimo estado del comtrast
            byte contrast_value = eeprom.read(514);
            analogwrite(contrast_pwm, contrast_value);
    }
void back_light_en()
    {
        byte back_light_value = eeprom.read(513);                // lectura del ultimo valor desde la eeprom, 513 es donde se guarda el valor
        // encender
            if (back_light_on_off == 0)                            // si esta apagada encenderla
                {
                    if (back_light_value == 0)                    // la encendemos de todos modos
                        {
                            analogwrite(back_light_pwm, 127);    // aqui el valor a encender en el caso que se haya establecido apagado el back light
                        }
                    if (back_light_value > 0)
                        {
                            analogwrite(back_light_pwm, back_light_value);    // encender con el valor de la eeprom
                        }
                    back_light_on_off = 1;
                    goto salida;
                }
        // apagar
            if (back_light_on_off == 1)                            // si esta encendida apagarla
                {
                    analogwrite(back_light_pwm, 0);
                    back_light_on_off = 0;
                }
        salida:
            {
                delay(300);                                        // para impedir repeticion del comando
            }
    }
void gui_about()
    {
        byte firm_ver_ent = 0;
        byte firm_ver_dec = 6;
        byte hard_ver_ent = 0;
        byte hard_ver_dec = 0;
        byte id = 20;
        lcd.clear ();
        lcd.noblink();                                    // ocultar cursor
        lcd.setcursor(0, 0);
        for(int numero = 0; numero 498)    // limite de matriz
                                {
                                    num_val = 498;
                                }
                            if (num_val == 0)    // limite de matriz
                                {
                                    num_val = 1;
                                }
                            inicial = num_val;
                            goto inicio;
                        }
                // banco final
                    if (lcd_col_pos == 16 && lcd_row_pos == 0)
                        {
                            num_row_pos = 0;
                            num_col_pos = 17;
                            if (inicial == 1)
                                num_val = 15;
                            else    
                                num_val = inicial - 14;    // para dejar el numero que estaba si no se cambia
                            numerico_calc(0);
                            if (num_val > 512)        // limite de matriz
                                {
                                    inicial = 498;
                                    goto inicio;
                                }
                            if (num_val 255)
                {
                    num_val = 255;
                    numerico_write (255, num_col_pos + 2, num_row_pos);
                }
            arduinodmx0.txbuffer[canal_actual - 1] = num_val;
            dmx_values[canal_actual] = num_val;
            goto banco;        
    }
void cursor_conf_clear()
    {
        for (byte conteo_col = 0; conteo_col , 2 dibujar +
                // lcd back light *
                    digitalwrite(boton_array_1, low);    // lectura linea 1
                        if (digitalread(boton_array_d) == low)
                            {
                                delay(boton_delay_teclado);
                                back_light_en();
                            }
                    digitalwrite(boton_array_1, high);    // lectura linea 1
                // left
                    if (digitalread(boton_left) == low)
                        {
                            delay (boton_delay_cursor);
                            byte salida_left = 0;
                            byte lcd_col_pos_temp = 0;
                            lcd_col_pos_temp = lcd_col_pos;
                            while (salida_left == 0)
                                {
                                    if (lcd_col_pos_temp == 0)
                                        {
                                            lcd_col_pos_temp = 20;
                                        }
                                            lcd_col_pos_temp = lcd_col_pos_temp - 1;
                                    if (cursor_conf[lcd_row_pos][lcd_col_pos_temp] == 1)
                                        {
                                            lcd_col_pos = lcd_col_pos_temp;
                                            dibujar_cursor = 1;
                                            salida_left = 1;
                                        }
                                }
                            goto salida;
                        }
                // right
                    if (digitalread(boton_right) == low)
                        {
                            delay(boton_delay_cursor);
                            byte salida_right = 0;
                            byte lcd_col_pos_temp = 0;
                            lcd_col_pos_temp = lcd_col_pos;
                            while (salida_right == 0)
                                {
                                    lcd_col_pos_temp = lcd_col_pos_temp + 1;
                                    if (lcd_col_pos_temp >= 20)
                                        {
                                            lcd_col_pos_temp = 0;    // regresar al cero
                                        }
                                    if (cursor_conf[lcd_row_pos][lcd_col_pos_temp] == 1)
                                        {
                                            lcd_col_pos = lcd_col_pos_temp;
                                            dibujar_cursor = 1;
                                            salida_right = 1;
                                        }
                                }
                            goto salida;
                        }
                // down
                    if (digitalread(boton_down) == low)
                        {
                            delay(boton_delay_cursor);
                            byte salida_down = 0;
                            byte lcd_row_pos_temp = 0;
                            lcd_row_pos_temp = lcd_row_pos;
                            while (salida_down == 0)
                                {
                                    lcd_row_pos_temp = lcd_row_pos_temp + 1;
                                    if (lcd_row_pos_temp >= 4)
                                        {
                                            lcd_row_pos_temp = 0;    // regresar al cero
                                        }
                                    if (cursor_conf[lcd_row_pos_temp][lcd_col_pos] == 1)
                                        {
                                            lcd_row_pos = lcd_row_pos_temp;
                                            dibujar_cursor = 1;
                                            salida_down = 1;
                                        }
                                }
                            goto salida;
                        }
                // up
                    if (digitalread(boton_up) == low)
                        {
                            delay(boton_delay_cursor);
                            byte salida_up = 0;
                            byte lcd_row_pos_temp;
                            lcd_row_pos_temp = lcd_row_pos;
                            while (salida_up == 0)
                                {
                                    if (lcd_row_pos_temp 0)
                        {
                            if (dibujar_cursor == 1)
                                {
                                    // borra el anterior
                                        lcd.setcursor (lcd_col_pos_ant, lcd_row_pos_ant);
                                        lcd.print( ); 
                                    // escribir >
                                        lcd.setcursor (lcd_col_pos, lcd_row_pos);
                                        lcd.print(>);
                                    // matrix print posicion
                                        if (matrix == 1)
                                            {
                                                // banco inicial
                                                    if (lcd_col_pos == 12 && lcd_row_pos == 0)
                                                        {
                                                            lcd.setcursor(1, 0);
                                                            lcd.print(---);
                                                            goto salida;
                                                        }
                                                // banco  final
                                                    if (lcd_col_pos == 16 && lcd_row_pos == 0)
                                                        {
                                                            lcd.setcursor(1, 0);
                                                            lcd.print(---);
                                                            goto salir;
                                                        }
                                                // memory
                                                    if (lcd_col_pos == 4 && lcd_row_pos == 0)
                                                        {
                                                            lcd.setcursor(1, 0);
                                                            lcd.print(---);
                                                            goto salida;
                                                        }
                                                // unitary
                                                    if (lcd_col_pos == 8 && lcd_row_pos == 0)
                                                        {
                                                            lcd.setcursor(1, 0);
                                                            lcd.print(---);
                                                            goto salida;
                                                        }
                                                // banco 1
                                                    if (lcd_col_pos == 0 && lcd_row_pos == 1)
                                                        {
                                                            numerico_write (banco, 1, 0);
                                                            goto salida;
                                                        }
                                                // banco 2
                                                    if (lcd_col_pos == 4 && lcd_row_pos == 1)
                                                        {
                                                            numerico_write (banco + 1, 1, 0);
                                                            goto salida;
                                                        }
                                                // banco 3
                                                    if (lcd_col_pos == 8 && lcd_row_pos == 1)
                                                        {
                                                            numerico_write (banco + 2, 1, 0);
                                                            goto salida;
                                                        }
                                                // banco 4
                                                    if (lcd_col_pos == 12 && lcd_row_pos == 1)
                                                        {
                                                            numerico_write (banco + 3, 1, 0);
                                                            goto salida;
                                                        }
                                                // banco 5
                                                    if (lcd_col_pos == 16 && lcd_row_pos == 1)
                                                        {
                                                            numerico_write (banco + 4, 1, 0);
                                                            goto salida;
                                                        }
                                                // banco 6
                                                    if (lcd_col_pos == 0 && lcd_row_pos == 2)
                                                        {
                                                            numerico_write (banco + 5, 1, 0);
                                                            goto salida;
                                                        }
                                                // banco 7
                                                    if (lcd_col_pos == 4 && lcd_row_pos == 2)
                                                        {
                                                            numerico_write (banco + 6, 1, 0);
                                                            goto salida;
                                                        }
                                                // banco 8
                                                    if (lcd_col_pos == 8 && lcd_row_pos == 2)
                                                        {
                                                            numerico_write (banco + 7, 1, 0);
                                                            goto salida;
                                                        }
                                                // banco 9
                                                    if (lcd_col_pos == 12 && lcd_row_pos == 2)
                                                        {
                                                            numerico_write (banco + 8, 1, 0);
                                                            goto salida;
                                                        }
                                                // banco 10
                                                    if (lcd_col_pos == 16 && lcd_row_pos == 2)
                                                        {
                                                            numerico_write (banco + 9, 1, 0);
                                                            goto salida;
                                                        }
                                                // banco 11
                                                    if (lcd_col_pos == 0 && lcd_row_pos == 3)
                                                        {
                                                            numerico_write (banco + 10, 1, 0);
                                                            goto salida;
                                                        }
                                                // banco 12
                                                    if (lcd_col_pos == 4 && lcd_row_pos == 3)
                                                        {
                                                            numerico_write (banco + 11, 1, 0);
                                                            goto salida;
                                                        }
                                                // banco 13
                                                    if (lcd_col_pos == 8 && lcd_row_pos == 3)
                                                        {
                                                            numerico_write (banco + 12, 1, 0);
                                                            goto salida;
                                                        }
                                                // banco 14
                                                    if (lcd_col_pos == 12 && lcd_row_pos == 3)
                                                        {
                                                            numerico_write (banco + 13, 1, 0);
                                                            goto salida;
                                                        }
                                                // banco 15
                                                    if (lcd_col_pos == 16 && lcd_row_pos == 3)
                                                        {
                                                            numerico_write (banco + 14, 1, 0);
                                                            goto salida;
                                                        }
                                                // escribir guion de bancos
                                                salida:
                                                    lcd.setcursor(16, 0);
                                                    lcd.print(-);
                                                salir:
                                                    {}
                                            }
                                }
                            else
                                {
                                    // escribir +
                                        lcd.setcursor (lcd_col_pos, lcd_row_pos);
                                        lcd.print(+);
                                }
//salida
                                lcd_col_pos_ant = lcd_col_pos;
                                lcd_row_pos_ant = lcd_row_pos;
                                if (dibujar_cursor == 2)
                                    {
                                        goto salir;
                                    }
                                else    
                                    {
                                        dibujar_cursor = 0;
                                    }
                        }
            goto dibujar;
            salir: {}
    }
null
void gui_memory_init()
    {
        lcd.clear ();
        // texto
            lcd.setcursor (0, 0);
            lcd.print(initial memory:);
            lcd.setcursor (2, 2);
            lcd.print(empty);
            lcd.setcursor (9, 2);
            lcd.print(load);
            lcd.setcursor (15, 2);
            lcd.print(clear);
        // cursor
            lcd_col_pos = 1;            // posicion de cursor
            lcd_row_pos = 2;
        // configuracion de cursor    
            cursor_conf_clear();        // limpiar array
            // acciones
                cursor_conf[2][1]  = 1;    // empty
                cursor_conf[2][8]  = 1; // load
                cursor_conf[2][14] = 1;    // clear
        // navegar
            gui_navegar(0, 0);
        // acciones
            // load
                if (lcd_col_pos == 8 && lcd_row_pos == 2)
                    {
                        eeprom_load();
                        gui_control_options();
                    }
            // clear
                if (lcd_col_pos == 14 && lcd_row_pos == 2)
                    {
                        eeprom_clear();
                        gui_control_options();
                    }
            // empty
                if (lcd_col_pos == 1 && lcd_row_pos == 2)
                    {
                        gui_control_options();
                    }
    }
void gui_memory()
    {
        lcd.clear ();
        // texto
            lcd.setcursor (0, 0);
            lcd.print(memory options:);
            lcd.setcursor (1, 2);
            lcd.print(save);
            lcd.setcursor (1, 3);
            lcd.print(load);
            lcd.setcursor (7, 2);
            lcd.print(empty);
            lcd.setcursor (7, 3);
            lcd.print(clear);
            lcd.setcursor (14, 3);
            lcd.print(cancel);
        // cursor
            lcd_col_pos = 0;            // posicion de cursor
            lcd_row_pos = 2;
        // configuracion de cursor    
            cursor_conf_clear();        // limpiar array
            // acciones
                cursor_conf[2][0]  = 1;    // save
                cursor_conf[3][0]  = 1; // load
                cursor_conf[3][6]  = 1;    // clear
                cursor_conf[2][6]  = 1;    // empty
                cursor_conf[3][13] = 1;    // cancel
        // navegar
            gui_navegar(0, 0);
        // acciones
            // load
                if (lcd_col_pos == 0 && lcd_row_pos == 3)
                    {
                        eeprom_load();
                    }
            // clear
                if (lcd_col_pos == 6 && lcd_row_pos == 3)
                    {
                        eeprom_clear();
                    }
            // save
                if (lcd_col_pos == 0 && lcd_row_pos == 2)
                    {
                        eeprom_save();
                    }
            // empty
                if (lcd_col_pos == 6 && lcd_row_pos == 2)
                    {
                        eeprom_empty();
                    }
            // cancel
                if (lcd_col_pos == 3 && lcd_row_pos == 13)
                    {
null
                    }
    }
null
void eeprom_save()
    {
        lcd.clear ();
        lcd.setcursor (17, 1);
        for(int canal = 1; canal <= 512; canal ++)
            {
                eeprom.write(canal, dmx_values[canal]);                  // lectura desde eeprom
                lcd.print (canal, bin);
            }
        lcd.clear ();
        lcd.setcursor (3, 1);
        lcd.print (memory saved!);
        delay (1000);
    }
void eeprom_load()
    {
        lcd.clear ();
        lcd.setcursor (17, 1);
        for(int canal = 1; canal <= 512; canal ++)
            {
                dmx_values[canal] = eeprom.read(canal);                  // lectura desde eeprom
                arduinodmx0.txbuffer[canal - 1] = dmx_values[canal];     // salida a dmx
                lcd.print (canal, bin);
            }
        lcd.clear ();
        lcd.setcursor (3, 1);
        lcd.print (memory loaded!);
        delay (1000);
    }
void eeprom_empty()
    {
        lcd.clear ();
        lcd.setcursor (17, 1);
        for(int canal = 0; canal 0)
                                    {
                                        back_light_on_off = 1;
                                    }
                            eeprom.write(513, num_val);                // guardar valor nuevo
                            goto navegacion;
                    }
            //contrast value
                if (lcd_col_pos == 14 && lcd_row_pos == 2)
                    {
                        num_row_pos = 2;
                        num_col_pos = 15;
                        numerico_calc (1);
                        if (num_val == 712)
                            {
                                lcd.setcursor (14, 2);
                                lcd.print(a);                                    // indicar que es analogo
                                digitalwrite(boton_array_3, low);                // lectura linea 3
                                lcd.blink();
                                while (digitalread(boton_array_d) == high && digitalread(boton_center) == high) // enter y center para paro
                                    {
                                        num_val = analogread(pot);                // lectura desde el potenciometro
                                        num_val = num_val / 4;                    // / 4 porque es de 12 bits
                                        if (num_val > 149)                        // limite menor de contraste lcd                        
                                            {
                                                numerico_write(num_val, 15, 2);
                                                analogwrite(contrast_pwm, num_val);
                                            }
                                        delay(50);                                // retardo de lectura
                                    }
                                lcd.noblink();
                                digitalwrite(boton_array_3, high);                // lectura linea 3
                                delay(300);                                        // retraso para center    
                                goto salir;
                            }
                        if (num_val > 255)
                            {
                                num_val = 255;
                                numerico_write (255, 15, 2);
                            }
                        if (num_val 512)    // si no es valido
                                    {
                                        lcd.setcursor(13, 0);
                                        lcd.print(error! );
                                        goto siguiente;
                                    }
                            // calcular
                                lcd.setcursor(13, 0);
                                lcd.print(       );
                                long canal;
                                for (long conteo = 1; conteo 512)
                                            {
                                                canal = canal - multiply;
                                                conteo = quantity;
                                            }
                                        lcd.setcursor(17, 0);
                                        lcd.print(canal);
                                        delay (5);
                                        arduinodmx0.txbuffer[canal - 1] = value;
                                        dmx_values[canal] = value;
                                    }
                                lcd.setcursor(13, 0);
                                lcd.print(ok!);
                                goto siguiente;
                        }
                // first channel
                    if (lcd_col_pos == 8 && lcd_row_pos == 1)
                        {
                            num_row_pos = 1;
                            num_col_pos = 9;
                            num_val = first_channel;    // para dejar el numero que estaba si no se cambia
                            numerico_calc(0);
                            first_channel = num_val;
                            if (first_channel == 0)
                                {
                                    first_channel = 1;
                                    numerico_write (first_channel, 9, 1);
                                }
                            if (first_channel > 512)
                                {
                                    first_channel = 512;
                                    numerico_write (first_channel, 9, 1);
                                }
                        }
                // multiply
                    if (lcd_col_pos == 8 && lcd_row_pos == 2)
                        {
                            num_row_pos = 2;
                            num_col_pos = 9;
                            num_val = multiply;            // para dejar el numero que estaba si no se cambia
                            numerico_calc(0);
                            multiply = num_val;
                            if (multiply == 0)
                                {
                                    multiply = 1;
                                    numerico_write (multiply, 9, 2);
                                }
                            if (multiply > 512)
                                {
                                    multiply = 512;
                                    numerico_write (multiply, 9, 2);
                                }
                        }
                // quantity
                    if (lcd_col_pos == 8 && lcd_row_pos == 3)
                        {
                            num_row_pos = 3;
                            num_col_pos = 9;
                            num_val = quantity;            // para dejar el numero que estaba si no se cambia
                            numerico_calc(0);
                            quantity = num_val;
                            if (quantity == 0)
                                {
                                    quantity = 1;
                                    numerico_write (quantity, 9, 3);
                                }
                            if (quantity > 512)
                                {
                                    quantity = 512;
                                    numerico_write (quantity, 9, 3);
                                }
                        }
                // value
                    if (lcd_col_pos == 8 && lcd_row_pos == 0)
                        {
                            num_row_pos = 0;
                            num_col_pos = 9;
                            num_val = value;            // para dejar el numero que estaba si no se cambia
                            numerico_calc(1);
                            value = num_val;
                            if (value > 255)
                                {
                                    value = 255;
                                    numerico_write (value, 9, 0);
                                }
                        }
            goto siguiente;
    }
void gui_control_chaser()
    {
        long delay     = 1;
        long first        = 1;
        long final        = 0;
        iniciar:
            // lcd
                lcd.clear ();
                lcd.setcursor (0, 0);
                lcd.print (chaserch ---);
                lcd.setcursor (3, 1);
                lcd.print (delay    x10=ms);
                lcd.setcursor (0, 2);
                lcd.print (first ch       ctrl);
                lcd.setcursor (0, 3);
                lcd.print (final ch       start);
                numerico_write (delay, 9, 1);
                numerico_write (first, 9, 2);
                numerico_write (final, 9, 3);
            // cursor
                lcd_col_pos = 8;            // posicion de cursor
                lcd_row_pos = 1;
        siguiente:    
            // configuracion de cursor        
                cursor_conf_clear();        // limpiar array
            // acciones
                cursor_conf[1][8]   = 1;    // delay
                cursor_conf[2][8]   = 1;     // first
                cursor_conf[3][8]   = 1;     // final
                cursor_conf[2][14]  = 1;     // control
                cursor_conf[3][14]  = 1;     // start
            // navegar
                gui_navegar(0, 0);
            // acciones
                // control
                    if (lcd_col_pos == 14 && lcd_row_pos == 2)
                        {
                            gui_control_options();
                        }
                // start
                    if (lcd_col_pos == 14 && lcd_row_pos == 3)
                        {
                            long ciclo_longitud = 1300;                            // numero multiplicador aprox para 1 seg
                            long ciclo             = 0;
                            long delay_cont        = 0;
                            int  canal             = first;
                            lcd.setcursor(15,3);
                            lcd.print(stop );
                            // borrar canales previos
                                for(int canales = 0; canales final)
                                                        {
                                                            canal = first;
                                                        }
                                                    numerico_write (canal, 9, 0);
                                                    // apagar lo anterior
                                                        for (long contar = first; contar 512)
                                {
                                    first = 512;
                                    numerico_write (first, 9, 2);
                                }
                        }
                // final
                    if (lcd_col_pos == 8 && lcd_row_pos == 3)
                        {
                            num_row_pos = 3;
                            num_col_pos = 9;
                            num_val = final;    // para dejar el numero que estaba si no se cambia
                            numerico_calc(0);
                            final = num_val;
                            if (final == 0)
                                {
                                    final = 1;
                                    numerico_write (final, 9, 3);
                                }
                            if (final > 512)
                                {
                                    final = 512;
                                    numerico_write (final, 9, 3);
                                }
                        }
            goto siguiente;
    }
void numerico_write (int valor, int col, int row)
    {
        //posicionar el valor en los campos 000
            lcd.setcursor (col, row);
            lcd.print (000);
        if (valor 9 && valor 99)
            {
                lcd.setcursor (col, row);
            }
        lcd.print (valor);
    }
void gui_control_unit()
    {
    inicio:    
        canal_actual = 1;
        // gui
            lcd.clear ();
            lcd.setcursor (0, 0);
            lcd.print (unitary control:);
            lcd.setcursor (14, 2);
            lcd.print (ctrl);
            lcd.setcursor (14, 3);
            lcd.print (memory);
            lcd.setcursor (0, 2);
            lcd.print (channel: 001);
            lcd.setcursor (2, 3);
            lcd.print (value:);
            numerico_write(dmx_values[1], 9, 3);
        // cursor
            lcd_col_pos = 8;        // posicion de cursor
            lcd_row_pos = 2;        // posicion e cursor
        // configuracion de cursor    
            cursor_conf_clear();    // limpiar array
        // cursores
            cursor_conf[2][8]  = 1;    // channel
            cursor_conf[3][8]  = 1;    // value
            cursor_conf[2][13] = 1; // control
            cursor_conf[3][13] = 1;    // memory
        // navegar
    navegacion:
            gui_navegar(0, 0);
        // acciones
            //channel
                if (lcd_col_pos == 8 && lcd_row_pos == 2)
                    {
                        numerico_write(canal_actual, 9, 2);
                        num_row_pos = 2;
                        num_col_pos = 9;
                        num_val = canal_actual;        // para dejar el numero que estaba si no se cambia
                        numerico_calc (0);
                        if (num_val > 512)
                            {
                                num_val = 512;
                                numerico_write (512, 9, 2);
                            }
                        if (num_val 255)
                            {
                                num_val = 255;
                                numerico_write (255, 9, 3);
                            }
                        // escribr valor en dmx
                            arduinodmx0.txbuffer[canal_actual - 1] = num_val;
                            dmx_values[canal_actual] = num_val;
                        goto navegacion;
                    }
            // memory
                if (lcd_col_pos == 13 && lcd_row_pos == 3)
                    {
                        gui_memory();
                        goto inicio;
                    }
            // control
                if (lcd_col_pos == 13 && lcd_row_pos == 2)
                    {
                        gui_control_options();
                    }
            goto navegacion;
    }
void ubicar()
    {
        digitalwrite(boton_array_4, low);
        while (digitalread(boton_array_c) == high)
            {
                arduinodmx0.txbuffer[canal_actual - 1] = 255;
                numerico_write (255, num_col_pos - 2, num_row_pos);
                delay (100);
                arduinodmx0.txbuffer[canal_actual - 1] = 0;
                lcd.setcursor (num_col_pos - 2, num_row_pos);
                lcd.print (   );
                delay (100);
            }
        digitalwrite(boton_array_4, high);
        lcd.setcursor (num_col_pos, num_row_pos);
    }
void numerico_calc(byte value)
    {
    // escritura del numero desde el teclado numerico si value es 1 entra opcion de a 255 y b 0
        byte     salida             = 0;
        int     num_val_temp_1      = 0;
        int     num_val_temp_2      = 0;
        int     num_val_temp_3      = 0;
        lcd.setcursor (num_col_pos, num_row_pos);
        lcd.print(___);
        lcd.blink();                                // mostrar cursor
        //num_val = 0;
        num_col_pos = num_col_pos + 2;
        lcd.setcursor (num_col_pos, num_row_pos);
        // primer numero
            numerico_read();                        // leer boton
            if (boton_calc <= 9)
                {
                    lcd.print (boton_calc);            // escribir valor calculado
                    lcd.setcursor (num_col_pos, num_row_pos);
                    num_val = boton_calc;            // valor calculado
                    num_val_temp_1 = boton_calc;    // valor temporal para el acarreo
                }
            if (boton_calc == 14)                    // enter
                {
                    goto salida;                    // num val = 0        
                }
            if (value == 1)                            // si es un valor
                {
                    if (boton_calc == 10)            // 255
                        {
                            num_val = 255;
                            goto salida;
                        }
                    if (boton_calc == 11)            // 000
                        {
                            num_val = 0;
                            goto salida;
                        }
                    if (boton_calc == 12)            // ubicar
                        {
                            num_val = 612;
                            goto salida_option;
                        }
                    if (boton_calc == 13)            // analogo
                        {
                            num_val = 712;
                            goto salida_option;
                        }
                }
        // segundo numero
            numerico_read();                        // leer boton
            if (boton_calc == 14)                    // enter
                {
                    num_val = num_val_temp_1;    
                    goto salida;                    // num val = num val anterior
                }
            if (value == 1)                            // si es un valor
                {
                    if (boton_calc == 10)            // 255
                        {
                            num_val = 255;
                            goto salida;
                        }
                    if (boton_calc == 11)            // 000
                        {
                            num_val = 0;
                            goto salida;
                        }
                    if (boton_calc == 12)            // ubicar
                        {
                            num_val = 612;
                            goto salida_option;
                        }
                    if (boton_calc == 13)            // analogo
                        {
                            num_val = 712;
                            goto salida_option;
                        }
                }
            if (boton_calc <= 9)
                {
                    // recorrer numero ya impreso
                        num_col_pos = num_col_pos - 1;
                        lcd.setcursor (num_col_pos, num_row_pos);
                        lcd.print (num_val_temp_1);
                    // dibujar numero nuevo
                        lcd.print (boton_calc);
                        num_val_temp_2 = boton_calc;
                        num_col_pos = num_col_pos + 1;
                        lcd.setcursor (num_col_pos, num_row_pos);
                }
        // tercer numero
            numerico_read();                        // leer boton
            if (boton_calc == 14)                    // enter
                {    
                    num_val = (num_val_temp_1 * 10) + num_val_temp_2;
                    goto salida;
                }
            if (value == 1)                            // si es un valor
                {
                    if (boton_calc == 10)            // 255
                        {
                            num_val = 255;
                            goto salida;
                        }
                    if (boton_calc == 11)            // 000
                        {
                            num_val = 0;
                            goto salida;
                        }
                    if (boton_calc == 12)            // ubicar
                        {
                            num_val = 612;
                            goto salida_option;
                        }
                    if (boton_calc == 13)            // analogo
                        {
                            num_val = 712;
                            goto salida_option;
                        }
                }
            if (boton_calc 表示光标在菜单上的位置
“+”和闪烁的光标,数字符号表示需要用户输入
菜单之间的导航由光标向上、向下、向右、向左和居中进行,应用为“输入”
当在需要用户输入的菜单中给出“enter”时,出现“+ ___”并且指示用户输入的闪烁光标,在这种情况下,如果文档编号小于 3 位,则使用小键盘按“#”,其功能为一个“输入”在数字键盘上
如果是用户输入,其中显示了 dmx 通道的值,您可以按(在“回车”后)直接键入“255”(通道的最大值)的键“a”或“b”键你直接输入“000”(一个通道的最小值)
“c”键用作定位灯具或特定通道的方法,只需在值中选择通道位置,“输入”并按“c”,该值将在“000”和“255”之间排序通道, 停止再按一次返回c
“*”键开启或关闭背光
“d”只对模拟电位器数值有效,按键可通过转动输入数值
“ctrl”返回菜单选项“控制选项”
初始:
设置 ram 的初始值,eeprom 读取自:
空(eeprom保持原样不变,所有通道都在“000”)
加载(加载存储在 dmx universe 的 eeprom 中的值)
清除(擦除存储在 eeprom 中的值并保留通道“000”)
控制选项:
用户选择不同dmx通道的控制方式
“内存”访问内存选项
统一快速访问特定频道
“矩阵”显示一个 3 x 5 的矩阵,其中包含不同通道的当前值
“追逐者”在频道之间制作特定的序列
“乘”为特定数量的通道分配一个值,具有特定的数值跳转
“配置”访问系统设置
单一控制
它允许快速访问特定频道
“频道”频道访问
“价值”获取渠道价值
“ctrl” 访问菜单“控制选项”
“内存” 访问“内存选项”菜单
矩阵控制
显示一个 3 x 5 的矩阵,其中包含不同 dmx 通道的当前值
“c ---”从光标处显示所选通道的编号
“内存”访问“内存选项”
“ctrl”访问“控制选项”
“001-015”获取要显示的通道数,以3×5的矩阵形式显示,第一个数字代表第一个通道,第二个到最后一个通道
延迟控制
允许通道之间的特定序列
“chaserch”显示排序的当前值(在序列开始之后)
“延迟”,选择每一步之间的时间量,单位为 ms(毫秒),该值近似于数字 10 = ms 的数量
“first ch”,选择序列的第一个通道
“最后的 ch”。选择序列中的最后一个通道
“ctrl”访问“控制选项”,序列值不影响ram out with old values
“开始”开始序列并切换到“停止”,您可以在此处停止序列
例子:
选择“延迟”100 (100x10 = 1000 ms)、“第一通道”001 和“最后通道”512 结果是从通道 1 到 512 的序列,通道之间的步长每秒
乘法控制
为特定数量的通道分配一个值,并带有特定的数字跳转
“值”选择要写入的值(000-255)
“first ch”选择第一个频道
“乘”选择要相乘的通道数
“数量”选择要乘的次数
“ctrl”访问“控制选项”,ram影响通道
“内存”访问“内存选项”
“应用”评估请求是不可能的应用程序显示消息“错误”,否则应用乘法通道并放置选定的值
例子:
选择“值”= 255,“第一个通道”= 001,“乘”= 003“数量”= 170 和“应用”
结果:从通道 1 到 510 的 170 个通道,3 对 3,值为 255
内存选项
轻松访问 eeprom 选项
“保存”以当前值保存 dmx universe
从先前保存的 dmx universe 的 eeprom 值中“加载”加载
empty 使用当前 dmx 值删除 ram,而不影响 eeprom
“清除”清除存储在 eeprom 中的 dmx 宇宙
“black” 选项 “black out”,将dmx全域的所有通道置“000”,不影响内存,按“enter”或“central”退出,返回上述值
取消(返回上一级菜单,不做任何更改)
配置
整体系统配置
位于“控制选项”
“背光” 选择 lcd 背光的 000-255 之间的调光值
“对比度”选择调光值在150-255 lcd对比度之间(降低150,防止lcd看不到)
“退出”返回上一级菜单
修改后的值自动保存在 eeprom 存储器中

光磊减资15%,蓄力LED感测元件产品
Redmi K20,8G+256G版本仅仅2299元,大容量首选!
小米笔记本Pro15增强版正式发售 售价6999元
阻容降压原理图详解
纸贵区块链的设计原则及应用架构
如何利用DMX-512协议实现测试仪控制器的设计
e络盟凭借其优异表现荣获飞思卡尔半导体颁发的亚太区“2012最佳电子商务零售商”奖项
HCPL-0600-500E详细参数
485中继器
北京移动携手华为在北京师范大学成功开通首个5G基站
驾驭噪声电源
800V高压平台受关注,PI推出集成SiC MOSFET的车规级反激式开关IC
工业交换机使用VLAN的原因 工业交换机的接线步骤
杭州正式开启第二届绽放杯5G应用征集大赛
2019年一季度互联网和相关服务业运行情况
微型热保护器在工业变频器的应用-「安的电子」
欧洲市场是三星手机唯一能看出其全球手机市场老大的根据地市场
openharmony原理 aosp和openharmony关系
极简开发、更易集成,恒高科技即将亮相深圳国际物联网展
想学习单片机经常会问的2个问题详细解答