Comunicação Serial Arduino e Wio Terminal
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!
GOOOOOD