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:

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.

Circuito Wio Terminal e Arduino Uno

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!

5/5 - (1 vote)