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:
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):
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:
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:
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:
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:
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):
Em Terminal, clique em Force On nas seções Local echo e Local line editing:
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:
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.
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.
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.
Olá! Você tem alguma idéia de como configurar as seriais do arduino DUE para trabalharem com 7 bit e paridade par?
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
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
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.
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)
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’); //
José, poste seu código todo aqui pra eu dar uma olhada, por favor.
Fábio, o código é exatamente o que você postou.
Simplesmente copiei de seu site e tentei compilar.
Caso queira ver como ficou na IDE eu te envio.
Muito Obrigado
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
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?
tem como o arduino receber os dados do temporazidor por exemplo de um microondas e eu enviar para receber na web?
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
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.
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 😀
}
}
}
Já descobri como fazer, obrigado
Bom dia Fabio.
Sabe me dizer se consigo fazer esta comunicação seria PC arduino, com um programa em C++?
Sim Anderson, consegue.
Como eu posso fazer isso? Me ajude
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
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
Olá Fernando!
Creio que esse artigo do Embarcados possa te ajudar:
https://www.embarcados.com.br/protocolo-modbus-exemplos-e-simuladores/
Abraço!
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.
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?