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 to TFT_eSPI/User_Setups/
  • Add #include <User_Setups/TTGO_T_Display.h> to TFT_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(); }

 

 

Translate »