Adam Skřivánek
Jedná se už o můj druhý projekt s GPS modulem. Hodiny řídí Raspberry Pi Zero W, připojené k GPS modulu u-blox NEO-6M s podporou PPS (Pulse Per Second). Díky tomuto modulu jsou hodiny schopné získat extrémně přesný čas. Čas je zobrazován na OLED displeji s čipem SSD1306.
Použitý materiál
- 1× Raspberry Pi Zero W
- 1× GPS modul u-blox NEO-6M s podporou PPS pinu
- 1× OLED displej 0.91″ 128×32 I2C (čip SSD1306)
Zapojení
GPS modul
- RX (GPS) → GPIO 14 (TX RPi)
- TX (GPS) → GPIO 15 (RX RPi)
- VCC a GND → 3.3V a GND Raspberry Pi
OLED displej
- SDA → GPIO 2
- SCL → GPIO 3
- VCC a GND → 3.3V a GND Raspberry Pi
Software
1. Instalace potřebných balíčků
sudo apt update
sudo apt install gpsd gpsd-clients chrony pps-tools
2. Zapnutí sériové komunikace a PPS
V souboru /boot/firmware/config.txtpřidejte:
enable_uart=1
dtoverlay=pps-gpio,gpiopin=18
3. Konfigurace gpsd
V souboru /etc/default/gpsd upravte řádky:
DEVICES=“/dev/serial0 /dev/pps0″
GPSD_OPTIONS=“-n“
4. Konfigurace chrony
Do souboru /etc/chrony/chrony.conf přidejte:
refclock SHM 0 offset 0.5 delay 0.2 refid GPS noselect
refclock PPS /dev/pps0 refid PPS prefer
5. Restart služeb
sudo systemctl restart gpsd
sudo systemctl restart chrony
6. Ověření
cgps
chronyc sources -v
7. Zobrazení času na OLED displeji
Vytvořte soubor s názvem display_clock.py a vložte do něj následující kód. Soubor poté spusťte.
import time
from datetime import datetime
import board
import busio
from adafruit_ssd1306 import SSD1306_I2C
from PIL import Image, ImageDraw, ImageFont
i2c = busio.I2C(board.SCL, board.SDA)
oled = SSD1306_I2C(128, 64, i2c)
oled.fill(0)
oled.show()
font_path = "/usr/share/fonts/truetype/dejavu/DejaVuSansMono-Bold.ttf"
font = ImageFont.truetype(font_path, 24)
prev_time_str = ""
while True:
now = datetime.now()
time_str = now.strftime("%H:%M:%S")
if time_str != prev_time_str:
prev_time_str = time_str
image = Image.new("1", (oled.width, oled.height))
draw = ImageDraw.Draw(image)
bbox = font.getbbox(time_str)
text_width = bbox[2] - bbox[0]
text_height = bbox[3] - bbox[1]
x = (oled.width - text_width) // 2
y = (oled.height - text_height) // 2
draw.text((x, y), time_str, font=font, fill=255)
oled.image(image)
oled.show()
time.sleep(0.1)

5 komentářů
Bylo by možné to použít do auta (automatická kniha jízd) zaznamenával čas a polohu a ukládat to na kartu a při připojení na internet odeslat na e-mail?
Pěkný den pane Nekolny,
pokud byste měl zájem, naše firma by toto řešení dokázala pro Vás zrealizovat. V případě zájmu mě můžete kontaktovat na e-mailu: netolicky@andweb.cz.
Ahoj, snaha se cení i když tam máš chybu. Než to vysvětlovat, tak se mrkni na https://cs.wikipedia.org/wiki/P%C5%99estupn%C3%A1_sekunda a bude ti to jasné … 😀 ale jinak palec nahoru
No nevím kolik lidí jako já třeba nepochopí, kde je chyba. Takže v souboru (display_clock.py) či v sekci č. 3 nebo č. 4.
Jinak obecně a to již není na vás ten návod na zprovoznění a nahrání potřebného SW je hodně zjednodušen a není to dle mě pro neznalé co by to chtěli třeba i vyzkoušet, když by vytáhli tu částku z peněženky za ten GPS modul. Prostě škoda.
Osobně jsem postavil něco podobného s tímto displejem https://www.laskakit.cz/6-mistny-sedmisegmentovy-lcd-displej-2-4–ht1621–bily/ (i stav baterky se tam dá ukazovat) a arduino MKR zero https://docs.arduino.cc/hardware/mkr-zero/ (nenacházím na e-shopu láska, měl jsem ho od reichelta), plus arduino MKR GPS Shield https://docs.arduino.cc/hardware/mkr-gps-shield/ původní úmysl byl záznam GPS na SD kartu (což také dělá), ale i když zrovna necestuju, jako přesné hodiny to je skvělé. K tomu ještě baterka, myslím, že tahle https://www.laskakit.cz/geb-lipol-baterie-125054-4000mah-3-7v-jst-ph-2-0/
Ani nechci počítat, kolik jsem dal za materiál, to arduino a ten GPS shield bylo dohromady okolo €80 ostatní jsou drobnosti.
Program vznikal postupně, nejdřív jen záznam GPS, pak jsem přidal právě displej s hodinama, zjišťováni stavu baterie a nějaké další drobnosti. Vycházel jsem z examplu non-blocking write v arduino IDE. Jediné, co se mi nedaří, je přidat opravdu veliký displej https://www.laskakit.cz/64×16-led-matice-s-max7219-3mm/ přijde mi, že dostupné knihovny nefungujou na mkr zero a neměl jsem čas po tom nějak víc pátrat proč.