Giter Club home page Giter Club logo

esp32-weather-epd's Introduction

ESP32 E-Paper Weather Display

This is a weather display powered by a wifi-enabled ESP32 microcontroller and a 7.5in E-Paper (aka E-ink) display. Current and forecasted weather data is obtained from the OpenWeatherMap API. A sensor provides the display with accurate indoor temperature and humidity.

The project draws ~14μA when sleeping and an estimated average of ~83mA during its ~15s wake period. The display can be configured to update as frequently as desired. When the refresh interval is set to 30 minutes, the device will run for >6 months on a single 5000mAh battery. The project displays accurate battery life percentage and can be recharged via a USB-C cable connected to a wall adapter or computer.

There are configuration options for everything from location, time/date formats, units, and language to air quality index scale and hourly outlook graph bounds.

The hourly outlook graph (bottom right) shows a line indicating temperature and shaded bars indicating probability of precipitation (or optionally volume of precipitation).

Here are two examples utilizing various configuration options:

Contents

Setup Guide

Hardware

7.5inch (800×480) E-Paper Display

  • Advantages of E-Paper

    • Ultra Low Power Consumption - E-Paper (aka E-Ink) displays are ideal for low-power applications that do not require frequent display refreshes. E-Paper displays only draw power when refreshing the display and do not have a backlight. Images will remain on the screen even when power is removed.
  • Limitations of E-Paper:

    • Colors - E-Paper has traditionally been limited to just black and white, but in recent years 3-color E-Paper screens have started showing up.

    • Refresh Times and Ghosting - E-Paper displays are highly susceptible to ghosting effects if refreshed too quickly. To avoid this, E-Paper displays often take a few seconds to refresh(4s for the unit used in this project) and will alternate between black and white a few times, which can be distracting.

  • Panel support:

    Waveshare and Good Display make equivalent panels. Either variant will work.

    Panel Resolution Colors Notes
    Waveshare 7.5in e-paper (v2) 800x480px Black/White Available here. (recommended)
    Good Display 7.5in e-paper (GDEY075T7) 800x480px Black/White Available here. (recommended)
    Waveshare 7.5in e-Paper (B) 800x480px Red/Black/White Available here.
    Good Display 7.5in e-paper (GDEY075Z08) 800x480px Red/Black/White Available here.
    Waveshare 7.3in ACeP e-Paper (F) 800x480px 7-Color Available here.
    Good Display 7.3in e-paper (GDEY073D46) 800x480px 7-Color Available here.
    Waveshare 7.5in e-paper (v1) 640x384px Black/White Limited support. Some information not displayed, see image.
    Good Display 7.5in e-paper (GDEW075T8) 640x384px Black/White Limited support. Some information not displayed, see image.

    This software has limited support for accent colors. E-paper panels with additional colors tend to have longer refresh times, which will reduce battery life.

DESPI-C02 Adapter Board

FireBeetle 2 ESP32-E Microcontroller

  • Why the ESP32?

    • Onboard WiFi.

    • 520kB of RAM and 4MB of FLASH, enough to store lots of icons and fonts.

    • Low power consumption.

    • Small size, many small development boards available.

  • Why the FireBeetle 2 ESP32-E

    • Drobot's FireBeetle ESP32 models are optimized for low-power consumption (https://diyi0t.com/reduce-the-esp32-power-consumption/). The Drobot's FireBeetle 2 ESP32-E variant offers USB-C, but older versions of the board with Micro-USB would work fine too.

    • Firebeetle ESP32 models include onboard charging circuitry for a 3.7v lithium-ion(LiPo) battery.

    • FireBeetle ESP32 models include onboard circuitry to monitor battery voltage of a battery connected to its JST-PH2.0 connector.

  • https://www.dfrobot.com/product-2195.html

BME280 - Pressure, Temperature, and Humidity Sensor

  • Provides accurate indoor temperature and humidity.

  • Much faster than the DHT22, which requires a 2-second wait before reading temperature and humidity samples.

3.7V Lipo Battery w/ 2 Pin JST Connector

  • Size is up to you. I used a 5000mah battery so that the device can operate on a single charge for >6 months.

  • The battery can be charged by plugging the FireBeetle ESP32 into the wall via the USB-C connector while the battery is plugged into the ESP32's JST connector.

    Warning The polarity of JST-PH2.0 connectors is not standardized! You may need to swap the order of the wires in the connector.

Stand/Frame

  • You'll want a nice way to show off your project. Here are a few popular choices.
  • DIY Wooden
    • I made a small stand by hollowing out a piece of wood from the bottom. On the back, I used a short USB extension cable so that I can charge the battery without needing to remove the components from the stand. I also wired a small reset button to refresh the display manually. Additionally, I 3d printed a cover for the bottom, which is held on by magnets. The E-paper screen is very thin, so I used a thin piece of acrylic to support it.
    • Measurements:
      • depth = 63mm
        height = 49mm
        width = 170.2mm (= width of the screen)
        screen angle = 80deg
        screen is 15mm from the front
  • 3D Printable
  • Picture Frame

Wiring

Pin connections are defined in config.cpp.

If you are using the FireBeetle 2 ESP32-E, you can use the connections I used or change them how you would like.

I have included 2 wiring diagrams. One for the Waveshare HAT rev2.2 and another using the recommended DESPI-C02.

IMPORTANT: The Waveshare E-Paper Driver HAT has two physical switches that MUST be set correctly for the display to work.

  • Display Config: Set switch to position B.

  • Interface Config: Set switch to position 0.

IMPORTANT: The DESPI-C02 adapter has one physical switch that MUST be set correctly for the display to work.

  • RESE: Set switch to position 0.47.

Cut the low power pad for even longer battery life.

  • From https://wiki.dfrobot.com/FireBeetle_Board_ESP32_E_SKU_DFR0654

    Low Power Pad: This pad is specially designed for low power consumption. It is connected by default. You can cut off the thin wire in the middle with a knife to disconnect it. After disconnection, the static power consumption can be reduced by 500 μA. The power consumption can be reduced to 13 μA after controlling the maincontroller enter the sleep mode through the program. Note: when the pad is disconnected, you can only drive RGB LED light via the USB Power supply.

Configuration, Compilation, and Upload

PlatformIO for VSCode is used for managing dependencies, code compilation, and uploading to ESP32.

  1. Clone this repository or download and extract the .zip.

  2. Install VSCode.

  3. Follow these instructions to install the PlatformIO extension for VSCode: https://platformio.org/install/ide?install=vscode

  4. Open the project in VSCode.

    a. File > Open Folder...

    b. Navigate to this project and select the folder called "platformio".

  5. Configure Options.

    • Most configuration options are located in config.cpp, with a few in config.h. Locale/language options can also be found in locales/locale_**.cpp.

    • Important settings to configure in config.cpp:

      • WiFi credentials (ssid, password).

      • Open Weather Map API key (it's free, see next section for important notes about obtaining an API key).

      • Latitude and longitude.

      • Time and date formats.

      • Sleep duration.

      • Pin connections for E-Paper (SPI), BME280 (I2C), and battery voltage (ADC).

    • Important settings to configure in config.h:

      • Units (Metric or Imperial).
    • Comments explain each option in detail.

  6. Build and Upload Code.

    a. Connect ESP32 to your computer via USB.

    b. Click the upload arrow along the bottom of the VSCode window. (Should say "PlatformIO: Upload" if you hover over it.)

    • PlatformIO will automatically download the required third-party libraries, compile, and upload the code. :)

    • You will only see this if you have the PlatformIO extension installed.

    • If you are getting errors during the upload process, you may need to install drivers to allow you to upload code to the ESP32.

OpenWeatherMap API Key

Sign up here to get an API key; it's free. https://openweathermap.org/api

This project will make calls to 2 different APIs ("One Call" and "Air Pollution").

Note OpenWeatherMap One Call 2.5 API has been deprecated for all new free users (accounts created after Summer 2022). Fortunately, you can make 1,000 calls/day to the One Call 3.0 API for free by following the steps below.

  • If you have an account created before Summer 2022, you can simply use the One Call 2.5 API by setting OWM_ONECALL_VERSION = "2.5"; in config.cpp.

  • Otherwise, the One Call API 3.0 is only included in the "One Call by Call" subscription. This separate subscription includes 1,000 calls/day for free and allows you to pay only for the number of API calls made to this product.

Here's how to subscribe and avoid any credit card changes:

Error Messages and Troubleshooting

Low Battery

This error screen appears once the battery voltage has fallen below LOW_BATTERY_VOLTAGE (default = 3.20v). The display will not refresh again until it detects battery voltage above LOW_BATTERY_VOLTAGE. When battery voltage is between LOW_BATTERY_VOLTAGE and VERY_LOW_BATTERY_VOLTAGE (default = 3.10v) the esp32 will deep-sleep for periods of LOW_BATTERY_SLEEP_INTERVAL (default = 30min) before checking battery voltage again. If the battery voltage falls between LOW_BATTERY_SLEEP_INTERVAL and CRIT_LOW_BATTERY_VOLTAGE (default = 3.00v), then the display will deep-sleep for periods VERY_LOW_BATTERY_SLEEP_INTERVAL (default = 120min). If battery voltage falls below CRIT_LOW_BATTERY_VOLTAGE, then the esp32 will enter hibernate mode and will require a manual push of the reset (RST) button to begin updating again.

WiFi Connection

This error screen appears when the ESP32 fails to connect to WiFi. If the message reads "WiFi Connection Failed" this might indicate an incorrect password. If the message reads "SSID Not Available" this might indicate that you mistyped the SSID or that the esp32 is out of the range of the access point. The esp32 will retry once every SLEEP_DURATION (default = 30min).

API Error

This error screen appears if an error (client or server) occurs when making an API request to OpenWeatherMap. The second line will give the error code followed by a descriptor phrase. Positive error codes correspond to HTTP response status codes, while error codes <= 0 indicate a client(esp32) error. The esp32 will retry once every SLEEP_DURATION (default = 30min).

In the example shown to the left, "401: Unauthorized" may be the result of an incorrect API key or that you are attempting to use the One Call v3 API without the proper account setup.

Time Server Error

This error screen appears when the esp32 fails to fetch the time from NTP_SERVER_1/NTP_SERVER_2. This error sometimes occurs immediately after uploading to the esp32; in this case, just hit the reset button or wait for SLEEP_DURATION (default = 30min) and the esp32 to automatically retry. If the error persists, try selecting closer/lower latency time servers or increasing NTP_TIMEOUT.

Licensing

esp32-weather-epd is licensed under the GNU General Public License v3.0 with tools, fonts, and icons whose licenses are as follows:

Name License Description
Adafruit-GFX-Library: fontconvert BSD License CLI tool for preprocessing fonts to be used with the Adafruit_GFX Arduino library.
pollutant-concentration-to-aqi GNU Lesser General Public License v2.1 C library that converts pollutant concentrations to Air Quality Index(AQI).
GNU FreeFont GNU General Public License v3.0 Font Family
Lato SIL OFL v1.1 Font Family
Montserrat SIL OFL v1.1 Font Family
Open Sans SIL OFL v1.1 Font Family
Poppins SIL OFL v1.1 Font Family
Quicksand SIL OFL v1.1 Font Family
Raleway SIL OFL v1.1 Font Family
Roboto Apache License v2.0 Font Family
Roboto Mono Apache License v2.0 Font Family
Roboto Slab Apache License v2.0 Font Family
Ubuntu font Ubuntu Font Licence v1.0 Font Family
Weather Themed Icons SIL OFL v1.1 (wi-**.svg) Weather icon family by Lukas Bischoff/Erik Flowers.
Google Icons Apache License v2.0 (battery**.svg, visibility_icon.svg) Battery and visibility icons from Google Icons.
Biological Hazard Symbol CC0 v1.0 (biological_hazard_symbol.svg) Biohazard icon.
House Icon MIT License (house.svg) House icon.
Indoor Temerature/Humidity Icons SIL OFL v1.1 (house_**.svg) Indoor temerature/humidity icons.
Ionizing Radiation Symbol CC0 v1.0 (ionizing_radiation_symbol.svg) Ionizing radiation icons.
Phosphor Icons MIT License (wifi**.svg, warning_icon.svg, error_icon.svg) WiFi, Warning, and Error icons from Phosphor Icons.
Wind Direction Icon CC BY v3.0 (meteorological_wind_direction_**deg.svg) Meteorological wind direction icon from Online Web Fonts.

esp32-weather-epd's People

Contributors

apiasi avatar asandhu3 avatar colonelmoutarde avatar cwitting avatar davidffry avatar deimi avatar horasim avatar jaquelinep avatar jrial avatar lmarzen avatar ottr-arch avatar pjveltri avatar runweasel avatar sabership avatar srt19170 avatar supergiovane avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

esp32-weather-epd's Issues

Waveshare 7.5in (B)

Hello.

I'm trying to use a https://www.waveshare.com/wiki/7.5inch_e-Paper_HAT_(B) with the project.
I put in renderer.cpp:

// B/W display
// GxEPD2_BW<GxEPD2_750_T7, GxEPD2_750_T7::HEIGHT> display(
//   GxEPD2_750_T7(PIN_EPD_CS,
//                 PIN_EPD_DC,
//                 PIN_EPD_RST,
//                 PIN_EPD_BUSY));
// 3-colour displays */
GxEPD2_3C<GxEPD2_750c_Z08, GxEPD2_750c_Z08::HEIGHT> display(
  GxEPD2_750c_Z08(PIN_EPD_CS,
             PIN_EPD_DC,
             PIN_EPD_RST,
             PIN_EPD_BUSY));

And changed renderer.h and includes accordingly. I used the _Z08 because of the resolution of 800x480.

I have this error at linkage:

