Micro:bit redomat


#1

Pozdrav svima i sve najbolje u 2019.
Imam jedan problem za kojeg vjerujem da mi netko od Vas može pomoći.
Kad djeci postavim neko pitanje onda mi ih se više javi i svi tvrde sa su prvi pa mi treba redomat pomoću microbita.
Dakle imamo 10 microbita u jednoj radio grupi od kojih je jedan kod voditelja za resetiranje grupe. Kada voditelj s tipkom “A” resetira grupu na ostalih 9 se pojavi nula “0”. Tko prvi stisne tipku za prijavu na displeju mu se prikaže broj “1” i više se ne može prijavljivati i brisati taj broj do ponovnog reseta. Ostalima u grupi više nije dostupan broj 1 nego broj 2 pa slijedeći koji se prijavi dobiva na displej “2” i tako redom do broja 9.
Unaprijed se zahvaljujem na pomoći i lijep pozdrav,
Mladen Božić


#2

Nemam “gotovo” rješenje no dajem konceptualni prijedlog rješenja sa malo kôda iz kojega mislim da se lako izrodi željeno rješenje. Segment postavljanja svih uređaja na 0 nisam ubacio da kôd bude pregledniji a dodavanje istoga je lako.

U nastavku prvo kôd namijenjen serveru (master):

Ovdje imamo dva bloka.

OnStart blok
se postavlja grupa (zajedničko i za master i za slave uređaje) i forsira slanje serijskog broja - u predloženom rješenju i nije to toliko bitno i može se isključiti no ukoliko je bitno isključiti mogućnost da se netko pokušao ubaciti u lanac prikazujući se kao drugi uređaj tada se rješenje može prilagoditi da koristi taj broj umjesto onoga kojega pošalje slave uređaj. Na kraju ovog bloka se stvara matrica koja će pamtiti sve pohranjene uređaje. Prvi element ove matrice neće nikada biti iskorišten no tako mi je lakše jer se ne moram igrati sa raznim detaljima od rednog broja na dalje - recimo da to mjesto pripada masteru i zato je neiskorišteno i uvijek na -1.
Redni broj prijavljenog uređaja određuje se na osnovu pozicije u toj matrici pa je redni broj 0 = master, 1= prvi prijavljeni, 2 = drugi prijavljeni itd. Ovdje se ne koristi fiksni broj mjesta pa se time može raditi i sa znatno više od 9 slave uređaja.

OnRadioReceived blok
Komunikacija između uređaja će uvijek morati biti na način da se šalje tekst i broj. Zamišljeno je da u tekstu bude identifikacija operacije koja se radi a u broju dodatni podatak npr. serijski broj uređaja koji šalje ili 0 ako ne treba slati išta (npr.pošalje se sa severa kao tekst “RESET” a kao broj 0 pa svi na to reagiraju postavljanjem na 0).
Trenutno je postavljeno da se reagira na tekst “ID” i serijskim brojem uređaja. Kôd će u petlji provjeriti u matrici da li dani serijski broj u value već postoji. Ako postoji vratiti će njegov redni broj a ako ne postoji tada će ga zapamtiti kao zadnji u nizu i vratiti njegov redni broj. Ovo znači i da će, u slučaju da se neki slave uređaj zagasi i ponovo pokuša prijaviti - master vratiti njegov stari redni broj (jer ih pamti po serijskom broju).

Slijedi i ono što je na klijentu:

Ovdje ima tri bloka

OnStart blok
Ponovo se postavlja kanal i slanje serijskog broja (zajedničko za sve) no tu sada inicijaliziramo i dvije varijable:
mojbroj će sadržavati dodijeljeni broj a inicijalno je 0
myID se postavlja na serijski broj uređaja i to je broj sa kojim se uređaj predstavlja u komunikaciji (nalazi se u Advanced/Control izborniku)

OnButton A Pressed blok
Ovdje samo šaljemo poruku “ID” i naš serijski broj - redni broj će nam vratiti server.

