Chcemy połączyć się z ekranem OLED, a do tego będą nam potrzebne dodatkowe biblioteki. Przechodzimy do Sketch -> Include Library -> Manage Libraries.
Wyszukujemy dwie z pakietu Adafruit:
– Adafruit GFX
– Adafruit SSD1306
wybieramy je i instalujemy. Opcja będzie dostępna po ich zaznaczeniu.
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 0 // GPIO0
Adafruit_SSD1306 OLED(OLED_RESET);
void setup() {
OLED.begin();
OLED.clearDisplay();
//Dodajemy elementy do 'display listy’
OLED.setTextWrap(false);
OLED.setTextSize(1);
OLED.setTextColor(WHITE);
OLED.setCursor(0,0);
OLED.println(„Cezarowy blogspot”);
OLED.display(); //wyświetl zawartość pamięci ekranu na ekran
OLED.startscrollleft(0x00, 0x0F); //make display scroll
}
void loop() {
}
Można wybrać Verify/Compile, co wyłącznie skompiluje nasz program, można od razu Upload, co wymusi kompilację i załaduje skompilowany sketch do D1 Mini.
Skoro proste tematy mamy za sobą, ruszamy od razu z czymś trudniejszym. A co! Do odważnych świat należy!
Po pierwsze, kolejne dwie biblioteki do pobrania. WiFiManager i biblioteka do parsowania (czyli czytania i przetwarzania) plików JSON.
Od razu piszę, że pomysł i kod nie jest mój, dostosowałem znaleziony przez Macieja kod do swoich potrzeb.
Zacznijmy od tego, że skorzystaliśmy z biblioteki Weather Station opracowanej przez zespół ThingPulse. W ramach dostępnych w niej przykładów znajduje się kod PlaneSpotterDemo, który przerobimy na nasze potrzeby.
Ze strony https://github.com/ThingPulse/esp8266-weather-station pobieramy ZIP z biblioteką, którą trzeba rozpakować do folderu jak poniżej.
Restart Arduino IDE i już mamy w Examples dostępny kod PlaneSpotterDemo.
U mnie potrzebny był 'delikatny’ tuning.
W parametrach wywołania strony, która pokazuje JSON trzeba podać promień okręgu jaki mamy sprawdzać, oraz jeżeli chcecie – wysokość graniczną samolotów Od/Do.
Przy okazji dowiecie się jak wyglądają pliki JSON, które można później obrabiać, czytać i zapisywać na przykład w Domoticz.
Na przykład:
https://public-api.adsbexchange.com/VirtualRadar/AircraftList.json?lat=LATZDomoticz&lng=LongZDomoticz&fDstL=0&fDstU=12, gdzie fDstL i fDstU oznacza odległość Od/Do jaka nas interesuje.
Kolejny: fDstL=0&fDstU=12&fAltL=5000&fAltU=45000 interesują nas samoloty, które są w odległości od zera do 12 kilometrów, na wysokości od 5 do 45 tysięcy stóp.
Aby zobaczyć co lata obok lotniska na Balicach, wystarczy sprawdzić adres: https://public-api.adsbexchange.com/VirtualRadar/AircraftList.json?lat=50.0769780&lng=19.7881190&fDstL=0&fDstU=100
W ogóle – nazwy parametrów to jak widać fDst, L oraz U oznacza limit dolny oraz górny, S – zaczynający się od – jeżeli szukacie konkretnych modeli samolotów. Itd., itp. Dokładna dokumentacja wszystkich parametrów znajduje się pod adresem: http://www.virtualradarserver.co.uk/Documentation/Formats/AircraftList.aspx
Aplikacja o której tutaj mówimy pobiera właśnie dane z tej strony, przetwarza je, zapisuje w odpowiednich zmiennych i wyświetla na ekranie OLED.
Aby być pewnym, że moje parametry są poprawne, uruchamiam na jednym ekranie https://global.adsbexchange.com/VirtualRadar/desktop.html z moją okolicą, na drugim odświeżam wyniki https://public-api.adsbexchange.com/VirtualRadar/AircraftList.json?lat=50.0769780&lng=19.7881190&fDstL=0&fDstU=100 (podajecie oczywiście swoje współrzędne). Wtedy wiem, że to co mam na mapie pokrywa się z tym, co zawierają dane w formacie JSON.
Aby program zadziałał musimy prowadzić kilka zmian.
Po pierwsze, mam ekran SSD1306, także usuwam komentarz (czyli //) z jednej linii i komentuję tą z SH1106.
#include „SSD1306Wire.h”
//#include „SH1106Wire.h”
const String QUERY_STRING = „lat=LatZDomoticz&lng=19.562571&fDstL=0&fDstU=12”;
// Setup OTA
// Serial.println(„Hostname: ” + hostname);
// ArduinoOTA.setHostname((const char *)hostname.c_str());
// ArduinoOTA.onProgress(drawOtaProgress);
// ArduinoOTA.begin();
TADAM! Mamy, działa, pokazuje!
Tak w sumie posiadając ekran otwierają się przed nami nowe możliwości eksperymentowania – z samych przykładów można się mnóstwo nauczyć i robić swoje małe (albo i duże) projekty.
Postaram się rozszerzyć ten wpis o kolejny, w którym dane wylądują w Domoticz, ale tak prawdę mówiąc, to muszę się tego najpierw sam nauczyć 😀
— 'Aircrafts' – nazwa dummy text
— 'xxxx' w apiUrl – tu wstaw współrzędne, które Cię interesują
— 'fDstU' 'fDstU' minimalna i maksymalna odległość od podanych współrzędnch
— skrypt odpala się co minutę, mnie interesowała trochę większa częstotliwość stąd:
— domoticz.openURL({ url = apiUrl, method = apiMethod, callback = apiCallback }).afterSec(15) — i kolejne
— if(gnd == false) to warunek na samoloty, które są w powietrzu
return {
on = {
timer = { 'every minute' },
httpResponses = { 'aircraftsRetrieved' }
},
execute = function(domoticz, item)
if (item.isTimer) then
local apiUrl = 'https://public-api.adsbexchange.com/VirtualRadar/AircraftList.json?lat=xxxx&lng=xxxx&fDstL=0&fDstU=1'
local apiMethod = 'GET'
local apiCallback = 'aircraftsRetrieved'
domoticz.openURL({ url = apiUrl, method = apiMethod, callback = apiCallback })
domoticz.openURL({ url = apiUrl, method = apiMethod, callback = apiCallback }).afterSec(15)
domoticz.openURL({ url = apiUrl, method = apiMethod, callback = apiCallback }).afterSec(30)
domoticz.openURL({ url = apiUrl, method = apiMethod, callback = apiCallback }).afterSec(45)
elseif (item.isHTTPResponse) then
local textArea = domoticz.devices('Aircrafts')
local cnt = 0
local caption = ''
if (item.ok) then
local json = domoticz.utils.fromJSON(item.data)
for i, ac in pairs(json.acList) do
local gnd = ac.Gnd and ac.Gnd or false
if(gnd == false) then
cnt = cnt + 1
local mdl = ac.Mdl and ac.Mdl or '-' –model
local from = ac.From and ac.From or '-'
local to = ac.To and ac.To or '-'
local op = ac.Op and ac.Op or '-' –operator
local call = ac.Call and ac.Call or '-' –call name
local dst = ac.Dst and ac.Dst or '-' –distance
local alt = ac.Alt and domoticz.utils.round(ac.Alt * 0.3048) or '-' –altitude
local spd = ac.Spd and domoticz.utils.round(ac.Spd * 1.852,0) or '-' –speed
caption = caption..'Aircraft: '..mdl..'nFrom: '..from..'nTo: '..to..'nOper: '..op..'nCall: '..call..'nDist: '..dst..' km'..'nAlt: '..alt..' km'..'nSpeed: '..spd..' km/h'..'nn'
end
end
if(cnt == 0) then
caption = '-'
end
else
caption = '?'
end
if(not(textArea.text == caption)) then
textArea.updateText(caption)
end
end
end
}