Receber/Enviar múltiplos dados

Boas pessoal,

Sou iniciante no Arduíno e estou com alguma dificuldade em enviar e receber múltiplos dados entre o Arduíno e app Android (com MIT App Inventor), através de ligação bluetooth.

Estou a utilizar o Clock.Timer para receber inúmeros valores (vamos supor, valores de 10 variáveis), essa ordem de recepção está pela mesma ordem de envio no Arduíno.

Do género:
(Arduino)

Serial.println(stateBatatas);
Serial.println(stateCenouras);
Serial.println(stateMorangos);
Serial.println(stateArvores);

(MIT App Inventor)
Em anexo

A minha dúvida é, isto está certo? Ou irá dar barraca?

Precisarei também do envio de valores (4 ao mesmo tempo) para o Arduíno para modificar o valor das variáveis, por exemplo: RegaBatatasTempo, RegaCenourasTempo, etc. Qual a maneira certa de enviar estes dados e actualiza-los no Arduino? Exemplo segue noutro anexo.

A minha dúvida é, como é que o Arduíno saberá que dados está a receber? Faço por ordem como fiz no envio dos dados?..

Já fiz inumeras pesquisas mas só encontro exemplos de: botao1 envia valor X, botao2 envia valor Y. Mas preciso de ao clicar num botão, enviar 4 valores…

edicaovalores.png

Ola amigo
A minha sugestao é a seguinte.Crias um protocolo no qual tu defines o numero de bytes que queres passar entre o android e o arduino.
Algo
byte 0 → Passas o valor batatas
byte 1 → Passas o valor das cenouras
byte 2 → Passas o valor dos morango …
Crias um array que te armazene todos estes bytes.Algo assim

byte arrayQueContemAinformaçaoQueVaisPassar[10]; //Este array tem 10 elementos.Relembro que ele começa no 0 e vai ate ao 9 elemento!

Depois envias para o arduino.

Do lado do arduino ao receberes todos esses bytes carrega-los tambem em um array e depois tomas decisoes com base no que cada byte tem.
A idea é esta …
Tem umas arestas que tens de moldar do tipo adicionares um caracter de inicio de trama e de fim para teres a certeza do que estas a recolher, talvez implementares CRC ou um checksum para teres confirmaçao dos dados e que nada se perdeu …
Em termos teoricos será algo assim

Em termos práticos poderás mostrar um exemplo para que possa perceber melhor? Isto em relação a:

Tem umas arestas que tens de moldar do tipo adicionares um caracter de inicio de trama e de fim para teres a certeza do que estas a recolher, talvez implementares CRC ou um checksum para teres confirmaçao dos dados e que nada se perdeu …

Le isto que vai te ajudar a entender o que procuras

Sobre os CRC's ou os checksum lê este

Continuo sem perceber como incorporar isto com o MIT App Inventor.. :\

Consegues enviar dados para o Arduino?

Tipo uma frase ou algo do género?

consigo enviar um valor através do mit e recebê-lo no arduíno:

MIT:
bluetoothclient1.sendtext → C

Arduino:

char Dado = Serial.read()

Então o que te falta é definir o protocolo como o hugo referiu.

Como é que a app define as acções a tomar?

Uma forma simples de você começar a entender como o negócio funciona:

No seu MIT App Inventor, quando apertar o botão imprima os 4 valores:

bluetoothclient1.sendtext -> B
bluetoothclient1.sendtext -> C
bluetoothclient1.sendtext -> M
bluetoothclient1.sendtext -> A

No Arduino, espere até ter 4 valores no serial e leia todos:

if (Serial.available() == 4)
{
  char batata = Serial.read();
  char cenoura = Serial.read();
  char morango = Serial.read();
  char arvore = Serial.read();
}

Dessa forma você define o seu protocolo, que é bem simples: envia o valor da batata, da cenoura, do morando e da árvore. Não tem caracter de início e de fim de mensagem, verificação de erro, nem nada. Depois você pode ir incrementando, se sentir necessidade de melhorar o sistema.