OnRadioReceived blok
Ovdje reagiramo na dvije situacije - ako smo dobili ID to je možda od nekog drugog slavea pa to ignoriramo
Ako je u value naš ID tada je poruka za nas. Kako trenutno nemamo drugih vrsta poruka tada nemamo potrebu za drugim provjerama već znamo da u tekstualnom dijelu imamo ukodiran naš redni broj - pretvaramo tekst u broj i pohranjujemo taj broj te prikazujemo na ekranu.
U normalnom radu bi ovaj dio bio zadnji i prije toga bi bili navedeni svi elseif uvjeti koji bi pokrivali sve ostale naredbe pa bi bilo
else if (tekst = “naredba”) and (value=“myID”) <-- u slučaju da se naredbe šalju samo za određeni uređaj
ili
else if (tekst = “naredba”) ako svi uređaji moraju isto reagirati

Evo ovo je onako nekako iz glave jer su mi svi micro:bit-ovi u uredu a ja sam na G.O. no nadam se da je stvar OK - probajte pa javite.

Za kraj imajte u vidu da radio komunikacija kod micro:bit-a zna biti prilično nepouzdana i da u radio kanalu može biti poprilično šuma (jer svi uređaji bez obzira na kanal šalju po istoj frekvenciji pa dolazi do interferencije).


#3

Hvala na trudu i lijepoj prezentaciji. Složio sam blokove ali još nisam stigao testirati jer sam okupiran legom pa nakon natjecanja ću probati i javiti iskustva.


#4

Eto konačno pet minuta vremena za test i stvar funkcionira odlično, ali bi trebalo malo šminke:

  • da se pritiskom A+B na masteru ponište (resetiraju) svi korisnici u grupi i da im se prikaže 0
    -da se na masteru ispisuje zadnji prijavljeni broj odnosno broj prijavljenih. Unaprijed zahvaljujem, to će biti odlična stvar za kviz s klincima.

#5

Proširiti koncept nije problem no bitno je znati kuda se ide.

Da li trebate imati i neku kompliciraniju komunikaciju - da djeca biraju odgovor?
Kako onda slati pitanja i brojati odgovore?

Inače što se tiče teme kviza - ako se ne varam jedan je kolega o toj temi pisao mislim u grupi na Facebooku.

@VladoLendvaj da li se ti sjećaš gdje je to bilo? Mislim da je tamo čak bilo gotovo rješenje pa da ne izmišljamo toplu vodu?


#6

Da bi ste samo dodali reset funkcionalnost tada je dovoljno da na glavnom programu postavite “OnButton A+B Pressed” događaj u kojemu stavite da se šalje poruka “RESET” = 0.
Nakon toga tu stavite i onu zadnju naredbu iz OnStart (set uredjaji to array od -1).

Da bi prikazali koliko ih se prijavilo izmijenite OnRadioReceived event gdje kao zadnju naredbu u IF name=“ID” bloka stavite naredbu “show number (length of array(uredjaji))”

Na klijentima treba izmijeniti OnRadioReceived događaj tako da se doda jedan else if (name = “RESET”) i u tom bloku stavi:
set mojbroj to 0
show number (mojbroj)

I to bi trebalo biti dovoljno ako samo želite imati redomat bez pamćenja odgovora.


#7

Hvala na odgovoru, no Vaša pitanja mi djeluju kao da ja nešto skrivam. Možda ja nisam jasno izrazio svoju želju, ali potreba je isključivo redomat jer kad imam neku provjeru znanja bitno mi je da imam zabilježeno koje se dijete prvo, drugo,treće,… javilo i ako ne zna prvi, pitam drugog. Ideja se javila kada je došlo do prepirke tko se prvi javio, a niti ja nisam mogao procijeniti jer su se gotovo istovremeno javilo više njih. Nisam tako dobar s microbitom pa da sam to složim i zato tražim pomoć od iskusnijih.


#8

Ne smatram da nešto skrivate već vas želim možda usmjeriti na neka rješenja koja su drugi razvili a bave se temom kviza obzirom da redomat kanite koristiti kao pomagalo za koliko sam shvatio - kviz.

Kolega je razvio takav jedan program koji omogućava i da kažete koliko će pitanja biti, u kojemu možete birati točan trenutak počinjanja i tavršetka pitanja te pamćenje odgovora.

Možda bi vas to zanimalo?


#9

Ovo je meni potrebno i s ovim dodacima koje ste opisali. Nisam još dodao opisane blokove pa kad isprobam javim ili ako zapne opet ću tražiti pomoć. Hvala i lijep pozdrav.