TTGO-T-Display
2019年8月6日 - 未分類
TTGOは、OLED付きのESP32です。1000円以下で購入できます。OLEDは、ST7789V 1.14inchのディスプレィがSPIでつながっています。
TTGO-T-Displayというライブラリーで表示できます。
他にも2つのライブラリーも必要です。
2.TFT_eSPI settings
- Move or copy
User_Setups/TTGO_T_Display.h
toTFT_eSPI/User_Setups/
- Add
#include <User_Setups/TTGO_T_Display.h>
toTFT_eSPI/User_Setup_Select.h
とありますが、TFT_eSPI/User_Setup_Select.h
内の
#include <User_Setup.h> // Default setup is root library folder
は、コメントアウトします。
Arduino IDEでは、Preferences > 追加のボードマネージャのURLに、
https://docs.heltec.cn/download/package_heltec_esp32_index.json
を追加して、ボードマネージャでHeltec WiFi Kit 32を選択します。
プログラムの書き込み時には、TTGOの右ボタンを押す必要があります。
TFT_eSPI tft = TFT_eSPI(135, 240); // Invoke custom library
を
TFT_eSPI tft = TFT_eSPI(240, 320); // ST7789V
に変更しないと、全画面表示されません。OLEDの解像度が上がっているみたいです。
tft.drawString(“WORD”, tft.width() / 2, tft.height() / 2 );
で画面中央に文字が表示されます。
tft.setRotation(1);
で画面の長い方向に文字が表示されます。
tft.pushImage(x_disp_offset, y_disp_offset, 240, 135, ttgo);
tft.drawString(buff, x_disp_offset, y_disp_offset+i*10);
のように、x_disp_offset, y_disp_offsetを付けないと正確な位置に文字や画像が表示されません。
#define x_disp_offset 40
#define y_disp_offset 55
ほどで正確な位置に表示できました。
TTGO-T-Display.ino
#include <TFT_eSPI.h>
#include <SPI.h>
#include “WiFi.h”
#include <Wire.h>
#include <Button2.h>
#include “esp_adc_cal.h”
#include <Ticker.h>
#include “bmp.h”
#define TFT_MOSI 19
#define TFT_SCLK 18
#define TFT_CS 5
#define TFT_DC 16
#define TFT_RST 23
#define TFT_BL 4 // Display backlight control pin
#define ADC_EN 14
#define ADC_PIN 34
#define BUTTON_1 35
#define BUTTON_2 0
#define BUTTONS_MAP {BUTTON_1,BUTTON_2}
#define x_disp_offset 40
#define y_disp_offset 55
//TFT_eSPI tft = TFT_eSPI(135, 240); // Invoke custom library
TFT_eSPI tft = TFT_eSPI(240, 320); // ST7789V
Button2 *pBtns = nullptr;
uint8_t g_btns[] = BUTTONS_MAP;
char buff[320];
int vref = 1100;
int btnCick = false;
Ticker tick;
void showVoltage()
{
static uint64_t timeStamp = 0;
if (millis() – timeStamp > 1000) {
timeStamp = millis();
uint16_t v = analogRead(ADC_PIN);
float battery_voltage = ((float)v / 4095.0) * 2.0 * 3.3 * (vref / 1000.0);
String voltage = “Voltage :” + String(battery_voltage) + “V”;
Serial.println(voltage);
tft.fillScreen(TFT_BLACK);
//tft.setTextDatum(MC_DATUM);
tft.setTextDatum(TC_DATUM);
tft.drawString(voltage, tft.width() / 2, tft.height() / 2 );
}
}
void button_init()
{
uint8_t args = sizeof(g_btns) / sizeof(g_btns[0]);
pBtns = new Button2 [args];
pBtns[0] = Button2(g_btns[0]);
pBtns[1] = Button2(g_btns[1]);
pBtns[0].setLongClickHandler([](Button2 & b) {
btnCick = false;
int r = digitalRead(TFT_BL);
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_GREEN, TFT_BLACK);
tft.setTextDatum(MC_DATUM);
tft.drawString(“Press again to wake up”, tft.width() / 2, tft.height() / 2 );
delay(3000);
digitalWrite(TFT_BL, !r);
tft.writecommand(TFT_DISPOFF);
tft.writecommand(TFT_SLPIN);
esp_sleep_enable_ext1_wakeup(GPIO_SEL_35, ESP_EXT1_WAKEUP_ALL_LOW);
esp_deep_sleep_start();
});
pBtns[0].setPressedHandler([](Button2 & b) {
Serial.println(“Detect Voltage..”);
btnCick = true;
});
pBtns[1].setPressedHandler([](Button2 & b) {
btnCick = false;
Serial.println(“btn press wifi scan”);
wifi_scan();
});
}
void button_loop()
{
for (int i = 0; i < sizeof(g_btns) / sizeof(g_btns[0]); ++i) {
pBtns[i].loop();
}
}
void wifi_scan()
{
tft.setTextColor(TFT_GREEN, TFT_BLACK);
tft.fillScreen(TFT_BLACK);
tft.setTextDatum(MC_DATUM);
tft.setTextSize(1);
tft.drawString(“Scan Network”, tft.width() / 2, tft.height() / 2);
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
int16_t n = WiFi.scanNetworks();
tft.fillScreen(TFT_BLACK);
if (n == 0) {
tft.drawString(“no networks found”, tft.width() / 2, tft.height() / 2);
} else {
tft.setTextDatum(TL_DATUM);
tft.setCursor(0, 0);
Serial.printf(“Found
for (int i = 0; i < n; ++i) {
sprintf(buff,
“[
i + 1,
WiFi.SSID(i).c_str(),
WiFi.RSSI(i));
//tft.println(buff);
tft.drawString(buff, x_disp_offset, y_disp_offset+i*10);
}
}
WiFi.mode(WIFI_OFF);
}
void setup()
{
Serial.begin(115200);
delay(1000);
Serial.println(“Start”);
//Serial.println( tft.width());
//Serial.println( tft.height());
tft.init();
tft.setRotation(1);
tft.fillScreen(TFT_BLACK);
tft.setTextSize(2);
tft.setTextColor(TFT_WHITE);
tft.setCursor(0, 0);
tft.setTextDatum(MC_DATUM);
tft.drawString(“TTGO”, tft.width() / 2, tft.height() / 2 );
tft.setTextSize(1);
if (TFT_BL > 0) {
pinMode(TFT_BL, OUTPUT);
digitalWrite(TFT_BL, HIGH);
}
tft.setRotation(1);
tft.pushImage(x_disp_offset, y_disp_offset, 240, 135, ttgo);
delay(5000);
tft.setRotation(1);
int i = 1;
while (i–) {
tft.fillScreen(TFT_RED);
delay(1000);
tft.fillScreen(TFT_BLUE);
delay(1000);
tft.fillScreen(TFT_GREEN);
delay(200);
}
button_init();
esp_adc_cal_characteristics_t adc_chars;
esp_adc_cal_value_t val_type = esp_adc_cal_characterize((adc_unit_t)ADC_UNIT_1, (adc_atten_t)ADC1_CHANNEL_6, (adc_bits_width_t)ADC_WIDTH_BIT_12, 1100, &adc_chars);
//Check type of calibration value used to characterize ADC
if (val_type == ESP_ADC_CAL_VAL_EFUSE_VREF) {
Serial.printf(“eFuse Vref:
vref = adc_chars.vref;
} else if (val_type == ESP_ADC_CAL_VAL_EFUSE_TP) {
Serial.printf(“Two Point –> coeff_a:
} else {
Serial.println(“Default Vref: 1100mV”);
}
}
void loop()
{
if (btnCick) {
showVoltage();
}
button_loop();
}