collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[Ontem às 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: separar valores de vários sensores  (Lida 9812 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline guibot

  • Mini Robot
  • *
  • Mensagens: 651
    • Guibot
separar valores de vários sensores
« em: 13 de Dezembro de 2008, 20:47 »
estou a inciar-me em comunicação wireless entre 2 arduinos, usando os módulos XBee Pro.

no arduino 1, tenho 2 potenciómetros a enviar valores.

no arduino 2 recebo os valores dos potenciómetros assim:

100,234
100,230
100,228
etc...

agora não estou a conseguir separar estes valores para continuar a minha programação.
gostava de assignar os valores do 1º potenciómetro a uma variável e os valores do 2º potenciómetro a outra variavel

alguem me sabe dar uma ajuda com isto?   :geek:

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re: separar valores de vários sensores
« Responder #1 em: 13 de Dezembro de 2008, 20:52 »
Não sei como funcionam os módulos, mas a primeira coisa que tens que fazer é mete-los a valores completamente diferentes para poderes verificar se esta mesmo a enviar de um e de outro alternadamente, depois talvez num loop que afecte a cada um, mas tens que nos dizer mais, protocolo, como estás a enviar os dados, etc... ;)

Offline defer

  • Mini Robot
  • *
  • Mensagens: 57
Re: separar valores de vários sensores
« Responder #2 em: 13 de Dezembro de 2008, 21:16 »
A maneira mais rápida é provavelmente enviares os dados byte a byte, isto implica saberes quantos bytes ocupa cada valor que queres enviar. Explicar bitwise logic de repente num post seria complicado, no entanto há muita informação por aí.
De outra forma, se quiseres passar strings separadas por ',' podes usar a função strtok, fica um exemplo rápido:

Código: [Seleccione]
char *ptr = strtok(bufferin,",");
while (ptr) {
  int val = atoi(ptr);
  ptr = strtok(NULL, ",");
}
O código deve ser auto-explicável, dentro do ciclo while a tua variável val vai ter cada um dos tokens da string bufferin que passas para função.

Offline guibot

  • Mini Robot
  • *
  • Mensagens: 651
    • Guibot
Re: separar valores de vários sensores
« Responder #3 em: 13 de Dezembro de 2008, 23:16 »
para quem não tem boas bases de programação isto torna-se um pouco abstracto.

na minha função loop tenho o seguinte:

Código: [Seleccione]
void loop() {
  if (mySerial.available()) {
    Serial.println((char)mySerial.read());
  }
}

isto printa para a janela de output os valores de ambos os potenciómetros, agora não sei como usar o pedaço de código que escreveste.

obrigado por ajudares defer!  ;)

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re: separar valores de vários sensores
« Responder #4 em: 13 de Dezembro de 2008, 23:23 »
Partido do principio que estás a enviar os dois seguidos, podes fazer:
Código: [Seleccione]
void loop() {
  if (mySerial.available()) {
    pot1 = mySerial.read();
    pot2 = mySerial.read();
  }
}
Visto que os dados vêm seguidos, ele lê os dois, mas isto depende de como estão a ser enviados.

Offline defer

  • Mini Robot
  • *
  • Mensagens: 57
Re: separar valores de vários sensores
« Responder #5 em: 13 de Dezembro de 2008, 23:27 »
Ok, pelo que tou a ver já estas a enviar o resultado byte a byte (um char é um byte) tem cuidado que só podes enviar valores até 255 desta forma, nesse caso podes ler os dois valores fazendo uma modificação simples, a funcao available da classe serial retorna o numero de bytes disponíveis, logo só tens que ver se tens 2 e ler esses dois

Código: [Seleccione]
void loop() {
      if (mySerial.available() >= 2) {
        Serial.println((char)mySerial.read());
        Serial.println((char)mySerial.read());
      }
    }
Suponho que do outro lado estejas a fazer
Código: [Seleccione]
myserial.write((char)v1);
myserial.write((char)v1);

EDIT: não vi o post acima, sorry. De qualquer forma, deves verificar se tens pelo menos 2 bytes para ler, senão um dos valores pode retornar -1 (ve a documentação do read)

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re: separar valores de vários sensores
« Responder #6 em: 13 de Dezembro de 2008, 23:31 »
Citação de: "defer"
a funcao available da classe serial retorna o numero de bytes disponíveis, logo só tens que ver se tens 2 e ler esses dois

Não sabia que retornava os bytes a ler, tenho estado um pouco ausente da programação do arduino ultimamente, só na faculdade estou a dar 4 linguagens diferentes e os trabalhos tem apertado nos últimos dias :P

Obrigado defer.

Offline guibot

  • Mini Robot
  • *
  • Mensagens: 651
    • Guibot
Re: separar valores de vários sensores
« Responder #7 em: 13 de Dezembro de 2008, 23:47 »
ok se calhar devia ter feito isto logo no inicio, o código que se segue é o que estou a usar.. espero que entendam, e desde já muito obrigado por estarem a ajudar  :geek:

Offline defer

  • Mini Robot
  • *
  • Mensagens: 57
Re: separar valores de vários sensores
« Responder #8 em: 14 de Dezembro de 2008, 00:33 »
A função read() lê um byte, tu estás a mandar vários através do println, o que te aconselho a fazer é o seguinte:

Arduino 1:
Código: [Seleccione]
Serial.write (val1); //escreve 1 byte
Serial.write (val2); //escreve outro byte

Arduino 2:
Código: [Seleccione]
void loop() {
  if (myserial.available >= 2) { //estas a mandar 2 bytes, ver se estao disponiveis
    char val1 = myserial.read (); //ler o primeiro
    char val2 = myserial.read (); //ler o segundo
  }
}

Apenas tens que assumir que isto é o teu protocolo, envias sempre 2 bytes, recebes sempre 2

Offline guibot

  • Mini Robot
  • *
  • Mensagens: 651
    • Guibot
Re: separar valores de vários sensores
« Responder #9 em: 14 de Dezembro de 2008, 01:01 »
parece ser este o caminho, mas quando faço Serial.print ele só me lê um número de cada vez, em vez de me ler os 3 números de cada variavel ('val1'   e    'val2')    :(

Código: [Seleccione]
if (mySerial.available() >= 2) {
    char val1 = mySerial.read();
    char val2 = mySerial.read();
   
    Serial.print(val1);
    Serial.println(val2);
  }

Citar
55
25
52
55
25
52
55

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re: separar valores de vários sensores
« Responder #10 em: 14 de Dezembro de 2008, 01:15 »
3 números?

já agora em vez de:
Código: [Seleccione]
int a1 = analogValue1 / 4;
int a2 = analogValue2 / 4;

experimenta:
Código: [Seleccione]
int a1 = analogValue1>>2;
int a2 = analogValue2>>2;

Faz o mesmo gasta menos memória de código, e demora menos tempo a processar, visto o atmega poder fazer shifts como operação elementar da sua ALU. (até trocaria o int a1 e a2 para chars).

Offline defer

  • Mini Robot
  • *
  • Mensagens: 57
Re: separar valores de vários sensores
« Responder #11 em: 14 de Dezembro de 2008, 01:32 »
Quanto aos shifts, qualquer compilador faz isso automaticamente, mas sim, é boa prática.
Quanto aos resultados, estas a uasr um print e um println, os numeros estao seguidos, poe espaços e faz mais algum debug, com o que deste não tou a ver qual possa ser o problema.

Offline guibot

  • Mini Robot
  • *
  • Mensagens: 651
    • Guibot
Re: separar valores de vários sensores
« Responder #12 em: 14 de Dezembro de 2008, 09:34 »
tenho estado a alterar vários parametros mas de certeza algo me está a escapar.

se fizer isto consigo vizualizar o que envio sem quaisquer problemas:
Código: [Seleccione]
char incomingByte;

void loop() {
if (mySerial.available()) {  
    incomingByte = mySerial.read();
    Serial.print(incomingByte);
  }
}

Citar
val1 = 122     val2 = 255
val1 = 123     val2 = 253
val1 = 125     val2 = 252
val1 = 126     val2 = 250
val1 = 127     val2 = 249

vou continuar a luta  :mrgreen:

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.372
    • Tiago Rodrigues
Re: separar valores de vários sensores
« Responder #13 em: 14 de Dezembro de 2008, 12:33 »
O problema de leres um a um, é que depois podes ter apenas um byte para ler, e não sabes a que variável afectar, a menos que tenhas uma flag interna que diga qual é o próximo a ler.

Foi por isso que aconselhamos ler logo os dois valores ;)

Offline guibot

  • Mini Robot
  • *
  • Mensagens: 651
    • Guibot
Re: separar valores de vários sensores
« Responder #14 em: 16 de Dezembro de 2008, 15:53 »
confesso que me está a custar compreender a parte dos "char" e dos "bytes", como se processam, analisam, interpretam, etc..    :mrgreen: