Enviando e recebendo dados com Serial Monitor no Arduino

Como enviar e receber dados com Serial Monitor

Podemos enviar informações do Arduino para o PC (ou outros dispositivos) usando o IDE (ou outro programa de terminal serial qualquer), de modo a verificarmos se nosso programa está operando da forma esperada, e assim podermos detectar e eliminar erros de programação, ou efetuarmos qualquer outro tipo de comunicação com a máquina.

E também podemos enviar dados e comandos do PC para o Arduino, de modo a poder controlar dispositivos eletrônicos a ele conectados.

As placas de Arduino possuem ao menos uma porta serial (UART / USART), chamada de Serial. Ela realiza comunicação por meio dos pinos digitais 0 (RX) e 1 (TX), assim como via USB com o PC. Veja um detalhe da placa de um Arduino UNO mostrando esses pinos e sua identificação:

serial-01

Se usarmos esses pinos com a função de TX/RX, não poderemos utilizá-los para outras funções.

Podemos usar a ferramenta de  Monitor Serial presente no IDE para comunicação com a placa. Para isso, basta clicar no botão Serial Monitor na barra de ferramentas, e selecionar a taxa de transferência desejada em bauds (a mesma que será inserida no código):

serial-02

Vamos trabalhar em nosso projeto com o Arduino UNO, que possui as características descritas acima. Outras placas podem possuir características diferentes, como o Arduino Mega, que possui três portas seriais adicionais, e o Arduino Due, que possui três portas seriais TTL de 3.3V a mais. Nosso projeto funcionará em qualquer uma das placas.

Vamos ver alguns exemplos de comunicação serial com o Arduino, usando a classe Serial.

A classe Serial

A classe Serial possui diversas funções para comunicação, sendo algumas delas listadas na tabela a seguir:

Função Significado
available() Obtém o número de bytes disponíveis para leitura na porta serial.
begin() Configura a taxa de dados em bauds para transmissão serial de dados
end() Desabilita a comunicação serial, permitindo que os pinos TX e RX (0 e 1) sejam usados para entrada e saída geral de sinais.
print() Imprime dados na porta serial em formato legível por humanos (texto ASCII)
println() Idem a print(), porém adicionando um caractere de retorno de carro (ASCII 13) e um de nova linha (ASCII 10) no final da string.
read() Lê dados a partir da porta serial.
readBytes() Lê caracteres a partir da porta serial em um buffer até que uma determinada quantidade de caracteres tenha sido lida.
write() Escreve dados binários na porta serial

Vamos a um exemplo: exibir números sequenciais no monitor serial:

Exemplo 01: Exibir números sequenciais no Monitor Serial:

Conecte o Arduino na porta USB de seu PC, abra o IDE e digite o seguinte código em um novo projeto:

/* Testando a saída serial do Arduíno
Vamos escrever números na porta serial*/
void setup(){
  Serial.begin(9600); //Enviar e receber dados em 9600 baud
  Serial.println("Gerando valores sequenciais");
}
int numero = 0;
void loop() {
  Serial.print("Valor: ");
  Serial.println(numero);
  delay(500);
  numero++;
}

Após digitar o código no IDE, compile-o e envie-o para execução no Arduino. Então, abra o Serial Monitor para verificar os dados sendo transmitidos do Arduino para seu PC:

Serial Monitor no Arduino

Exemplo 02: Exibindo valores da 1 a 255 em vários sistemas

Neste segundo exemplo, vamos exibir os números de 1 a 255 no monitor serial nos sistemas decimal, binário e hexadecimal.

Conecte seu Arduino à porta USB, abra o IDE no PC e digite o código a seguir:

/* Exibindo valores em diferentes sistemas de numeração */
int valor = 0;

void setup() {
  Serial.begin(9600);  Serial.println("Exibindo valores em sistemas diversos");
}
void loop() { 
  for (valor = 0; valor <= 255; valor++)  {
    Serial.print("DEC: ");
    Serial.print(valor);
    Serial.print(" HEX: ");
    Serial.print(valor, HEX);
    Serial.print(" BIN: ");
    Serial.println(valor, BIN);

/* Se o valor for 255, não repetir mais a geração de números.
Entrar nesse loop para sempre:
*/
    if(valor == 255) {
      while(true) {
        continue;
      }
    }
  }
}

Após digitar o código, compile-o e envie para execução no Arduino. Veja a saída esperada:

Acessando Monitor Serial com Arduino

 

Enviando dados do PC para o Arduino via porta serial

