Translate

sábado, 30 de abril de 2016

Arduino Web - Página Web Controlando Hardware Arduino

Descrevo neste post Projeto completo de interface gráfica (web) controlando placa Arduino, acionando o servo motor, colocando mensagens no LCD e ajustando cor de Led RGB, atuando sobre uma porta ligada a um relé para acender lâmpada, etc.


A Aplicação consiste numa página Web rodando sob um servidor GlassFish.

Esta envia/recebe comandos de uma aplicação Java RMI (RMIServer) que se comunica com a placa Arduino.



Abaixo, projeto completo, incluindo código para o hardware e as bibliotecas RTXcomm.jar para comunicação serial com o Arduino.






terça-feira, 26 de abril de 2016

Banco Oracle - Verificando Tempo Transcorrido


Podemos eventualmente, necessitar contar o tempo transcorrido entre dois valores de campos distintos de uma tabela (DATA_FINAL - DATA_INICIAL) ou determinado tempo passado até a data atual.

No Banco Oracle podemos utilizar de alguns artifícios para conseguirmos esta solução.

Utilizarei as tabelas e dados criados no post anterior:

Banco Oracle - Adicionando valores de tempo em Datas TIMESTAMP


Observação: Utilize o comando abaixo para ajustar o formato de hora para a sessão, a fim de evitarmos problemas de conversão:

--necessario alterar a sessao, utilizo aqui o formato 'DD/MM/YYYY HH24:MI:SS'
       ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI:SS';

Baseando-se que já tenhamos uma tabela e uma pequena massa de dados na mesma, podemos executar a seguinte consulta, calculando a subtração do tempo transcorrido entre a data atual (SYSTIMESTAMP) e a data registrada no campo DATA1:


--demonstra valor de data 1 e suas diferencas                         
SELECT ID_TESTE
      ,SYSTIMESTAMP AS DATA_ATUAL
      ,DATA1
      ,(SYSTIMESTAMP --DATA ATUAL
        -
        DATA1
        ) AS DIFERENCA_ENTRE_DATAS
            FROM TESTES_COM_DATA;  


Obtendo um resultado semelhante ao demonstrado na figura:










Observe o campo DIFERENCA_ENTRE_DATAS. É demonstrado, dias/horas/minutos/segundos.

Mas e se desejarmos saber apenas os minutos transcorridos?

Podemos usar a cláusula WITH e a partir de um sub-query semelhante à demonstrada acima, extrair os valores desejados, no caso, os minutos transcorridos desde a hora atual até o momento da execução da consulta:
--SELECIONA MINUTOS TRANSCORRIDOS
        WITH DIFERENCA AS (
        --SELECIONA DIFERENCAS ENTRE A DATA ATUAL 
        -- E A DATA REGISTRADA NA TABELA
         SELECT (
              SYSTIMESTAMP --DATA ATUAL ou por ex.:TO_TIMESTAMP('22/04/2016 13:00:00', 'DD/MM/YYYY HH24:MI:SS') 
              -
              DATA1
              ) AS DIFERENCA_ENTRE_DATAS
                  FROM TESTES_COM_DATA                                    
                         )
          --EXTRAI OS MINUTOS
          SELECT (( EXTRACT (DAY FROM (DIFERENCA_ENTRE_DATAS)) *24*60*60 
               + EXTRACT (HOUR FROM (DIFERENCA_ENTRE_DATAS)) *60*60 
               + EXTRACT (MINUTE FROM (DIFERENCA_ENTRE_DATAS)) *60 
               + EXTRACT (SECOND FROM (DIFERENCA_ENTRE_DATAS)) )/60) AS TOTAL
          FROM DIFERENCA;

Observe o resultado


Podemos, através da função  ROUND(<valor>,<casas_decimais>) arredondar este valor: 


--SELECIONA MINUTOS TRANSCORRIDOS
        WITH DIFERENCA AS (
        --SELECIONA DIFERENCAS ENTRE A DATA ATUAL 
        -- E A DATA REGISTRADA NA TABELA
         SELECT (
             SYSTIMESTAMP --DATA ATUAL ou por ex.:TO_TIMESTAMP('22/04/2016 13:00:00', 'DD/MM/YYYY HH24:MI:SS') 
              -
              DATA1
              ) AS DIFERENCA_ENTRE_DATAS
                  FROM TESTES_COM_DATA                                    
                         )
          --EXTRAI OS MINUTOS
          SELECT ROUND((( EXTRACT (DAY FROM (DIFERENCA_ENTRE_DATAS)) *24*60*60 
               + EXTRACT (HOUR FROM (DIFERENCA_ENTRE_DATAS)) *60*60 
               + EXTRACT (MINUTE FROM (DIFERENCA_ENTRE_DATAS)) *60 
               + EXTRACT (SECOND FROM (DIFERENCA_ENTRE_DATAS)) )/60)
               ,0) AS TOTAL_ARREDONDADO -- 0 CASAS DECIMAIS
          FROM DIFERENCA;

