Fechando essa série de posts usando o Wio Terminal, hoje vamos mostrar como realizar a comunicação serial Arduino Uno e Wio Terminal, que pode ser útil para troca de informações entre as plataformas, enviando e recebendo dados de sensores e módulos.
Para realizar o experimento, recomendo a leitura do post Wio Terminal: Uma ótima opção para o seu projeto de IoT, onde mostramos as principais características do componente e como configurar para uso com a IDE do Arduino.
A comunicação serial no Wio Terminal
No Wio Terminal, vamos usar a comunicação serial através da GPIO da parte traseira:
Essa GPIO segue o padrão da Raspberry Pi, mostrada na imagem abaixo. Vamos utilizar para comunicação serial o pino 8 (GPIO14 – TX) e o pino 10 (GPIO15 – RX):
Também vamos precisar da conexão do pino 1 (3V3) e do GND, como referência de tensão para o nosso conversor de nível lógico. Vamos ver como fica o circuito.
Conexão Wio Terminal e Arduino Uno
Para o circuito de conexão vamos utilizar:
- Wio Terminal
- Arduino Uno
- Led vermelho e Led Verde
- 2x Resistor 1K para conexão dos leds
- Conversor de nível lógico bidirecional
O conversor de nível lógico é necessário para converter a tensão de 3.3V dos pinos da GPIO para a tensão dos pinos do Arduino, que é de 5V.
No circuito abaixo você pode conferir que no Arduino vamos usar as portas digitais 8 e 9 como RX e TX, respectivamente, para efetuar a comunicação usando a serial por software.
No lado do Arduino, temos o led vermelho conectado na porta 4 e o led verde conectado na porta 5.
Programa comunicação serial
Vamos começar carregando o programa do Wio Terminal.
O programa monitora os 3 botões da parte superior do Wio, e caso sejam pressionados enviam via serial um comando de Ligar ou Desligar os leds conectados no Arduino.
A serial da GPIO é referenciada como Serial1, e usamos comandos comuns como o Serial1.prinln() para enviar os dados.
//Programa: Arduino Uno e Wio Terminal - Envio de dados serial
//Autor: Arduino e Cia
#include <pins_arduino.h>
#include <SPI.h>
#include <TFT_eSPI.h>
TFT_eSPI tft;
void setup()
{
pinMode(WIO_KEY_A, INPUT_PULLUP);
pinMode(WIO_KEY_B, INPUT_PULLUP);
pinMode(WIO_KEY_C, INPUT_PULLUP);
//Inicializa a comunicacao serial da GPIO
Serial1.begin(9600);
//Inicializa o display
tft.begin();
tft.setRotation(3);
tft.fillScreen(0x0);
tft.setCursor(0, 0, 2);
//Informacoes iniciais display
tft.setTextColor(TFT_WHITE);
tft.drawCircle(55, 60, 32, TFT_WHITE);
tft.drawCircle(55, 160, 32, TFT_WHITE);
tft.setTextSize(5);
tft.setCursor(110, 20);
tft.print("LED 1");
tft.setCursor(110, 120);
tft.print("LED 2");
//Estado inicial botoes - desligados
tft.setTextColor(TFT_RED);
tft.fillCircle(55, 60, 30, TFT_RED);
tft.fillCircle(55, 160, 30, TFT_RED);
//Informacoes rodape
tft.setTextColor(TFT_BLACK, TFT_YELLOW);
tft.setTextSize(1);
tft.fillRect(3, 213, 315, 26, TFT_YELLOW);
tft.setCursor((320 - tft.textWidth("arduinoecia.com.br")) / 2, 217);
tft.print("arduinoecia.com.br");
tft.drawRoundRect(3, 3, 315, 236, 5, TFT_WHITE);
}
void loop()
{
//Verifica se o botao 1 foi pressionado
if (digitalRead(WIO_KEY_C) == LOW)
{
//Muda botao 1 para verde
tft.fillCircle(55, 60, 30, TFT_GREEN);
//Envia informacao para o Arduino
Serial1.println("Liga Led 1");
while (digitalRead(WIO_KEY_C) == LOW)
{
//Loop enquanto o botao 1 esta pressionado
delay(50);
}
//Muda botao 1 para vermelho
tft.fillCircle(55, 60, 30, TFT_RED);
Serial1.println("Desliga Led 1");
}
//Verifica se o botao 2 foi pressionado
if (digitalRead(WIO_KEY_B) == LOW)
{
//Muda botao 2 para verde
tft.fillCircle(55, 160, 30, TFT_GREEN);
Serial1.println("Liga Led 2");
while (digitalRead(WIO_KEY_B) == LOW)
{
delay(50);
}
//Muda botao 2 para vermelho
tft.fillCircle(55, 160, 30, TFT_RED);
Serial1.println("Desliga Led 2");
}
}
Os botões do Wio vão funcionar como “push-buttons”: ao pressionar o botão o led acende, e assim que soltarmos o botão o led se apaga.
O segundo programa da nossa comunicação Arduino e Wio Terminal é o do Uno, mostrado abaixo.
Usamos a serial por software (biblioteca SoftwareSerial) para emular uma serial nos pinos digitais 8 e 9 do Arduino. Isso deixa a nossa serial padrão “livre” para enviar mensagens para o Serial Monitor, onde podemos monitorar o recebimento dos dados enviados pelo Wio.
//Programa: Arduino Uno e Wio Terminal - Recepcao dados Serial
//Autor: Arduino e Cia
//Carrega a biblioteca SoftwareSerial
#include <SoftwareSerial.h>
//Define os pinos para a serial
SoftwareSerial mySerial(8, 9); // RX, TX
int incomingByte = 0;
char buf[20];
int num = 0;
String dados;
//Definicoes pinos dos leds
#define pino_r 4
#define pino_g 5
void setup()
{
Serial.begin(9600);
pinMode(pino_r, OUTPUT);
pinMode(pino_g, OUTPUT);
Serial.println("Preparado para receber dados...");
//Inicializa a serial nas portas 8 e 9
mySerial.begin(9600);
}
void loop()
{
//Verifica se algum dado foi recebido na serial
while (mySerial.available() > 0)
{
buf[num] = mySerial.read();
if (buf[num] == '\n')
{
//Mostra informacoes no Serial Monitor
Serial.print("Dados Recebidos: ");
Serial.println(buf);
String dados = buf;
dados.trim();
int tamanho_string = dados.length();
Serial.print("Caracteres: ");
Serial.println(tamanho_string);
//apaga o buffer
for (int ca = 0; ca < 20; ca++)
{
buf[ca] = 0;
}
num = 0;
//Verifica se existem comandos para ligar ou desligar o led 1
if (dados == "Liga Led 1")
{
Serial.println("Ligando led 1");
digitalWrite(pino_r, HIGH);
}
if (dados == "Desliga Led 1")
{
Serial.println("Desligando led 1");
digitalWrite(pino_r, LOW);
}
//Verifica se existem comandos para ligar ou desligar o led 2
if (dados == "Liga Led 2")
{
Serial.println("Ligando led 2");
digitalWrite(pino_g, HIGH);
}
if (dados == "Desliga Led 2")
{
Serial.println("Desligando led 2");
digitalWrite(pino_g, LOW);
}
break;
}
num++;
}
}
Recebendo os dados, o Arduino verifica se a mensagem corresponde a uma das opções de ligar ou desligar os leds por meio de uma série de IF´s dentro do loop. Finalizado o processo, o buffer é apagado e o programa aguarda novos comandos.
Gostou? Confira outros posts usando Wio Terminal aqui mesmo no Arduino e Cia!
