' ' Quakes32 V1.1 for ESP32 and ILI9341 (240x320) ' Uses map image map-s.jpg. ' AndyGadget 2021 ' ' Tidied up code, added overnight dimming of display ' added more comments and improved event location dot accuracy. ' wlog can.stop ' Kill CanBus as not required OPTION.NTPSYNC ' Sync to internet time (Mage sure Timezone is correct on Config screen TFT.INIT 1 ' May need TFT.INIT 3, depending on screen orientation. TFT.BRIGHTNESS 255 ' Various variable definitions. FName$ = "/history.txt" OldRef$ = "" dim Hist(100,3) PLat = 0 : PLon = 0 : PMag = 0 EOL$ = chr$(10) tft.text.align 4 tft.text.col Yellow tft.text.font 4 ' Display bare map on screen. tft.jpg "/map-s.jpg" if file.exists(FName$) = 1 then ' Read event history from file into array. for FCnt = 1 to 100 FLine$ = file.read$(FName$,FCnt) Hist(FCnt,0) = val(word$(FLine$,1,"|")) Hist(FCnt,1) = val(word$(FLine$,2,"|")) Hist(FCnt,2) = val(word$(FLine$,3,"|")) next FCnt end if 'Sets routine to call when data received from seismic portal API. ONWGETASYNC MsgReceived gosub QueryServer ' Set timer to run Blink routine every 500mS timer0 500, Blink ' Set timer to run data request routine every 30 seconds. timer1 30000, QueryServer ' Do nothing and wait for the events above to occur. wait ' SUBROUTINES ' *********** QueryServer: ' Request data from SeismicPortal API - No key needed. ' JSON is an option but chose simple delimited text string output. ' Requesting only most recent event. ' Green dot in top centre of screen - Clears when data received. TFT.CIRCLE 162, 9, 3,green,1 wgetasync("seismicportal.eu/fdsnws/event/1/query?limit=1&format=text",443,0,1) ' Turn TFT brightness down overnight Hour = val(left$(time$,2)) if (Hour >=23) or (Hour <=7) then TFT.BRIGHTNESS 20 else TFT.BRIGHTNESS 255 return MsgReceived: ' Seismic portal API has replied ot data request. TFT.CIRCLE 162, 9, 3,&H3475,1 Line$ = WORD$( WGETRESULT$, 2, chr$(10)) Ref$ = word$(Line$,1,"|") ' Only process result if it is a new event. if (Ref$ <> OldRef$) and (val(Ref$) <> 0) then wlog line$ OldRef$ = Ref$ ' Extract the data items we want from returned data line. TD$ = word$(Line$,2,"|") EDate$ = left$(TD$,10) ETime$ = left$(time$,5) EMag$ = word$(Line$,11,"|") ELoc$ = word$(Line$,13,"|") Lat = val(word$(Line$,3,"|")) Lon = val(word$(Line$,4,"|")) ' Load map to clear display, then print text info about event. TFT.JPG "/map-s.jpg" tft.text.draw EMag$,30,20 tft.text.draw ETime$,275,20 ' Split location into 2 lines if too long for screen. if len(ELoc$) <21 then tft.text.draw ELoc$, 160,230 else tft.text.font 3 sp = instr(14,ELoc$," ") tft.text.draw left$(ELoc$,sp), 160,215 tft.text.draw right$(ELoc$,len(ELoc$) - sp), 160,232 tft.text.font 4 end if ' Shift array. For Cnt = 0 to 99 Hist(Cnt,0) = Hist(Cnt+1,0) Hist(Cnt,1) = Hist(Cnt+1,1) Hist(Cnt,2) = Hist(Cnt+1,2) next Cnt ' Convert longitude and latitude of event to screen co-ordinates. ' Size of plotted circle is proportional to quake magnitude. PLon = (150 + (0.889 * Lon)) mod 320 PLat = 169 - ((0.86 * Lat) + (Lat * 0.0475)^3) PMag = cint(val(EMag$) * 1.0) if PMag <= 1 then PMag = 1 ' Write new event to array. Hist(100,0) = PLon Hist(100,1) = PLat Hist(100,2) = PMag ' Plot event history from array. for HCnt = 0 to 100 RedVal = 155 + HCnt GrnVal = 55 + (HCnt * 2) BluVal = 0 ' Colour of plotted point fades from bright yellow through orange to dull red with age. TFT.CIRCLE Hist(HCnt,0),Hist(HCnt,1),Hist(HCnt,2),TFT.RGB(RedVal,GrnVal,BluVal),1 next HCnt ' Plot most recent event. TFT.CIRCLE PLon,Plat,PMag,&HF800,1 ' Store array to file. ' DO NOT STOP PROGRAM WHEN RED DOT AT TOP OF SCREEN ' OTHERWISE HISTORY FILE WILL BE CORRUPTED. TFT.CIRCLE 162, 9, 3,red,1 x = file.delete(FName$) for FCnt = 1 to 100 FLine$ = str$(Hist(FCnt,0)) + "|" + str$(Hist(FCnt,1)) + "|" + str$(Hist(FCnt,2)) + EOL$ file.append FName$,FLine$ next FCnt TFT.CIRCLE 162, 9, 3,&H3475,1 endif return Blink: ' Flashing red / yellow dot to mark most recent event. Flsh = (Flsh + 1) mod 2 if Flsh = 0 then TFT.CIRCLE PLon,PLat,PMag,Yellow,1 else TFT.CIRCLE PLon,PLat,PMag,Red,1 endif return