Ir ao conteúdo
  • Cadastre-se

Sensor + controle em arduino


Posts recomendados

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...

Link para o comentário
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.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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

Link para o comentário
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

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

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.

Link para o comentário
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.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!