Dan prije finalne utakmice Francuske i naše Hrvatske palo mi je na pamet za micro:bit složiti dohvat rezultata. Budući da micro:bit sam po sebi ne može na Internet, povezao bih ga s ESP8266 i pomoću AT-a pristupao Internetu. Dohvatio bih aktualni rezultat, obradio ga, prikazao i nekako javio da je došlo do promjene.
Prvo što sam trebao napraviti, pronaći je izvor podataka. Ranije sam za neka osobna istraživanja koristio odlični API worldcup.sfg.io. Problem u ovom našem slučaju je da taj API vraća dosta podataka, što nikako nije dobro za malu memorije micro:bita. Bezuspješno sam pokušao pronaći neki lakši API. Na kraju sam se odlučio malo upoznati s Pythonovim Flaskom i za doslovno pet minuta složio svoj vlastiti server koji se spajao na gornji API i izdvajao mi i slao samo rezultat. Ispod se vidi dobiveno, a na kraju članka priložen je kod servera. Za vrijeme izrade spajao sam se na worldcup.sfg.io/matches/today, a za potrebe ovog članka prilagodio sam spajanje na aktivni worldcup.sfg.io/matches.

Nakon što sam dobio izvor podataka, odlučio sam testirati vezu ESP-a prema serveru. To je najbolje učiniti pomoću računala. Povežem se s ESP-om pomoću FTDI-ja i putem serijske veze izravno unosim AT naredbe.

Testiranje sam uspješno odradio u Arduino IDE-ju. Ovo su potrebne naredbe, a ispod se vidi rezultat izvođenja.
AT+CIPSTART="TCP","192.168.5.40",5000 AT+CIPSEND=38 GET / HTTP/1.1 Host: 192.168.5.40

Preostalo mi je navedene naredbe pretočiti u program za micro:bit. Kod je dosta jednostavan. Serijskom vezom povežem micro:bit i ESP8266, pošaljem ranije navedene AT naredbe i pripadajuće podatke i pročitam ono što mi je vraćeno, obradim i prikažem.
from microbit import * uart.init(baudrate=115200, tx=pin0, rx=pin1) sleep(3000) while True: if button_a.was_pressed(): display.clear() display.show('C') uart.write(b'ATE0\r\n') sleep(3000) uart.write(b'AT+CIPSTART="TCP","192.168.5.40",5000\r\n') sleep(3000) uart.write(b'AT+CIPSEND=38\r\n') sleep(3000) uart.write(b'GET / HTTP/1.1\r\nHost: 192.168.5.40\r\n\r\n') while True: step = 0 while not uart.any(): sleep(100) step += 1 if step == 100: break if step == 100: break while uart.any(): data = uart.read() display.scroll(str(data), delay=50) sleep(100)
Nažalost, čitanje nije prošlo kako je zamišljeno. Podaci su uredno poslani i dobri podaci su vraćeni, no nikako nisam uspio natjerati micro:bit da pročita sve podatke. Jednom sam, pomoću ovog koda, uspio dobiti sve podatke, no u većini slučajeva dobio bih samo dio podataka, otprilike polovicu. Budući da je rezultat tek na kraju, kao takvi su beskorisni. Isprobao sam razne oblike dohvata, i u MakeCodu i u MicroPythonu, no bezuspješno. UART dio micro:bita problematičan je i loše dokumentiran. Nažalost, za proučavanje koda izvedbe nemam baš vremena.
Budući da glavna ekipa micro:bita dolazi iz Engleske, nema smisla odmah im se obratiti s pitanjima. 🙂 Pustit ću da im rane malo zarastu. A tada možda probam istu stvar napraviti i pomoću Arduino IDE-ja. Sve to skupa ostavim za drugi dio ove priče o nogometu.