Queremos agora efetuar o processo inverso: enviar caracteres do PC para o Arduino, o que pode ser muito útil para, por exemplo, controlar dispositivos a partir do computador conectado a um Arduino.

Vamos criar um projeto para demonstrar o uso da função Serial.read():

Ex. 03: Controlando um LED a partir do PC

Neste projeto vamos fazer um LED piscar em uma velocidade proporcional a um valor numérico enviado a partir do PC. Crie um novo projeto no IDE e digite o código abaixo:

/* Enviando dados do PC para o Arduíno.
Vamos piscar um LED de forma proporcional ao valor recebido a partir do PC */
 
const int ledPin = 13; // Pino ao qual o LED será conectado
int piscando = 0; // variável para armazenar taxa de “piscagem”
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT); // Pino 13 será de saída de sinais
}
 
void loop()
{
if (Serial.available()) { // Verificar se há caracteres disponíveis
char caractere = Serial.read(); // Armazena caractere lido
if ( isDigit(caractere) ) {  // Verificar se o caractere ASCII é um dígito entre 0 e 9
  piscando = (caractere – ‘0’); // Convertendo ASCII em valor numérico (0 = 48)
  piscando = piscando * 100; // Escalando taxa de tempo multiplicando por 100ms
}
}
pisca(); // Chamando a função blink(), que será declarada abaixo.
}
 
/* Declarando a função pisca() que fará o LED piscar na taxa determinada pelo valor armazenado na variável piscando
*/
 
void pisca()
{
 digitalWrite(ledPin, HIGH);
 delay(piscando);
 digitalWrite(ledPin, LOW);
 delay(piscando);
}

Conecte um LED ao Arduino usando uma protoboard e um resistor de aproximadamente 470 ohms conforme a ilustração abaixo mostra:

serial-05

 

Compile e envie o código digitado ao Arduino. Logo após, abra o Serial Monitor, digite um número entre 0 e 9 e clique no botão Send para enviar o valor ao Arduino:

serial-06

Observe que o LED piscará numa velocidade diferente para cada número enviado a partir do IDE. Desta forma, atingimos nosso objetivo de enviar dados a partir do PC para a placa do Arduino, controlando um dispositivo eletrônico conectado a ele.

Usando outro programa para comunicação serial com o Arduino