LegendBR:
Uma forma simples de você começar a entender como o negócio funciona:

No seu MIT App Inventor, quando apertar o botão imprima os 4 valores:

bluetoothclient1.sendtext -> B

bluetoothclient1.sendtext -> C
bluetoothclient1.sendtext -> M
bluetoothclient1.sendtext -> A




No Arduino, espere até ter 4 valores no serial e leia todos:



if (Serial.available() == 4)
{
  char batata = Serial.read();
  char cenoura = Serial.read();
  char morango = Serial.read();
  char arvore = Serial.read();
}




Dessa forma você define o seu protocolo, que é bem simples: envia o valor da batata, da cenoura, do morando e da árvore. Não tem caracter de início e de fim de mensagem, verificação de erro, nem nada. Depois você pode ir incrementando, se sentir necessidade de melhorar o sistema.

Ah, então é como tinha pensado só que faltou:

if (Serial.available() == 4) { ... }

Obrigado!

E em relação ao enviar-se múltiplos dados do Arduíno para o MIT, como referi logo de início, estará certo?:

VSousaProg:
Boas pessoal,

Sou iniciante no Arduíno e estou com alguma dificuldade em enviar e receber múltiplos dados entre o Arduíno e app Android (com MIT App Inventor), através de ligação bluetooth.

Estou a utilizar o Clock.Timer para receber inúmeros valores (vamos supor, valores de 10 variáveis), essa ordem de recepção está pela mesma ordem de envio no Arduíno.

Do género:
(Arduino)

Serial.println(stateBatatas);

Serial.println(stateCenouras);
Serial.println(stateMorangos);
Serial.println(stateArvores);




(MIT App Inventor)
Em anexo

A minha dúvida é, isto está certo? Ou irá dar barraca?
(...)

Posso utilizar um switch consoante o primeiro dado recebido, certo?

Tipo isto:

if (Serial.available() == 5)
  {
    Campo = Serial.read();
    switch(Campo)
    {
     case 'B':
      PhBatatas = Serial.read();
      PmBatatas = Serial.read();
      DhBatatas = Serial.read();
      DmBatatas = Serial.read(); 
      break;
     case 'M':
      PhMorangos = Serial.read();
      PmMorangos = Serial.read();
      DhMorangos = Serial.read();
      DmMorangos = Serial.read(); 
      break;
     case 'A':
      PhArvores = Serial.read();
      PmArvores = Serial.read();
      DhArvores = Serial.read();
      DmArvores = Serial.read(); 
      break;
     case 'C':
      PhCenouras = Serial.read();
      PmCenouras = Serial.read();
      DhCenouras = Serial.read();
      DmCenouras = Serial.read(); 
      break;
    }
  }

Para enviar os dados do Arduino para o Android é por aí mesmo, só utilize Serial.print() ao invés de Serial.println(), para evitar o envio do caracter '\r'.

E pode utilizar dessa outra forma que você falou sim, utilizando o switch. Tudo é questão de você definir seu protocolo e se fixar nele.

Depois comece a adicionar um caracter de início e fim da mensagem, verificação de erro, etc.

LegendBR:
Para enviar os dados do Arduino para o Android é por aí mesmo, só utilize Serial.print() ao invés de Serial.println(), para evitar o envio do caracter '\r'.

E pode utilizar dessa outra forma que você falou sim, utilizando o switch. Tudo é questão de você definir seu protocolo e se fixar nele.

Depois comece a adicionar um caracter de início e fim da mensagem, verificação de erro, etc.

Obrigado.

Posso enviar dados em formato de texto e depois no Arduino convertê-los para int, correcto?

Correto.

No MIT irei colocar então o SendText, que será o valor de uma label só de números.

No Arduino tenho a variável int a receber assim:

PhX = Serial.read() - '0';

Está certo ou dará erro por ser enviado do MIT como texto?

Se o número for entre '0' e '9', deve dar certo.

O número poderá ser maior que 9…

Então envia em binário. ..

Ok, corrigido :slight_smile: Obrigada!

pois coloca o função de envia os dado do app para arduino

VAleu....Obrigado