diff --git a/README.md b/README.md index c6bb8a57..0241a3c4 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ LoLin32lite + [LoraNode32-Lite shield](https://github.com/hallard/LoLin32-Lite-L - Pyom: WiPy - WeMos: LoLin32, LoLin32 Lite, WeMos D32, [Wemos32 Oled](https://www.instructables.com/id/ESP32-With-Integrated-OLED-WEMOSLolin-Getting-Star/) - Crowdsupply: [TinyPICO](https://www.crowdsupply.com/unexpected-maker/tinypico) +- TTGO: [T-Display](https://www.aliexpress.com/item/33048962331.html) - Generic ESP32 Depending on board hardware following features are supported: diff --git a/img/Paxcounter-ttgo-tdisplay.jpg b/img/Paxcounter-ttgo-tdisplay.jpg new file mode 100644 index 00000000..7e3cac4b Binary files /dev/null and b/img/Paxcounter-ttgo-tdisplay.jpg differ diff --git a/include/bmesensor.h b/include/bmesensor.h index c0d17475..5724db84 100644 --- a/include/bmesensor.h +++ b/include/bmesensor.h @@ -21,43 +21,29 @@ extern Ticker bmecycler; extern bmeStatus_t bme_status; // Make struct for storing gps data globally available -// --- Bosch BSEC v1.4.7.4 library configuration --- -// 3,3V supply voltage; 3s max time between sensor_control calls; 4 days +// --- Bosch BSEC library configuration --- +// We use 3,3V supply voltage; 3s max time between sensor_control calls; 4 days // calibration. Change this const if not applicable for your application (see -// BME680 datasheet) -// Note: 3s max time not exceed BMECYCLE frequency set in paxcounter.conf! -const uint8_t bsec_config_iaq[454] = { - 4, 7, 4, 1, 61, 0, 0, 0, 0, 0, 0, 0, 174, 1, 0, - 0, 48, 0, 1, 0, 0, 192, 168, 71, 64, 49, 119, 76, 0, 0, - 225, 68, 137, 65, 0, 63, 205, 204, 204, 62, 0, 0, 64, 63, 205, - 204, 204, 62, 0, 0, 0, 0, 216, 85, 0, 100, 0, 0, 0, 0, - 0, 0, 0, 0, 28, 0, 2, 0, 0, 244, 1, 225, 0, 25, 0, - 0, 128, 64, 0, 0, 32, 65, 144, 1, 0, 0, 112, 65, 0, 0, - 0, 63, 16, 0, 3, 0, 10, 215, 163, 60, 10, 215, 35, 59, 10, - 215, 35, 59, 9, 0, 5, 0, 0, 0, 0, 0, 1, 88, 0, 9, - 0, 229, 208, 34, 62, 0, 0, 0, 0, 0, 0, 0, 0, 218, 27, - 156, 62, 225, 11, 67, 64, 0, 0, 160, 64, 0, 0, 0, 0, 0, - 0, 0, 0, 94, 75, 72, 189, 93, 254, 159, 64, 66, 62, 160, 191, - 0, 0, 0, 0, 0, 0, 0, 0, 33, 31, 180, 190, 138, 176, 97, - 64, 65, 241, 99, 190, 0, 0, 0, 0, 0, 0, 0, 0, 167, 121, - 71, 61, 165, 189, 41, 192, 184, 30, 189, 64, 12, 0, 10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 229, 0, 254, 0, 2, 1, 5, 48, - 117, 100, 0, 44, 1, 112, 23, 151, 7, 132, 3, 197, 0, 92, 4, - 144, 1, 64, 1, 64, 1, 144, 1, 48, 117, 48, 117, 48, 117, 48, - 117, 100, 0, 100, 0, 100, 0, 48, 117, 48, 117, 48, 117, 100, 0, - 100, 0, 48, 117, 48, 117, 100, 0, 100, 0, 100, 0, 100, 0, 48, - 117, 48, 117, 48, 117, 100, 0, 100, 0, 100, 0, 48, 117, 48, 117, - 100, 0, 100, 0, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, - 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, - 44, 1, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, - 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, - 112, 23, 112, 23, 112, 23, 112, 23, 112, 23, 112, 23, 112, 23, 112, - 23, 112, 23, 112, 23, 112, 23, 112, 23, 112, 23, 112, 23, 255, 255, - 255, 255, 255, 255, 255, 255, 220, 5, 220, 5, 220, 5, 255, 255, 255, - 255, 255, 255, 220, 5, 220, 5, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, - 255, 255, 255, 255, 255, 255, 255, 255, 255, 44, 1, 0, 0, 0, 0, - 138, 80, 0, 0}; +// BME680 datasheet) Note: 3s max time must not exceed BMECYCLE frequency set in +// paxcounter.conf! + +const uint8_t bsec_config_iaq[] = { +#include "config/generic_33v_3s_4d/bsec_iaq.txt" +}; + +/* Configure the BSEC library with information about the sensor + 18v/33v = Voltage at Vdd. 1.8V or 3.3V + 3s/300s = BSEC operating mode, BSEC_SAMPLE_RATE_LP or BSEC_SAMPLE_RATE_ULP + 4d/28d = Operating age of the sensor in days + generic_18v_3s_4d + generic_18v_3s_28d + generic_18v_300s_4d + generic_18v_300s_28d + generic_33v_3s_4d + generic_33v_3s_28d + generic_33v_300s_4d + generic_33v_300s_28d +*/ // Helper functions declarations int bme_init(); diff --git a/platformio_orig.ini b/platformio_orig.ini index dbaa6046..def51a91 100644 --- a/platformio_orig.ini +++ b/platformio_orig.ini @@ -20,6 +20,7 @@ halfile = generic.h ;halfile = ttgofox.h ;halfile = ttgobeam.h ;halfile = ttgobeam10.h +;halfile = ttgotdisplay.h ;halfile = fipy.h ;halfile = lopy.h ;halfile = lopy4.h @@ -75,7 +76,8 @@ lib_deps_sensors = adafruit/Adafruit Unified Sensor @ ^1.1.4 adafruit/Adafruit BME280 Library @ ^2.1.1 adafruit/Adafruit BMP085 Library @ ^1.1.0 - boschsensortec/BSEC Software Library @ 1.5.1474 + ;boschsensortec/BSEC Software Library @ 1.6.1480 + https://github.com/BoschSensortec/BSEC-Arduino-library.git https://github.com/ricki-z/SDS011.git lib_deps_basic = bblanchon/ArduinoJson @ <6 diff --git a/src/display.cpp b/src/display.cpp index 7e7e5b38..43be8d80 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -53,7 +53,7 @@ QRCode qrcode; #if (HAS_DISPLAY) == 1 OBDISP ssoled; #elif (HAS_DISPLAY) == 2 -TFT_eSPI tft = TFT_eSPI(); +TFT_eSPI tft = TFT_eSPI(MY_DISPLAY_WIDTH, MY_DISPLAY_HEIGHT); #else #error Unknown display type specified in hal file #endif diff --git a/src/hal/ttgotdisplay.h b/src/hal/ttgotdisplay.h new file mode 100644 index 00000000..0011d825 --- /dev/null +++ b/src/hal/ttgotdisplay.h @@ -0,0 +1,55 @@ +// clang-format off +// upload_speed 1500000 +// board esp32dev + +#ifndef _TTGOTDISPLAY_H +#define _TTGOTDISPLAY_H + +#include + +#define DISABLE_BROWNOUT 1 // comment out if you want to keep brownout feature + +#define HAS_DISPLAY 2 // TFT-LCD, support work in progess, not ready yet +#define MY_DISPLAY_FLIP 1 // use if display is rotated + +#define HAS_LED NOT_A_PIN // no on board LED (?) +#define HAS_BUTTON (35) // on board button A + +// power management settings +#define BAT_MEASURE_ADC ADC1_GPIO34_CHANNEL // battery probe GPIO pin -> ADC1_CHANNEL_6 +#define BAT_VOLTAGE_DIVIDER 2.605f // voltage divider + +// Display Settings +#define MY_DISPLAY_WIDTH 135 +#define MY_DISPLAY_HEIGHT 240 +#define MY_DISPLAY_INVERT 1 + +// setting for TTGO T-display +#define USER_SETUP_LOADED 1 +#define ST7789_DRIVER 1 + +#define CGRAM_OFFSET + +#define TFT_MOSI GPIO_NUM_19 // SPI +#define TFT_SCLK GPIO_NUM_18 // SPI +#define TFT_CS GPIO_NUM_5 // Chip select control +#define TFT_DC GPIO_NUM_16 // Data Command control +#define TFT_RST GPIO_NUM_23 // Reset +#define TFT_BL GPIO_NUM_4 // LED back-light + +#define TFT_RGB_ORDER TFT_BGR // Colour order Blue-Green-Red + +#define LOAD_GLCD // Font 1. Original Adafruit 8 pixel font needs ~1820 bytes in FLASH +#define LOAD_FONT2 // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters +#define LOAD_FONT4 // Font 4. Medium 26 pixel high font, needs ~5848 bytes in FLASH, 96 characters +#define LOAD_FONT6 // Font 6. Large 48 pixel font, needs ~2666 bytes in FLASH, only characters 1234567890:-.apm +#define LOAD_FONT7 // Font 7. 7 segment 48 pixel font, needs ~2438 bytes in FLASH, only characters 1234567890:-. +#define LOAD_FONT8 // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-. +//#define LOAD_FONT8N // Font 8. Alternative to Font 8 above, slightly narrower, so 3 digits fit a 160 pixel TFT +#define LOAD_GFXFF // FreeFonts. Include access to the 48 Adafruit_GFX free fonts FF1 to FF48 and custom fonts +#define SMOOTH_FONT + +#define SPI_FREQUENCY 40000000 +#define SPI_READ_FREQUENCY 6000000 + +#endif diff --git a/src/macsniff.cpp b/src/macsniff.cpp index 798de95f..7a5063c7 100644 --- a/src/macsniff.cpp +++ b/src/macsniff.cpp @@ -134,7 +134,7 @@ uint16_t mac_analyze(MacBuffer_t MacBuffer) { uint32_t *oui; // temporary buffer for vendor OUI oui = (uint32_t *)MacBuffer.mac; // if we find OUI on vendor filter list we don't analyze and return early - if (std::find(vendors.begin(), vendors.end(), __builtin_bswap32(*oui) >> 8) != + if (std::find(vendors.begin(), vendors.end(), __builtin_bswap32(*oui) >> 8) == vendors.end()) return 0; #endif @@ -212,4 +212,4 @@ uint16_t mac_analyze(MacBuffer_t MacBuffer) { // if an unknown Wifi or BLE mac was counted, return hash of this mac, else 0 return (added ? hashedmac : 0); -} \ No newline at end of file +} diff --git a/src/power.cpp b/src/power.cpp index 5d3d770e..ee07aba9 100644 --- a/src/power.cpp +++ b/src/power.cpp @@ -47,12 +47,10 @@ void AXP192_powerevent_IRQ(void) { if (pmu.isBattTempHighIRQ()) ESP_LOGI(TAG, "Battery low temperature."); -// short press -> esp32 deep sleep mode, can be exited by pressing user button -#ifdef HAS_BUTTON + // short press -> esp32 deep sleep mode, can be exited by pressing user button if (pmu.isPEKShortPressIRQ() && (RTC_runmode == RUNMODE_NORMAL)) { enter_deepsleep(0, HAS_BUTTON); } -#endif // long press -> shutdown power, can be exited by another longpress if (pmu.isPEKLongtPressIRQ()) { @@ -85,10 +83,12 @@ void AXP192_power(pmu_power_t powerlevel) { pmu.setPowerOutPut(AXP192_LDO2, AXP202_OFF); // lora off break; - default: // all rails power on - pmu.setPowerOutPut(AXP192_LDO2, AXP202_ON); // Lora on T-Beam V1.0 - pmu.setPowerOutPut(AXP192_LDO3, AXP202_ON); // Gps on T-Beam V1.0 - pmu.setPowerOutPut(AXP192_DCDC1, AXP202_ON); // OLED on T-Beam v1.0 + default: // all rails power on + pmu.setPowerOutPut(AXP192_LDO2, AXP202_ON); // Lora on T-Beam V1.0 + pmu.setPowerOutPut(AXP192_LDO3, AXP202_ON); // Gps on T-Beam V1.0 + pmu.setPowerOutPut(AXP192_DCDC1, AXP202_ON); // OLED on T-Beam v1.0 + pmu.setPowerOutPut(AXP192_DCDC2, AXP202_OFF); // unused on T-Beam v1.0 + pmu.setPowerOutPut(AXP192_EXTEN, AXP202_OFF); // unused on T-Beam v1.0 pmu.setChgLEDMode(AXP20X_LED_LOW_LEVEL); break; } @@ -121,6 +121,8 @@ void AXP192_init(void) { // configure AXP192 pmu.setDCDC1Voltage(3300); // for external OLED display + pmu.setLDO2Voltage(3300); // LORA VDD 3v3 + pmu.setLDO3Voltage(3300); // GPS VDD 3v3 pmu.setTimeOutShutdown(false); // no automatic shutdown pmu.setTSmode(AXP_TS_PIN_MODE_DISABLE); // TS pin mode off to save power @@ -138,7 +140,8 @@ void AXP192_init(void) { attachInterrupt(digitalPinToInterrupt(PMU_INT), PMUIRQ, FALLING); pmu.enableIRQ(AXP202_VBUS_REMOVED_IRQ | AXP202_VBUS_CONNECT_IRQ | AXP202_BATT_REMOVED_IRQ | AXP202_BATT_CONNECT_IRQ | - AXP202_CHARGING_FINISHED_IRQ, + AXP202_CHARGING_FINISHED_IRQ | AXP202_PEK_SHORTPRESS_IRQ | + AXP202_PEK_LONGPRESS_IRQ, 1); pmu.clearIRQ(); #endif // PMU_INT