MANIPULADOR ELETRONICO ARDUINO CW IAMBICO
por:
De desenvolvedores para desenvolvedores. Dicas e utilidades rápidas para sua caixa de ferramentas de desenvolvimento.
terça-feira, 24 de novembro de 2015
Arduino - Manipulador eletrônico automático, com memória (Arduino's CW keyer)
Atendendo a pedidos, Manipulador Eletrônico de CW (telegrafia), demonstrado no vídeo de meu canal:
Bibliotecas:
timerOne
LiquidCrystal
Inseri abaixo, o código fonte compĺeto.
Bibliotecas:
timerOne
LiquidCrystal
Inseri abaixo, o código fonte compĺeto.
#include <LiquidCrystal.h> #include <EEPROM.h> #include <TimerOne.h> // //variavais de controle // int ditTime = 100; //tempo do ponto int dashTime = ditTime * 3; //tempo do traco (ponto * 3) int spaceLetter = dashTime; //espaco entre letras int space = ditTime; //espaco entre pontos e tracos qeu compoem mesma letra int spaceWord = ditTime * 7; //espaco entre palavras // int intervaloBeacon = 2000; //tempo default de espera de interacao do beacon // boolean isAutomatico = false; boolean interacoes = false; // portas e configuracoes de hardware // LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //pinos do display LCD // int teclaTraco = 8; int teclaPonto = 9; // int chave1 = A1; int chave2 = A2; // // int saida = 13; //saida para circuito Rele int saida2 = 7; // //variaveis de controle EEPROM int tamanhoMemoria = 512; char t; int address = 0; byte value; // //variaveis de tela do editor // // int i = 0; //cariavel do cursor do seletor de texto de memoria int c = 0; //varicavel cursor de LCD para display texto // char v; //char para conversao do inteiro em char e exibicao no LCD String out = String(""); //saida de texto para gravaçao na memoria // //vetor de inteiros representando letras e caracteres, //para exibicao na tela LCD no modo de edicao int vetorCaracteres[] = { 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90,48, 49, 50, 51, 52, 53, 54, 55, 56,57,32}; // // //variaveis de tela de boas vindas // String splash1 = String("Chave Automatica"); String splash2 = String("Bem Vindo! v:1.0"); // int tempoSplashScreen = 3000; // // //Variaveis de comparacao e controle de dados //String que sera concatenada String str = String(""); boolean done = false; int index = 0; boolean isMenuAtivo = false; // // String txt = String(""); String morse = String(""); // const String A = String(".-"); const String B = String("-..."); const String C = String("-.-."); const String D = String("-.."); const String E = String("."); const String F = String("..-."); const String G = String("--."); const String H = String("...."); const String I = String(".."); const String J = String(".---"); const String K = String("-.-"); const String L = String(".-.."); const String M = String("--"); const String N = String("-."); const String O = String("---"); const String P = String(".--."); const String Q = String("--.-"); const String R = String(".-."); const String S = String("..."); const String T = String("-"); const String U = String("..-"); const String V = String("...-"); const String W = String(".--"); const String X = String("-..-"); const String Y = String("-.--"); const String Z = String("--.."); // const String zero = String("-----"); const String um = String(".----"); const String dois = String("..---"); const String tres = String("...--"); const String quatro = String("....-"); const String cinco = String("....."); const String seis = String("-...."); const String sete = String("--..."); const String oito = String("---.."); const String nove = String("----."); // // // const String _A = String("A"); const String _B = String("B"); const String _C = String("C"); const String _D = String("D"); const String _E = String("E"); const String _F = String("F"); const String _G = String("G"); const String _H = String("H"); const String _I = String("I"); const String _J = String("J"); const String _K = String("K"); const String _L = String("L"); const String _M = String("M"); const String _N = String("N"); const String _O = String("O"); const String _P = String("P"); const String _Q = String("Q"); const String _R = String("R"); const String _S = String("S"); const String _T = String("T"); const String _U = String("U"); const String _V = String("V"); const String _W = String("W"); const String _X = String("X"); const String _Y = String("Y"); const String _Z = String("Z"); // const String _0 = String("0"); const String _1 = String("1"); const String _2 = String("2"); const String _3 = String("3"); const String _4 = String("4"); const String _5 = String("5"); const String _6 = String("6"); const String _7 = String("7"); const String _8 = String("8"); const String _9 = String("9"); // //metodo executado pela interrupcao, busca leitura do potenciometro com o objetivo de ajustar a velocidade void potenciometro(){ int sensorValue = analogRead(0); ditTime = sensorValue *0.2; dashTime = ditTime * 3; dashTime = ditTime * 3; //tempo do traco (ponto * 3) spaceLetter = dashTime; //espaco entre letras space = ditTime; //espaco entre pontos e tracos qeu compoem mesma letra spaceWord = ditTime * 7; //espaco entre palavras // //caso qualquer paddle seja pressionado, retorna ao modo manual e limpa a tela if((isAutomatico && (digitalRead(teclaTraco) == HIGH)) || (isAutomatico && (digitalRead(teclaPonto) == HIGH))){ isAutomatico = false; lcd.clear(); } if((digitalRead(chave2)==HIGH)&&(digitalRead(chave1)==HIGH)){ delay(1000); if((digitalRead(chave2)==HIGH)&&(digitalRead(chave1)==HIGH)){ isAutomatico = false; loop(); } } } void setup(){ Timer1.initialize(1600000); Timer1.attachInterrupt(potenciometro); // lcd.begin(16, 2); mostraSplashScreen(); // //Serial.begin(9600); // pinMode(chave1, INPUT); pinMode(chave2, INPUT); // pinMode(teclaTraco, INPUT); pinMode(teclaPonto, INPUT); // pinMode(saida, OUTPUT); // ///leitura(); } void loop(){ //leitura(); // // if(digitalRead(chave1)==HIGH){ delay(300); exibeMenu(); } else //ROTINA AUTO/MANUAL if(isAutomatico){ beacon(); } else{ checa(); } } void ajustaTempoBeacon(){ lcd.clear(); lcd.setCursor(0,1); lcd.print("Tmp.Esper.Beac."); while(true){ lcd.setCursor(0,0); lcd.print(intervaloBeacon/1000); lcd.print(" Segundos."); if(digitalRead(teclaTraco)==HIGH){ delay(100); lcd.setCursor(0,0); lcd.print(intervaloBeacon/1000); lcd.print(" Segundos."); delay(500); if(intervaloBeacon==10000){ intervaloBeacon = intervaloBeacon; } else { intervaloBeacon = intervaloBeacon + 1000; } } else if(digitalRead(teclaPonto)==HIGH){ delay(100); lcd.setCursor(0,0); lcd.print(intervaloBeacon/1000); lcd.print(" Segundos."); delay(500); if(intervaloBeacon==1000){ intervaloBeacon = intervaloBeacon; } else{ intervaloBeacon = intervaloBeacon - 1000; } } if(digitalRead(chave1)==HIGH){ delay(100); if(digitalRead(chave1)==LOW){ lcd.clear(); lcd.setCursor(0,0); lcd.print("Beacon = " + (intervaloBeacon/1000)); delay(1000); isAutomatico=false; loop(); break; //sai do metodo } } } } void exibeMenu(){ int indiceMenu = 0; int totalMenu = 4; isMenuAtivo= true; lcd.clear(); menu(indiceMenu); while(isMenuAtivo){ if(digitalRead(teclaTraco)==HIGH){ delay(700); indiceMenu++; if(indiceMenu>totalMenu){ indiceMenu = totalMenu; } menu(indiceMenu); } else if(digitalRead(teclaPonto)==HIGH){ delay(700); indiceMenu--; if(indiceMenu<0){ indiceMenu = 0; } menu(indiceMenu); } else if(digitalRead(chave2)==HIGH){ delay(10); if(digitalRead(chave2)==LOW){ break; //sai do menu } } else if(digitalRead(chave1)==HIGH){ delay(100); switch(indiceMenu){ case 1: if(isMenuAtivo){ isAutomatico = true; beacon(); isMenuAtivo= false; } break; case 2: if(isMenuAtivo){ ajustaTempoBeacon(); isMenuAtivo= true; } break; case 3: if(isMenuAtivo){ isMenuAtivo= false; //MENU ESCREVE TEXTO MEMORIA textoMemorizar(); isMenuAtivo= true; } break; case 4: if(isMenuAtivo){ isMenuAtivo= false; } break; default: isMenuAtivo = true; break; } } //lcd.setCursor(0,0); //lcd.print(indiceMenu); } lcd.clear(); return; } void menu(int m){ lcd.clear(); lcd.setCursor(0,0); lcd.print(" *** MENU *** "); switch(m){ case 0: lcd.setCursor(0,1); lcd.print(""); break; case 1: lcd.setCursor(0,1); lcd.print("-Iniciar Beacon"); break; case 2: lcd.setCursor(0,1); lcd.print("-Tempo Beacon"); break; case 3: lcd.setCursor(0,1); lcd.print("-Gravar Memoria"); break; //case 3: // lcd.setCursor(0,1); // lcd.print("-Apagar Memoria"); // break; case 4: lcd.setCursor(0,1); lcd.print("-Voltar"); break; } } void beacon(){ leitura(); lcd.clear(); lcd.setCursor(3,1); lcd.print("... TX ..."); lcd.setCursor(0,0); comparaTexto(); delay(10); espaco(); delay(10); // index = 0; // delay(10); // lcd.clear(); lcd.setCursor(1,1); lcd.print("Aguardando..."); // delay(1000); lcd.clear(); lcd.setCursor(0,0); } void emiteMorse(String m){ if(isAutomatico){ for(int j=0;j<m.length();j++){ if(m.charAt(j)=='.'){ ponto(); } else if (m.charAt(j)=='-'){ traco(); } else{ espaco(); } } } else{ return; } } void comparaTexto(){ //lcd.print(txt); if(isAutomatico){ for(int i =0; i<txt.length(); i++){ limpaLcd(); index++; if(txt.charAt(i)==_A.charAt(0)){ lcd.print(_A); emiteMorse(A); } else if(txt.charAt(i)==_B.charAt(0)){ lcd.print(_B); emiteMorse(B); } else if(txt.charAt(i)==_C.charAt(0)){ lcd.print(_C); emiteMorse(C); } else if(txt.charAt(i)==_D.charAt(0)){ lcd.print(_D); emiteMorse(D); } else if(txt.charAt(i)==_E.charAt(0)){ lcd.print(_E); emiteMorse(E); } else if(txt.charAt(i)==_F.charAt(0)){ lcd.print(_F); emiteMorse(F); } else if(txt.charAt(i)==_G.charAt(0)){ lcd.print(_G); emiteMorse(G); } else if(txt.charAt(i)==_H.charAt(0)){ lcd.print(_H); emiteMorse(H); } else if(txt.charAt(i)==_I.charAt(0)){ lcd.print(_I); emiteMorse(I); } else if(txt.charAt(i)==_J.charAt(0)){ lcd.print(_J); emiteMorse(J); } else if(txt.charAt(i)==_K.charAt(0)){ lcd.print(_K); emiteMorse(K); } else if(txt.charAt(i)==_L.charAt(0)){ lcd.print(_L); emiteMorse(L); } else if(txt.charAt(i)==_M.charAt(0)){ lcd.print(_M); emiteMorse(M); } else if(txt.charAt(i)==_N.charAt(0)){ lcd.print(_N); emiteMorse(N); } else if(txt.charAt(i)==_O.charAt(0)){ lcd.print(_O); emiteMorse(O); } else if(txt.charAt(i)==_P.charAt(0)){ lcd.print(_P); emiteMorse(P); } else if(txt.charAt(i)==_Q.charAt(0)){ lcd.print(_Q); emiteMorse(Q); } else if(txt.charAt(i)==_R.charAt(0)){ lcd.print(_R); emiteMorse(R); } else if(txt.charAt(i)==_S.charAt(0)){ lcd.print(_S); emiteMorse(S); } else if(txt.charAt(i)==_T.charAt(0)){ lcd.print(_T); emiteMorse(T); } else if(txt.charAt(i)==_U.charAt(0)){ lcd.print(_U); emiteMorse(U); } else if(txt.charAt(i)==_V.charAt(0)){ lcd.print(_V); emiteMorse(V); } else if(txt.charAt(i)==_W.charAt(0)){ lcd.print(_W); emiteMorse(W); } else if(txt.charAt(i)==_X.charAt(0)){ lcd.print(_X); emiteMorse(X); } else if(txt.charAt(i)==_Y.charAt(0)){ lcd.print(_Y); emiteMorse(Y); } else if(txt.charAt(i)==_Z.charAt(0)){ lcd.print(_Z); emiteMorse(X); } // // else if(txt.charAt(i)==_0.charAt(0)){ lcd.print(zero); emiteMorse(zero); } else if(txt.charAt(i)==_1.charAt(0)){ lcd.print(_1); emiteMorse(um); } else if(txt.charAt(i)==_2.charAt(0)){ lcd.print(_2); emiteMorse(dois); } else if(txt.charAt(i)==_3.charAt(0)){ lcd.print(_3); emiteMorse(tres); } else if(txt.charAt(i)==_4.charAt(0)){ lcd.print(_4); emiteMorse(quatro); } else if(txt.charAt(i)==_5.charAt(0)){ lcd.print(_5); emiteMorse(cinco); } else if(txt.charAt(i)==_6.charAt(0)){ lcd.print(_6); emiteMorse(seis); } else if(txt.charAt(i)==_7.charAt(0)){ lcd.print(_7); emiteMorse(sete); } else if(txt.charAt(i)==_8.charAt(0)){ lcd.print(_8); emiteMorse(oito); } else if(txt.charAt(i)==_9.charAt(0)){ lcd.print(_9); emiteMorse(nove); } else{ lcd.print(" "); // emiteMorse(String(" ")); // delay(spaceWord); espaco(); } // emiteMorse(String(" ")); delay(250); delay(spaceLetter); } } else{ return; } } void checa(){ if(isAutomatico){ return; } if((digitalRead(teclaTraco)== HIGH)&&(digitalRead(teclaPonto)== LOW)){ traco(); } else if((digitalRead(teclaPonto)== HIGH)&&(digitalRead(teclaTraco)== LOW)){ ponto(); } else if((digitalRead(teclaTraco)== HIGH)&&(digitalRead(teclaPonto)== HIGH)){ // do{ // traco(); // delay(ditTime); // ponto(); // delay(ditTime); // } // while((digitalRead(teclaTraco)== HIGH)&&(digitalRead(teclaPonto)== HIGH)); } if((digitalRead(teclaTraco)== LOW)&&(digitalRead(teclaPonto)== LOW) && !isAutomatico){ if(!done){ // //Serial.print(str); compara(); //Serial.print(" "); str = String(""); done = true; } } } void espaco(){ digitalWrite(saida, LOW); delay(spaceLetter); str.concat(" "); done = false; if(!isAutomatico) checa(); } void traco(){ digitalWrite(saida, HIGH); delay(dashTime); digitalWrite(saida, LOW); delay(ditTime); str.concat("-"); done = false; checa(); if((digitalRead(teclaTraco)== HIGH)&&(digitalRead(teclaPonto)== HIGH) && !isAutomatico){ ponto(); } } void ponto(){ digitalWrite(saida, HIGH); delay(ditTime); digitalWrite(saida, LOW); delay(ditTime); str.concat("."); done = false; checa(); if((digitalRead(teclaTraco)== HIGH)&&(digitalRead(teclaPonto)== HIGH)&& !isAutomatico){ traco(); } } void limpaLcd(){ if(index ==15){ index = 0; lcd.clear(); lcd.setCursor(0,0); } } void limpaLcdTotal(){ delay(500); if((digitalRead(teclaTraco)== HIGH)&&(digitalRead(teclaPonto)== HIGH)){ lcd.clear(); lcd.setCursor(0,0); } } //////////////// void compara(){ limpaLcd(); index++; if(str.equals(String(""))){ //Serial.println(""); } else if(str.equals(A)){ //Serial.print(_A); lcd.print(_A); } else if(str.equals(B)){ //Serial.print(_B); lcd.print(_B); } else if(str.equals(C)){ //Serial.print(_C); lcd.print(_C); } else if(str.equals(D)){ //Serial.print(_D); lcd.print(_D); } else if(str.equals(E)){ //Serial.print(_E); lcd.print(_E); } else if(str.equals(F)){ //Serial.print(_F); lcd.print(_F); } else if(str.equals(G)){ //Serial.print(_G); lcd.print(_G); } else if(str.equals(H)){ //Serial.print(_H); lcd.print(_H); } else if(str.equals(I)){ //Serial.print(_I); lcd.print(_I); } else if(str.equals(J)){ //Serial.print(_J); lcd.print(_J); } else if(str.equals(K)){ //Serial.print(_K); lcd.print(_K); } else if(str.equals(L)){ //Serial.print(_L); lcd.print(_L); } else if(str.equals(M)){ //Serial.print(_M); lcd.print(_M); } else if(str.equals(N)){ //Serial.print(_N); lcd.print(_N); } else if(str.equals(O)){ //Serial.print(_O); lcd.print(_O); } else if(str.equals(P)){ //Serial.print(_P); lcd.print(_P); } else if(str.equals(Q)){ //Serial.print(_Q); lcd.print(_Q); } else if(str.equals(R)){ //Serial.print(_R); lcd.print(_R); } else if(str.equals(S)){ //Serial.print(_S); lcd.print(_S); } else if(str.equals(T)){ //Serial.print(_T); lcd.print(_T); } else if(str.equals(U)){ //Serial.print(_U); lcd.print(_U); } else if(str.equals(V)){ //Serial.print(_V); lcd.print(_V); } else if(str.equals(W)){ //Serial.print(_W); lcd.print(_W); } else if(str.equals(X)){ //Serial.print(_X); lcd.print(_X); } else if(str.equals(Y)){ //Serial.print(_Y); lcd.print(_Y); } else if(str.equals(Z)){ //Serial.print(_Z); lcd.print(_Z); } else if(str.equals(zero)){ //Serial.print(_0); lcd.print(_0); } else if(str.equals(um)){ //Serial.print(_1); lcd.print(_1); } else if(str.equals(dois)){ //Serial.print(_2); lcd.print(_2); } else if(str.equals(tres)){ //Serial.print(_3); lcd.print(_3); } else if(str.equals(quatro)){ //Serial.print(_4); lcd.print(_4); } else if(str.equals(cinco)){ //Serial.print(_5); lcd.print(_5); } else if(str.equals(seis)){ //Serial.print(_6); lcd.print(_6); } else if(str.equals(sete)){ //Serial.print(_7); lcd.print(_7); } else if(str.equals(oito)){ //Serial.print(_8); lcd.print(_8); } else if(str.equals(nove)){ //Serial.print(_9); lcd.print(_9); } else{ //Serial.print(str); lcd.print(str); index += str.length(); } limpaLcd(); } void leitura() { while(true){ // read a byte from the current address of the EEPROM value = EEPROM.read(address); if(value==35) return; //'#' sai do metodo t = value; //Serial.print(address); //Serial.print("\t"); //Serial.print(t); //Serial.print("\t"); //Serial.print(value); //Serial.println(); txt.concat(t); //Serial.println(txt); // advance to the next address of the EEPROM address = address + 1; // there are only 512 bytes of EEPROM, from 0 to 511, so if we're // on address 512, wrap around to address 0 if (address == tamanhoMemoria){ address = 0; return; } // delay(500); } } void mostraSplashScreen(){ // lcd.setCursor(0,0); lcd.print(splash1); lcd.setCursor(0,1); lcd.print(splash2); delay(tempoSplashScreen); lcd.clear(); // } void textoMemorizar(){ lcd.clear(); lcd.setCursor(c,0); lcd.cursor(); // boolean isStay = true; // while(!isMenuAtivo){ while(true){ if((digitalRead(chave2)==HIGH)&&(digitalRead(chave1)==HIGH)){ delay(1000); if((digitalRead(chave2)==HIGH)&&(digitalRead(chave1)==HIGH)){ loop(); } } if((digitalRead(chave1)==HIGH) && (out.length()>0)){ delay(10); //if((digitalRead(chave1)==LOW) && (out.length()>0)){ delay(250); gravaMemoria(); //TESTE // isAutomatico = true; isMenuAtivo = true; // isStay = false; //return; // //} } if(digitalRead(chave2)==HIGH){ // delay(10); // if(digitalRead(chave2)==LOW){ delay(250); c--; lcd.setCursor(c,0); out = out.substring(0,c); // } } if((digitalRead(teclaTraco)== HIGH)&&(digitalRead(teclaPonto)== LOW)){ do{ lcd.noCursor(); lcd.setCursor(c,0); i++; if(i>37) { i = 0; v = 32; } v = vetorCaracteres[i]; lcd.print(v); delay(400); } while ((digitalRead(teclaTraco)== HIGH)&&(digitalRead(teclaPonto)== LOW)); } else if((digitalRead(teclaPonto)== HIGH)&&(digitalRead(teclaTraco)== LOW)){ do{ lcd.noCursor(); lcd.setCursor(c,0); i--; if(i<0) { i =37; v = 32; } v = vetorCaracteres[i]; lcd.print(v); delay(400); } while ((digitalRead(teclaPonto)== HIGH)&&(digitalRead(teclaTraco)== LOW)); } if((digitalRead(teclaTraco)== HIGH)&&(digitalRead(teclaPonto)== HIGH)){ delay(10); // if((digitalRead(teclaTraco)== LOW)&&(digitalRead(teclaPonto)== LOW)){ c++; lcd.clear(); out.concat(v); i = 64; lcd.setCursor(c,0); lcd.cursor(); delay(100); // isMenuAtivo = false; // isStay = true; //break; lcd.clear(); lcd.print(out); delay(1000); //} } } // isMenuAtivo = true; // } } void gravaMemoria(){ lcd.setCursor(0,1); lcd.print("Gravando Mem...."); limpaMemoria(); int addr = 0; for(; addr<=out.length(); addr++){ EEPROM.write(addr, out.charAt(addr)); if (addr == tamanhoMemoria){ break; } } EEPROM.write(addr, 35); lcd.clear(); lcd.setCursor(0,1); lcd.print(" Gravado! "); beep(); } void limpaMemoria(){ for (int i = 0; i < tamanhoMemoria; i++) EEPROM.write(i, 0); } void beep(){ digitalWrite(saida2, HIGH); delay(100); digitalWrite(saida2, LOW); delay(100); digitalWrite(saida2, HIGH); delay(100); digitalWrite(saida2, LOW); delay(100); digitalWrite(saida2, HIGH); delay(300); digitalWrite(saida2, LOW); delay(100); lcd.clear(); loop(); } //////////////////////////////////////////// //void S(){ // // ponto(); // delay(ditTime); // ponto(); // delay(ditTime); // ponto(); // delay(ditTime); // //} // // //void O(){ // // traco(); // delay(ditTime); // traco(); // delay(ditTime); // traco(); // delay(ditTime); // //}