TTGO ESP32 LoRa – Ou, ESP32 Paxcounter

Em um produto, pouco importa a beleza. Mas a TTGO ESP32 LoRa é uma daquelas placas para conquistar o coração de qualquer maker!

Especificações da TTGO ESP32 LoRa

Essa placa possui um ESP32 com 4M de flash, antena SMA e CI CP2104. Trabalha da frequência de 868 à 915MHz, tem um display OLED de 0.96″, Bluetooth, WiFi e SD card. Tirando a parte que já é característica do ESP32, os demais recursos são bastante atraentes.

Duas coisas me chamaram muito a atenção , uma delas é sem dúvidas a qualidade, que pude notar em todas as placas da LilyGo.

Já escrevi sobre a TTGO T-Camera nesse outro artigo, uma placa apaixonante, da qual fiz até um programa em Qt para fazer captura.

Também escrevi sobre o incrível display e-ink, de extrema qualidade. Se quer adquirir placas de qualidade, as da LilyGo não causarão decepção.

Uma das coisas que me chamou a atenção foi o acabamento. Ela é perfeitamente alinhada e o display OLED está sobre um suporte acrílico preto, muito bonito. Ao lado da porta micro-USB está o slot para cartão micro-SD, o mais discreto de todos. Aliás, nunca, havia visto um slot assim.

O consumo dessa placa em modo sleep é 0.2uA e em idle é de 1.5uA.

O rádio LoRa tem algumas características específicas também, como função RSSI digital, correção automática de frequência, controle de ganho automático, função de wake-up. Faz saltos rápidos do estado de wake e de frequências.

Essa placa é a versão 1.6, os pinos do LoRa variam conforme a versão.

TTGO ESP32 Lora Pinout

Apesar do modelo da imagem ser diferente, as barras de pinos tem as mesmas identificações:

TTGO ESP32 LoRa pinout

 

Pinos LoRa

Os pinos utilizados para o LoRa são 26, 23, 18, 5, 27, 19.

Pinos SD Card

Os pinos utilizados para o SD são o 13, 15, 14, 2, 12, 4.

A tabela a seguir descrever todos os pinos utilizados nos periféricos:

TTGO ESP32 LoRa pins definition

Código para uso inicial

Primeiro, instale as dependências. Será necessário instalar as bibliotecas arduino-LoRa, ds3231 e oled-ssd1306.

Clone o repositório com o código:

git clone https://github.com/DjamesSuhanko/TTGO-LoRa-Series.git

Edite o arquivo board_def.h e faça a definição conforme a versão, silkada na placa. Basta colocar 1 no define da respectiva placa. No caso, fica assim:

#define LORA_V1_0_OLED  0
#define LORA_V1_2_OLED  0
#define LORA_V1_6_OLED  1
#define LORA_V2_0_OLED  0

Também será necessário escolher a frequência da placa. Aqui vou utilizar em 915MHz, portanto:

//#define LORA_PERIOD 433  
// #define LORA_PERIOD 868  
#define LORA_PERIOD 915

Na definição LORA_SENDER utilize 1 para enviar, para receber. Claro que a comunicação pode ser bi-direcional, não se preocupe.

No diretório LoRa há um sketch de exemplo, mas antes de subir sugiro que veja o firmware que vem por padrão, é bem bonita a disposição das informações no display.

Particularmente, utilizei apenas alguns recursos para testar a placa, com esse sketch:

#include <Arduino.h>
#include <SPI.h>
#include <LoRa.h>
#include <WiFi.h>
#include "SSD1306.h"
#include "board_def.h"

#define OLED_ADDRESS 0x3c
#define I2C_SDA 21
#define I2C_SCL 22

SSD1306Wire display(OLED_ADDRESS, I2C_SDA, I2C_SCL, GEOMETRY_128_64);

#define WIFI_SSID       "DobitAoByte"
#define WIFI_PASSWORD   "mylab123"