Linking .pio\build\firebeetle32\firmware.elf
c:/users/aurel/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio\build\firebeetle32\firmware.elf section `.dram0.bss' will not fit in region `dram0_0_seg'
c:/users/aurel/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: DRAM segment data does not fit.
c:/users/aurel/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: DRAM segment data does not fit.
c:/users/aurel/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: region `dram0_0_seg' overflowed by 23880 bytes
collect2.exe: error: ld returned 1 exit status
*** [.pio\build\firebeetle32\firmware.elf] Error 1

Do you know if that panel can be used, or the way it can be?

What does rxOWM[2] identifier stand for?

I am currently trying to understand the code (still learning lol) in order to get a different API working instead of onecall.
So I cam across said int rxOMW[2] which holds http response codes. But I couldn't find any naming convention or something that explains the 'rx' part.
Great project by the way, love it!

api_response.h

Where is api_response.h?

Starting to build your weather station, but Platformio can't find this library.

WiFi Manager Integration

Hello,
Are you interested in a PR to integrate WiFi Manager? I have local branch with it integrated so, I can change WiFi networks/passwords without having deploy a new build.

WiFi Manager also supports custom fields, so I've considered adding custom fields to also set. However I haven't gone down that rabbit hole yet.

  • OWM_APIKEY (Not sure if there are any security implications. With it complied it would be harder to get to. If I were to add it to configs, it would likely just be saved in json format using SPIFFS).
  • CITY_STRING (In case I move)
  • LAT (CITY_STRING would be useless without this).
  • LON (CITY_STRING would be useless without this).
  • TIMEZONE (In case I move)

One Call deserializeJson() failed: IncompleteInput

I am able to connect to wifi, pull down the time from the NTP server, but then I get an error "One Call deserializeJson() failed: IncompleteInput"

This repeats 3x before continuing on. I can confirm that in Open Weather API Subscriptions that I see the call attempts increase. I am following this project verbatim using a DFRobot Firebeetle 2 (ESP32-E) and a BME-280.

Outdoor Temp Sensor

I just built this project yesterday and love it!! Have you considered maybe adding a wireless temp sensor to the project?

Add Sensor Module

Would it be possible with this configuration to add a sensor module gather data from a location other than the main station?

Include google Calendar

Hello again!
I was trying to include google calendar items and making it configurable whether to show upcoming events or the outlook graph on the right.

I built a node-red endpoint which is pulling events from iCal private links and responds with an array of days and events for each day in this format:

{ "days": [ { "date": "Samstag, 11. März 2023", "events": [ { "summary": "awgaf", "eventStart": "2023-03-11T08:30:00.000Z", "calendarName": "CalendarA" } ] }, { "date": "Samstag, 18. März 2023", "events": [ { "summary": "asgsdsaf", "eventStart": "2023-03-17T23:00:00.000Z", "calendarName": "CalendarB" }, { "summary": "aergherhae", "eventStart": "2023-03-18T09:00:00.000Z", "calendarName": "CalendarA" } ] } ] }

I was trying to implement it in your project but struggle how to pass the received response to a drawCalendarItems function in the rendere.cpp file.

I must admit I'm not an expert in coding and this is really just a trial and error approach replicating what you did for parsing the OWM calls and drawing the content.
Would you be willing to support this?

ePaper Screen does not work

Hello! Thank you for the nice project!

This is a bit outside the scope of this project, but I thought I would try anyway.

I bought this screen and this ESP32 board for the screen. This ESP board has different pins for SPI, found here. Previously the e-paper screen was working with them. But when I update config.cpp with the same pins, the screen doesn't react.

I can see via the serial monitor that the code is working because it's connecting to my Wifi and making an API request to Openweather.

Any ideas what It could be?

Excessive update requests tied to: Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled

I periodically had an issue where the project would burn through all 1,000 daily requests with openweathermap's service in short order, resulting in a "too many requests" error. I hooked up the serial monitor and let it run for over a week and it finally error'd out again. The errors with core dumps begin on like 6372 of the logfile, towards the end. I've left the preceding entries in the log so you can see normal operation. I intercepted the error before it burned through all my daily requests, looks like it was retrying every few seconds. Let me know if you need anything else.

putty-esp32 - core dumps.txt

How to Change Icons

Please see the README in the icons folder. This document explains how to use the provided script to generate the c arrays from .svg files. If you want to change any specific icon just replace the existing icon in icons/svg with a new icon, make sure the name is the exact same. Once the script finishes, you will have a folder icons/icons with a .h header for every file that was in the icons/svg folder. Copy the contents of icons/icons to platformio/src/icons. Then recompile and upload.

Humidity in Graph

I now have the correct Paper and everything works fine except, the humidity doesn't seem to be displayed in the graph.
No blocks appear even though I have a Humidity of 43%

Localisation: AQI

I've created a Dutch translation (for which I'll create a pull request once I figure out some last details), but I noticed the air quality index is reported in English. Not sure if that issue belongs here, or in the pollutant-concentration-to-aqi repo, since the strings are taken directly from there. But since the AQI repo doesn't have any translations, I felt the correct place to create an issue was here.

It would be nice if these strings would also be translatable via the translation files.

Retries on API or wifi fail

Hi -

VERY NICE PROJECT for a start - thanks for sharing it with us all.

I have flashed the code onto a spare board to play with before committing to buying the display .... what I see so far (debug terminal) is that on a wifi fail, or API request fail we wait until the next wake time to try again. I am examining the code (as an amateur!) now, but if this is something I have misconfigured or is not expected plz let me know :-)

I'll try to work out in code how to try say 3 times 1 minute apart on a fail before failing until the next wake time - already I see:

display.powerOff();
beginDeepSleep(startTime, &timeInfo);

on a fail of fetching the time so will start there.

eink display loses contrast on days with high PoP

On days with high PoP throughout the day, there's something about the PoP graph that causes the entire display to lose contrast. I'm using the 7.5" BW display, Waveshare e-Paper Driver HAT rev2.3.

image

Fully removing the PoP graph or drawing the graph with every third pixel (it's currently every other pixel) seems to resolve the issue.

image

image

Guru Meditation Error: Core 1 panic'ed (IllegalInstruction). Exception was unhandled.

Hello and thanks for the cool project.

After solving a USB Serial problem I managed to compile and upload the code.
But I now have another problem, it get's into a reboot loop because of this error

Guru Meditation Error: Core 1 panic'ed (IllegalInstruction). Exception was unhandled

Here's the complete output

ELF file SHA256: dee408f393c3a310

Rebooting...

ets Jul 29 2019 12:21:46
rst:0xc (SW_CPU_RESET),boot:0x1b (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0030,len:1184
load:0x40078000,len:13232
load:0x40080400,len:3028
entry 0x400805e4
Battery voltage: 4.14
Connecting to ''.........................................
IP: 192.168.0.44
Saturday, September 23, 2023 15:13:34
Attempting HTTP Request: api.openweathermap.org/data/2.5/onecall?lat=47.4222&lon=8.3639&lang=en&units=standard&exclude=minutely&appid={API key}
200 OK
Attempting HTTP Request: api.openweathermap.org/data/2.5/air_pollution/history?lat=47.&lon=8.
*&start=1695388418&end=1695474817&appid={API key}
200 OK
Reading from BME280... Success
Guru Meditation Error: Core 1 panic'ed (IllegalInstruction). Exception was unhandled.
Memory dump at 0x40176c2c: 00004136 00004136 1d004136
Core 1 register dump:
PC : 0x40176c32 PS : 0x00060f30 A0 : 0x800db446 A1 : 0x3ffd8a80
A2 : 0x3ffc4188 A3 : 0x020036d1 A4 : 0x3ffd8acc A5 : 0x00000000
A6 : 0x3ffd8a7c A7 : 0x3ffc5820 A8 : 0x3f44ace8 A9 : 0x3ffd8a40
A10 : 0x00000003 A11 : 0x401775e8 A12 : 0x00000045 A13 : 0x0000015c
A14 : 0x3ffd8a78 A15 : 0x3ffd8a7a SAR : 0x00000010 EXCCAUSE: 0x00000000
EXCVADDR: 0x00000000 LBEG : 0x4008bc75 LEND : 0x4008bc85 LCOUNT : 0xffffffff

Backtrace: 0x40176c2f:0x3ffd8a80 0x400db443:0x3ffd8aa0 0x400d99a1:0x3ffd8b40 0x400e72de:0x3ffd8d20

Thanks

(PS I didn't put the output as code as it looks quite messy)

Adding new display items and edit icons 5 days

Tell me how to add a new monitoring item as "Daylength"
And also how to make a gray frame behind the weather icon for 5 days. I tried to increase the size of the icons for 5 days, but the icon turned out blurry.
// icons display.drawInvertedBitmap(x, 350 + 69 / 2 - 32 - 6, getForecastBitmap64(daily[i]), 64, 64, GxEPD_BLACK);
I change it to 96 and the icons are blurry
// icons display.drawInvertedBitmap(x, 350 + 69 / 2 - 32 - 6, getForecastBitmap64(daily[i]), 96, 96, GxEPD_BLACK);

One Call API 3.0

Hello,

i need some help with your Weather Station Project.

This is my Api Key and i also signed to 3.0, everything working:
https://api.openweathermap.org/data/3.0/onecall?lat=47.28&lon=12.83&units=metric&lang=de&appid=e186e663cc7f8efc0006a3129edabc25

but when i compile everything and upload my Firmware, Allway One Call 3.0 API -1: connection refused.

Here comes the funny part:

In my router it i can see an Ip Adress also give it a free Static IP via Mac Adress.
I can Ping that Adress but Target host not avaible.

I can send you my Code if you whant to take a look.
I have no clue what is wrong.

I also tried to change to 2.5 API Link and Version, nothing.

best regards,

diettelo
Screenshot 2023-10-23 200021
Screenshot 2023-10-23 200056
Screenshot 2023-10-23 200114
Screenshot 2023-10-23 200134
Screenshot 2023-10-23 200143
Screenshot 2023-10-23 200150

Error redrerer.cpp

When loading into the ESP, an error occurs in the line
src/renderer.cpp:317:59: error: no matching function for call to 'max(float, double)'

317: uint uvi = static_cast(max(round(current.uvi), 0.0));

*** [.pio\build\firebeetle32\src\renderer.cpp.o] Error 1

Dust sensor

There is a great idea to create a dust sensor based on an inexpensive DSM501A sensor with a 4 inch display

Support for Waveshare 7.5 e ink v1

Hi @lmarzen
I like to use your project. However, I only have the old e ink display with a resolution of 640 × 384px.
Can you add support for this display as well. I found the config in 'config.h' line 24f but I don't know what needs to be changed for the smaller resolution.
Thanks in advance.

Localisation: wind speed, air pressure

I noticed that wind speed for Metric uses the SI unit of m/s. However, that's not how we measure speeds over here in anything other than a scientific setting, and very specific scenarios like muzzle speeds of firearms. Colloquially, we measure in km/h. With a conversion factor of * 3.6 from m/s to km/h. But some sites also report in "Beaufort", which has a slightly more complex conversion formula.

Air pressure has a similar issue: the current "Metric" defaults to hPa, but mbar is also used (moreso in the past). Fortunately, both units are interchangeable: 1 atmosphere equals 1013hPa, which equals 1013mbar. So only the label needs to be swapped, for those that prefer to read "mbar".

I'm willing to create a pull request for this, but I was wondering which approach you'd prefer:

  1. Just update m/s to km/h and apply the conversion factor, disregard Beaufort and mbar.
  2. create multiple "metric variants", e.g. UNITS_METRIC_SI, UNITS_METRIC_KPH, UNITS_METRIC_BEAUFORT, and a setting to toggle between hPa and mbar.
  3. Split the unit system out into separate systems for temperature, wind speed and air pressure, so people can configure these independently. Imperial/Metric would then only apply to temperature, and renamed to UNITS_TEMPERATURE_IMPERIAL. New config keys would be added for UNITS_WINDSPEED_KPH (and *_MPS or *_SI and *_MPH), UNITS_PRESSURE_HPA and UNITS_PRESSURE_MBAR (and whatever is currently defined for imperial; need to look that up).

Is it possible to have the wind direction shown in degrees?

Hi,
Just a feature request/enhancememnt.
Is it possible to have the wind diricetion shown in degrees rather than an arrow Icon?
i.e. 270 @
Had a look at the code but its beyond my understanding.

Built the Station, works great, thanks!

Partial refresh support

I just got all the components (finally!) and got my own unit working as expected and customized for my location/preferences.

Works great!

I was doing some poking around and am having trouble understanding how to get partial refresh working. I was hoping to further enhance that low power goals of this project by preventing the full refresh which takes multiple seconds to occur as it flashes the full screen multiple times to redraw.

I know my panel supports partial refresh according to the spec, but it seems like nothing I change in the display init flow makes any difference -- I still get the full refresh every time.

I have been searching around and have run into dead ends. Are there any resources available or hints as to where I can investigate further in an attempt to implement this?

"Unexpected error occured" during build

I'm trying to build from the github main branch. Windows 11, Visual Studio Code Version 1.75.1, PlatformIO Core 6.1.6, Home 3.4.3. Build fails with the following traceback. I've uninstalled and reinstalled VSCode and PlatformIO with no change. I'm not an expert in either, so this could very well be a problem behind the keyboard. I was able to compile a simple Hello World in VSCode.

Any pointers?

`Resolving firebeetle32 dependencies...
Error: Traceback (most recent call last):
File "C:\Users\roger.platformio\penv\lib\site-packages\platformio_main_.py", line 102, in main
cli() # pylint: disable=no-value-for-parameter
File "C:\Users\roger.platformio\penv\lib\site-packages\click\core.py", line 1130, in call
return self.main(*args, **kwargs)
File "C:\Users\roger.platformio\penv\lib\site-packages\click\core.py", line 1055, in main
rv = self.invoke(ctx)
File "C:\Users\roger.platformio\penv\lib\site-packages\platformio\cli.py", line 71, in invoke
return super().invoke(ctx)
File "C:\Users\roger.platformio\penv\lib\site-packages\click\core.py", line 1657, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "C:\Users\roger.platformio\penv\lib\site-packages\click\core.py", line 1657, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "C:\Users\roger.platformio\penv\lib\site-packages\click\core.py", line 1404, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "C:\Users\roger.platformio\penv\lib\site-packages\click\core.py", line 760, in invoke
return __callback(*args, **kwargs)
File "C:\Users\roger.platformio\penv\lib\site-packages\platformio\project\commands\init.py", line 94, in project_init_cmd
install_project_dependencies(
File "C:\Users\roger.platformio\penv\lib\site-packages\platformio\package\commands\install.py", line 106, in install_project_dependencies
already_up_to_date = not install_project_env_dependencies(env, options)
File "C:\Users\roger.platformio\penv\lib\site-packages\platformio\package\commands\install.py", line 132, in install_project_env_dependencies
_install_project_env_libraries(project_env, options),
File "C:\Users\roger.platformio\penv\lib\site-packages\platformio\package\commands\install.py", line 247, in _install_project_env_libraries
env_lm.install(
File "C:\Users\roger.platformio\penv\lib\site-packages\platformio\package\manager_install.py", line 48, in install
pkg = self._install(spec, skip_dependencies=skip_dependencies, force=force)
File "C:\Users\roger.platformio\penv\lib\site-packages\platformio\package\manager_install.py", line 92, in _install
self.install_dependencies(pkg, print_header=False)
File "C:\Users\roger.platformio\penv\lib\site-packages\platformio\package\manager_install.py", line 140, in install_dependencies
self.install_dependency(dependency)
File "C:\Users\roger.platformio\penv\lib\site-packages\platformio\package\manager\library.py", line 89, in install_dependency
not_builtin_conds.append(not self.is_builtin_lib(spec.name))
File "C:\Users\roger.platformio\penv\lib\site-packages\platformio\package\manager\library.py", line 120, in is_builtin_lib
for storage in cls.get_builtin_libs():
File "C:\Users\roger.platformio\penv\lib\site-packages\platformio\util.py", line 56, in wrapper
self.cache[key] = (time.time(), func(*args, **kwargs))
File "C:\Users\roger.platformio\penv\lib\site-packages\platformio\package\manager\library.py", line 105, in get_builtin_libs
for storage in p.get_lib_storages():
File "C:\Users\roger.platformio\penv\lib\site-packages\platformio\platform\base.py", line 216, in get_lib_storages
pkg = self.get_package(opts["package"])
File "C:\Users\roger.platformio\penv\lib\site-packages\platformio\platform_packages.py", line 29, in get_package
return self.pm.get_package(spec or self.get_package_spec(name))
File "C:\Users\roger.platformio\penv\lib\site-packages\platformio\platform_packages.py", line 21, in get_package_spec
owner=self.packages[name].get("owner"),
KeyError: 'framework-stm32cube'

============================================================

An unexpected error occurred. Further steps:

============================================================

`

Failed to connect to ESP32

I'm having trouble uploading the project. There is one warning early on, and though I just updated Python, it persists and I'm not sure if that's the cause anyway.

Second error, rather generic, I looked at the link, tried suggestions such as disconnecting everything and still can't upload. It's my first time using PIO and just guessing... shouldn't I have a USB connection? I see /dev/cu.Bluetooth-Incoming-Port but I'm not connected by bluetooth?? I'm on a mac running OS12.7 and VS 1.83.0

A fatal error occurred: Failed to connect to ESP32: No serial data received.
For troubleshooting steps visit: https://docs.espressif.com/projects/esptool/en/latest/troubleshooting.html
*** [upload] Error 2

Full terminal ouput below:

================================================== [FAILED] Took 92.01 seconds ==================================================

Environment Status Duration


dfrobot_firebeetle2_esp32e FAILED 00:01:32.008
============================================= 1 failed, 0 succeeded in 00:01:32.008 =============================================

  • The terminal process "platformio 'run', '--target', 'upload'" terminated with exit code: 1.

  • Terminal will be reused by tasks, press any key to close it.

  • Executing task in folder platformio: platformio run --target upload

/Users/davepixmb12/.platformio/penv/lib/python3.9/site-packages/urllib3/init.py:34: NotOpenSSLWarning: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'. See: urllib3/urllib3#3020
warnings.warn(
Processing dfrobot_firebeetle2_esp32e (board: dfrobot_firebeetle2_esp32e; platform: espressif32 @ 6.4.0; framework: arduino)

/Users/davepixmb12/.platformio/penv/lib/python3.9/site-packages/urllib3/init.py:34: NotOpenSSLWarning: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'LibreSSL 2.8.3'. See: urllib3/urllib3#3020
warnings.warn(
Verbose mode can be enabled via -v, --verbose option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/dfrobot_firebeetle2_esp32e.html
PLATFORM: Espressif 32 (6.4.0) > DFRobot Firebeetle 2 ESP32-E
HARDWARE: ESP32 80MHz, 320KB RAM, 4MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES:

  • framework-arduinoespressif32 @ 3.20011.230801 (2.0.11)
  • tool-esptoolpy @ 1.40501.0 (4.5.1)
  • tool-mkfatfs @ 2.0.1
  • tool-mklittlefs @ 1.203.210628 (2.3)
  • tool-mkspiffs @ 2.230.0 (2.30)
  • toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch5
    LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
    LDF Modes: Finder ~ chain, Compatibility ~ soft
    Found 40 compatible libraries
    Scanning dependencies...
    Dependency Graph
    |-- Adafruit BME280 Library @ 2.2.2
    |-- Adafruit BusIO @ 1.14.4
    |-- Adafruit Unified Sensor @ 1.1.13
    |-- ArduinoJson @ 6.21.3
    |-- GxEPD2 @ 1.5.2
    |-- pollutant-concentration-to-aqi
    |-- HTTPClient @ 2.0.0
    |-- SPI @ 2.0.0
    |-- WiFi @ 2.0.0
    |-- WiFiClientSecure @ 2.0.0
    |-- Preferences @ 2.0.0
    |-- Wire @ 2.0.0
    Building in release mode
    Retrieving maximum program size .pio/build/dfrobot_firebeetle2_esp32e/firmware.elf
    Checking size .pio/build/dfrobot_firebeetle2_esp32e/firmware.elf
    Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
    RAM: [=== ] 31.0% (used 101744 bytes from 327680 bytes)
    Flash: [==== ] 44.5% (used 1401097 bytes from 3145728 bytes)
    Configuring upload protocol...
    AVAILABLE: cmsis-dap, esp-bridge, esp-prog, espota, esptool, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa
    CURRENT: upload_protocol = esptool
    Looking for upload port...
    Auto-detected: /dev/cu.Bluetooth-Incoming-Port
    Uploading .pio/build/dfrobot_firebeetle2_esp32e/firmware.bin
    esptool.py v4.5.1
    Serial port /dev/cu.Bluetooth-Incoming-Port
    Connecting......................................

A fatal error occurred: Failed to connect to ESP32: No serial data received.
For troubleshooting steps visit: https://docs.espressif.com/projects/esptool/en/latest/troubleshooting.html
*** [upload] Error 2
================================================== [FAILED] Took 95.12 seconds ==================================================

Environment Status Duration


dfrobot_firebeetle2_esp32e FAILED 00:01:35.118
============================================= 1 failed, 0 succeeded in 00:01:35.118 =============================================

  • The terminal process "platformio 'run', '--target', 'upload'" terminated with exit code: 1.
  • Terminal will be reused by tasks, press any key to close it.

The Red/Black/White e-paper is only visible while refreshing

I have everything connected. When the controller refreshes the screen, I see a white background with the black text briefly, and then the display goes dark. The information is written on the screen, but it's like there is a nearly opaque darkish-red color on the screen. I've tried to include some pictures.

Any ideas on what might be going on?

White refresh:
white-refresh

Red-ish-dark-ish opaqueness:
nearly_opaque

FireBeetle 2 ESP32-E Can't connect via USB port

I've just received all the parts for this cool project, but when trying to upload the code the board USB serial is not recognised.
I've tried on 2 Macs and a PC with 3 different cables which are definitely data versions but the board is not recognised in platformio or Arduino where I've used many ESP32 and ESP8266.
I also tried consulting Dr. Google and there seems to be others with beetle serial port problems but no concrete solution.
Have you come across this and maybe have a solution?

75b_V2 display is not working

I have a no name tricolor display with waveshare ESP32 e-paper driver board that work with waveshare arduino examples, when 75b_v2 is selected. It also works with ESPHome. However esp32-weather-epd does nothing - screen does not flicker, and screen init / render portion happens very quickly which leads me to believe that this portion fails quietly (no errors in console)

Cable question

Hey,
i have (maybe a dump) question... How the cable between the ESP and the driver hat is called?

Add specific humidity option

This is nit picking but when referring to humidity you should have %RH as its Relative Humidity.

I have seen where to edit it but never done a pull request before so will give that a try after reading the instructions.

Multilingual character set support

Hi first of all, great project! Thank you. Also for absolute newbie like me, i suceeded!

I made a translation into german, but can I also change the charakter set? I need the characters "ä", "ö" ...

Thank you,
Mathias from Austria

Error compile VS Studio

Great project I am awaiting FireBeetle32 on order from China. I decided to configure and compile ready to upload once I get the board.

Getting an error from VS Code with one of the parameters.

src/main.cpp: In function 'void beginDeepSleep(long unsigned int&, tm*)':
src/main.cpp:105:58: error: call of overloaded 'String(uint64_t&)' is ambiguous
Serial.println("Deep-sleep for " + String(sleepDuration) + "s");

VS Code flags these String(sleepDuration)

esp_sleep_enable_timer_wakeup(sleepDuration * 1000000ULL);
Serial.println("Awake for " + String((millis() - startTime) / 1000.0, 3) + "s");

  • Serial.println("Deep-sleep for " + String(sleepDuration) + "s"); *
    esp_deep_sleep_start();
    } // end beginDeepSleep

  • line 105 in code

Any idea on fix ?

Thank you again for this great project, going to look at integrating outside ESP32 with temp/humd/Pressure sensor I already have over ESP-now. See if its possible.

Regards,

Graham

Waveshare e-Paper Driver HAT rev2.3

I got a new 7.5 3-colour display from Waveshare this week including a Waveshare e-Paper Driver HAT rev2.3. The new HAT is not documented on Waveshares webpage yet and is different from the previous versions. It features 9 pins, with an additional PWR pin. The display does not start with VCC or PWR only connected. But with PWR connected to second 3.3V and therefore disconnecting the BME it works. I will update if the PWR pin can be put on same 3V3 as the VCC from the hat.

e-Paper HAT

5v or 3.3v version for the BME280 sensor?

In the official wiring diagram, the BME280 is connected to a 3.3v power output, but when I am going to put the order, I found that the model on it need the 5v power input and there is also a BME280 with 3.3v. I just want to make sure which version of the BME280 should we use? Or both of them work?

Xnip2023-09-11_23-39-40 截屏2023-09-11 23 38 37 截屏2023-09-11 23 51 25

Can't compile latest source

Apologies for opening this as it may be something environmental. I've been running the project for a while and love it.

I've just made up a new case and in the process was swapping to a new Firebeetle, so thought i should do an update from Github. Unfortunately, it's now failing to build and i can't see why. It seems to be to do with resource references in some of the source files but everything seems to be set up as i'd expected. I've even tried playing with the LDF loader settings, creating a new PIO project, but so far no luck.

Sample error:
c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/_strftime.cpp.o:(.literal._Z9_strftimePcjPKcPK2tm+0x10): undefined reference to `LC_ABDAY'

Hopefully, I'm just being dense but not being a CPP programmer and new to the ESP32 platform I'm struggling to understand why it's stopped working

Thanks for any insight anyone can offer ....

Full log:

Processing dfrobot_firebeetle2_esp32e (platform: espressif32; board: dfrobot_firebeetle2_esp32e; framework: arduino) --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Verbose mode can be enabled via -v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/dfrobot_firebeetle2_esp32e.html
PLATFORM: Espressif 32 (6.1.0) > DFRobot Firebeetle 2 ESP32-E
HARDWARE: ESP32 80MHz, 320KB RAM, 4MB Flash
DEBUG: Current (cmsis-dap) External (cmsis-dap, esp-bridge, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES:

  • framework-arduinoespressif32 @ 3.20007.0 (2.0.7)
  • tool-esptoolpy @ 1.40500.0 (4.5.0)
  • toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch5
    LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
    LDF Modes: Finder ~ chain+, Compatibility ~ soft
    Found 40 compatible libraries
    Scanning dependencies...
    Dependency Graph
    |-- Adafruit BME280 Library @ 2.2.2
    | |-- Adafruit BusIO @ 1.14.1
    | | |-- Wire @ 2.0.0
    | | |-- SPI @ 2.0.0
    | |-- Wire @ 2.0.0
    | |-- SPI @ 2.0.0
    | |-- Adafruit Unified Sensor @ 1.1.9
    |-- Adafruit BusIO @ 1.14.1
    | |-- Wire @ 2.0.0
    | |-- SPI @ 2.0.0
    |-- Adafruit Unified Sensor @ 1.1.9
    |-- ArduinoJson @ 6.21.2
    |-- GxEPD2 @ 1.5.2
    | |-- Adafruit GFX Library @ 1.11.5
    | | |-- Adafruit BusIO @ 1.14.1
    | | | |-- Wire @ 2.0.0
    | | | |-- SPI @ 2.0.0
    | | |-- Wire @ 2.0.0
    | | |-- SPI @ 2.0.0
    | |-- Adafruit BusIO @ 1.14.1
    | | |-- Wire @ 2.0.0
    | | |-- SPI @ 2.0.0
    | |-- Wire @ 2.0.0
    | |-- SPI @ 2.0.0
    |-- HTTPClient @ 2.0.0
    | |-- WiFi @ 2.0.0
    | |-- WiFiClientSecure @ 2.0.0
    | | |-- WiFi @ 2.0.0
    |-- WiFi @ 2.0.0
    |-- WiFiClientSecure @ 2.0.0
    | |-- WiFi @ 2.0.0
    |-- SPI @ 2.0.0
    |-- Wire @ 2.0.0
    |-- pollutant-concentration-to-aqi
    |-- Adafruit GFX Library @ 1.11.5
    | |-- Adafruit BusIO @ 1.14.1
    | | |-- Wire @ 2.0.0
    | | |-- SPI @ 2.0.0
    | |-- Wire @ 2.0.0
    | |-- SPI @ 2.0.0
    |-- Preferences @ 2.0.0
    Building in release mode
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\src_strftime.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\src\api_response.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\src\client_utils.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\src\config.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\src\conversions.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\src\display_utils.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\src\locales\locale_de_DE.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\src\locales\locale_en_GB.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\src\locales\locale_en_US.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\src\locales\locale_nl_BE.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\src\main.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\src\renderer.cpp.o
    Building .pio\build\dfrobot_firebeetle2_esp32e\bootloader.bin
    esptool.py v4.5
    Creating esp32 image...
    Merged 1 ELF section
    Successfully created esp32 image.
    Generating partitions .pio\build\dfrobot_firebeetle2_esp32e\partitions.bin
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\libc2f\Wire\Wire.cpp.o
    Archiving .pio\build\dfrobot_firebeetle2_esp32e\libc2f\libWire.a
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib2f2\SPI\SPI.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib753\Adafruit BusIO\Adafruit_BusIO_Register.cpp.o
    Archiving .pio\build\dfrobot_firebeetle2_esp32e\lib2f2\libSPI.a
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib753\Adafruit BusIO\Adafruit_I2CDevice.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib753\Adafruit BusIO\Adafruit_SPIDevice.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib148\Adafruit Unified Sensor\Adafruit_Sensor.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\libfa8\Adafruit BME280 Library\Adafruit_BME280.cpp.o
    Archiving .pio\build\dfrobot_firebeetle2_esp32e\lib753\libAdafruit BusIO.a
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib2fa\Adafruit GFX Library\Adafruit_GFX.cpp.o
    Archiving .pio\build\dfrobot_firebeetle2_esp32e\lib148\libAdafruit Unified Sensor.a
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib2fa\Adafruit GFX Library\Adafruit_GrayOLED.cpp.o
    Archiving .pio\build\dfrobot_firebeetle2_esp32e\libfa8\libAdafruit BME280 Library.a
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib2fa\Adafruit GFX Library\Adafruit_SPITFT.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib2fa\Adafruit GFX Library\glcdfont.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\GxEPD2_EPD.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd3c\GxEPD2_1248c.cpp.o
    Archiving .pio\build\dfrobot_firebeetle2_esp32e\lib2fa\libAdafruit GFX Library.a
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd3c\GxEPD2_154_Z90c.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd3c\GxEPD2_154c.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd3c\GxEPD2_213_Z19c.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd3c\GxEPD2_213_Z98c.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd3c\GxEPD2_213c.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd3c\GxEPD2_266c.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd3c\GxEPD2_270c.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd3c\GxEPD2_290_C90c.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd3c\GxEPD2_290_Z13c.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd3c\GxEPD2_290c.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd3c\GxEPD2_420c.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd3c\GxEPD2_420c_Z21.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd3c\GxEPD2_583c.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd3c\GxEPD2_583c_Z83.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd3c\GxEPD2_750c.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd3c\GxEPD2_750c_Z08.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd3c\GxEPD2_750c_Z90.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd4c\GxEPD2_437c.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd7c\GxEPD2_565c.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd7c\GxEPD2_730c_GDEY073D46.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_102.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_1160_T91.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_1248.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_150_BN.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_154.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_154_D67.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_154_M09.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_154_M10.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_154_T8.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_213.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_213_B72.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_213_B73.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_213_B74.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_213_BN.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_213_M21.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_213_T5D.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_213_flex.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_260.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_260_M01.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_266_BN.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_270.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_290.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_290_BS.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_290_I6FD.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_290_M06.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_290_T5.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_290_T5D.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_290_T94.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_290_T94_V2.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_370_TC1.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_371.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_420.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_420_M01.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_583.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_583_T8.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_750.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_750_T7.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\epd\GxEPD2_750_YT7.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\gdeq\GxEPD2_583_GDEQ0583T31.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\gdey\GxEPD2_154_GDEY0154D67.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\gdey\GxEPD2_213_GDEY0213B74.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\gdey\GxEPD2_266_GDEY0266T90.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\gdey\GxEPD2_270_GDEY027T91.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\gdey\GxEPD2_290_GDEY029T94.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\gdey\GxEPD2_420_GDEY042T91.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\it8951\GxEPD2_it103_1872x1404.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\it8951\GxEPD2_it60.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\it8951\GxEPD2_it60_1448x1072.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\GxEPD2\it8951\GxEPD2_it78_1872x1404.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\liba33\WiFi\WiFi.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\liba33\WiFi\WiFiAP.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\liba33\WiFi\WiFiClient.cpp.o
    Archiving .pio\build\dfrobot_firebeetle2_esp32e\lib7c3\libGxEPD2.a
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\liba33\WiFi\WiFiGeneric.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\liba33\WiFi\WiFiMulti.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\liba33\WiFi\WiFiSTA.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\liba33\WiFi\WiFiScan.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\liba33\WiFi\WiFiServer.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\liba33\WiFi\WiFiUdp.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib1bc\WiFiClientSecure\WiFiClientSecure.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib1bc\WiFiClientSecure\esp_crt_bundle.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\lib1bc\WiFiClientSecure\ssl_client.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\libbfe\HTTPClient\HTTPClient.cpp.o
    Archiving .pio\build\dfrobot_firebeetle2_esp32e\liba33\libWiFi.a
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\libfe5\pollutant-concentration-to-aqi\aqi.c.o
    Archiving .pio\build\dfrobot_firebeetle2_esp32e\libfe5\libpollutant-concentration-to-aqi.a
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\libba4\Preferences\Preferences.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\Esp.cpp.o
    Archiving .pio\build\dfrobot_firebeetle2_esp32e\lib1bc\libWiFiClientSecure.a
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\FirmwareMSC.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\FunctionalInterrupt.cpp.o
    Archiving .pio\build\dfrobot_firebeetle2_esp32e\libbfe\libHTTPClient.a
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\HWCDC.cpp.o
    Archiving .pio\build\dfrobot_firebeetle2_esp32e\libba4\libPreferences.a
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\HardwareSerial.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\IPAddress.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\IPv6Address.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\MD5Builder.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\Print.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\Stream.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\StreamString.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\Tone.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\USB.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\USBCDC.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\USBMSC.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\WMath.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\WString.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\base64.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\cbuf.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-adc.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-bt.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-cpu.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-dac.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-gpio.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-i2c-slave.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-i2c.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-ledc.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-matrix.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-misc.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-psram.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-rgb-led.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-rmt.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-sigmadelta.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-spi.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-time.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-timer.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-tinyusb.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-touch.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\esp32-hal-uart.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\firmware_msc_fat.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\libb64\cdecode.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\libb64\cencode.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\main.cpp.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\stdlib_noniso.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\wiring_pulse.c.o
    Compiling .pio\build\dfrobot_firebeetle2_esp32e\FrameworkArduino\wiring_shift.c.o
    Archiving .pio\build\dfrobot_firebeetle2_esp32e\libFrameworkArduino.a
    Linking .pio\build\dfrobot_firebeetle2_esp32e\firmware.elf
    c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/_strftime.cpp.o:(.literal._Z9_strftimePcjPKcPK2tm+0x10): undefined reference to LC_ABDAY' c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/_strftime.cpp.o:(.literal._Z9_strftimePcjPKcPK2tm+0x14): undefined reference to LC_DAY'
    c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/_strftime.cpp.o:(.literal._Z9_strftimePcjPKcPK2tm+0x18): undefined reference to LC_ABMON' c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/_strftime.cpp.o:(.literal._Z9_strftimePcjPKcPK2tm+0x1c): undefined reference to LC_MON'
    c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/_strftime.cpp.o:(.literal._Z9_strftimePcjPKcPK2tm+0x20): undefined reference to LC_D_T_FMT' c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/_strftime.cpp.o:(.literal._Z9_strftimePcjPKcPK2tm+0x5c): undefined reference to LC_AM_STR'
    c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/_strftime.cpp.o:(.literal._Z9_strftimePcjPKcPK2tm+0x60): undefined reference to LC_PM_STR' c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/_strftime.cpp.o:(.literal._Z9_strftimePcjPKcPK2tm+0x64): undefined reference to LC_T_FMT_AMPM'
    c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/_strftime.cpp.o:(.literal._Z9_strftimePcjPKcPK2tm+0x74): undefined reference to LC_D_FMT' c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/_strftime.cpp.o:(.literal._Z9_strftimePcjPKcPK2tm+0x78): undefined reference to LC_T_FMT'
    c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/client_utils.cpp.o:(.literal._Z13getOWMonecallR10WiFiClientR16owm_resp_onecall+0x1c): undefined reference to OWM_LANG' c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/display_utils.cpp.o:(.literal._Z17getRefreshTimeStrR6StringbP2tm+0x0): undefined reference to TXT_UNKNOWN'
    c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/display_utils.cpp.o:(.literal._Z10getUVIdescj+0x0): undefined reference to TXT_UV_LOW' c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/display_utils.cpp.o:(.literal._Z10getUVIdescj+0x4): undefined reference to TXT_UV_MODERATE'
    c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/display_utils.cpp.o:(.literal._Z10getUVIdescj+0x8): undefined reference to TXT_UV_HIGH' c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/display_utils.cpp.o:(.literal._Z10getUVIdescj+0xc): undefined reference to TXT_UV_VERY_HIGH'
    c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/display_utils.cpp.o:(.literal._Z10getUVIdescj+0x10): undefined reference to TXT_UV_EXTREME' c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/display_utils.cpp.o:(.literal._Z11getWiFidesci+0x0): undefined reference to TXT_WIFI_NO_CONNECTION'
    c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/display_utils.cpp.o:(.literal._Z11getWiFidesci+0x4): undefined reference to TXT_WIFI_EXCELLENT' c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/display_utils.cpp.o:(.literal._Z11getWiFidesci+0x8): undefined reference to TXT_WIFI_GOOD'
    c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/display_utils.cpp.o:(.literal._Z11getWiFidesci+0xc): undefined reference to TXT_WIFI_FAIR' c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/display_utils.cpp.o:(.literal._Z11getWiFidesci+0x10): undefined reference to TXT_WIFI_WEAK'
    c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/renderer.cpp.o:(.literal._Z21drawCurrentConditionsR11owm_currentR9owm_dailyR22owm_resp_air_pollutionff+0x0): undefined reference to TXT_UNITS_TEMP_CELSIUS' c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/renderer.cpp.o:(.literal._Z21drawCurrentConditionsR11owm_currentR9owm_dailyR22owm_resp_air_pollutionff+0xc): undefined reference to TXT_FEELS_LIKE'
    c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/renderer.cpp.o:(.literal._Z21drawCurrentConditionsR11owm_currentR9owm_dailyR22owm_resp_air_pollutionff+0x3c): undefined reference to TXT_SUNRISE' c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/renderer.cpp.o:(.literal._Z21drawCurrentConditionsR11owm_currentR9owm_dailyR22owm_resp_air_pollutionff+0x40): undefined reference to TXT_WIND'
    c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/renderer.cpp.o:(.literal._Z21drawCurrentConditionsR11owm_currentR9owm_dailyR22owm_resp_air_pollutionff+0x44): undefined reference to TXT_UV_INDEX' c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/renderer.cpp.o:(.literal._Z21drawCurrentConditionsR11owm_currentR9owm_dailyR22owm_resp_air_pollutionff+0x48): undefined reference to TXT_AIR_QUALITY_INDEX'
    c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/renderer.cpp.o:(.literal._Z21drawCurrentConditionsR11owm_currentR9owm_dailyR22owm_resp_air_pollutionff+0x4c): undefined reference to TXT_INDOOR_TEMPERATURE' c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/renderer.cpp.o:(.literal._Z21drawCurrentConditionsR11owm_currentR9owm_dailyR22owm_resp_air_pollutionff+0x50): undefined reference to TXT_SUNSET'
    c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/renderer.cpp.o:(.literal._Z21drawCurrentConditionsR11owm_currentR9owm_dailyR22owm_resp_air_pollutionff+0x54): undefined reference to TXT_HUMIDITY' c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/renderer.cpp.o:(.literal._Z21drawCurrentConditionsR11owm_currentR9owm_dailyR22owm_resp_air_pollutionff+0x58): undefined reference to TXT_PRESSURE'
    c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/renderer.cpp.o:(.literal._Z21drawCurrentConditionsR11owm_currentR9owm_dailyR22owm_resp_air_pollutionff+0x5c): undefined reference to TXT_VISIBILITY' c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/renderer.cpp.o:(.literal._Z21drawCurrentConditionsR11owm_currentR9owm_dailyR22owm_resp_air_pollutionff+0x60): undefined reference to TXT_INDOOR_HUMIDITY'
    c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/renderer.cpp.o:(.literal._Z21drawCurrentConditionsR11owm_currentR9owm_dailyR22owm_resp_air_pollutionff+0x68): undefined reference to TXT_UNITS_SPEED_MILESPERHOUR' c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/renderer.cpp.o:(.literal._Z21drawCurrentConditionsR11owm_currentR9owm_dailyR22owm_resp_air_pollutionff+0x70): undefined reference to TXT_UNITS_PRES_MILLIBARS'
    c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/src/renderer.cpp.o:(.literal._Z21drawCurrentConditionsR11owm_currentR9owm_dailyR22owm_resp_air_pollutionff+0x74): undefined reference to TXT_UNITS_DIST_MILES' c:/users/ayh20.000/.platformio/packages/toolchain-xtensa-esp32/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld.exe: .pio/build/dfrobot_firebeetle2_esp32e/libfe5/libpollutant-concentration-to-aqi.a(aqi.c.o):(.literal.united_kingdom_daqi_desc+0x0): undefined reference to UNITED_KINGDOM_DAQI_TXT'
    collect2.exe: error: ld returned 1 exit status
    *** [.pio\build\dfrobot_firebeetle2_esp32e\firmware.elf] Error 1`

Daylight savings time is not accounted for

I'm in Central Daylight Time (CST6, e.g., America/Mexico City). The time function reports a time one hour behind me, because daylight savings is not accounted for by the time server, I guess?

I've tried passing both 3600 and -3600 to configTime but that doesn't seem to have any effect.

Compile error " no such file pins_arduino.h"

Hi Luke
First off, great project nice work! One problem I can't seem to get around is the error
"fatal error: pins_arduino.h: No such file or director"
I cloned the project from Github and have the latest files and platformio.ini. Any suggestions on where to look for this.

I can post the full output from the build if needed.

I'm pretty new at VsCode and PlatformIO so any help would be much appreciated.

Thanks

Mark

Description for european air quality index is upside down?

I just installed everything. But I came across an issue(?) with the description of the air quality if the european air quality index is selected.

Today the air quality index is 14 (wich should be a really good value (lower = better)).
For the en_US translation this value is described as Very Low.
As said in https://en.wikipedia.org/wiki/Air_quality_index#Europe (second paragraph of "CAQI"): The CAQI is a number on a scale from 1 to 100, where a low value means good air quality and a high value means bad air quality.
So in my understanding the description should be Very High instead.

The issue might come from the table below, which lists the Qualitative name and the corresponding Index or sub-index. In my understanding the Qualitative name answers the question: "How high or low is the pollution?" but I think the question that should be answered for the air quality (index) is: "How good or bad ist the air (quality)?"

So in conclusion the char array for the air quality with european calculation should not be from low to high

const char *EUROPE_CAQI_TXT[5] = 
{
  "Very Low",
  "Low",
  "Medium",
  "High",
  "Very High",
};

but the other way round: from high to low (as the array for the us air quality is):

const char *EUROPE_CAQI_TXT[5] = 
{
  "Very High",
  "High",
  "Medium",
  "Low",
  "Very Low"
};

I hope this is understandable. 🙈
If you think the same I would create a merge request. (:

ps. the same principal applies to CANADA_AQHI_TXT, HONG_KONG_AQHI_TXT, UNITED_KINGDOM_DAQI_TXT.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.