제조공정
| × | 1 | ||||
| × | 1 | ||||
| × | 5 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 2 | ||||
| × | 1 | ||||
| × | 2 | ||||
| × | 6 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 4 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
DMX-512 프로토콜에 의한 테스트 및 조명 쇼를 위한 제어 도구로, 조명의 고정 또는 임시 설치에 대한 빠른 테스트에 이상적입니다. 이 프로젝트는 적대적이거나 접근하기 어려운 외부 환경에 조명 콘솔, 인터페이스 또는 컴퓨터를 설치할 필요 없이 조명 설치에서 신속한 테스트를 위한 휴대용 시스템이 있어야 한다는 필요성에서 비롯되었습니다.
기준:
<울>
하드웨어 v0.4
릴리스 노트...
<울>도식
PCB
시뮬레이터
건설을 시작했습니다...
우리는 페놀 판을 한 번 사용하고 구리 사포 물을 강화하고 원형으로 더 얇게 만듭니다.
Proteus를 사용하면 프리프레스 아세테이트 네거티브를 인쇄하기 위해 파일을 보냅니다(파일이 포함된 PDF가 있음)
그림>감광성 필름의 용도 및 방법
그림>우리는 완벽하게 PCB를 접착하기 위해 종이 라미네이터 필름을 사용합니다.
플레이트와 아세테이트 사이에 물을 조금 넣어 움직이지 않게 하고 UV광을 가합니다
그림> 그림>깨끗하고 준비된 염화 제2철 도포
그림>천공 판
그림>납땜 부품
그림> 그림> 그림>전위차계 가이드로 스트립됨
그림>전위차계를 넣을 페놀 드릴 플레이트
그림>노브를 돌려 패드에 납땜했습니다.
그림> 그림>걸 플레이트의 경우 헤더를 넣어 윗면을 용접하고 핀 위에는 사포로 자른 후 물로 과잉 제거 그림> 그림>
키보드를 플레이트에 부착하기 위해 테이프 이중 테이프를 추가합니다.
그림>여기서 우리는 세부 사항, 키보드의 플렉스로 막힌 헤더, 컷(다음 버전을 고려함)을 접합니다.
그림>키보드 아래에 있는 헤더를 용접하고 뒤로 구부려 키보드를 측면으로 연결
그림> 그림> 그림> 그림>우리는 LCD 보드에 키보드를 배치했습니다. 여기에 세부 사항이 있습니다. MAX485의 베이스는 키보드에 매우 부착되어 있으며 약간 힘을 가합니다(다음 버전에서 고려)
그림> 그림>트랙 사이의 단락을 방지하기 위해 Arduino Mega에 USB 포트에 테이프를 추가합니다.
그림> 그림> 그림>장착된 모든 구성 요소
그림> 그림> 그림> 그림> 그림> 그림> 그림> 그림>Arduino에 펌웨어를 로드합니다.
펌웨어 v1.2
릴리스 노트...
<울>코드
<사전><코드>// ********************************************** ************************************************** *******************************// ***************** ************************************************** ************************************************** ******// ** **// ** 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
<울>
Initial Memory:
Sets the initial values of the RAM, EEPROM read from:
<울>
Control Options:
The user selects the control method of different DMX channels
<울>
Unitary Control
It allows quick access to a specific channel
<울>
Matrix Control
Displays a matrix of 3 x 5 with the current values of different DMX channels
<울>
Chaser Control
Allows a specific sequence between channels
<울>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
<울>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
<울>
Config
Overall system configuration
<울>
약
Displays the "About .." project and the hardware and firmware versions installed
<울>For more Information, updates repository...
섹션> <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">// ***************************************************************************************************************************// ***************************************************************************************************************************// ** **// ** 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.
제조공정
구성품 및 소모품 Arduino UNO × 1 SparkFun 330옴 저항기 4개만 필요합니다 × 1 SparkFun 10k 옴 저항기 4개만 필요합니다 × 1 SparkFun 모듬 LED 다른 색상의 LED 4개가 필요합니다. × 1 SparkFun Mini 스피커 사운드에 신경 쓰지 않는다면 이것 없이도 할 수 있습니다. × 1 SparkFun BreadBoard(전체 크기) × 1 점퍼 와이어(일반) × 1
구성품 및 소모품 Arduino UNO × 1 Adafruit Standard LCD - 파란색 바탕에 16x2 흰색 × 1 SparkFun 푸시버튼 스위치 12mm × 1 Perma-Proto 브레드보드 절반 크기 × 1 점퍼 와이어(일반) × 1 저항 1k 옴 × 1 저항 10k 옴 × 1 저항 470k ohm 1% × 3 저항 680옴 1% × 3