mirror of
https://github.com/Xinyuan-LilyGO/TTGO-T-Display.git
synced 2024-09-21 09:57:27 +00:00
249 lines
7.2 KiB
C++
249 lines
7.2 KiB
C++
#include <TFT_eSPI.h>
|
|
#include <SPI.h>
|
|
#include "WiFi.h"
|
|
#include <Wire.h>
|
|
#include <Button2.h>
|
|
#include "esp_adc_cal.h"
|
|
#include "bmp.h"
|
|
|
|
#ifndef TFT_DISPOFF
|
|
#define TFT_DISPOFF 0x28
|
|
#endif
|
|
|
|
#ifndef TFT_SLPIN
|
|
#define TFT_SLPIN 0x10
|
|
#endif
|
|
|
|
#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 //ADC_EN is the ADC detection enable port
|
|
#define ADC_PIN 34
|
|
#define BUTTON_1 35
|
|
#define BUTTON_2 0
|
|
|
|
TFT_eSPI tft = TFT_eSPI(135, 240); // Invoke custom library
|
|
Button2 btn1(BUTTON_1);
|
|
Button2 btn2(BUTTON_2);
|
|
|
|
char buff[512];
|
|
int vref = 1100;
|
|
int btnCick = false;
|
|
|
|
#define ENABLE_SPI_SDCARD
|
|
|
|
//Uncomment will use SDCard, this is just a demonstration,
|
|
//how to use the second SPI
|
|
#ifdef ENABLE_SPI_SDCARD
|
|
|
|
#include "FS.h"
|
|
#include "SD.h"
|
|
|
|
SPIClass SDSPI(HSPI);
|
|
|
|
#define MY_CS 33
|
|
#define MY_SCLK 25
|
|
#define MY_MISO 27
|
|
#define MY_MOSI 26
|
|
|
|
void setupSDCard()
|
|
{
|
|
SDSPI.begin(MY_SCLK, MY_MISO, MY_MOSI, MY_CS);
|
|
//Assuming use of SPI SD card
|
|
if (!SD.begin(MY_CS, SDSPI)) {
|
|
Serial.println("Card Mount Failed");
|
|
tft.setTextColor(TFT_RED);
|
|
tft.drawString("SDCard Mount FAIL", tft.width() / 2, tft.height() / 2 - 32);
|
|
tft.setTextColor(TFT_GREEN);
|
|
} else {
|
|
tft.setTextColor(TFT_GREEN);
|
|
Serial.println("SDCard Mount PASS");
|
|
tft.drawString("SDCard Mount PASS", tft.width() / 2, tft.height() / 2 - 48);
|
|
String size = String((uint32_t)(SD.cardSize() / 1024 / 1024)) + "MB";
|
|
tft.drawString(size, tft.width() / 2, tft.height() / 2 - 32);
|
|
}
|
|
}
|
|
#else
|
|
#define setupSDCard()
|
|
#endif
|
|
|
|
|
|
void wifi_scan();
|
|
|
|
//! Long time delay, it is recommended to use shallow sleep, which can effectively reduce the current consumption
|
|
void espDelay(int ms)
|
|
{
|
|
esp_sleep_enable_timer_wakeup(ms * 1000);
|
|
esp_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_ON);
|
|
esp_light_sleep_start();
|
|
}
|
|
|
|
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.drawString(voltage, tft.width() / 2, tft.height() / 2 );
|
|
}
|
|
}
|
|
|
|
void button_init()
|
|
{
|
|
btn1.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 );
|
|
espDelay(6000);
|
|
digitalWrite(TFT_BL, !r);
|
|
|
|
tft.writecommand(TFT_DISPOFF);
|
|
tft.writecommand(TFT_SLPIN);
|
|
//After using light sleep, you need to disable timer wake, because here use external IO port to wake up
|
|
esp_sleep_disable_wakeup_source(ESP_SLEEP_WAKEUP_TIMER);
|
|
// esp_sleep_enable_ext1_wakeup(GPIO_SEL_35, ESP_EXT1_WAKEUP_ALL_LOW);
|
|
esp_sleep_enable_ext0_wakeup(GPIO_NUM_35, 0);
|
|
delay(200);
|
|
esp_deep_sleep_start();
|
|
});
|
|
btn1.setPressedHandler([](Button2 & b) {
|
|
Serial.println("Detect Voltage..");
|
|
btnCick = true;
|
|
});
|
|
|
|
btn2.setPressedHandler([](Button2 & b) {
|
|
btnCick = false;
|
|
Serial.println("btn press wifi scan");
|
|
wifi_scan();
|
|
});
|
|
}
|
|
|
|
void button_loop()
|
|
{
|
|
btn1.loop();
|
|
btn2.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 %d net\n", n);
|
|
for (int i = 0; i < n; ++i) {
|
|
sprintf(buff,
|
|
"[%d]:%s(%d)",
|
|
i + 1,
|
|
WiFi.SSID(i).c_str(),
|
|
WiFi.RSSI(i));
|
|
tft.println(buff);
|
|
}
|
|
}
|
|
WiFi.mode(WIFI_OFF);
|
|
}
|
|
|
|
void setup()
|
|
{
|
|
Serial.begin(115200);
|
|
Serial.println("Start");
|
|
|
|
/*
|
|
ADC_EN is the ADC detection enable port
|
|
If the USB port is used for power supply, it is turned on by default.
|
|
If it is powered by battery, it needs to be set to high level
|
|
*/
|
|
pinMode(ADC_EN, OUTPUT);
|
|
digitalWrite(ADC_EN, HIGH);
|
|
|
|
tft.init();
|
|
tft.setRotation(1);
|
|
tft.fillScreen(TFT_BLACK);
|
|
tft.setTextSize(2);
|
|
tft.setTextColor(TFT_GREEN);
|
|
tft.setCursor(0, 0);
|
|
tft.setTextDatum(MC_DATUM);
|
|
tft.setTextSize(1);
|
|
|
|
if (TFT_BL > 0) { // TFT_BL has been set in the TFT_eSPI library in the User Setup file TTGO_T_Display.h
|
|
pinMode(TFT_BL, OUTPUT); // Set backlight pin to output mode
|
|
digitalWrite(TFT_BL, TFT_BACKLIGHT_ON); // Turn backlight on. TFT_BACKLIGHT_ON has been set in the TFT_eSPI library in the User Setup file TTGO_T_Display.h
|
|
}
|
|
|
|
tft.setSwapBytes(true);
|
|
tft.pushImage(0, 0, 240, 135, ttgo);
|
|
espDelay(5000);
|
|
|
|
|
|
tft.setRotation(0);
|
|
tft.fillScreen(TFT_RED);
|
|
espDelay(1000);
|
|
tft.fillScreen(TFT_BLUE);
|
|
espDelay(1000);
|
|
tft.fillScreen(TFT_GREEN);
|
|
espDelay(1000);
|
|
|
|
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:%u mV", adc_chars.vref);
|
|
vref = adc_chars.vref;
|
|
} else if (val_type == ESP_ADC_CAL_VAL_EFUSE_TP) {
|
|
Serial.printf("Two Point --> coeff_a:%umV coeff_b:%umV\n", adc_chars.coeff_a, adc_chars.coeff_b);
|
|
} else {
|
|
Serial.println("Default Vref: 1100mV");
|
|
}
|
|
|
|
|
|
tft.fillScreen(TFT_BLACK);
|
|
tft.setTextDatum(MC_DATUM);
|
|
|
|
setupSDCard();
|
|
|
|
|
|
tft.drawString("LeftButton:", tft.width() / 2, tft.height() / 2 - 16);
|
|
tft.drawString("[WiFi Scan]", tft.width() / 2, tft.height() / 2 );
|
|
tft.drawString("RightButton:", tft.width() / 2, tft.height() / 2 + 16);
|
|
tft.drawString("[Voltage Monitor]", tft.width() / 2, tft.height() / 2 + 32 );
|
|
tft.drawString("RightButtonLongPress:", tft.width() / 2, tft.height() / 2 + 48);
|
|
tft.drawString("[Deep Sleep]", tft.width() / 2, tft.height() / 2 + 64 );
|
|
tft.setTextDatum(TL_DATUM);
|
|
}
|
|
|
|
void loop()
|
|
{
|
|
if (btnCick) {
|
|
showVoltage();
|
|
}
|
|
button_loop();
|
|
}
|