···55## Features
6677- **WiFi sync with goals.garden** - Your completions sync bidirectionally with your goals.garden account
88-- **Real-time updates** - Changes on goals.garden appear instantly via Jetstream WebSocket
88+- **Real-time updates** - Changes on goals.garden appear appear in just a few seconds, via Jetstream WebSocket
99- **Web UI for goal selection** - Visit `http://everydaycalendar.local` to choose which goal to track
1010- **Offline support** - Keep using the calendar when WiFi is unavailable; changes sync when reconnected
1111- **Light wave animation** - Satisfying ripple effect when you mark a day complete
12121313-## Hardware Setup
1414-1515-### What You'll Need
1313+## What you'll need
16141717-- [Adafruit QT Py ESP32-S3](https://www.adafruit.com/product/5426) (~$13)
1818-- A Stemma QT / Qwiic cable (any length - you'll cut it)
1515+- [Adafruit QT Py ESP32-S3](https://thepihut.com/products/adafruit-qt-py-esp32-s3-wifi-dev-board) (~£12~)
1616+- [A Stemma QT / Qwiic cable](https://thepihut.com/products/stemma-qt-qwiic-jst-sh-4-pin-cable-100mm-long) (at least ~8cm - you'll cut it)
1917- Soldering iron and solder
2018- Small Phillips screwdriver
21192222-### Wiring the ESP32
2020+> [!IMPORTANT] Good WiFi needed
2121+> These tiny devices have tiny WiFi antennas. You'll need good signal wherever you hang your calendar. There are [variants with antennas](https://www.adafruit.com/product/5348) you may want to try!
2222+2323+<details>
2424+<summary>Don't have a QT Py ESP32-S3? Considering other boards?</summary>
2525+2626+If you don't have or can't find a QT Py ESP32-S3 _many_ other devices will work here! There's no need to buy new stuff if you have existing stuff that'll work lying around!
2727+2828+Things to consider when picking another device:
2929+3030+- It'll need Wifi (obviously)
3131+- This code has been built for ESP32 hardware, you'll likely need to make significant changes if you want to use a different platform
3232+- Watch for space: the height between the rear & front boards of the calendar isn't much, and the width between the foam padding and the wooden edge of the calendar is small too
3333+- my QT Py gives off a fair amount of heat (it holds a constant WiFi connection), don't use a board that can't cope with that
3434+- You don't need a Qwiic connector, you can hardwire I2C lines if that's easier
3535+- The esp32's program/sketch is quite large (~1MB for my esp32-s3), don't skimp on program space!
3636+3737+You'll need to change the `board` in `platformio.ini` to match whatever you go for.
3838+3939+</details>
4040+4141+## Hardware hacking
23422424-1. **Cut the Stemma QT cable in half** - You'll need about 8cm of cable with the connector on one end.
4343+> [!TIP] Backup your data!
4444+> I've tried to ensure your calendar data is never lost, but don't risk it! Take a photo of your calendar with its lights on before you start, just in case things go wrong.
25452626-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.
4646+1. **Cut the Stemma QT cable in half**
4747+4848+ You'll need about 8cm of cable with the connector on one end.
4949+5050+2. **Strip and tin the wires**
5151+5252+ Strip about 3mm of insulation from each wire and add a small amount of solder to the exposed copper (this helps it 'stick' to the pads when we connect them).
5353+5454+3. **Open the calendar**
5555+5656+ Remove the screws from the back panel. Carefully lift off the front panel - it separates easily but can crack if flexed too much.
27572828-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.
5858+4. **Locate the two front-panel jumper holes**
29593030-4. **Locate the I2C header** - Find the two 3-pin jumper headers (J2) near the top of the PCB.
6060+ Find the two 8-pin jumper headers near the top of the rear PCB; these are the holes the long prongs from the front panel go into.
31613232-5. **Solder the wires** to the header pads:
6262+5. **Solder the wires to the right pads**
33633464 | Wire Color | Connection | Location |
3565 | ------------ | ---------- | --------------------------------------- |
6666+ | Black (GND) | Ground | Top-right pad of LEFT jumper |
3667 | Red (3.3V) | Power | Bottom-right pad of LEFT jumper |
3737- | Black (GND) | Ground | Top-right pad of LEFT jumper |
6868+ | Blue (SDA) | Data | Middle-top right pad of RIGHT jumper |
3869 | Yellow (SCL) | Clock | Middle-bottom right pad of RIGHT jumper |
3939- | Blue (SDA) | Data | Middle-top right pad of RIGHT jumper |
40704171 
42724343-6. **Connect the ESP32** - Plug the Stemma QT connector into the ESP32's Stemma QT port.
7373+6. **Connect the ESP32**
44744545-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.
7575+ Plug the Stemma QT connector into the ESP32's Stemma QT port. It'll only go all the way in one way up, so don't push too hard if it isn't working.
46764747-## Software Setup
7777+7. **Mount the ESP32**
7878+7979+ 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.
8080+8181+8. **Flash the firmware**
8282+8383+ Physical work done! See below for how to handle the software/firmware…
8484+8585+## Software setup
48864987### Install PlatformIO
5088···5896pip install platformio
5997```
60986161-### Configure the ESP32
9999+### Configuration
621006363-1. **Copy the config template:**
101101+1. **Copy the config template**
6410265103 ```bash
66104 cp firmware/esp32/GoalsGardenSync/config.local.h.example \
67105 firmware/esp32/GoalsGardenSync/config.local.h
68106 ```
691077070-2. **Edit `config.local.h`** with your WiFi credentials, ATProto username & app-password, and any other details.
108108+2. **Edit your new `config.local.h`**
711097272-### Flash the Firmware
110110+ It'll _need_ your WiFi credentials, ATProto username & app-password (so it can stay connected indefinitely); you can also add some preferences for how it should operate (eg. your timezone, and what happens when your internet connection is down).
731117474-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!)
112112+## Flash firmware
751137676-1. **Flash the calendar (ATmega328P):**
114114+> [!WARNING] Use the power supply
115115+> 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!)
771167878- Connect the calendar via USB Type-B cable.
117117+1. **Flash the calendar (ATmega328P)**
118118+119119+ Connect the calendar via USB Type-B cable,then flash & monitor its output:
7912080121 ```bash
81122 pio run -e calendar -t upload && pio device monitor -e calendar
82123 ```
831248484- (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)
125125+ You can exit the monitor when you're happy by pressing Ctrl-c, any time.
851268686-2. **Flash the ESP32:**
127127+2. **Flash the new ESP32**
871288888- Connect the ESP32 via USB-C cable.
129129+ Similarly for the ESP32 via USB-C cable:
8913090131 ```bash
91132 pio run -e esp32sync -t upload && pio device monitor -e esp32sync
92133 ```
931349494- (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)
135135+> [!NOTE]
951369696-### First Boot
137137+At this point things _should_ already be fully working, but naturally you'll not be able to press any buttons.
971389898-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.)
139139+To make sure things are all set up correctly you may want to:
99140100100-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.
141141+- Visit [http://everydaycalendar.local](http://everydaycalendar.local) to see if the website loads (it'll be _slow_, be patient)
142142+- Choose which online goal you want to track with your calendar
143143+- Visit [goals.garden](https://goals.garden), swao to the relevant goal, and check that adding a new day online turns on the relevant LED
101144102102-3. **Select your goal** - Visit `http://everydaycalendar.local` in your browser to choose which goal to track.
145145+> [!NOTE] Slight update delay
146146+> Updates between the site and the physical calendar may take a moment (hopefully not more than 5 seconds).
103147104104- Assuming you left the offline sync option as the default:
148148+## Troubleshooting
149149+150150+- **Can't find `everydaycalendar.local`**
105151106106- - If you have existing data on the calendar, it will create a new "Everyday Calendar" goal and upload your completions
107107- - If the calendar is blank, it will sync from your first goal on goals.garden
152152+ Try the IP address instead (it should be in the serial monitor output, while the ESP32 is connected to your computer).
108153109109-## Troubleshooting
154154+- **Sync not working**
110155111111-- **Can't find `everydaycalendar.local`** - Try the IP address instead (check your router's DHCP list), or ensure mDNS is working on your network.
112112-- **ESP32 not responding** - Check the serial monitor (`pio device monitor -e esp32sync`) for error messages.
113113-- **Calendar not syncing** - Verify your ATProto credentials and that you have at least one goal on goals.garden.
156156+ Check the serial monitor (`pio device monitor -e esp32sync`) for error messages. If it works at your desk, but not on your wall, your WiFi may also not be strong enough for this little device at that location. There are QT Py ESP32 devices with [external antennas](https://www.adafruit.com/product/5348) that may help here?
114157115158## Built on top of [The Every Day Calendar](https://yetch.studio/products/every-day-goal-calendar)
116159117160
118161119119-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!
162162+This repository contains [firmware and schematics](https://gitlab.com/simonegiertz/the-every-day-calendar) 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!
163163+164164+It also incorporates [improvements made by
165165+Momin Khan](https://github.com/foolmoron/EverydayCalendar2) on Github — I love the starburst animation!
120166121167## License
122168