Obtendo o resultado em Minutos, como desejávamos:




domingo, 24 de abril de 2016

Banco Oracle - Adicionando valores de tempo em Datas TIMESTAMP


Neste post procurarei utilizar exemplos de como inserir valores de datas, (campos TIMESTAMP) incrementando, minutos, segundos, etc, a partir da data atual.

Para começar, vamos criar uma tabela de exemplo, com campo identificador (ID_TESTE) dois campos (DATA1 e DATA2) representando as datas atuais e a data acrescida respectivamente.

Há também a criação (opcional) de uma sequence (TESTE_COM_DATA_SEQ) para facilitar a inserção de valores únicos o campo ID_TESTE.

--criação da tabela de testes
CREATE TABLE TESTES_COM_DATA(

ID_TESTE          INTEGER,
DATA1             TIMESTAMP(6),
DATA2             TIMESTAMP(6),

PRIMARY KEY (ID_TESTE)

);

--criação de sequence (opcional) para atribuição de 
--valores do campo ID_TESTE
CREATE SEQUENCE TESTES_COM_DATA_SEQ
  MINVALUE 1
  START WITH 1
  INCREMENT BY 1
  CACHE 20;


Para começarmos, temos que alterar o formato de exibição de TIMESTAMP para a sessão atual do usuário. Esta alteração não é permanente e é cancelada quando encerramos a sessão.

Observação: Sempre que formos utilizar este tipo de tratativas com datas, temos que utilizar o comando abaixo:

--necessario alterar a sessao, utilizo aqui o formato 'DD/MM/YYYY HH24:MI:SS'
       ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI:SS';

Feito isso, vamos estudar os códigos para incremento dos valores de Horas, Minutos e Segundos




 --TIMESTAMP ADICIONADO HORAS
        SELECT SYSTIMESTAMP AS DATA_ATUAL
                            , TO_TIMESTAMP(
                              SYSTIMESTAMP + (
                              2 --QUANTIDADE DE HORAS ADICIONADAS
                              /24)
                              , 'DD/MM/YYYY HH24:MI:SS') 
                              AS DATA_SOMADA_HORAS
                            FROM DUAL;      
      
       --TIMESTAMP ADICIONADO MINUTOS
       SELECT SYSTIMESTAMP AS DATA_ATUAL
                            , TO_TIMESTAMP(
                              SYSTIMESTAMP + (
                              5 --QUANTIDADE DE MINUTOS ADICIONADOS
                              /(24*60))
                              , 'DD/MM/YYYY HH24:MI:SS') 
                              AS DATA_SOMADA_MINUTOS
                            FROM DUAL;
                            
       --TIMESTAMP ADICIONADO SEGUNDOS
        SELECT SYSTIMESTAMP AS DATA_ATUAL
                            , TO_TIMESTAMP(
                              SYSTIMESTAMP + (
                              25 --QUANTIDADE DE SEGUNDOS ADICIONADOS
                              /24/60/60)
                              , 'DD/MM/YYYY HH24:MI:SS') 
                              AS DATA_SOMADA_SEGUNDOS
                            FROM DUAL;  


Finalmente, podemos aplicar os conceitos aprendidos dentro de cláusulas de INSERT na tabela do banco:
--inserindo diferença de duas horas
INSERT INTO TESTES_COM_DATA (  
                              ID_TESTE
                              ,DATA1
                              ,DATA2)
        VALUES(
        TESTES_COM_DATA_SEQ.NEXTVAL --busca proximo valor para a sequence
        ,SYSTIMESTAMP               --data/hora atual
        ,(TO_TIMESTAMP(
                       SYSTIMESTAMP + (
                       2 --QUANTIDADE DE HORAS ADICIONADAS
                       /24)
                       , 'DD/MM/YYYY HH24:MI:SS') 
                       )  --inserção de SYSTIMESTAMP + 2 Horas        
        );


--inserindo diferença de quinze minutos
INSERT INTO TESTES_COM_DATA (  
                              ID_TESTE
                              ,DATA1
                              ,DATA2)
        VALUES(
        TESTES_COM_DATA_SEQ.NEXTVAL --busca proximo valor para a sequence
        ,SYSTIMESTAMP               --data/hora atual
        ,(TO_TIMESTAMP(
                       SYSTIMESTAMP + (
                       15 --QUANTIDADE DE MINUTOS ADICIONADOS
                        /(24*60))
                      , 'DD/MM/YYYY HH24:MI:SS')--inserção de SYSTIMESTAMP + 15 mins        
          )
        );


        INSERT INTO TESTES_COM_DATA (  
                              ID_TESTE
                              ,DATA1
                              ,DATA2)
        VALUES(
        TESTES_COM_DATA_SEQ.NEXTVAL --busca proximo valor para a sequence
        ,SYSTIMESTAMP               --data/hora atual
        ,(TO_TIMESTAMP(
                       SYSTIMESTAMP + (
                       30 --QUANTIDADE DE SEGUNDOS ADICIONADOS
                       /24/60/60)
                       , 'DD/MM/YYYY HH24:MI:SS')--inserção de SYSTIMESTAMP + 30 segs        
          )
        );   

Resultado final das linhas inseridas:




Podemos também adicionar simultaneamente HORAS/MINUTOS/SEGUNDOS à data atual, como no exemplo abaixo:

      --inserindo diferenca de HORAS/MINUTOS/SEGUNDOS
        INSERT INTO TESTES_COM_DATA (  
                              ID_TESTE
                              ,DATA1
                              ,DATA2)
        VALUES(
        TESTES_COM_DATA_SEQ.NEXTVAL --busca proximo valor para a sequence
        ,SYSTIMESTAMP               --data/hora atual
        ,(TO_TIMESTAMP(
                              SYSTIMESTAMP + (
                              2 --QUANTIDADE DE HORAS ADICIONADAS
                              /24)
                               +(
                              10 --QUANTIDADE DE MINUTOS ADICIONADOS
                              /(24*60))
                              +
                              (
                              30 --QUANTIDADE DE SEGUNDOS ADICIONADOS
                              /24/60/60)   --inserção de SYSTIMESTAMP + 30 segundos        
             )
          )
        );   

Resultando em:




sexta-feira, 22 de abril de 2016

Banco Oracle - Desbloquear Usuários com senhas Expiradas ORA-28001

Eventualmente, por padrão, o banco de dados Oracle expira a senha de usuários.

Para reverter esta situação execute as linhas a seguir, com usuário SYS , e atribuição SYSDBA:
--desbloqueie o usuário
ALTER USER TESTES_LOCAIS ACCOUNT UNLOCK;

--atribua uma nova senha
ALTER USER TESTES_LOCAIS IDENTIFIED BY 123456;

--verifique a próxima data de expiração (EXPIRY_DATE)
SELECT USERNAME, ACCOUNT_STATUS, EXPIRY_DATE FROM DBA_USERS 
WHERE USERNAME='TESTES_LOCAIS';

Se for de seu desejo que as contas de usuário nunca mais expirem, execute os comandos a seguir, também com usuário SYS , e atribuição SYSDBA:
--alterando perfil para não expirar mais
ALTER PROFILE DEFAULT LIMIT PASSWORD_REUSE_TIME UNLIMITED;
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME  UNLIMITED;


--verifique se não há mais data de expiração (EXPIRY_DATE)
SELECT USERNAME, ACCOUNT_STATUS, EXPIRY_DATE FROM DBA_USERS
WHERE USERNAME='TESTES_LOCAIS';


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.

#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); 
//
//}





segunda-feira, 9 de fevereiro de 2015

Java - Banco de Dados I - A Fábrica de Conexões 'ConnectionFactory'

Connection Factory - A Fábrica de Conexões

Em padrões de desenvolvimento, o "conceito de fábrica" nada mais é do que uma classe onde encapsulamos métodos muito utilizados, além da mesma ser capaz de retornar uma referência a um novo objeto.

Resumindo, no caso da conexão a um Banco de Dados, criamos uma "ConnectionFactory" para nos conectarmos ao banco de dados, nos retornando uma instancia do objeto de conexão com o banco de dados, de maneira a evitar codificação repetida em diversos locais do código. 

Nesta caso, também implementaremos métodos para inicialização e fechamento desta conexão, evitando consumo desnecessário de recursos.


No código abaixo, criamos uma conexão para um Banco de Dados Oracle. 

Utilizamos o driver ojdbc6.jar, disponível em:


Nos próximos posts demonstrarei como criarmos uma classe com métodos para acesso às tabelas do banco. Esta classe, buscará uma instancia da conexão do banco, usando  o metodo estático ConnectionFactory.getConnection();


Abaixo, código comentado de uma Connection Factory:



package br.com.devfacil.factory;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class ConnectionFactory {

 private static Connection conn;

 public static Connection getConnection() {

  // Connection Factoru de exemplo para Banco Oracle

  try {

   // Configurações para acesso ao Banco de dados

   String driverName = "oracle.jdbc.driver.OracleDriver";
   String url = "jdbc:oracle:thin:@localhost:1521:XE";
   String username = "TESTES_LOCAIS";
   String password = "123456";



   // Carrega o driver JDBC
   Class.forName(driverName);
   
   // Cria uma conexão com a base de dados
   conn = DriverManager.getConnection(url, username, password);

  } catch (ClassNotFoundException e) {

   // Erro na conexão com o driver
   System.out.println("Não foi localizado o driver Oracle.");
   
  } catch (SQLException f) {
   
   // Erro na conexão com o Banco de Dados
   System.out.println("Não foi possível conectar ao banco.");
   
  }
  return conn;
 }

 // Fecha as conexões

 public static void closeConnection(Connection conn, PreparedStatement pstm,
   ResultSet rs) throws Exception {
  close(conn, pstm, rs);
 }

 public static void closeConnection(Connection conn, PreparedStatement pstm)
   throws Exception {
  close(conn, pstm, null);
 }

 public static void closeConnection(Connection conn) throws Exception {
  close(conn, null, null);
 }

 private static void close(Connection conn, PreparedStatement pstm,
   ResultSet rs) throws Exception {
  try {
   if (rs != null)
    rs.close();
   if (pstm != null)
    pstm.close();
   if (conn != null)
    conn.close();
  } catch (Exception e) {
   throw new Exception(e.getMessage());
  }
 }

}

domingo, 27 de abril de 2014

Configurando Memória Virtual SWAP no Ubuntu

Quando nosso Sistema Operacional utiliza uma grande porcentagem de memória RAM, para não travar, ele lança mão da Memória Virtual.

Explicando este termo resumidamente, "Memória Virtual" é quando o sistema operacional armazena em disco (acesso mais lento), dados que deveriam ser colocados na memória RAM, e isto não pôde ser feito, porque a mesma já estava muito cheia. 

O fato da memória RAM estar muito cheia pode ser sinal de que seu sistema precisa ser fisicamente atualizado, adicionar mais 'pentes' de memória RAM pode ajudar.

Quando a memória virtual é alocada pelo sistema operacional, o computador se torna mais lento, pois como já disse anteriormente, o acesso aos dados no disco é muito mais lento do que o acesso à memória. 

No Ubuntu, por padrão a memória virtual é acionada quando atinge-se 40% de memória RAM utilizada (60% de memória RAM livre); isto pode tornar o sistema lento rapidamente, no caso do uso mais extremo. 

Para checar como seu Sistema Operacional está usando o recurso de swap (memória virtual) e também a memória em si, execute o comando na janela do Terminal (shell)

free -m

O resultado deve ser algo parecido com a tela abaixo: 

free -m
             total       used       free     shared    buffers   cached
Mem:          3848       3644        204        263         19      515
-/+ buffers/cache:       3108        740

Swap:         4940        619       4320


Note que meu Sistema operacional, está consumindo 619 MB de memória virtual!

Podemos mudar isto, ajustando o ponto de utilização da memória RAM em que o sistema operacional começará a alocar dados também em Memória Virtual.

Para saber como este ponto está configurado atualmente, digite o seguinte comando :

cat /proc/sys/vm/swappiness 

O SO deve retornar o valor atualmente configurado para swap:

60

O valor a ser alterado é bastante subjetivo, para alterá-lo somente durante a sessão atual como forma de teste, execute o comando: 

sudo sysctl vm.swappiness=30

Verifique que o valor está alterado, chamando novamente:

cat /proc/sys/vm/swappiness 

Para alterá-lo efetivamente no Sistema Operacional, edite com permissão sudo o arquivo /etc/sysctl.conf  e adicione ao final do arquivo a linha: 

vm.swappiness = "VALOR_ESCOLHIDO_ENTRE 0 e 100"

Abaixo exemplo:

sudo gedit /etc/sysctl.conf

Adicionei a este arquivo a linha abaixo, no meu caso o valor de 30, que quer dizer que quando estiver com 70% da RAM ocupada, meu SO irá começar a utilizar Memória Virtual.

vm.swappiness = 30