Ir ao conteúdo
  • Cadastre-se
Dianderson

Sensor + controle em arduino

Recommended Posts

Olá pessoal.

Estou com uma dúvida no Arduino, atualmente uso um algorítimo que fica recebendo dados de um programa Java e manipulando as portas.

Tipo, recebo pela porta serial " 1 " no código tem - '' if ( recebido == 1) { digitalWrite (7, HIGH)}; " - ( ou seja, se receber " 1 " ele liga o pino 7.

isso se repete para 5 pinos e funciona perfeitamente, porém eu gostaria que o programa alem disso, ficasse mandando informação de um sensor de temperatura.

Enquanto ele está esperando um dado de entrada, pra saber se abre ou se fecha alguma porta, ele " em tempo real " fique executando um código assim por exemplo.

 

  for(i = 0; i < 8; i++){
    samples = analogRead(0);
    temp = temp + samples
    delay(100);
    }
    temp = temp/8.0; 
    Serial.write(temp);
    temp = 0;

 

ou seja, vai ficar mandando informação pro programa Java sobre o sensor de temperatura, mais quando eu insiro essa linha no código, as informações ficam todas erradas, liga o pino que não pedi pra ligar esse tipo de "bug".

 

De ante-mão agradeço,

 

Obrigado...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testa com algum software de serial(pode ser o da própria ide do arduino),outra coisa Serial.write,envia apenas 1BYTE e não é convertido para ascii,se você colocar 65,vai aparecer no terminal da serial "A","A" é 65 na tabela ascii. Provavelmente sua variavel "I" é de 16bits,deveria usar Serial.print(i). Caso com este software de certo,,o problema seria no seu software em java.

Compartilhar este post


Link para o post
Compartilhar em outros sites

penso que você deve elaborar um protocolo de comunicação mais aprimorado ou até mesmo lançar mão de usar a interrupção do arduino (desconheço) pra receber o comando. No loop principal só fica enviando dados.

Veja também nas configs do seu terminal se ele está programado pra gerar echos, retornar dados ou algo do gênero ou se tx-rx estão em curto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pessoal, mais não entendi não, irei postar o código do Arduíno e do Java em txt anexo. me parece que o problema é na comunicação serial, acho que ela não aceita enviar e receber dados ao mesmo tempo.

Segue o imagem da interface pra facilitar o entendimento.

 

 

 

 

Interface.jpg

Arduino.txt

Java.txt

Compartilhar este post


Link para o post
Compartilhar em outros sites

não vi os txt. Coloque direto no campo de respostas. Use <code> e <spoiler>

 

De fato pelo menos do lado do java (que não entendo) era pra conversar "ao mesmo tempo" sim. Afinal é um sistema multitarefa ou um mondmér?

 

Do lado do mc, de fato não é ao mesmo tempo mas teu protocolo há de prever um "transmitiu? posso continuar" e um "para túdô!..tem um byte aqui!" tipo na interrupção

 

não vi os txt de novo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

int byteEntrada = 0;
 
void setup(){
  Serial.begin(9600); // Abre a porta serial
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
  digitalWrite(13,LOW);
}
 
void loop(){

    Serial.write(Serial.read(A0));
	  
    byteEntrada = Serial.read();
      if(byteEntrada == '0'){
        digitalWrite(8,LOW);
      }else if(byteEntrada == '1'){
        digitalWrite(8,HIGH);
      }
      if(byteEntrada == '2'){
        digitalWrite(9,LOW);
      }else if(byteEntrada == '3'){
        digitalWrite(9,HIGH);
      }
      if(byteEntrada == '4'){
        digitalWrite(10,LOW);
      }else if(byteEntrada == '5'){
        digitalWrite(10,HIGH);
      }
            if(byteEntrada == '6'){
        digitalWrite(11,LOW);
      }else if(byteEntrada == '7'){
        digitalWrite(11,HIGH);
      }
      if(byteEntrada == '8'){
        digitalWrite(12,LOW);
      }else if(byteEntrada == '9'){
        digitalWrite(12,HIGH);
      }   
}
    public void enviarDados(String dados) {
        try {
            output.write(dados.getBytes());
        } catch (IOException e) {
            
            JOptionPane.showMessageDialog(null, "Algo deu errado", "ERRO", JOptionPane.ERROR_MESSAGE);
                      
        }
    }