Podemos também acessar a porta serial usando outro programa, como o PuTTY. Para isso, abra o PuTTY (que pode ser baixado gratuitamente em http://www.putty.org/) e faça os ajustes conforme as figuras a seguir:

Em Session, clique em Serial no tipo da conexão, digite o nome da porta serial na caixa Serial line (a minha é COM 3), e a velocidade em bauds em Speed (9600 no meu caso):

Arduino Putty

Em Terminal, clique em Force On nas seções Local echo e Local line editing:

PuTTY com Arduino

Clique no botão Open para abrir a conexão e observe as mensagens sendo enviadas do Arduino para o PuTTY ao enviarmos o programa do exemplo 02:

PuTTY com Arduino

Há muitos outros softwares para comunicação serial disponíveis para uso com o Arduino, como o GNU Screen (http://www.gnu.org/software/screen), RealTerm (http://realterm.sourceforge.net/) e CoolTerm (http://freeware.the-meiers.org/), entre outros.

No próximo artigo vamos começar a explorar o Arduino criando um projeto bem interessante com LEDs.

 

Sobre Fábio dos Reis (1195 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.

25 Comentários em Enviando e recebendo dados com Serial Monitor no Arduino

  1. Ivan Carvalho // 12/04/2015 em 20:47 // Responder

    Tem como gravar código .ino sem usar a IDE do arduino. Usando Java, ou C#, por exemplo? Se puder onde acho um exemplo de comando para efetuar a gravação dos arquivo.ino?

    Obrigado.

  2. Carlos Henrique Ramos Queiroz // 18/05/2015 em 17:34 // Responder

    Olá! Você tem alguma idéia de como trata uma frase enviada via serial por bluetooth para aparecer em um display de Led 8X8? Não tive muita evolução… Consegui ele ler caractere por caractere.

  3. Olá! Você tem alguma idéia de como configurar as seriais do arduino DUE para trabalharem com 7 bit e paridade par?

  4. Denilson // 24/08/2015 em 0:33 // Responder

    Olá Fábio muito bom trabalho, ainda mais divulgando, para expandir o conhecimento, estou trabalhando num projeto em que tenho que acionar uma saida digital do arduino, mas esta saida deve ser controlada por tempo e este tempo tem que ser inserido via bloetooth, com este artigo tive já uma ideia, mas tenho duvida na parte que tera que digitar no celular tipo 2.30 ou seja duas hora e 30 minutos, como vou tratar este numero em ASCII para configura-lo no delay e obedecer justamente este tempo.

    Desde já obrigado abraços

  5. boa noite
    estou tentando trabalhar com uma placa EASYVR 2.0 ja fiz toda a programação só que na hora que abro o serial monitor fica aparecendo mensagem bridge not start e em seguida easyvr not detect
    alguem sabe dizer como resolver isso
    estou usando o win7 profissional

  6. Ola, estou tendo o mesmo problema. Voce resolveu seu problema ai? Como foi que voce fez? Poderia me mandar a solucao no email darife_@hotmail.com? Obrigado.

  7. Professor Roceli // 29/06/2016 em 17:03 // Responder

    tenho um shiel mp3 tds055 que permite comunicação serial tx/rx. sabendo o padrão dos nomes dos arquivos mp3 como seria esse código ? qual comando utilizaria para executar um arquivo? segundo o datasheet_TDS055 não é necessário biblioteca.
    característica de comunicação:
    Means of communication : Serial port RS232 (TTL)
    >9600bit/s 1 start bit+ 8 data bit+1 end bit None verify (TTL level)

  8. josé rodolfo durante // 20/10/2016 em 22:14 // Responder

    Fábio, no ex 3 “Controlando um led a partir do PC” ao compilar
    aparecem vários erros stray ‘\200’e outros números e também
    ” expected ‘)’ before ‘0’” todos os erros na linha 13:
    piscando = (caractere – ‘0’); //

  9. Mario Kano // 25/10/2016 em 18:17 // Responder

    Boa Noite
    Achei legal uns ajudando outro a melhorar tecnologicamente nosso país
    Estou começando programar arduino, entendo um pouco do antigo vb6
    Estou tentado sem muito sucesso fazer um programinha que parece fácil
    de um lado tenho 10 chaves e um arduino e doutro lado 10 lampadas para serem controlados, a transmissão pensei em serial para economizar fios
    voce tem algo para me ajudar.
    Obrigado

  10. alan josino // 12/11/2016 em 14:31 // Responder

    tem como usar o arduino para receber os dados do display de tempo do meu microondas e enviar para web, tem algum artigo aqui parecido para fazer este procedimento?

  11. alan josino // 12/11/2016 em 14:44 // Responder

    tem como o arduino receber os dados do temporazidor por exemplo de um microondas e eu enviar para receber na web?

  12. Tadeu Bassetti // 27/03/2017 em 18:25 // Responder

    Boa noite, sou novo com arduino, fiz acender/apagar 1lâmpada com controle da tv, tem como eu acender/apagar o mesmo com outro controle, só apontando para o sensor, (da net ou do Home), sem ter que programar novamente.Obrigado

  13. Thiago ribeiro santos. // 29/03/2017 em 1:09 // Responder

    Galera to com dificuldade em fazer um isso roda.

    Ler 1 nome
    Ler 1 idade
    >”Nome” tem “idade anos.

    ou seja. fazer com que eu digite no serial monitor o nome e a idade e depois aparecer a frase “Nome” tem “idade anos.

    • Vitor Lopes // 27/04/2017 em 22:31 // Responder

      Olá Thiago, fiz um sketch que atende o seu desejo, vou postá-la aqui pra que outras pessoas possam ver, mas se quiser que mande o arquivo por email, é só responder com o endereço de email :D. Aqui vai:

      //Olá thiago, ai vai um exemeplo de código que supre o que entendi do que vc queria.
      //Peço desculpas se de alguma forma ofendo, tento comentado linha por linha.
      //Se esse for o caso, peço que entenda que talvez outras pessoas, possam ter dificuldade em ler o código sem o comentário detalhado.

      String nomeRecebido = “”; // String que vai receber o conjunto de caracteres do “nome”.
      String idadeRecebida = “”; // String que vai receber o conjunto de caracteres da “idade”.
      unsigned long delay1 = 0; // delay para verificar se acabaram os caracteres.

      //funciona da sequinte maneira:
      //abrimos o monitor serial, inserimos o nome, enter, inserimos a idade, enter, e é mostrado a frase: “(nome) tem (idade) anos.”.

      void setup()
      {
      Serial.begin(9600); //inicia a comuicação serial em uma taxa de 9600.
      }

      void loop()
      {
      char caracter; //variável que irá comportar momentaneamente o ultimo caracter lido
      boolean flag=true; // variável para sair e entrar nas rotinas, dá pra fazer de outros milhares de jeitos, mas né, o que veio primeiro à mente…

      while(flag){
      if (Serial.available()) //verifica se há um caracter disponivel no buffer, se sim, realiza a seguinte rotina:
      {
      caracter = Serial.read(); //guarda o ultimo caracter no buffer, na variável caracter rsrsrsr
      nomeRecebido += caracter; // adiciona o ultimo caracter lido ao string do nome.
      delay1 = millis(); //guarda o momento que realizamos essa rotina.
      }
      if (((millis() – delay1) > 10) && (nomeRecebido != “”)) //verifica se não há mais caracteres no buufer à serem adicionados à string do nome, e verifica se a mesma não está vazia, se as duas condições são atendidas, realizamos a rotina:
      {
      flag=false; //dasativamos o flag para sairmos da rotina while.
      }
      }
      flag=true; //ativamos o flag novamente para entrarmos no while da idade, e não termos de criar um flag, ou outro artificio só pra essa rotina 😀
      while(flag)
      {
      if (Serial.available()) //verifica se há um caracter disponivel no buffer, se sim, realiza a seguinte rotina:
      {
      caracter = Serial.read(); //guarda o ultimo caracter no buffer, na variável caracter, de novo isso rsrsrsr
      idadeRecebida += caracter;// adiciona o ultimo caracter lido ao string da idade.
      delay1 = millis(); //guarda o momento que realizamos essa rotina.
      }
      if (((millis() – delay1) > 10) && (idadeRecebida != “”))//verifica se não há mais caracteres no buufer à serem adicionados à string da idade, e verifica se a mesma não está vaziase as duas condições são atendidas, realizamos a rotina:
      {
      Serial.print(nomeRecebido); //imprime no monitor serial o nome que foi digitado anteriormente.
      Serial.print(” tem “); //imprime no monitor serial a sequencia de caracteres: ” tem ”
      Serial.print(idadeRecebida);//imprime no monitor serial a idade digitada anteriormente.
      Serial.println(” anos.”); //imprime no monitor serial asequencia de caracteres: ” anos.”. E quebra a linha.
      nomeRecebido = “”; //Esvazia o string do nome, para caso queira repetir o processo
      idadeRecebida = “”; //Esvazia o string da idade, para caso queira repetir o processo
      flag=false; //dasativamos o flag para sairmos da rotina while, e reiniciar o loop 😀
      }
      }
      }

  14. Tadeu Bassetti // 29/03/2017 em 20:23 // Responder

    Já descobri como fazer, obrigado

  15. Anderson Gonçalves // 16/04/2018 em 11:14 // Responder

    Bom dia Fabio.

    Sabe me dizer se consigo fazer esta comunicação seria PC arduino, com um programa em C++?

  16. Leonardo Amorim Silva // 18/06/2018 em 5:32 // Responder

    o meu problema é o seguinte, eu queria fazer um programa em arduino uno que ao digitar na console do pc “open” o arduino me abrisse a caixa registradora, queria fazer uma especie de caixa anti roubo. me ajude por favor

  17. fernando mántaras // 13/12/2018 em 20:21 // Responder

    Olá Fabio:
    Eu não sou da area de eletrônica digital, Apenas estou tentando fazer com que um arduino ligado a uma celula de carga transmita os dados a outro arduino atraves do rs485. Você sabe se há alguma rotina pronta para a comunicação de dados entre arduinos??
    Grato
    Fernando

  18. SÔNIA CRISTINA RAFAEL // 27/09/2020 em 12:41 // Responder

    EU QUERO SABER MAIS SOBRE ESTE ASSUNTO.
    COM IMPLEMENTAR O CÓDIGO ABAIXO NO MICROCONTROLADOR ARDUINO MEGA. ENVIAR DADOS PARA A SERIAL. E COMPROVA AS INFORMAÇÕES ENVIADAS ATRAVÉS DO OSCILOSCÓPIO.
    FAZER AS DEVIDAS ALTERAÇÕES NO CÓDIGO PARA TESTAR O ENVIO DA LETRA S.

  19. Thiago SOuza // 08/06/2023 em 12:53 // Responder

    Olá, você sabe me dizer se é possivel controlar uma saída do arduino atravês de uma mensagem que recebo por email? Recebo alertas por email e queria controlar um sensor pela saída do arduino, é possivel?

Escreva um comentário

Seu e-mail não será divulgado


*