산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

Arduino DMX-512 테스터 컨트롤러

구성품 및 소모품

Arduino Mega 2560
× 1
SparkFun 회전 전위차계 - 10k Ohm, 선형
× 1
스위치 푸시 버튼 촉각 단일 극 단일 스로우 오프 순간
× 5
SparkFun Basic 20x4 문자 LCD - 녹색 5V에 검은색
× 1
트랜지스터 2N2222A TO-18 NPN 75볼트 0.6암페어
× 2
키 매트릭스 4x4
× 1
MAX485 저전력, 슬루율 제한 RS-485 /RS-422 트랜시버
× 1
저항 330옴
× 2
저항 1k 옴
× 2
저항 120옴
× 1
3mm LED:녹색
× 2
커패시터 1nF
× 6
나사 3개가 있는 대형 터미널
× 1
나사 2개가 있는 대형 터미널
× 1
슬라이드 1폴, 2샷, 2포지션 전환
× 1
XLR 커넥터 3핀 PCB 실장 Amphenol AC3FAH2-AU-PRE
× 1
XLR 커넥터 5핀 PCB 실장 Amphenol AC5FAH-AU-B
× 1
남성 헤더 40 위치 1 행(0.1")
× 4
15 x 20cm의 페이스 플레이트 페놀
× 1
집적 회로 8핀용 베이스
× 1
감광성 드라이 필름 PCB 30cm*200cm/2m
× 1

이 프로젝트 정보

DMX-512 프로토콜에 의한 테스트 및 조명 쇼를 위한 제어 도구로, 조명의 고정 또는 임시 설치에 대한 빠른 테스트에 이상적입니다. 이 프로젝트는 적대적이거나 접근하기 어려운 외부 환경에 조명 콘솔, 인터페이스 또는 컴퓨터를 설치할 필요 없이 조명 설치에서 신속한 테스트를 위한 휴대용 시스템이 있어야 한다는 필요성에서 비롯되었습니다.

기준:

<울>
  • Arduino Mega 2560 Rev-3
  • <울>
  • Arduino 라이브러리 포 유니버스 DMX v0.3 - Deskontrol
  • <울>
  • Library LCD v1.2.1 - Francisco Malpartida
  • <울>
  • Proteus Simulation의 Arduino - Microcontrolandos
  • 하드웨어 v0.4

    릴리스 노트...

    <울>
  • 펌웨어 v0.9 - v1.3 지원
  • <울>
  • 4x20 LCD(백라이트 및 콘트라스트가 소프트웨어로 제어됨)
  • <울>
  • USB, 배터리 또는 외부 전원 공급 장치의 전원
  • <울>
  • 탐색 키패드
  • <울>
  • 4x4 키패드
  • <울>
  • 아날로그 제어 전위차계
  • <울>
  • 켜기/끄기(USB 전원에는 적용되지 않음)
  • <울>
  • 터미널 블록의 DMX 출력, XLR 3핀 및 5핀 XLR
  • <울>
  • 출력 상태 LED DMX
  • <울>
  • Proteus V7.7 SP2의 시뮬레이션
  • <울>
  • Proteus v8.0 SP1의 회로도 및 PCB
  • 도식

    PCB

    시뮬레이터

    건설을 시작했습니다...

    우리는 페놀 판을 한 번 사용하고 구리 사포 물을 강화하고 원형으로 더 얇게 만듭니다.

    Proteus를 사용하면 프리프레스 아세테이트 네거티브를 인쇄하기 위해 파일을 보냅니다(파일이 포함된 PDF가 있음)

    감광성 필름의 용도 및 방법

    우리는 완벽하게 PCB를 접착하기 위해 종이 라미네이터 필름을 사용합니다.

    플레이트와 아세테이트 사이에 물을 조금 넣어 움직이지 않게 하고 UV광을 가합니다

    깨끗하고 준비된 염화 제2철 도포

    천공 판

    납땜 부품

    전위차계 가이드로 스트립됨

    전위차계를 넣을 페놀 드릴 플레이트

    노브를 돌려 패드에 납땜했습니다.

    걸 플레이트의 경우 헤더를 넣어 윗면을 용접하고 핀 위에는 사포로 자른 후 물로 과잉 제거

    키보드를 플레이트에 부착하기 위해 테이프 이중 테이프를 추가합니다.

    여기서 우리는 세부 사항, 키보드의 플렉스로 막힌 헤더, 컷(다음 버전을 고려함)을 접합니다.

    키보드 아래에 있는 헤더를 용접하고 뒤로 구부려 키보드를 측면으로 연결

    우리는 LCD 보드에 키보드를 배치했습니다. 여기에 세부 사항이 있습니다. MAX485의 베이스는 키보드에 매우 부착되어 있으며 약간 힘을 가합니다(다음 버전에서 고려)

    트랙 사이의 단락을 방지하기 위해 Arduino Mega에 USB 포트에 테이프를 추가합니다.

    장착된 모든 구성 요소

    Arduino에 펌웨어를 로드합니다.

    펌웨어 v1.2

    릴리스 노트...

    <울>
  • 하드웨어 v0.3 - v0.4 지원
  • <울>
  • 쉽고 직관적인 커서 탐색
  • <울>
  • 키패드에서 빠른 값 삽입
  • <울>
  • 아날로그 전위차계에서 값 삽입
  • <울>
  • 메모리 뱅크는 8개의 DMX 유니버스를 저장합니다.
  • <울>
  • EEPROM에서 읽기 시작 DMX 유니버스 사전 선택
  • <울>
  • 시작할 메모리 옵션 선택
  • <울>
  • DMX Control Unitary는 특정 채널을 선택하고 이전 채널과 다음 채널의 값을 보여줍니다.
  • <울>
  • Matrix Control DMX는 표시된 채널 값과 함께 3 x 5 매트릭스를 보여줍니다.
  • <울>
  • Chaser DMX Control은 선택된 시간과 함께 선택된 채널의 시퀀스를 허용합니다.
  • <울>
  • DMX 시퀀서는 선택한 시간으로 EEPROM 메모리에 저장된 유니버스 간의 시퀀싱을 허용합니다.
  • <울>
  • DMX 컨트롤을 곱하면 선택한 채널을 채우는 값을 곱할 수 있습니다.
  • <울>
  • 선택한 채널에서 등기구를 찾는 기능
  • <울>
  • 메모리 옵션에 대한 빠른 액세스
  • <울>
  • 메모리 옵션 저장, 로드, 지우기, 모두 지우기(뱅크 및 빈 RAM 메모리용
  • <울>
  • 8개의 DMX 유니버스 뱅크를 위한 메모리 옵션
  • <울>
  • 기능 블랙아웃
  • <울>
  • LCD 백라이트 조명 제어
  • <울>
  • LCD 대비 제어
  • <울>
  • LCD 백라이트의 키보드 단축키
  • <울>
  • Arduino IDE v1.0.6으로 컴파일
  • <울>
  • Arduino 라이브러리 포 유니버스 DMX v0.3 - Deskontrol.net
  • <울>
  • Library LCD v1.2.1 - Francisco Malpartida
  • 코드

    <사전><코드>// ********************************************** ************************************************** *******************************// ***************** ************************************************** ************************************************** ******// ** **// ** Arduino DMX-512 테스터 컨트롤러 **// ** **// ** - 펌웨어 v0.6 **// ** - 하드웨어 v0.0 - v0.2 **// ** **// ** - Compilado en Arduino IDE v1.0.6 **// ** http://www.arduino.cc/en/Main/OldSoftwareReleases **// * * - 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 **// ** - Proteus de Arduino - Microcontrolandos **// ** http //microcontrolandos.blog spot.mx/2012/12/arduino-componentes-para-o-proteus.html **// ** **// ** 작성자:**// ** **// ** Daniel Roberto Becerril Angeles * *// ** [email protected] ** **// ** https://github.com/daniel3514/Arduino-DMX-512-Tester-Controller/ **// ** **// ** 라이선스:**// ** **// ** GNU 일반 공개 라이선스 버전 3 **// ** https://www.gnu.org/copyleft/gpl.html **// ** **/ / ************************************************* ************************************************** *********************// ************************ ************************************************** *************************************************없는 // 라이브러리 #include // 라이브러리 파라 LCD #include #include #include #include // 라이브러리 DMX 4 universos Deskontrol 네 유니버스 DMX 라이브러리 - http://www.deskontrol.net/blog // DMX 라이브러리 #define DMX512 (0 ) // (250 kbaud - 2 ~ 512 채널) Standard USITT DMX-512 //#define DMX1024 (1) // (500 kbaud - 2 ~ 1024 채널) 완전 비표준 - TESTED ok //#de fine DMX2048 (2) // (1000 kbaud - 2 ~ 2048 채널) 제조업체에서 호출 DMX1000K, DMX 4x 또는 DMX 1M ???null// 푸에르토, 변수 // DMX //int DMX_Data_Flux =2; // dmx의 데이터 제어 제어, 0 또는 기본 int DMX_Values ​​[515]; // 실제 값 배열 DMX int Canal_Actual =1; // 보톤 커서 int Boton_Up =51; 정수 Boton_Down =45; 정수 Boton_Left =53; int Boton_Right =49; int Boton_Center =47; 바이트 LCD_Col_Pos =0; // 실제 위치 LCD 바이트 LCD_Row_Pos =0; // 실제 위치와 LCD 바이트 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 열 행 {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,0}}; // Botones Numerico 배열 int Boton_Array_1 =36; 정수 Boton_Array_2 =34; 정수 Boton_Array_3 =32; 정수 Boton_Array_4 =30; 정수 Boton_Array_A =44; 정수 Boton_Array_B =42; 정수 Boton_Array_C =40; 정수 Boton_Array_D =38; 바이트 Boton_Calc =17; // 용기 계산 # E * F, 17 죄 용기 계산 바이트 Num_Col_Pos =0; // 실시간 위치 실수 LCD 바이트 Num_Row_Pos =0; // 실제 위치와 실시간 위치 int Num_Val =0; // valor Generado al Calculo long Boton_Delay_Teclado =100; // De lectura de boton // Potenciometro int Pot =A15; // 전위차 측정기 // LCD int LCD_RS =8; // LCD에 대한 연결 int LCD_E =9; 정수 LCD_D4 =10; 정수 LCD_D5 =11; 정수 LCD_D6 =12; 정수 LCD_D7 =13; 액정 액정(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7); //LCD 설정 int Back_Light_PWM =3; // LCD 백라이트의 PWM 및 백라이트 int Contrast_PWM =4; // LCD 바이트의 대조를 위한 pwm Back_Light_On_Off =0; // 세이버 시 esta encendida o apagadanullvoid setup() { // DMX //pinMode(DMX_Data_Flux, OUTPUT); // 보톤 커서 pinMode(Boton_Up, INPUT_PULLUP); 핀모드(Boton_Down, INPUT_PULLUP); 핀모드(Boton_Left, INPUT_PULLUP); 핀모드(Boton_Right, INPUT_PULLUP); 핀모드(Boton_Center, INPUT_PULLUP); // 보톤 수치o pinMode(Boton_Array_1, OUTPUT); 핀모드(Boton_Array_2, 출력); 핀모드(Boton_Array_3, 출력); 핀모드(Boton_Array_4, 출력); 핀모드(Boton_Array_A, INPUT_PULLUP); 핀모드(Boton_Array_B, INPUT_PULLUP); 핀모드(Boton_Array_C, INPUT_PULLUP); 핀모드(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 핀모드(LCD_RS, OUTPUT); 핀모드(LCD_E, 출력); 핀모드(LCD_D7, 출력); 핀모드(LCD_D6, 출력); 핀모드(LCD_D5, 출력); 핀모드(LCD_D4, 출력); 핀모드(백라이트_PWM, 출력); lcd.begin(20, 4); // LCD 표시 // DMX ArduinoDmx0.set_tx_address(1); // DMX ArduinoDmx0.set_tx_channels(512); // 전송기 ArduinoDmx0.init_tx(DMX512); // 초기 전송 유니버소 0, 모드 표준 DMX512 // 연결 없음 pinMode(5, OUTPUT); 디지털 쓰기(5, 낮음); 핀모드(6, 출력); 디지털 쓰기(6, 낮음); 핀모드(7, 출력); 디지털 쓰기(7, 낮음); 핀모드(22, 출력); 디지털 쓰기(22, LOW); 핀모드(23, 출력); 디지털 쓰기(23, 낮음); 핀모드(24, 출력); 디지털 쓰기(24, LOW); 핀모드(25, 출력); 디지털 쓰기(25, 낮음); 핀모드(26, 출력); 디지털 쓰기(26, 낮음); 핀모드(27, 출력); 디지털 쓰기(27, 낮음); 핀모드(28, 출력); 디지털 쓰기(28, LOW); 핀모드(29, 출력); 디지털 쓰기(29, 낮음); 핀모드(31, 출력); 디지털 쓰기(31, 낮음); 핀모드(33, 출력); 디지털 쓰기(33, 낮음); 핀모드(35, 출력); 디지털 쓰기(35, 낮음); 핀모드(37, 출력); 디지털 쓰기(37, 낮음); 핀모드(39, 출력); 디지털 쓰기(39, 낮음); 핀모드(41, 출력); 디지털 쓰기(41, 낮음); 핀모드(43, 출력); 디지털 쓰기(43, 낮음); 핀모드(46, 출력); 디지털 쓰기(46, 낮음); 핀모드(48, 출력); 디지털 쓰기(48, 낮음); 핀모드(50, 출력); 디지털 쓰기(50, 낮음); 핀모드(52, 출력); 디지털 쓰기(52, 낮음); 핀모드(A0, 출력); 디지털 쓰기(A0, LOW); 핀모드(A1, 출력); 디지털 쓰기(A1, LOW); 핀모드(A2, 출력); 디지털 쓰기(A2, LOW); 핀모드(A3, 출력); 디지털 쓰기(A3, LOW); 핀모드(A4, 출력); 디지털 쓰기(A4, LOW); 핀모드(A5, 출력); 디지털 쓰기(A5, LOW); 핀모드(A6, 출력); 디지털 쓰기(A6, LOW); 핀모드(A7, 출력); 디지털 쓰기(A7, LOW); 핀모드(A8, 출력); 디지털 쓰기(A8, LOW); 핀모드(A9, 출력); 디지털 쓰기(A9, LOW); 핀모드(A10, 출력); 디지털 쓰기(A10, LOW); 핀모드(A11, 출력); 디지털 쓰기(A11, LOW); 핀모드(A12, 출력); 디지털 쓰기(A12, LOW); 핀모드(A13, 출력); 디지털 쓰기(A13, LOW); 핀모드(A14, 출력); 디지털 쓰기(A14, LOW); } nullvoid 루프() { digitalWrite(2, HIGH); // 최대 485 코모 살리다 Back_Light_Init(); 대비_초기화(); GUI_정보(); GUI_Memory_Init(); }nullvoid Back_Light_Init() { // 백라이트 바이트 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() { // 최대 적중률 바이트 Contrast_Value =EEPROM.read(514); analogWrite(대비_PWM, 대비_값); } 무효 Back_Light_En() { 바이트 Back_Light_Value =EEPROM.read(513); // 최고의 가치를 지닌 강의, 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 deWrite modos (백라이트_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); // 미래의 가치를 인정합니다 } Back_Light_On_Off =1; 고토 살리다; } // apagar if (Back_Light_On_Off ==1) // 현재 상태에서 apagarla { analogWrite(Back_Light_PWM, 0); Back_Light_On_Off =0; } 살리다:{ 지연(300); // para impedir repeticion del comando } } void GUI_About() { byte Firm_Ver_Ent =0; 바이트 Firm_Ver_Dec =6; 바이트 Hard_Ver_Ent =0; 바이트 Hard_Ver_Dec =0; 바이트 ID =20; lcd.clear(); lcd.noBlink(); // 안구 커서 lcd.setCursor(0, 0); for(int numero =0; numero <=512; numero ++) // efecto binario en lcd { lcd.print(숫자, BIN); } lcd.clear(); lcd.setCursor(0, 3); lcd.print("http://goo.gl/kdYlj7"); lcd.setCursor(3, 0); lcd.print("아두이노 DMX-512"); lcd.setCursor(1, 1); lcd.print("테스터 및 컨트롤러"); // 펌웨어 lcd.setCursor(0, 2); lcd.print("V펌"); lcd.print(펌_버전_엔트); lcd.print("."); lcd.print(펌_버전_덱); // 하드웨어 lcd.setCursor(11, 2); lcd.print("하드 v"); lcd.print(Hard_Ver_Ent); lcd.print("."); lcd.print(Hard_Ver_Dec); 지연(2000); //retardo de muestra de mensaje }nullvoid Multi_Matrix(int ​​inicial) { // dibujar banco Numerico_Write(초기, 13, 0); Numerico_Write(초기값 + 14, 17, 0); // 행렬 1 Numerico_Write(DMX_Values[초기], 1, 1); Numerico_Write(DMX_값[초기값 + 1], 5, 1); Numerico_Write(DMX_값[초기값 + 2], 9, 1); Numerico_Write(DMX_값[초기 + 3], 13, 1); Numerico_Write(DMX_값[초기값 + 4], 17, 1); // 행렬 2 Numerico_Write (DMX_Values[initial + 5], 1, 2); Numerico_Write(DMX_값[초기값 + 6], 5, 2); Numerico_Write(DMX_값[초기값 + 7], 9, 2); Numerico_Write(DMX_값[초기값 + 8], 13, 2); Numerico_Write(DMX_값[초기값 + 9], 17, 2); // 행렬 3 Numerico_Write (DMX_Values[initial + 10], 1, 3); Numerico_Write(DMX_값[초기 + 11], 5, 3); Numerico_Write(DMX_값[초기 + 12], 9, 3); Numerico_Write(DMX_값[초기값 + 13], 13, 3); Numerico_Write(DMX_값[초기 + 14], 17, 3); } 무효 GUI_Control_Matrix() { int 초기 =1; 운하_실제 =1; 초기:lcd.clear(); lcd.setCursor(0, 0); lcd.print("c--- Mem Ctr -"); Multi_Matrix(초기); // 커서 LCD_Col_Pos =12; // 커서의 위치 LCD_Row_Pos =0; // 커서 위치 // 커서 설정 Cursor_Conf_Clear(); // limpiar 배열 // 0행 Cursor_Conf[0][4] =1; // 메모리 Cursor_Conf[0][8] =1; // 단위 Cursor_Conf[0][12] =1; // Banco 초기 Cursor_Conf[0][16] =1; // Banco Final // 1행 Cursor_Conf[1][0] =1; Cursor_Conf[1][4] =1; Cursor_Conf[1][8] =1; Cursor_Conf[1][12] =1; Cursor_Conf[1][16] =1; // 2행 Cursor_Conf[2][0] =1; Cursor_Conf[2][4] =1; Cursor_Conf[2][8] =1; Cursor_Conf[2][12] =1; Cursor_Conf[2][16] =1; // 3행 Cursor_Conf[3][0] =1; Cursor_Conf[3][4] =1; Cursor_Conf[3][8] =1; Cursor_Conf[3][12] =1; Cursor_Conf[3][16] =1; // 네이버 Banco:GUI_Navegar(1, 초기); // Acciones // 메모리 if (LCD_Col_Pos ==4 &&LCD_Row_Pos ==0) { GUI_Memory(); 고토 이니시오; } // 제어 if (LCD_Col_Pos ==8 &&LCD_Row_Pos ==0) { GUI_Control_Options(); 고토 이니시오; } // Banco 초기 if (LCD_Col_Pos ==12 &&LCD_Row_Pos ==0) { Num_Row_Pos =0; Num_Col_Pos =13; Num_Val =초기; // 등록된 값을 입력하지 않음 Numerico_Calc(0); if (Num_Val> 498) // 행렬 제한 { Num_Val =498; } if (Num_Val ==0) // 행렬 제한 { Num_Val =1; } 초기 =Num_Val; 고토 이니시오; } // Banco Final if (LCD_Col_Pos ==16 &&LCD_Row_Pos ==0) { Num_Row_Pos =0; Num_Col_Pos =17; if (초기 ==1) Num_Val =15; else Num_Val =초기 - 14; // 등록된 값을 입력하지 않음 Numerico_Calc(0); if (Num_Val> 512) // 행렬 제한 { 초기 =498; 고토 이니시오; } if (Num_Val <15) // 행렬 제한 { 초기 =1; 고토 이니시오; } 초기 =Num_Val - 14; 고토 이니시오; } // 위치 1 if (LCD_Col_Pos ==0 &&LCD_Row_Pos ==1) { Canal_Actual =초기; goto Salida_DMX; } // 위치 2 if (LCD_Col_Pos ==4 &&LCD_Row_Pos ==1) { Canal_Actual =초기 + 1; goto Salida_DMX; } // 위치 3 if (LCD_Col_Pos ==8 &&LCD_Row_Pos ==1) { Canal_Actual =초기 + 2; goto Salida_DMX; } // 위치 4 if (LCD_Col_Pos ==12 &&LCD_Row_Pos ==1) { Canal_Actual =초기 + 3; goto Salida_DMX; } // 위치 5 if (LCD_Col_Pos ==16 &&LCD_Row_Pos ==1) { Canal_Actual =초기 + 4; goto Salida_DMX; } // 위치 6 if (LCD_Col_Pos ==0 &&LCD_Row_Pos ==2) { Canal_Actual =초기 + 5; goto Salida_DMX; } // 위치 7 if (LCD_Col_Pos ==4 &&LCD_Row_Pos ==2) { Canal_Actual =초기 + 6; goto Salida_DMX; } // 위치 8 if (LCD_Col_Pos ==8 &&LCD_Row_Pos ==2) { Canal_Actual =초기 + 7; goto Salida_DMX; } // 위치 9 if (LCD_Col_Pos ==12 &&LCD_Row_Pos ==2) { Canal_Actual =초기값 + 8; goto Salida_DMX; } // 위치 10 if (LCD_Col_Pos ==16 &&LCD_Row_Pos ==2) { Canal_Actual =초기 + 9; goto Salida_DMX; } // 위치 11 if (LCD_Col_Pos ==0 &&LCD_Row_Pos ==3) { Canal_Actual =초기 + 10; goto Salida_DMX; } // 위치 12 if (LCD_Col_Pos ==4 &&LCD_Row_Pos ==3) { Canal_Actual =초기 + 11; goto Salida_DMX; } // 위치 13 if (LCD_Col_Pos ==8 &&LCD_Row_Pos ==3) { Canal_Actual =초기 + 12; goto Salida_DMX; } // 위치 14 if (LCD_Col_Pos ==12 &&LCD_Row_Pos ==3) { Canal_Actual =초기 + 13; goto Salida_DMX; } // 위치 15 if (LCD_Col_Pos ==16 &&LCD_Row_Pos ==3) { Canal_Actual =초기 + 14; goto Salida_DMX; } Salida_DMX:Num_Row_Pos =LCD_Row_Pos; Num_Col_Pos =LCD_Col_Pos + 1; Num_Val =DMX_Values[Canal_Actual]; // 등록된 값을 입력하지 않은 경우 Numerico_Calc(1); if (Num_Val ==612) // 유비카 { 유비카(); Num_Col_Pos =Num_Col_Pos - 4; } if (Num_Val ==712) // analogo { Analog_Read_DMX(Num_Col_Pos - 2, Num_Row_Pos); Num_Col_Pos =Num_Col_Pos - 4; 고토 방코; } 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; 고토 방코; } 무효 Cursor_Conf_Clear() { for (byte Conteo_Col =0; Conteo_Col <=19; Conteo_Col ++) { for (byte Conteo_Row =0; Conteo_Row <=3; Conteo_Row ++) { =Cursor_Conf[]Conteo_Row;] } } } 무효 GUI_Navegar(바이트 행렬, int banco) { long Boton_Delay_Cursor =300; // 보톤 바이트의 강의 지연 LCD_Col_Pos_Ant; // saber el estado anterior para borrar cursor byte LCD_Row_Pos_Ant; // saber el estado anterior para borrar cursor // Guardar valor anterior de row col LCD_Col_Pos_Ant =LCD_Col_Pos; LCD_Row_Pos_Ant =LCD_Row_Pos; // 디뷰자 커서 lcd.setCursor (LCD_Col_Pos, LCD_Row_Pos); lcd.print(">"); // 탐색 Dibujar:바이트 Dibujar_Cursor =0; // saber si dibujar cursor para evitar repeticiones en lcd, 0 no dibujar, 1 dibujar>, 2 dibujar + // LCD 백라이트 * digitalWrite(Boton_Array_1, LOW); // 강의 선형 1 if (digitalRead(Boton_Array_D) ==LOW) { delay(Boton_Delay_Teclado); Back_Light_En(); } 디지털 쓰기(Boton_Array_1, HIGH); // lectura linea 1 // 왼쪽 if (digitalRead(Boton_Left) ==LOW) { delay (Boton_Delay_Cursor); 바이트 Salida_Left =0; 바이트 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; } } 고토 살리다; } // 맞다 if (digitalRead(Boton_Right) ==LOW) { delay(Boton_Delay_Cursor); 바이트 Salida_Right =0; 바이트 LCD_Col_Pos_Temp =0; LCD_Col_Pos_Temp =LCD_Col_Pos; 동안 (Salida_Right ==0) { LCD_Col_Pos_Temp =LCD_Col_Pos_Temp + 1; if (LCD_Col_Pos_Temp> =20) { LCD_Col_Pos_Temp =0; // 다시 정렬 } if (Cursor_Conf[LCD_Row_Pos][LCD_Col_Pos_Temp] ==1) { LCD_Col_Pos =LCD_Col_Pos_Temp; Dibujar_Cursor =1; 살리다_오른쪽 =1; } } 고토 살리다; } // 다운 if (digitalRead(Boton_Down) ==LOW) { delay(Boton_Delay_Cursor); 바이트 Salida_Down =0; 바이트 LCD_Row_Pos_Temp =0; LCD_Row_Pos_Temp =LCD_Row_Pos; 동안 (Salida_Down ==0) { LCD_Row_Pos_Temp =LCD_Row_Pos_Temp + 1; if (LCD_Row_Pos_Temp> =4) { LCD_Row_Pos_Temp =0; // 다시 정렬 } if (Cursor_Conf[LCD_Row_Pos_Temp][LCD_Col_Pos] ==1) { LCD_Row_Pos =LCD_Row_Pos_Temp; Dibujar_Cursor =1; Salida_Down =1; } } 고토 살리다; } // 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) { LCD_Row_Pos_Temp =4; } LCD_Row_Pos_Temp =LCD_Row_Pos_Temp - 1; if (Cursor_Conf[LCD_Row_Pos_Temp][LCD_Col_Pos] ==1) { Dibujar_Cursor =1; LCD_Row_Pos =LCD_Row_Pos_Temp; Salida_Up =1; } } goto Salida; } // Center if (digitalRead(Boton_Center) ==LOW) { delay(Boton_Delay_Cursor); byte Salida_Center =0; while (Salida_Center ==0) { if (Cursor_Conf[LCD_Row_Pos][LCD_Col_Pos] ==1) { Dibujar_Cursor =2; // dibujar + Salida_Center =1; } } } Salida:// Dibujar Cursor if (Dibujar_Cursor> 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:{} }nullvoid 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 } }nullvoid 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!"); 지연(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!"); 지연(1000); } void EEPROM_Empty() { lcd.clear (); lcd.setCursor (17, 1); for(int Canal =0; Canal <=512; Canal ++) { DMX_Values[Canal] =0; // lectura desde EEPROM ArduinoDmx0.TxBuffer[Canal] =0; // salida a DMX lcd.print (Canal, BIN); } lcd.clear (); lcd.setCursor (3, 1); lcd.print ("Memory Emptied!"); 지연(1000); } void EEPROM_Clear() { lcd.clear (); lcd.setCursor (17, 1); for(int Canal =0; Canal <=512; Canal ++) { DMX_Values[Canal] =0; // lectura desde EEPROM ArduinoDmx0.TxBuffer[Canal] =0; // salida a DMX EEPROM.write (Canal, 0); // escritura EEPROM lcd.print (Canal, BIN); } lcd.clear (); lcd.setCursor (3, 1); lcd.print ("Memory Cleaned!"); 지연(1000); } void GUI_Control_Options() { iniciar:// LCD lcd.clear (); lcd.setCursor (0, 0); lcd.print ("Control Options:"); lcd.setCursor (2, 2); lcd.print ("Unitary"); lcd.setCursor (2, 3); lcd.print ("Matrix"); lcd.setCursor (12, 2); lcd.print ("Chaser"); lcd.setCursor (12, 3); lcd.print ("Multiply"); lcd.setCursor (12, 1); lcd.print ("Config"); lcd.setCursor (2, 1); lcd.print ("Memory"); // 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; // Unitary Cursor_Conf[3][1] =1; // Matrix Cursor_Conf[2][11] =1; // Chaser Cursor_Conf[3][11] =1; // Multiply Cursor_Conf[1][11] =1; // Config Cursor_Conf[1][1] =1; // Memory // navegar GUI_Navegar(0, 0); // Acciones // Unitary if (LCD_Col_Pos ==1 &&LCD_Row_Pos ==2) { GUI_Control_Unit(); } // Matrix if (LCD_Col_Pos ==1 &&LCD_Row_Pos ==3) { GUI_Control_Matrix(); } // Chaser if (LCD_Col_Pos ==11 &&LCD_Row_Pos ==2) { GUI_Control_Chaser(); } // Multiply if (LCD_Col_Pos ==11 &&LCD_Row_Pos ==3) { GUI_Control_Multiply(); } // Config if (LCD_Col_Pos ==11 &&LCD_Row_Pos ==1) { GUI_Config(); } // Config if (LCD_Col_Pos ==1 &&LCD_Row_Pos ==1) { GUI_Memory(); goto iniciar; } }nullvoid GUI_Config() { Inicio:byte Back_Light_Value =EEPROM.read(513); byte Contrast_Value =EEPROM.read(514); // GUI lcd.clear (); lcd.setCursor (0, 0); lcd.print ("LCD Config:"); lcd.setCursor (15, 0); lcd.print ("About"); lcd.setCursor (3, 1); lcd.print ("Back Light:"); Numerico_Write(Back_Light_Value, 15, 1); lcd.setCursor (5, 2); lcd.print ("Contrast:"); Numerico_Write(Contrast_Value, 15, 2); lcd.setCursor (15, 3); lcd.print ("Ctrl"); // Cursor LCD_Col_Pos =14; // posicion de cursor LCD_Row_Pos =2; // posicion e cursor // configuracion de cursor Cursor_Conf_Clear(); // limpiar array // Cursores Cursor_Conf[1][14] =1; // Back Light Value Cursor_Conf[2][14] =1; // Contrast Value Cursor_Conf[3][14] =1; // control Cursor_Conf[0][14] =1; // About // navegar Navegacion:GUI_Navegar(0, 0); // Acciones //Back Light Value if (LCD_Col_Pos ==14 &&LCD_Row_Pos ==1) { Num_Row_Pos =1; Num_Col_Pos =15; Numerico_Calc (1); if (Num_Val ==712) { lcd.setCursor (14, 1); 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 Numerico_Write(Num_Val, 15, 1); analogWrite(Back_Light_PWM, Num_Val); delay(50); // retardo de lectura } lcd.noBlink(); digitalWrite(Boton_Array_3, HIGH); // lectura linea 3 delay(300); // retraso para center goto salida; } if (Num_Val> 255) { Num_Val =255; Numerico_Write (255, 15, 1); } analogWrite(Back_Light_PWM, Num_Val); salida:// mecanismo para on off Enable if (Num_Val ==0) { Back_Light_On_Off =0; } if (Num_Val> 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 <150) { Num_Val =150; // limite menor de contraste LCD Numerico_Write (150, 15, 2); } analogWrite(Contrast_PWM, Num_Val); salir:EEPROM.write(514, Num_Val); // guardar valor nuevo goto Navegacion; } // Exit if (LCD_Col_Pos ==14 &&LCD_Row_Pos ==3) { GUI_Control_Options(); goto Navegacion; } // About if (LCD_Col_Pos ==14 &&LCD_Row_Pos ==0) { GUI_About(); while (digitalRead(Boton_Center) ==HIGH) { // esperamos a que se precione enter } delay(300); // retardo para el rebote del boton goto Inicio; } goto Navegacion; }nullvoid GUI_Control_Multiply() { int First_Channel =1; long Multiply =0; long Quantity =0; int Value =255; iniciar:// LCD lcd.clear (); lcd.setCursor (3, 0); lcd.print ("Value"); lcd.setCursor (0, 1); lcd.print ("First CH Ctrl"); lcd.setCursor (0, 2); lcd.print ("Multiply Memory"); lcd.setCursor (0, 3); lcd.print ("Quantity Apply"); Numerico_Write (Value, 9, 0); Numerico_Write (First_Channel, 9, 1); Numerico_Write (Multiply, 9, 2); Numerico_Write (Quantity, 9, 3); // Cursor LCD_Col_Pos =8; // posicion de cursor LCD_Row_Pos =0; Siguiente:// configuracion de cursor Cursor_Conf_Clear(); // limpiar array // Acciones Cursor_Conf[1][8] =1; // first Channel Cursor_Conf[3][8] =1; // quantity Cursor_Conf[2][8] =1; // Multiply Cursor_Conf[1][13] =1; // control Cursor_Conf[2][13] =1; // Memory Cursor_Conf[3][13] =1; // apply Cursor_Conf[0][8] =1; // value // navegar GUI_Navegar(0, 0); // Acciones // Control if (LCD_Col_Pos ==13 &&LCD_Row_Pos ==1) { GUI_Control_Options(); } // Memory if (LCD_Col_Pos ==13 &&LCD_Row_Pos ==2) { GUI_Memory(); goto iniciar; } // Apply if (LCD_Col_Pos ==13 &&LCD_Row_Pos ==3) { // Validar datos long valid =Multiply * Quantity; if (valid> 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 <=Quantity; conteo++) { if (conteo ==1) { canal =First_Channel; } if (conteo !=1) { canal =canal + Multiply; } if (canal> 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 <=512; Canales ++) { DMX_Values[Canales] =0; // lectura desde EEPROM ArduinoDmx0.TxBuffer[Canales] =0; // salida a DMX } while (digitalRead(Boton_Center) ==HIGH) // lectura del boton centro { ciclo =ciclo + 1; if (ciclo ==ciclo_longitud) { Delay_Cont =Delay_Cont + 1; if (Delay_Cont ==Delay) { if (canal> Final) { canal =First; } Numerico_Write (canal, 9, 0); // apagar lo anterior for (long contar =First; contar <=Final; contar ++) { ArduinoDmx0.TxBuffer[contar - 1] =0; DMX_Values[contar] =0; } // encender el siguiente ArduinoDmx0.TxBuffer[canal - 1] =255; DMX_Values[canal] =255; Delay_Cont =0; canal =canal + 1; } ciclo =0; } } lcd.setCursor(15,3); lcd.print("Start"); delay (300); // evita que le gane la descarga del capacitor goto Siguiente; } // Delay if (LCD_Col_Pos ==8 &&LCD_Row_Pos ==1) { Num_Row_Pos =1; Num_Col_Pos =9; Num_Val =Delay; // para dejar el numero que estaba si no se cambia Numerico_Calc(0); Delay =Num_Val; } // First if (LCD_Col_Pos ==8 &&LCD_Row_Pos ==2) { Num_Row_Pos =2; Num_Col_Pos =9; Num_Val =First; // para dejar el numero que estaba si no se cambia Numerico_Calc(0); First =Num_Val; if (First ==0) { First =1; Numerico_Write (First, 9, 2); } if (First> 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 <10) { lcd.setCursor (col + 2, row); } if (valor> 9 &&valor <100) { lcd.setCursor (col + 1, row); } if (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 <1) { Num_Val =1; Numerico_Write (1, 9, 2); } // mostrar valor actual del canal Canal_Actual =Num_Val; Numerico_Write(DMX_Values[Canal_Actual], 9, 3); } // Value if (LCD_Col_Pos ==8 &&LCD_Row_Pos ==3) { Num_Row_Pos =3; Num_Col_Pos =9; Num_Val =DMX_Values[Canal_Actual]; // para dejar el numero que estaba si no se cambia Numerico_Calc (1); if (Num_Val ==612) // ubicar { Ubicar(); } if (Num_Val ==712) // analogo { Analog_Read_DMX(9, 3); goto Navegacion; } 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 <=9) { // recorrer numero ya impreso Num_Col_Pos =Num_Col_Pos - 2; lcd.setCursor (Num_Col_Pos, Num_Row_Pos); lcd.print (Num_Val_Temp_1); lcd.print (Num_Val_Temp_2); // dibujar numero nuevo Num_Col_Pos =Num_Col_Pos + 2; lcd.setCursor (Num_Col_Pos, Num_Row_Pos); lcd.print (Boton_Calc); Num_Val =Boton_Calc + (Num_Val_Temp_1 * 100) + (Num_Val_Temp_2 * 10); } Salida:lcd.noBlink(); // pintar los ceros antes del numero Numerico_Write (Num_Val, Num_Col_Pos - 2, Num_Row_Pos); Num_Col_Pos =Num_Col_Pos - 4; // regresar el cursor a su ligar lcd.setCursor (Num_Col_Pos, Num_Row_Pos); Salida_Option:{ lcd.noBlink(); lcd.setCursor (Num_Col_Pos, Num_Row_Pos); delay(300); // rebote de boton } }nullvoid Numerico_Read() { long Num_Barrido_Time =5; // tiempo entre barrido de keys Boton_Calc =17; // limpiar valor para lectura while (Boton_Calc ==17) // valor calculado # E * F, 17 sin valor calculado { // Barrido // Linea 1 digitalWrite(Boton_Array_1, LOW); // lectura linea 1 // Lectura 1A =1 if (digitalRead(Boton_Array_A) ==LOW) { Boton_Calc =1; delay(Boton_Delay_Teclado); } delay(Num_Barrido_Time); // Lectura 1B =6 if (digitalRead(Boton_Array_B) ==LOW) { Boton_Calc =4; delay(Boton_Delay_Teclado); } delay(Num_Barrido_Time); // Lectura 1C =7 if (digitalRead(Boton_Array_C) ==LOW) { Boton_Calc =7; delay(Boton_Delay_Teclado); } delay(Num_Barrido_Time); // Lectura 1D =* =15 if (digitalRead(Boton_Array_D) ==LOW) { Boton_Calc =15; delay(Boton_Delay_Teclado); } delay(Num_Barrido_Time); digitalWrite(Boton_Array_1, HIGH); // lectura linea 1 // Linea 2 digitalWrite(Boton_Array_2, LOW); // lectura linea 2 // Lectura 2A =2 if (digitalRead(Boton_Array_A) ==LOW) { Boton_Calc =2; delay(Boton_Delay_Teclado); } delay(Num_Barrido_Time); // Lectura 2B =5 if (digitalRead(Boton_Array_B) ==LOW) { Boton_Calc =5; delay(Boton_Delay_Teclado); } delay(Num_Barrido_Time); // Lectura 2C =8 if (digitalRead(Boton_Array_C) ==LOW) { Boton_Calc =8; delay(Boton_Delay_Teclado); } delay(Num_Barrido_Time); // Lectura 2D =0 if (digitalRead(Boton_Array_D) ==LOW) { Boton_Calc =0; delay(Boton_Delay_Teclado); } delay(Num_Barrido_Time); digitalWrite(Boton_Array_2, HIGH); // lectura linea 2 // Linea 3 digitalWrite(Boton_Array_3, LOW); // lectura linea 3 // Lectura 3A =3 if (digitalRead(Boton_Array_A) ==LOW) { Boton_Calc =3; delay(Boton_Delay_Teclado); } delay(Num_Barrido_Time); // Lectura 3B =4 if (digitalRead(Boton_Array_B) ==LOW) { Boton_Calc =6; delay(Boton_Delay_Teclado); } delay(Num_Barrido_Time); // Lectura 3C =9 if (digitalRead(Boton_Array_C) ==LOW) { Boton_Calc =9; delay(Boton_Delay_Teclado); } delay(Num_Barrido_Time); // Lectura 3D =14 if (digitalRead(Boton_Array_D) ==LOW) { Boton_Calc =14; delay(Boton_Delay_Teclado); } delay(Num_Barrido_Time); digitalWrite(Boton_Array_3, HIGH); // lectura linea 3 // Linea 4 digitalWrite(Boton_Array_4, LOW); // lectura linea 4 // Lectura 4A =10 if (digitalRead(Boton_Array_A) ==LOW) { Boton_Calc =10; delay(Boton_Delay_Teclado); } delay(Num_Barrido_Time); // Lectura 4B =11 if (digitalRead(Boton_Array_B) ==LOW) { Boton_Calc =11; delay(Boton_Delay_Teclado); } delay(Num_Barrido_Time); // Lectura 4C =12 if (digitalRead(Boton_Array_C) ==LOW) { Boton_Calc =12; delay(Boton_Delay_Teclado); } delay(Num_Barrido_Time); // Lectura 4D =13 if (digitalRead(Boton_Array_D) ==LOW) { Boton_Calc =13; delay(Boton_Delay_Teclado); } delay(Num_Barrido_Time); digitalWrite(Boton_Array_4, HIGH); // lectura linea 4 // Cursor center "enter" if (digitalRead(Boton_Center) ==LOW) { Boton_Calc =14; delay(Boton_Delay_Teclado); } } } void Analog_Read_DMX(byte col, byte row) { // escritura del numero desde el potenciometro aplica a dmx int read; lcd.setCursor (col - 1, row); lcd.print("a"); // indicar que es analogo digitalWrite(Boton_Array_3, LOW); // lectura linea 3 lcd.blink(); int valores =0; while (digitalRead(Boton_Array_D) ==HIGH &&digitalRead(Boton_Center) ==HIGH) // enter y center para paro { read =analogRead(Pot); // lectura desde el potenciometro read =read / 4; // / 4 porque es de 12 bits delay(50); if (valores !=read) { Numerico_Write(read, col, row); ArduinoDmx0.TxBuffer[Canal_Actual - 1] =read; DMX_Values[Canal_Actual] =read; valores =read; } } lcd.noBlink(); digitalWrite(Boton_Array_3, HIGH); // lectura linea 3 // retraso para center delay(300); // delay para salir de la lectura analoga }

    User Input

    At startup it presents options "Initial Memory", to set the initial values ​​of RAM

    <울>
  • The ">" indicates where the cursor is positioned on the menu
  • <울>
  • The "+" and the blinking cursor, the numerical symbol indicates that user input is expected
  • <울>
  • The navigation between menus are made from the cursor up, down, right, left and center that applies as "enter"
  • <울>
  • When "Enter" is given in a menu that requires user input appears "+ ___" and the blinking cursor indicating the user input, in this case the keypad is used if the document number is less than 3 digits press " # "that functions as an" enter "on the number pad
  • <울>
  • If it is a user entry where the value of a DMX channel is indicated, you can press (after giving "enter") key "A" that you type directly "255" (maximum value of a channel) or the "B" key you type directly "000" (the minimum value of a channel)
  • <울>
  • The "C" key functions as a means for locating a luminaire or a specific channel, just enough to select a channel position in value, to "enter" and press "C", the value would sequence channel between "000 "and" 255 ", to stop press again return to" C "
  • <울>
  • The "*" key on or off the back light
  • <울>
  • The "D" active only for the analog potentiometer values, the key can enter the value by turning
  • <울>
  • The "Ctrl" returns to the menu option "Control Options"
  • Initial Memory:

    Sets the initial values of the RAM, EEPROM read from:

    <울>
  • Empty (EEPROM leave intact unmodified, all channels are in "000")
  • <울>
  • Load (loading the values stored in the EEPROM of the DMX universe)
  • <울>
  • Clear (erase the values stored in the EEPROM and leave the channels "000")
  • Control Options:

    The user selects the control method of different DMX channels

    <울>
  • "Memory" Access memory options
  • <울>
  • "Unitaryquick access to a specific channel
  • <울>
  • "Matrix" display a matrix of 3 x 5 with the current values of the different channels
  • <울>
  • "Chaser" make a specific sequence between channels
  • <울>
  • "Multiply" assign a value to a specific number of channels, with a specific numerical jump
  • <울>
  • "Config" access system settings
  • Unitary Control

    It allows quick access to a specific channel

    <울>
  • "Channel" channel access
  • <울>
  • "Value" access channel value
  • <울>
  • "Ctrl" Accessing the menu "Control Options"
  • <울>
  • "Memory" Access to the menu “Memory Options”
  • Matrix Control

    Displays a matrix of 3 x 5 with the current values of different DMX channels

    <울>
  • "C ---" shows the number of the selected channel from the cursor
  • <울>
  • "Mem" access "Memory Options"
  • <울>
  • "Ctrl" access "Control Options"
  • <울>
  • "001-015" access to the number of channels to be displayed in the matrix of 3 x 5, the first number represents the first channel and the second to the last channel
  • Chaser Control

    Allows a specific sequence between channels

    <울>
  • "ChaserCH" shows the current value sequenced (after the start of sequence)
  • <울>
  • "Delay", select the amount of time in mS (milliseconds) between each step, the value approximates the number by 10 =the number of mS
  • <울>
  • "First CH", select the first channel of the sequence
  • <울>
  • "Final CH". select the last channel in the sequence
  • <울>
  • "Ctrl" access "Control Options", sequenced values do not affect the RAM out with the old values
  • <울>
  • "Start" begins the sequence and switches to "Stop", here you can stop the sequence
  • Example:

    Select "Delay" 100 (100x10 =1000 mS), "First CH" 001 and "Final CH" 512 The result is a sequence from channel 1 to 512 and the step between the channels makes every second

    Multiply Control

    Assign a value to a specific number of channels, with a specific numerical jump

    <울>
  • "Value" selects the value to be written (000-255)
  • <울>
  • "First CH" selects the first channel
  • <울>
  • "Multiply" selects the number of channels to multiply
  • <울>
  • "Quantity" select the number of times to multiply
  • <울>
  • "Ctrl" Access"Control Options", RAM affects channel
  • <울>
  • "Memory" Access "Memory Options"
  • <울>
  • "Apply" Evaluates the request is not possible the application displays the message "Error", otherwise apply multiplication channels and places the selected value
  • Example:

    Select "Value" =255, "First CH" =001, "Multiply" =003 "Quantity" =170 and "Apply"

    The result:170 channels from channel 1 to 510, 3 on 3 with the value 255

    Memory Options

    Easy access to the EEPROM options

    <울>
  • "Save" saves the DMX universe with current values
  • <울>
  • "Load" load from EEPROM values previously saved DMX universe
  • <울>
  • "Empty" Delete RAM with the current DMX values without affecting the EEPROM
  • <울>
  • "Clear" Clear DMX universe stored in the EEPROM
  • <울>
  • "Black" Options "Black Out", puts all channels of DMX universe with "000", without affecting the memory, to exit press "enter" or "central" and returns the above values
  • <울>
  • Cancel (return to the previous menu without changes)
  • Config

    Overall system configuration

    <울>
  • Located in"Control Options"
  • <울>
  • "Backlight" Select dimmer value between 000-255 of the LCD backlight
  • <울>
  • "Contrast" Select dimmer value between 150-255 LCD contrast (lower liite 150, to prevent the LCD not see)
  • <울>
  • "Exit" returns to the previous menu
  • <울>
  • The modified values are saved in EEPROM memory automatic
  • Displays the "About .." project and the hardware and firmware versions installed

    <울>
  • Located in "Config"
  • <울>
  • To exit press "enter" or "center"
  • For more Information, updates repository...

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • DMX_Controller.ino
  • DMX_Controller.inoArduino
    // ***************************************************************************************************************************// ***************************************************************************************************************************// ** **// ** 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.m x/2012/12/arduino-componentes-para-o-proteus.html **// ** **// ** Autor:**// ** **// ** Daniel Roberto Becerril Angeles **// ** [email protected] ** **// ** https://github.com/daniel3514/Arduino-DMX-512-Tester-Controller/ **// ** **// ** Licenciamiento:**// ** **// ** GNU General Pubic Licence Version 3 **// ** https://www.gnu.org/copyleft/gpl.html **// ** **// ***************************************************************************************************************************// ***************************************************************************************************************************// 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 cha nnels) Completely non standard - TESTED ok //#define DMX2048 (2) // (1000 kbaud - 2 to 2048 channels) called by manufacturers DMX1000K, DMX 4x or DMX 1M ???// 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 apagadavoid 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); //tamao 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); 핀모드(33, 출력); 디지털 쓰기(33, 낮음); 핀모드(35, 출력); 디지털 쓰기(35, 낮음); 핀모드(37, 출력); 디지털 쓰기(37, 낮음); 핀모드(39, 출력); 디지털 쓰기(39, 낮음); 핀모드(41, 출력); 디지털 쓰기(41, 낮음); 핀모드(43, 출력); 디지털 쓰기(43, 낮음); 핀모드(46, 출력); 디지털 쓰기(46, 낮음); 핀모드(48, 출력); 디지털 쓰기(48, 낮음); 핀모드(50, 출력); 디지털 쓰기(50, 낮음); 핀모드(52, 출력); 디지털 쓰기(52, 낮음); pinMode(A0, OUTPUT); 디지털 쓰기(A0, LOW); pinMode(A1, OUTPUT); 디지털 쓰기(A1, LOW); pinMode(A2, OUTPUT); 디지털 쓰기(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); 핀모드(A8, 출력); 디지털 쓰기(A8, LOW); 핀모드(A9, 출력); 디지털 쓰기(A9, LOW); 핀모드(A10, 출력); 디지털 쓰기(A10, LOW); 핀모드(A11, 출력); 디지털 쓰기(A11, LOW); 핀모드(A12, 출력); 디지털 쓰기(A12, LOW); 핀모드(A13, 출력); 디지털 쓰기(A13, LOW); 핀모드(A14, 출력); 디지털 쓰기(A14, LOW); } void loop() { digitalWrite(2, HIGH); // max 485 como salida Back_Light_Init(); Contrast_Init(); GUI_About(); GUI_Memory_Init(); }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 <=512; numero ++) // efecto binario en lcd { lcd.print (numero, BIN); } lcd.clear (); lcd.setCursor(0, 3); lcd.print("http://goo.gl/kdYlj7"); lcd.setCursor(3, 0); lcd.print("Arduino DMX-512"); lcd.setCursor(1, 1); lcd.print("Tester &Controller"); // Firmware lcd.setCursor(0, 2); lcd.print("Firm v"); lcd.print(Firm_Ver_Ent); lcd.print("."); lcd.print(Firm_Ver_Dec); // Hardware lcd.setCursor(11, 2); lcd.print("Hard v"); lcd.print(Hard_Ver_Ent); lcd.print("."); lcd.print(Hard_Ver_Dec); 지연(2000); //retardo de muestra de mensaje }void Multi_Matrix(int inicial) { // dibujar banco Numerico_Write (inicial, 13, 0); Numerico_Write (inicial + 14, 17, 0); // matrix 1 Numerico_Write (DMX_Values[inicial], 1, 1); Numerico_Write (DMX_Values[inicial + 1], 5, 1); Numerico_Write (DMX_Values[inicial + 2], 9, 1); Numerico_Write (DMX_Values[inicial + 3], 13, 1); Numerico_Write (DMX_Values[inicial + 4], 17, 1); // matrix 2 Numerico_Write (DMX_Values[inicial + 5], 1, 2); Numerico_Write (DMX_Values[inicial + 6], 5, 2); Numerico_Write (DMX_Values[inicial + 7], 9, 2); Numerico_Write (DMX_Values[inicial + 8], 13, 2); Numerico_Write (DMX_Values[inicial + 9], 17, 2); // matrix 3 Numerico_Write (DMX_Values[inicial + 10], 1, 3); Numerico_Write (DMX_Values[inicial + 11], 5, 3); Numerico_Write (DMX_Values[inicial + 12], 9, 3); Numerico_Write (DMX_Values[inicial + 13], 13, 3); Numerico_Write (DMX_Values[inicial + 14], 17, 3); } void GUI_Control_Matrix() { int Inicial =1; Canal_Actual =1; inicio:lcd.clear(); lcd.setCursor (0, 0); lcd.print("c--- Mem Ctr -"); Multi_Matrix (Inicial); // Cursor LCD_Col_Pos =12; // posicion de cursor LCD_Row_Pos =0; // posicion e cursor // configuracion de cursor Cursor_Conf_Clear(); // limpiar array // Row 0 Cursor_Conf[0][4] =1; // Memory Cursor_Conf[0][8] =1; // Unit Cursor_Conf[0][12] =1; // Banco Inicial Cursor_Conf[0][16] =1; // Banco Final // Row 1 Cursor_Conf[1][0] =1; Cursor_Conf[1][4] =1; Cursor_Conf[1][8] =1; Cursor_Conf[1][12] =1; Cursor_Conf[1][16] =1; // Row 2 Cursor_Conf[2][0] =1; Cursor_Conf[2][4] =1; Cursor_Conf[2][8] =1; Cursor_Conf[2][12] =1; Cursor_Conf[2][16] =1; // Row 3 Cursor_Conf[3][0] =1; Cursor_Conf[3][4] =1; Cursor_Conf[3][8] =1; Cursor_Conf[3][12] =1; Cursor_Conf[3][16] =1; // navegar Banco:GUI_Navegar(1, Inicial); // Acciones // Memory if (LCD_Col_Pos ==4 &&LCD_Row_Pos ==0) { GUI_Memory(); goto inicio; } // Control if (LCD_Col_Pos ==8 &&LCD_Row_Pos ==0) { GUI_Control_Options(); goto inicio; } // Banco Inicial if (LCD_Col_Pos ==12 &&LCD_Row_Pos ==0) { Num_Row_Pos =0; Num_Col_Pos =13; Num_Val =Inicial; // para dejar el numero que estaba si no se cambia Numerico_Calc(0); if (Num_Val> 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 <15) // limite de matriz { Inicial =1; goto inicio; } Inicial =Num_Val - 14; goto inicio; } // posicion 1 if (LCD_Col_Pos ==0 &&LCD_Row_Pos ==1) { Canal_Actual =Inicial; goto Salida_DMX; } // posicion 2 if (LCD_Col_Pos ==4 &&LCD_Row_Pos ==1) { Canal_Actual =Inicial + 1; goto Salida_DMX; } // posicion 3 if (LCD_Col_Pos ==8 &&LCD_Row_Pos ==1) { Canal_Actual =Inicial + 2; goto Salida_DMX; } // posicion 4 if (LCD_Col_Pos ==12 &&LCD_Row_Pos ==1) { Canal_Actual =Inicial + 3; goto Salida_DMX; } // posicion 5 if (LCD_Col_Pos ==16 &&LCD_Row_Pos ==1) { Canal_Actual =Inicial + 4; goto Salida_DMX; } // posicion 6 if (LCD_Col_Pos ==0 &&LCD_Row_Pos ==2) { Canal_Actual =Inicial + 5; goto Salida_DMX; } // posicion 7 if (LCD_Col_Pos ==4 &&LCD_Row_Pos ==2) { Canal_Actual =Inicial + 6; goto Salida_DMX; } // posicion 8 if (LCD_Col_Pos ==8 &&LCD_Row_Pos ==2) { Canal_Actual =Inicial + 7; goto Salida_DMX; } // posicion 9 if (LCD_Col_Pos ==12 &&LCD_Row_Pos ==2) { Canal_Actual =Inicial + 8; goto Salida_DMX; } // posicion 10 if (LCD_Col_Pos ==16 &&LCD_Row_Pos ==2) { Canal_Actual =Inicial + 9; goto Salida_DMX; } // posicion 11 if (LCD_Col_Pos ==0 &&LCD_Row_Pos ==3) { Canal_Actual =Inicial + 10; goto Salida_DMX; } // posicion 12 if (LCD_Col_Pos ==4 &&LCD_Row_Pos ==3) { Canal_Actual =Inicial + 11; goto Salida_DMX; } // posicion 13 if (LCD_Col_Pos ==8 &&LCD_Row_Pos ==3) { Canal_Actual =Inicial + 12; goto Salida_DMX; } // posicion 14 if (LCD_Col_Pos ==12 &&LCD_Row_Pos ==3) { Canal_Actual =Inicial + 13; goto Salida_DMX; } // posicion 15 if (LCD_Col_Pos ==16 &&LCD_Row_Pos ==3) { Canal_Actual =Inicial + 14; goto Salida_DMX; } Salida_DMX:Num_Row_Pos =LCD_Row_Pos; Num_Col_Pos =LCD_Col_Pos + 1; Num_Val =DMX_Values[Canal_Actual]; // para dejar el numero que estaba si no se cambia Numerico_Calc(1); if (Num_Val ==612) // ubicar { Ubicar(); Num_Col_Pos =Num_Col_Pos - 4; } if (Num_Val ==712) // analogo { Analog_Read_DMX(Num_Col_Pos - 2, Num_Row_Pos); Num_Col_Pos =Num_Col_Pos - 4; goto Banco; } 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 <=19; Conteo_Col ++) { for (byte Conteo_Row =0; Conteo_Row <=3; Conteo_Row ++) { Cursor_Conf[Conteo_Row][Conteo_Col] =0; } } } void GUI_Navegar(byte matrix, int banco) { long Boton_Delay_Cursor =300; // delay de lectura de boton byte LCD_Col_Pos_Ant; // saber el estado anterior para borrar cursor byte LCD_Row_Pos_Ant; // saber el estado anterior para borrar cursor // guardar valor anterior de row col LCD_Col_Pos_Ant =LCD_Col_Pos; LCD_Row_Pos_Ant =LCD_Row_Pos; // Dibujar cursor lcd.setCursor (LCD_Col_Pos, LCD_Row_Pos); lcd.print(">"); // navegacion Dibujar:byte Dibujar_Cursor =0; // saber si dibujar cursor para evitar repeticiones en lcd, 0 no dibujar, 1 dibujar>, 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) { LCD_Row_Pos_Temp =4; } LCD_Row_Pos_Temp =LCD_Row_Pos_Temp - 1; if (Cursor_Conf[LCD_Row_Pos_Temp][LCD_Col_Pos] ==1) { Dibujar_Cursor =1; LCD_Row_Pos =LCD_Row_Pos_Temp; Salida_Up =1; } } goto Salida; } // Center if (digitalRead(Boton_Center) ==LOW) { delay(Boton_Delay_Cursor); byte Salida_Center =0; while (Salida_Center ==0) { if (Cursor_Conf[LCD_Row_Pos][LCD_Col_Pos] ==1) { Dibujar_Cursor =2; // dibujar + Salida_Center =1; } } } Salida:// Dibujar Cursor if (Dibujar_Cursor> 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:{} }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) { } }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!"); 지연(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!"); 지연(1000); } void EEPROM_Empty() { lcd.clear (); lcd.setCursor (17, 1); for(int Canal =0; Canal <=512; Canal ++) { DMX_Values[Canal] =0; // lectura desde EEPROM ArduinoDmx0.TxBuffer[Canal] =0; // salida a DMX lcd.print (Canal, BIN); } lcd.clear (); lcd.setCursor (3, 1); lcd.print ("Memory Emptied!"); 지연(1000); } void EEPROM_Clear() { lcd.clear (); lcd.setCursor (17, 1); for(int Canal =0; Canal <=512; Canal ++) { DMX_Values[Canal] =0; // lectura desde EEPROM ArduinoDmx0.TxBuffer[Canal] =0; // salida a DMX EEPROM.write (Canal, 0); // escritura EEPROM lcd.print (Canal, BIN); } lcd.clear (); lcd.setCursor (3, 1); lcd.print ("Memory Cleaned!"); delay (1000);...This file has been truncated, please download it to see its full contents.
    Repository
    https://github.com/daniel3514/Arduino-DMX-512-Tester-Controller

    맞춤형 부품 및 인클로저

    Repository
    https://github.com/daniel3514/Arduino-DMX-512-Tester-Controller DMX%20Controller%20v01%20-%20Proteus%2080.pdsprj

    회로도

    Repository
    https://github.com/daniel3514/Arduino-DMX-512-Tester-Controller

    제조공정

    1. 웹 운영 DMX 컨트롤러
    2. NeoPixel Ring으로 재미있는 자이로스코프
    3. Arduino 게임 컨트롤러
    4. Unopad - Ableton이 포함된 Arduino MIDI 컨트롤러
    5. Pixie:Arduino 기반 NeoPixel 손목시계
    6. Firmata 및 Xbox One 컨트롤러를 사용하여 Arduino Rover 제어
    7. 진공 형광 디스플레이 컨트롤러
    8. Arduino를 사용한 음성 인식 및 합성
    9. Alexa에 의해 활성화된 Arduino 홈 컨트롤러
    10. 모바일 원격 감시 카메라