GPS-трекер + Дисплей SSD1306
У одній з попередніх статей розглядався GPS-трекер на базі ESP8266
Тепер підключимо до нього дисплей SSD1306. Докладніше про SSD1306 та бібліотеку U8G йшлося у статті ESP8266 NodeMCU. U8G
Треба підключити дисплей SSD1306 як показано на схемі:
Спочатку треба завантажити у NodeMCU додаткові файли display_init.lua, display_draw.lua:
display_init.lua:
-- IIC init
local sda = 1 -- D1
local scl = 2 -- D2
local sla = 0x3c
i2c.setup(0, sda, scl, i2c.SLOW)
-- Display init
disp = u8g.ssd1306_128x64_i2c(sla)
disp:begin()
-- Set Font
disp:setFont(u8g.font_10x20)
-- Draw a text
disp:firstPage()
repeat
disp:drawStr(0, 16, "Welcome!")
until disp:nextPage() == false
-- Start timer
tmr.register(1, 3000, tmr.ALARM_AUTO, function() dofile(`display_draw.lua`) end)
tmr.start(1)
display_draw.lua:
-- Set Font
disp:setFont(u8g.font_10x20)
-- Draw a text
disp:firstPage()
repeat
if gps_point.lat ~= nil then
disp:drawStr(0, 16, gps_point.lat)
disp:drawStr(0, 32, gps_point.lon)
else
disp:drawStr(0, 16, "No Fix")
end
until disp:nextPage() == false
Потім додаємо у скрипт tracker.lua рядки:
-- initialize Dsplay
dofile(`display_init.lua`)
tracker.lua тепер виглядає так:
-- configuration
dofile(`config.lua`)
-- initialize SD Card
dofile(`sdcard.lua`)
-- initialize Dsplay
dofile(`display_init.lua`)
-- led pin init
gpio.mode(cfg[`led_pin`], gpio.OUTPUT)
-- GPS variables
gpx_file=""
gps_time=``
gps_dst=0
gps_point={}
gps_point.lat=nil
gps_point.lat_c=``
gps_point.lon=nil
gps_point.lon_c=``
gps_point1={}
gps_point1.lat=0
gps_point1.lat_c=``
gps_point1.lon=0
gps_point1.lon_c=``
gps_tracking = false
local gpx_index_file=cfg[`gpx_dir`]..cfg[`gpx_index_file`]
local gpx_file_mask=cfg[`gpx_dir`]..cfg[`gpx_file_mask`]
local function get_gpx_filename()
local gpx_index=0
if file.open(gpx_index_file) then
gpx_index=file.read()
if gpx_index ~= nil then
gpx_index=tonumber(gpx_index)
else
gpx_index=1
end
file.close()
if gpx_index==nil then
gpx_index=0
end
end
gpx_index=gpx_index+1
if file.open(gpx_index_file, "w") then
file.write(gpx_index)
file.close()
end
return string.format(gpx_file_mask, gpx_index)
end
local function round(num, numDecimalPlaces)
local mult=10^(numDecimalPlaces or 0)
return math.floor(num * mult + 0.5) / mult
end
local function gps_convert_to_grad(gps_data)
gps_data=gps_data/100;
grad=round(gps_data, 0);
min=((gps_data - grad)*100)/60;
return grad+min;
end
uart.on("data", "\r",
function(data)
local data=string.gsub(data, "%s+", "")
-- GPS LAT & LON
local st,fn=string.find(data, "$GPGGA")
if st==1 then
data=data..`,`
local gps_fields={}
local gps_field_id=0
for word in string.gmatch(data, "([^,]*),") do
gps_fields[gps_field_id]=word
gps_field_id=gps_field_id+1
end
if tonumber(gps_fields[2])~=nil then
gps_point.lat=gps_convert_to_grad(tonumber(gps_fields[2]))
gps_point.lat_c=gps_fields[3]
gps_point.lon=gps_convert_to_grad(tonumber(gps_fields[4]))
gps_point.lon_c=gps_fields[5]
else
gps_point.lat=nil
gps_point.lon=nil
end
end
--GPS Date & Time
local st,fn=string.find(data, "$GPRMC")
if st==1 then
local gps_dt={}
local gps_dt_id=0
for word in string.gmatch(data, "([^,]*),") do
gps_dt[gps_dt_id]=word
gps_dt_id=gps_dt_id+1
end
local time=0
local date=0
if gps_dt[1] ~= `` then
time=tonumber(gps_dt[1])
end
if gps_dt[9] ~= `` then
date=tonumber(gps_dt[9])
end
local h=math.floor(time/10000, 0)
local m=math.floor((time-h*10000)/100, 0)
local s=math.floor(time-h*10000 - m*100, 0)
local D=math.floor(date/10000, 0)
local M=math.floor((date-D*10000)/100, 0)
local Y=2000+math.floor(date-D*10000 - M*100, 0)
gps_time=string.format("%d-%02d-%02dT%02d:%02d:%02dZ",Y,M,D,h,m,s)
end
end, 0)
local function gps_track()
if gps_tracking then
if gps_point.lat~=nil then
gps_dst = dofile(`distance.lua`)
if gps_dst > cfg[`gpx_distance`] then
if file.open(gpx_file, "a+") then
file.write("<trkpt lat=\""..gps_point.lat.."\" lon=\""..gps_point.lon.."\">\r\n<time>"..gps_time.."</time>\r\n</trkpt>\r\n")
gps_point1.lat = gps_point.lat
gps_point1.lat_c = gps_point.lat_c
gps_point1.lon = gps_point.lon
gps_point1.lon_c = gps_point.lon_c
file.close()
gpio.serout (cfg[`led_pin`], gpio.LOW, {50000,50000}, 1, 1)
end
end
end
end
end
-- start timer
tmr.register(0, cfg[`gpx_period`]*1000, tmr.ALARM_AUTO, gps_track)
tmr.start(0)
-- button
local function btn_down(level, pulse2)
gps_tracking=not gps_tracking
if gps_tracking then
print("On")
gps_point1.lat=0
gps_point1.lon=0
gpio.serout (cfg[`led_pin`], gpio.LOW, {99000,99000}, 2, 1)
gpx_file=get_gpx_filename()
if file.open(gpx_file, "w+") then
file.write("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>\r\n<gpx>\r\n<trk>\r\n<trkseg>\r\n")
file.close()
else
gps_tracking=not gps_tracking
end
else
print("Off")
gpio.serout (cfg[`led_pin`], gpio.LOW, {99000,99000}, 1, 1)
if file.open(gpx_file, "a+") then
file.write("</trkseg>\r\n</trk>\r\n</gpx>\r\n")
file.close()
gpx_file=``
end
end
tmr.delay(500000) --0.5s
end
-- button init
gpio.mode(3, gpio.INT)
gpio.trig(3, "down", btn_down)
gpio.serout (cfg[`led_pin`], gpio.LOW, {99000,99000}, 2, 1)
print("Tracker started.")
У цьому прикладі у файлі display_init.lua виконується ініціалізація дисплею і налаштовується таймер, який періодично запускає скрипт display_draw.lua. Скрипт display_draw.lua і відповідає за те що і як буде виводитися на дисплей. У цьому прикладі на дисплей виводяться GPS-координати. Вам доведеться самим його доопрацювати щоб він мав більш пристойний вигляд.
Бажаю успіхів.
Дивись також:
- ESP8266 NodeMCU Перше знайомство. Робимо WiFi розетку
- ESP8266 NodeMCU. PWM
- ESP8266 NodeMCU. ADC
- ESP8266 NodeMCU. timer, rtc, SNTP, cron
- ESP8266 NodeMCU. файлова система, SD Card
- ESP8266 NodeMCU. UART
- GPS-трекер на базі ESP8266
- GPS-трекер + Дисплей SSD1306
- ESP8266 NodeMCU. SSD1306. U8G
- ESP-01 (ESP8266) upgrade flash memory to 4MB
- ESP8266 NodeMCU. I2C. BME280/
- Метеостанція на ESP8266
Tags
bme280 bmp280 gps mpu-6050 options stm32 ssd1331 ssd1306 eb-500 3d-printer soldering tim mpu-9250 dma watchdog piezo exti web raspberry-pi docker ngnix solar bluetooth foc html css brushless flask dc-dc capture gpio avr rs-232 mpx4115a atmega mongodb st-link barometer pwm nvic git java-script programmator dht11 hih-4000 pmsm encoder max1674 smd sensors rtc adc lcd motor timer meteo examples i2c usb flash sms rfid python esp8266 servo books bldc remap eeprom bkp battery ethernet uart usart displays led websocket nodemcu wifi
Архіви
