Lendo uma String com Arduino via Serial

O Problema

Uma dúvida muito comum quando estamos criando interfaces entre o Arduino e outros dispositivos externos via Serial, é como conseguir receber mais dados do que apenas um byte, exemplo ‘1’ ou ‘0’;

Imagine que você tem 5 LEDs conectados ao Arduino, e deseja ligá-los através de uma interface gráfica no computador, como o Processing. Como controlar separadamente esses 5 LEDs, de uma maneira simples?

A solução

Vamos imaginar que o Processing envie este padrão para trabalhar com um led: LEDX:STATUS. Para ligar o LED 1, o Processing envia esta informação ao Arduino: LED1:1, e para desligá-lo: LED1:0.

Simples de lidar não?

Código fonte

int led = 13;
 
void setup() { 
 pinMode(led, OUTPUT); 
 Serial.begin(9600);
}
 
/**
 * Função que lê uma string da Serial
 * e retorna-a
 */
String leStringSerial(){
  String conteudo = "";
  char caractere;
 
  // Enquanto receber algo pela serial
  while(Serial.available() > 0) {
    // Lê byte da serial
    caractere = Serial.read();
    // Ignora caractere de quebra de linha
    if (caractere != '\n'){
      // Concatena valores
      conteudo.concat(caractere);
    }
    // Aguarda buffer serial ler próximo caractere
    delay(10);
  }
   
  Serial.print("Recebi: ");
  Serial.println(conteudo);
   
  return conteudo;
}
 
void loop() {
  // Se receber algo pela serial
  if (Serial.available() > 0){
    // Lê toda string recebida
    String recebido = leStringSerial();
     
    if (recebido == "LED1:1"){
      digitalWrite(led, HIGH);
    }
     
    if (recebido == "LED1:0"){
      digitalWrite(led, LOW);
    }
  }
}

Abra o monitor serial e faça testes escrevendo: LED1:1 e LED1:0 e veja que seu led do pino 13 do Arduino irá ligar e desligar de forma correspondente aos comandos.

Espero ter ajudado :)

19 Comments

  1. Olá Paulo,
    Estou tentando fazer o IF funcionar para ativar um relé e não funciona. Já coloquei o Serial.print para testar ser o valor recebido está retornando para dentro do loop e sim, porem paraece que o IF nao testa a vairavel. Seria alguma blibioteca que náo estou carregando?
    Desde já grato.

  2. Ola, criei uma função baseada em alguns estudos que fiz, ela consiste em receber a informação digitada na porta serial, converte-la em String e apos isso converter para int… qualquer duvida me manda um e-mail (gabriel.f.salarini@gmail.com), sou técnico em automação industrial, precisar de alguma ajuda estamos ai!!
    Segue ai a função

    int getNumb() {
    String conteudo = “”;
    char caractere;

    // Enquanto receber algo pela serial
    while (Serial.available() > 0) {
    // Lê byte da serial
    caractere = Serial.read();
    // Ignora caractere de quebra de linha
    if (caractere != ‘\n’) {
    // Concatena valores
    conteudo.concat(caractere);
    }
    // Aguarda buffer serial ler próximo caractere
    delay(10);
    }
    int received_number = conteudo.toInt();
    return received_number;
    }

    Caso queira testar, vou deixar o programa completo para implementação e teste da funcao.. esta logo a baixo

    int res;
    void setup() {
    // put your setup code here, to run once:
    Serial.begin(9600);
    }

    void loop() {
    res = getNumb();
    if (res != 0 ) {
    Serial.println(res);
    }
    }

    int getNumb() {
    String conteudo = “”;
    char caractere;

    // Enquanto receber algo pela serial
    while (Serial.available() > 0) {
    // Lê byte da serial
    caractere = Serial.read();
    // Ignora caractere de quebra de linha
    if (caractere != ‘\n’) {
    // Concatena valores
    conteudo.concat(caractere);
    }
    // Aguarda buffer serial ler próximo caractere
    delay(10);
    }
    int received_number = conteudo.toInt();
    return received_number;
    }

  3. ola

    muito bom , me ajudou batsante.Mas e se eu receber um array de strings, por exemplo A B C (sem vírgulas separando ou com vírgulas)??

    grato
    Marques

Deixe uma resposta para Welton Lima Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *