Soldered Smart Watch: DIY ESP32 Pametni Sat
Soldered Smart Watch: DIY ESP32 Pametni Sat
Dragi čitatelji,
Uvjeren sam u to da je danas najbolje vrijeme ikad za raditi hobističke projekte iz elektronike. Pregršt alata, komponenti, ideja i primjena za ovakve projekte kao da samo čekaju mikroupravljač koji u vašim ladicama spava svoj najdublji deep sleep. Ovdje sam kako bi vas motivirao, jer, uz osnovno poznavanje programiranja u Arduino razvojnom okruženju, projekti koji uključuju spajanje na internet, pokretanje nekog aktuatora i čitanje sa senzora nisu više stresne sesije debuggiranja od tjedan dana, već zabavan izazov za vikend.
U ovom tutorijalu izraditi ćemo pametni sat koristeći samo komponente od hrvatske tvrtke Soldered. Ovaj sat će brojati korake pomoću akcelerometra i prikazivati ih na OLED zaslonu uz, naravno, trenutno vrijeme u satima i minutama. Sinkronizira se putem kućnog WiFi-ja i radi na bateriju koja je lako punjiva putem USB-C kabla. Sve komponente nalaziti će se u 3D printanom kućištu.
Programski kod i ostale datoteke potrebne za izradu ovog projekta kod kuće dostupne su na Soldered Electronics Github stranici na sljedećem repozitoriju:
github.com/SolderedElectronics/Soldered-Smart-Watch
Ipak je sve što radimo za naš brand otvorenog koda i dostupno svima. Krenimo!
Komponente i čemu služe
Dizajn ovog pametnog sata bazira se na Dasduino CONNECTPLUS-u, Solderedovom ESP32 mikroupravljaču. Poštedjeti ću vas nabrajanja velikog broja mogućnosti i prednosti ESP32, važne su glavne značajke koje ćemo koristiti: WiFi, RTC (real time clock) i I2C komunikacija.
Zaslon koji će prikazivati sve podatke je OLED dijagonale jednog inča s popularnim SSD1306 kontrolerom. Njime Dasduino upravlja putem I2C komunikacije. Kao i na Solderedovim Inkplate uređajima, na zaslon se crta pomoću popularne i moćne Adafruit GFX softverske biblioteke.
Akcelerometar i žiroskop LSM6DS3 poslužiti će za brojanje koraka. Funkcionalnost brojanja koraka se već nalazi u samom akcelerometru, tako da nije potrebno izvoditi softverske čarolije kako bi detektirali i brojali ljudske korake. U programskom kodu je akcelerometar potrebno inicijalno konfigurirati i onda je kasnije u toku programa moguće s njega pročitati podatak koliko koraka je izbrojano.
Naposlijetku, baterija je tu kako bi sve radilo bez vanjskog napajanja. Na Dasduino se spaja putem postojećeg JST konektora i automatski se puni kad je Dasduino spojen na USB-C. Uz to, dodati ćemo dva otpornika preko koja ćemo moći mjeriti stanje napunjenosti baterije kako bi mogli imati obavijest za nisku bateriju.
Slijedi detaljan popis svih potrebnih komponenti:
- Dasduino CONECTPLUS
- OLED I2C 0.96″ SSD1306
- Akcelerometar i žiroskop LSM6DS3
- Tipkalo
- Li-ion baterija 680mAh 3.7V
- 9 x Vijak M3 6mm
- 9 x Navojni umetak M3 3mm
Na ovoj shemi možete proučiti kako je sve spojeno.
Bezbolno prototipiranje
Razvoj može početi. Kako bi napisao softver za pametni sat, spojio sam sve komponente na svom radnom stolu u svega nekoliko sekundi koristeći easyC kabliće. easyC je Solderedov sustav za spajanje breakout-a s mikroupravljačem putem I2C komunikacijskog protokola (soldered.com/hr/easyC). Ostavio bi ih ovako spojene i u gotovom kućištu, ali u interesu toga da se sve bude što kompaktnije, unutar kućišta sve će biti spojeno žicama.
U prethodnom poglavlju spomenuo sam čitanje baterije i da će za to trebati nekoliko otpornika. O čemu je zapravo riječ? Potrebno je spojiti jednostavan naponski djelitelj (eng. Voltage Divider). To je strujni krug koji pretvara ulazni napon iz nekog početnog raspona u neki drugi raspon. Ovo moramo raditi zbog toga što je maksimalni ulazni napon signala na ESP32 jednak 3.3V a napon naše baterije je veći od toga. Osobno mi je najbolja analogija kako radi Voltage divider bila map() funkcija unutar Arduina, samo u hardverskom, analognom obliku. Voltage divider radi prema sljedećoj formuli:
Izabrane vrijednosti od 47kOhm-a za R1 i 100kOhm-a za R2 će smjestiti signal maksimalnog napona 4.2V (koji se mjeri kada je baterija u potpunosti puna) do ~2.8V, što znači: kad putem analogRead funkcije na pinu 33 možemo pročitati 2.24V – znamo da treba upaliti low battery alert. Evo kako voltage divider izgleda na Dasduinu:
Kod
Pogledajmo detaljnu specifikaciju svega što će sat raditi unutar softvera. Pri paljenju, sat prolazi inicijalnu konfiguraciju ekrana i žiroskopa. Onda se mora moći spojiti na WiFi prvi puta – tako dohvaća vrijeme s NTP servera i sprema ga u ESP32-ov RTC. Tako može precizno brojati vrijeme i dok nije spojen na WiFi. Sat onda u glavnoj petlji očitava izbrojane korake i prikazuje vrijeme u satima i minutama, uz mjesec i dan datuma. Osim toga, provjerava se: jesmo li prešli u novi dan (kako bi se resetirao broj izbrojanih koraka), je li došlo vrijeme za ponovnu sinkronizaciju sata i jesmo li ispod razine niske baterije.
U ostatku ovog poglavlja, istaknuti ću neke ključne dijelove programskog koda, koji mislim da bi bili dobri za demonstraciju i objašnjenje. Preporučujem da provjerite cijeli source code na Soldered Github-u, ne brinite, dobro je komentiran.
Pogledajmo prvo src/defines.h, datoteku u koju su smještene glavne konfiguracijske postavke pametnog sata. Ako ćete izrađivati ovaj projekt kod kuće, biti će potrebno modificirati ovu datoteku.
Ova glavna postavka pali ili gasi debug poruke (u ostatku koda označene s DEBUG_PRINT) koje se ispisuju preko Seriala i mogu se vidjeti kroz Arduino Serial Monitor:
Vjerojatno najvažnija postavka koju treba promijeniti su podatci of WiFi-ja, samo upišite vaš SSID i password, pazeći na veliko i malo slovo:
Ova postavka kontrolira koliko često se pametni sat pokušava sinkronizirati s NTP serverom. ESP32-ov RTC će u jednom danu izgubiti preciznost od nekoliko sekundi ili više, pa je zbog toga potrebna ponovna sinkronizacija.
Pogledajmo kako se dohvaća vrijeme preko WiFi-ja. U datoteci src/Network.cpp se nalaze funkcije koje su vezane uz mrežu. Unutar funkcije getTimeAndSaveToRTC možemo vidjeti pozivanje ESP32-ovih funkcija configTime, setenv i tzset.
ConfigTime dohvaća vrijeme putem interneta sa zadanog NTP servera i sprema ga na svoj unutarnji RTC. Ovo je besplatan i pouzdan način za vremensku sinkronizaciju, ESP32 obavlja sav posao za nas. Daljnje funkcije setenv i tzset postavljaju vremensku zonu prema onoj koja je korisnički zadana – što automatski pretvara vrijeme spremljeno u RTC-u u vrijeme koje trenutno odgovara vremenskoj zoni koja je postavljena. Ovo uračunava i ljetno računanje vremena. Za sve dostupne vremenske zone proučite timeZones.csv, tako da ste spremni ako sat budete nosili i na Havaje.
Unutar src/display.cpp datoteke možemo pronaći sve funkcije koje upravljaju s OLED zaslonom. Glavna funkcija drawTimeAndStepCount se poziva kroz svako ponavljanje petlje kako bi se zaslon promijenio, ovo se radi u dva dijela: prvo se vrijeme pretvara iz time_t oblika u niz slova (char array). Ovaj niz slova će uvijek imati 6 znakova npr. “22:43”. Ovdje imamo dva broja, dvotočku, dva broja i još jedan skriveni simbol nazvan null terminator koji označava kraj stringa. Osim sata, datuma i broja koraka, dodane su dvije horizontalne crte za ukras. Ako treba upaliti indikator za nisku bateriju, onda je nacrtano i to. Sada je sa Adafruit GFX bibliotekom moguće na ekran nacrtati i prikazati sve elemente:
Osim glavnog zaslona koji prikazuje sat, datum i broj koraka, stiskom na tipku ulazimo u izbornik. On sadržava 3 različite funkcionalnosti i mogućnost povratka na glavni zaslon. Prva funkcionalnost je WiFi scanner, koji će pretražiti okolinu za WiFi signale i ispisati ih. Druga funkcionalnost je animacija 3D kocke koja se na 2D projekciji rotira uz podatke sa žiroskopa. Treća funkcionalnost je “self destruct”, što je zapravo šaljiv način koji smo smislili kako bi ostavili prostor za implementiranje vaše vlastite funkcionalnosti. Za detalje ovih funkcija, pogledajte izvorni kod na GitHub-u u src/display.cpp datoteci.
Meni funkcionira na principu da se mjeri vrijeme nakon zadnjeg stiska tipke. Nakon što prođe sekunda, izabrana funkcija se pokreće:
Programiranje Dasduina
Kako bi prenijeli napisani kod na Dasduino CONNECTPLUS, potrebno je u Arduino IDE-u prvo instalirati Solderedove pločice, tj. Board definitione. To se radi tako da u postavkama Arduina (File -> Preferences) i zalijepimo odgovarajući link u Additional Board Manager URLs. Ovaj link se može pronaći na GitHub repozitoriju ovog projekta uz još detaljnije upute za programiranje Dasduina za ovaj projekt.
Nadalje, potrebno je instalirati sljedeće softverske biblioteke za Arduino:
· Soldered LSM6DS3 Library
· Soldered OLED Display Library
· Soldered WS2812 LED Library
· RBD_Button i RBD_Timer
Sada je moguće otvoriti projekt u Arduinu dvoklikom na Soldered-Smart-Watch.ino, modificirati defines.h datoteku kako je opisano u prethodnom poglavlju i moguće je prenijeti kod na pametni sat.
Kao što sam napomenuo, preporučujem čitanje detaljnijih uputa na GitHub repozitoriju.
Kućište
Pametni sat je morao biti dovoljno kompaktan da bi stao na zapešće, pa je zbog toga izabran dizajn u kojem se komponente slažu vertikalno kroz kućište. Ono sadržava otvor i držač za OLED, kao i utore za tipkalo koje se nalazi na prednjoj strani. Vjerujem kako priložena slika dizajna kućišta govori tisuću riječi:
Kako sve držati zajedno? Ovo je trik koji sam pokupio od svojih kolega – u kućište se u za to predviđene utore mogu elegantno umetnuti umetci s navojem za M3 vijke uz pomoć lemilice. Evo kako – zagrijte lemilicu na 300 stupnjeva. Postavite M3 umetak na za to predviđeno mjesto i koristeći lemilicu lagano pritisnite. Toplina lemilice će zagrijati umetak i jedva rastopiti plastiku oko njega, što će dopustiti umetku da uz lagani pritisak lemilice uđe u rupu u kojoj će onda čvrsto ostati.
Sastavljanje
Došlo je vrijeme za sklopiti uređaj! Posložimo komponente i spojimo ih prema shemi:
Sada je moguće umetnuti bateriju, spojiti ju, ušarafiti Dasduino i ostale komponente na za to predviđeno mjesto:
Sada je preostalo još zatvoriti uređaj u potpunosti i isprobati sve. Također, dodali smo trake s čičkom kako bi se uređaj mogao staviti na zapešće:
To je to! Nadam se da će vam ovaj projekt biti zabavan za izradu. Ako ga napravite, ostavite dojmove na našem community forumu! soldered.com/community
Korišteni proizvodi
No products found