A very common need for projects is to know the current date and time. Especially when you want to deep sleep until an event, or you want to change your display based on what day, time, date, etc. it is
Determining the correct local time is really really hard. There are various time zones, Daylight Savings dates, leap seconds, etc. Trying to get NTP time and then back-calculating what the local time is, is extraordinarily hard on a microcontroller just isn't worth the effort and it will get out of sync as laws change anyways.
For that reason, we have the free adafruit.io time service. Free for anyone with a free adafruit.io account. You do need an account because we have to keep accidentally mis-programmed-board from overwhelming adafruit.io and lock them out temporarily. Again, it's free!
Step 1) Make an Adafruit account
It's free! Visit https://accounts.adafruit.com/ to register and make an account if you do not already have one
Step 2) Sign into Adafruit IO
Head over to io.adafruit.com and click Sign In to log into IO using your Adafruit account. It's free and fast to join.
You will get a popup with your Username and Key (In this screenshot, we've covered it with red blocks)
Go to the settings.toml file on your CIRCUITPY drive and add three lines for AIO_USERNAME
, ADAFRUIT_AIO_KEY
and TIMEZONE
so you get something like the following:
# This file is where you keep secret settings, passwords, and tokens! # If you put them in the code you risk committing that info or sharing it CIRCUITPY_WIFI_SSID = "your-wifi-ssid" CIRCUITPY_WIFI_PASSWORD = "your-wifi-password" ADAFRUIT_AIO_USERNAME = "your-adafruit-io-username" ADAFRUIT_AIO_KEY = "your-adafruit-io-key" # Timezone names from http://worldtimeapi.org/timezones TIMEZONE="America/New_York"
The timezone is optional, if you don't have that entry, adafruit.io will guess your timezone based on geographic IP address lookup. You can visit http://worldtimeapi.org/timezones to see all the time zones available (even though we do not use Worldtime for time-keeping, we do use the same time zone table).
Step 4) Upload Test Python Code
This code is like the Internet Test code from before, but this time it will connect to adafruit.io and get the local time
import ipaddress import os import ssl import wifi import socketpool import adafruit_requests import secrets # Get our username, key and desired timezone ssid = os.getenv("CIRCUITPY_WIFI_SSID") password = os.getenv("CIRCUITPY_WIFI_PASSWORD") aio_username = os.getenv("ADAFRUIT_AIO_USERNAME") aio_key = os.getenv("ADAFRUIT_AIO_KEY") timezone = os.getenv("TIMEZONE") TIME_URL = f"https://io.adafruit.com/api/v2/{aio_username}/integrations/time/strftime?x-aio-key={aio_key}&tz={timezone}" TIME_URL += "&fmt=%25Y-%25m-%25d+%25H%3A%25M%3A%25S.%25L+%25j+%25u+%25z+%25Z" print("ESP32-S2 Adafruit IO Time test") print("My MAC addr:", [hex(i) for i in wifi.radio.mac_address]) print("Available WiFi networks:") for network in wifi.radio.start_scanning_networks(): print("\t%s\t\tRSSI: %d\tChannel: %d" % (str(network.ssid, "utf-8"), network.rssi, network.channel)) wifi.radio.stop_scanning_networks() print("Connecting to", ssid) wifi.radio.connect(ssid, password) print(f"Connected to {ssid}!") print("My IP address is", wifi.radio.ipv4_address) ipv4 = ipaddress.ip_address("8.8.4.4") print("Ping google.com:", wifi.radio.ping(ipv4), "ms") pool = socketpool.SocketPool(wifi.radio) requests = adafruit_requests.Session(pool, ssl.create_default_context()) print("Fetching text from", TIME_URL) response = requests.get(TIME_URL) print("-" * 40) print(response.text) print("-" * 40)
After running this, you will see something like the below text. We have blocked out the part with the secret username and key data!
Note at the end you will get the date, time, and your timezone! If so, you have correctly configured your settings.toml and can continue to the next steps!
Text editor powered by tinymce.