Upgraded firmware for Simone Giertz's Every Day Calendar that links an ATProto-powered ESP32, for sync with goals.garden 🌱
3
fork

Configure Feed

Select the types of activity you want to include in your feed.

docs: clarify readme & image

Adds details for how to build this modification!

+88 -39
+84 -37
README.md
··· 1 1 # Every Day Calendar (Fork) 2 2 3 - This fork adds WiFi sync with [goals.garden](https://goals.garden) via an ESP32 co-processor, plus visual enhancements. 3 + This fork adds WiFi sync with [goals.garden](https://goals.garden) via an ESP32 co-processor. 4 4 5 5 ## Features 6 6 7 - **New in this fork:** 7 + - **WiFi sync with goals.garden** - Your completions sync bidirectionally with your goals.garden account 8 + - **Real-time updates** - Changes on goals.garden appear instantly via Jetstream WebSocket 9 + - **Web UI for goal selection** - Visit `http://everydaycalendar.local` to choose which goal to track 10 + - **Offline support** - Keep using the calendar when WiFi is unavailable; changes sync when reconnected 11 + - **Light wave animation** - Satisfying ripple effect when you mark a day complete 12 + 13 + ## Hardware Setup 14 + 15 + ### What You'll Need 16 + 17 + - [Adafruit QT Py ESP32-S3](https://www.adafruit.com/product/5426) (~$13) 18 + - A Stemma QT / Qwiic cable (any length - you'll cut it) 19 + - Soldering iron and solder 20 + - Small Phillips screwdriver 21 + 22 + ### Wiring the ESP32 23 + 24 + 1. **Cut the Stemma QT cable in half** - You'll need about 8cm of cable with the connector on one end. 25 + 26 + 2. **Strip and tin the wires** - Strip about 3mm of insulation from each wire and add a small amount of solder to the exposed copper. 27 + 28 + 3. **Open the calendar** - Remove the screws from the back panel. Carefully lift off the front panel - it separates easily but can crack if flexed too much. 29 + 30 + 4. **Locate the I2C header** - Find the two 3-pin jumper headers (J2) near the top of the PCB. 31 + 32 + 5. **Solder the wires** to the header pads: 33 + 34 + | Wire Color | Connection | Location | 35 + | ------------ | ---------- | --------------------------------------- | 36 + | Red (3.3V) | Power | Bottom-right pad of LEFT jumper | 37 + | Black (GND) | Ground | Top-right pad of LEFT jumper | 38 + | Yellow (SCL) | Clock | Middle-bottom right pad of RIGHT jumper | 39 + | Blue (SDA) | Data | Middle-top right pad of RIGHT jumper | 8 40 9 - - WiFi sync with goals.garden (ATProto) via a [QT Py ESP32-S3](https://www.adafruit.com/product/5426) co-processor 10 - - Real-time updates via Jetstream WebSocket 11 - - Simplified brightness buttons just full brightness or off. 12 - - Light wave/fireworks animation when enabling a day 41 + ![A photo of the four wires above going to the right places](./images/wiring-esp32s3.jpeg) 13 42 14 - ## Quick Start (PlatformIO) 43 + 6. **Connect the ESP32** - Plug the Stemma QT connector into the ESP32's Stemma QT port. 15 44 16 - This project uses [PlatformIO](https://platformio.org/) for building and uploading firmware. 45 + 7. **Mount the ESP32** - You may want to use double-sided tape to secure it inside the calendar housing, but be careful, this little board gets warm, so don't enclose it entirely. 17 46 18 - ### Building the Calendar Firmware 47 + ## Software Setup 48 + 49 + ### Install PlatformIO 50 + 51 + PlatformIO is used to build and flash both firmware images. 19 52 20 53 ```bash 21 - pio run -e calendar -t upload 54 + # macOS (Homebrew) 55 + brew install platformio 56 + 57 + # Or via pip 58 + pip install platformio 22 59 ``` 23 60 24 - ### Building the ESP32 Sync Firmware 61 + ### Configure the ESP32 25 62 26 - 1. Copy the config template and fill in your credentials: 63 + 1. **Copy the config template:** 27 64 28 65 ```bash 29 66 cp firmware/esp32/GoalsGardenSync/config.local.h.example \ 30 67 firmware/esp32/GoalsGardenSync/config.local.h 31 68 ``` 32 69 33 - 2. Edit `config.local.h` with your WiFi and ATProto/Bluesky credentials (you'll need to make an [app-password](https://bsky.app/settings/app-passwords), this project doesn't support OAuth): 70 + 2. **Edit `config.local.h`** with your WiFi credentials, ATProto username & app-password, and any other details. 71 + 72 + ### Flash the Firmware 73 + 74 + Before starting, make sure to plug your calendar in with the usual 5V power supply. (We don't want to power all those LEDs directly from your computer's USB!) 75 + 76 + 1. **Flash the calendar (ATmega328P):** 34 77 35 - ```cpp 36 - #define WIFI_SSID "your-wifi-ssid" 37 - #define WIFI_PASSWORD "your-wifi-password" 38 - #define BLUESKY_IDENTIFIER "your-handle.bsky.social" 39 - #define BLUESKY_APP_PASSWORD "xxxx-xxxx-xxxx-xxxx" 40 - #define GOAL_URI "at://did:plc:xxx/garden.goals.goal/xxx" 78 + Connect the calendar via USB Type-B cable. 79 + 80 + ```bash 81 + pio run -e calendar -t upload && pio device monitor -e calendar 41 82 ``` 42 83 43 - 3. Build and upload: 84 + (This also starts the serial monitor, so you can see that they start properly — you can exit that with Ctrl-c any time you like) 85 + 86 + 2. **Flash the ESP32:** 87 + 88 + Connect the ESP32 via USB-C cable. 44 89 45 90 ```bash 46 - pio run -e esp32sync -t upload 91 + pio run -e esp32sync -t upload && pio device monitor -e esp32sync 47 92 ``` 48 93 49 - ## The Every Day Calendar (Original) 94 + (This also starts the serial monitor, so you can see that they start properly — you can exit that with Ctrl-c any time you like) 50 95 51 - ![edc](/images/edc.gif) 96 + ### First Boot 52 97 53 - ## Overview 98 + 1. **Reassemble the calendar** - Carefully replace the front panel and screws. (You can power on before replacing the front panel if you want, you just won't be able to press any buttons.) 54 99 55 - This repository contains firmware and schematics of the [Every Day Calendar](https://www.kickstarter.com/projects/simonegiertz/the-every-day-calendar) project. 100 + 2. **Power on** - The ESP32 will connect to WiFi and sync with goals.garden — it'll take a good minute or two to connect to your WiFi & sync with your PDS. 56 101 57 - ## Alternative: Arduino IDE 102 + 3. **Select your goal** - Visit `http://everydaycalendar.local` in your browser to choose which goal to track. 58 103 59 - If you prefer the Arduino IDE over PlatformIO: 104 + Assuming you left the offline sync option as the default: 60 105 61 - 1. Power on the Every Day Calendar with a 5V adapter and connect via USB Type-B cable. 106 + - If you have existing data on the calendar, it will create a new "Everyday Calendar" goal and upload your completions 107 + - If the calendar is blank, it will sync from your first goal on goals.garden 62 108 63 - 2. Configure the Arduino IDE: 64 - - Board: **Arduino Pro or Pro Mini** 65 - - Processor: **ATmega328P (3.3V, 8MHz)** 109 + ## Troubleshooting 66 110 67 - 3. Copy the contents of `firmware/libraries` to your Arduino libraries folder (typically `Documents/Arduino/libraries`). 111 + - **Can't find `everydaycalendar.local`** - Try the IP address instead (check your router's DHCP list), or ensure mDNS is working on your network. 112 + - **ESP32 not responding** - Check the serial monitor (`pio device monitor -e esp32sync`) for error messages. 113 + - **Calendar not syncing** - Verify your ATProto credentials and that you have at least one goal on goals.garden. 68 114 69 - 4. Open and upload `firmware/sketches/EverydayCalendar/EverydayCalendar.ino`. 115 + ## Built on top of [The Every Day Calendar](https://yetch.studio/products/every-day-goal-calendar) 70 116 71 - ## License 117 + ![edc](/images/edc.gif) 72 118 73 - The contents of this repository are released under the following licenses for hardware and software: 119 + This repository contains firmware and schematics for the [Every Day Calendar](https://yetch.studio/products/every-day-goal-calendar) by Simone Giertz. Thank you for making this beautiful piece of hardware! 74 120 75 - - Hardware: CC BY-SA 4.0: https://creativecommons.org/licenses/by-sa/4.0/ 76 - - Software: MIT License: https://opensource.org/licenses/MIT 121 + ## License 77 122 123 + - Hardware: [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/) 124 + - Software: [MIT License](https://opensource.org/licenses/MIT)
+4 -2
firmware/esp32/GoalsGardenSync/config.local.h.example
··· 27 27 #define TIMEZONE "GMT0BST,M3.5.0/1,M10.5.0" 28 28 29 29 // Offline sync mode - what happens when calendar reconnects after being offline 30 + // This determines how differences of opinion are resolved in the Everyday Calendar and 31 + // goals.garden disagree 30 32 // 0 = Block hardware button presses when not synced to goals.garden 31 - // 1 = Calendar wins - local changes override goals.garden on reconnect (default) 32 - // 2 = goals.garden wins - remote state overwrites local changes on reconnect 33 + // 1 = Calendar wins - changes made on the device override goals.garden on reconnect (default) 34 + // 2 = goals.garden wins - changes on goals.garden override the device on reconnect 33 35 #define OFFLINE_SYNC_MODE 1 34 36 35 37 #endif
images/board_config.png

This is a binary file and will not be displayed.

images/clockconfig.png

This is a binary file and will not be displayed.

images/serialmonitor.png

This is a binary file and will not be displayed.

images/wiring-esp32s3.jpeg

This is a binary file and will not be displayed.