void setup()
{
    Serial.begin(115200);
    while (!Serial);

    if (OLED_RST > 0) {
        pinMode(OLED_RST, OUTPUT);
        digitalWrite(OLED_RST, HIGH);
        delay(100);
        digitalWrite(OLED_RST, LOW);
        delay(100);
        digitalWrite(OLED_RST, HIGH);
    }

    display.init();
    display.flipScreenVertically();
    display.clear();
    display.setFont(ArialMT_Plain_16);
    display.setTextAlignment(TEXT_ALIGN_CENTER);
    display.drawString(display.getWidth() / 2, display.getHeight() / 2, LORA_SENDER ? "LoRa Sender" : "LoRa Receiver");
    display.display();
    delay(2000);


    String info = "bB";
    if (info != "") {
        display.clear();
        display.setFont(ArialMT_Plain_16);
        display.setTextAlignment(TEXT_ALIGN_CENTER);
        display.drawString(display.getWidth() / 2, display.getHeight() / 2, info);
        display.display();
        delay(2000);
    }

    WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
    if (WiFi.waitForConnectResult() != WL_CONNECTED) {
        display.clear();
        Serial.println("WiFi Connect Fail");
        display.drawString(display.getWidth() / 2, display.getHeight() / 2, "WiFi Connect Fail");
        display.display();
        delay(2000);
        esp_restart();
    }
    Serial.print("Connected : ");
    Serial.println(WiFi.SSID());
    Serial.print("IP:");
    Serial.println(WiFi.localIP().toString());
    display.clear();
    display.drawString(display.getWidth() / 2, display.getHeight() / 2, "IP:" + WiFi.localIP().toString());
    display.display();
    delay(2000);

    SPI.begin(CONFIG_CLK, CONFIG_MISO, CONFIG_MOSI, CONFIG_NSS);
    LoRa.setPins(CONFIG_NSS, CONFIG_RST, CONFIG_DIO0);
    if (!LoRa.begin(BAND)) {
        Serial.println("Starting LoRa failed!");
        while (1);
    }
    if (!LORA_SENDER) {
        display.clear();
        display.drawString(display.getWidth() / 2, display.getHeight() / 2, "LoraRecv Ready");
        display.display();
    }
}

int count = 0;

void loop()
{
#if LORA_SENDER
    int32_t rssi;
    if (WiFi.status() == WL_CONNECTED) {
        rssi = WiFi.RSSI();
        display.clear();
        display.setTextAlignment(TEXT_ALIGN_CENTER);
        display.drawString(display.getWidth() / 2, display.getHeight() / 2, "Send RSSI:" + String(rssi));
        display.display();
        LoRa.beginPacket();
        LoRa.print("WiFi RSSI: ");
        LoRa.print(rssi);
        LoRa.endPacket();
    } else {
        Serial.println("WiFi Connect lost ...");
    }
    delay(2500);
#else
    if (LoRa.parsePacket()) {
        String recv = "";
        while (LoRa.available()) {
            recv += (char)LoRa.read();
        }
        count++;
        display.clear();
        display.drawString(display.getWidth() / 2, display.getHeight() / 2, recv);
        String info = "[" + String(count) + "]" + "RSSI " + String(LoRa.packetRssi());
        display.drawString(display.getWidth() / 2, display.getHeight() / 2 - 16, info);
        display.display();
    }
#endif
}

 

Outra opção é clonar esse repositório:

git clone https://github.com/DjamesSuhanko/esp32-ttgo

De qualquer modo, temos todas as definições da placa e qualquer código implementado com LoRa, SD e OLED devem funcionar. Veremos exemplos práticos em outros artigos, mas pode ir se baseando também por esse outro artigo da TTGO T-Camera, caso já adquira essa belezinha que trabalha em uma larga faixa de frequências LoRa.

Onde comprar?

Essa placa está disponível em nosso parceiro UsinaInfo, que pode ser conferida através desse link. Aproveite para uni-la à sua coleção, ou para iniciar seus projetos com LoRa!

Djames Suhanko

Djames Suhanko é Perito Forense Digital. Já atuou com deployer em sistemas de missão critica em diversos países pelo mundão. Programador Shell, Python, C, C++ e Qt, tendo contato com embarcados ( ora profissionalmente, ora por lazer ) desde 2009.

Um comentário em “TTGO ESP32 LoRa – Ou, ESP32 Paxcounter

Fechado para comentários.