-----------------------------------------------------------------------------------------------------------------
        
    static void delay (int t) throws InterruptedException{
        Thread.sleep(t);
    } 

-----------------------------------------------------------------------------------------------------------------  
    
    private void enviar (int freqpin, int ciclopin, String a, String b) throws InterruptedException{        
        for(int ciclo=0; ciclo< ciclopin; ciclo++){            
            enviarDados(a);
                delay(freqpin);
            enviarDados(b);
                delay(freqpin);
        }            
    }

-----------------------------------------------------------------------------------------------------------------

    private void enviarciclos () throws InterruptedException{
        for(int i=0; i < Integer.valueOf(tfBinary.getText()); i++){ //Loop de ciclos por pino
            enviar(Integer.valueOf(tfFreqP8.getText()),Integer.valueOf(tfCyclesP8.getText()), "8ON", "8OFF");
            enviar(Integer.valueOf(tfFreqP9.getText()),Integer.valueOf(tfCyclesP9.getText()), "9ON", "9OFF");
            enviar(Integer.valueOf(tfFreqP10.getText()),Integer.valueOf(tfCyclesP10.getText()), "10ON", "10OFF");            
        }
    }

-----------------------------------------------------------------------------------------------------------------

    private void enviarcar () throws InterruptedException{
        int x = Integer.valueOf(tfCyclesCar1.getText());
        for(int i=0; i < x; i++){ //Loop do 1º ciclos carreador
            enviarDados("11ON");
                delay(Integer.valueOf(tfFreqP11.getText()));
            enviarDados("11OFF");
                delay(Integer.valueOf(tfFreqP11.getText()));
        }
            
            delay(Integer.valueOf(tfStopCar.getText())*1000);
            
        for(int i=0; i < Integer.valueOf(tfCyclesCar2.getText()); i++){ //Loop do 2º ciclos carreador
            enviarDados("11ON");
                delay(Integer.valueOf(tfFreqP11.getText()));
            enviarDados("11OFF");
                delay(Integer.valueOf(tfFreqP11.getText()));
        }
    }

-----------------------------------------------------------------------------------------------------------------

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        for(int i=0; i< Integer.valueOf(tfReplicate.getText());i++){
            try {
                enviarciclos();
                enviarcar();
            } catch (InterruptedException ex) {
                
            }
        }
    }

-----------------------------------------------------------------------------------------------------------------

    public synchronized void serialEvent(SerialPortEvent oEvent) {
		if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
			try {
                                int a = input.read();
                                int temp = Integer.parseInt(tfTemp.getText());
                                float t = (float) ((5.0 * a * 100.0) / 1024.0);

                                DecimalFormat decimal = new DecimalFormat( "0.00" );

                                jLTemp.setText(String.valueOf(decimal.format(t)));
                                
                                if (t <= temp){
                                    enviarDados("TON");
                                } else {
                                    enviarDados("TOFF");
                                }

                                //System.out.println(a);
			} catch (Exception e) {
				System.err.println(e.toString());
			}
		}
		// Ignore all the other eventTypes, but you should consider the other ones.
    }

 

adicionado 4 minutos depois

@Dianderson qual era sua intenção com esta linha? Serial.write(Serial.read(A0));

Seu firmaware no arduino,enviar,recebe num loop continuo,seria interessante deixar um tempo a cada vez,para dar tempo de processar os dados.

Também  verificar tanto em java como no arduino,se existe mesmo dado recebido,caso read() retornar -1 não existe dado(verifica na biblioteca do java que você está utilizado,a que eu utilizava -1 era sem dados),ou pode usar Serial.available() para verificar a quantidade de dados que tem no buffer,ai só ler caso tenha dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×