This shows you the differences between two versions of the page.
sde2:laboratoare:02_microbit_ro [2021/03/17 10:22] ioana_maria.culic [Structuri de date] |
sde2:laboratoare:02_microbit_ro [2021/03/22 11:05] (current) alexandra.state2607 [Exerciții] |
||
---|---|---|---|
Line 16: | Line 16: | ||
* Conectarea micro:bit-ului la PC | * Conectarea micro:bit-ului la PC | ||
* Încărcarea programelor pe micro:bit | * Încărcarea programelor pe micro:bit | ||
+ | * Definirea variabilelor folosind limbajul Python | ||
+ | * Familiarizarea cu structurile de date folosind limbajul Python | ||
+ | * Utilizarea structurilor repetitive și utilizarea funcțiilor folosind limbajul Python | ||
+ | * Crearea claselor și a obiectelor folosind limbajul Python | ||
Line 56: | Line 60: | ||
</code> | </code> | ||
- | Pentru a accesa simulatorul daca folosiți Linux sau MacOS scrieți comanda: | + | Pentru a accesa simulatorul deschideti un browser si accesati pagina ''http://localhost:8000/editor.html''. |
- | <code> | + | |
- | $ firefox editor.html | + | |
- | </code> | + | |
- | + | ||
- | Dacă folosiți Windows fie puteți folosi comanda anterioară, fie intrați in folder-ul "PythonEditor" și faceți click pe "editor.html". | + | |
Pentru a simula codul faceți click pe "Sim". Testați pentru **Exemplul 1** din secțiunea următoare. | Pentru a simula codul faceți click pe "Sim". Testați pentru **Exemplul 1** din secțiunea următoare. | ||
Line 125: | Line 124: | ||
{{ :sde2:laboratoare:flash.png?250 | }} | {{ :sde2:laboratoare:flash.png?250 | }} | ||
+ | <note info> | ||
+ | Pentru a vizualiza mesajele printate în consolă, trebuie să selectăm opțiunea ''Open Serial'' care va deschide terminalul cu un interpretorul de Python. | ||
+ | </note> | ||
===== Programarea Python ===== | ===== Programarea Python ===== | ||
<note warning> | <note warning> | ||
Line 210: | Line 211: | ||
=== Liste === | === Liste === | ||
- | Listele sunt similare cu array-urile. Pot conține nenumărate tipuri de variabile și de de elemente. Listele pot fi iterate într-un mod simplu, ca în exemplul următor: | + | Listele sunt similare cu array-urile. Pot conține nenumărate tipuri de variabile și de de elemente. |
+ | <note warning> Desi Python permite adaugarea de elemente de tipuri diferite in aceeasi lista, este recomandat sa nu faceti acest lucru care poate duce la aparitia a multe erori in program.</note> | ||
+ | |||
+ | Pentru a crea o listă care contine elemente de tip intreg vom rula următoarea linie de cod: | ||
+ | <code python> | ||
+ | myList = [1,2,3,4,5] | ||
+ | </code> | ||
+ | |||
+ | Putem de asemeanea să creăm o listă goală, la care vom adăuga elemente ulterior: | ||
<code python> | <code python> | ||
# Declararea unei liste | # Declararea unei liste | ||
Line 222: | Line 231: | ||
mylist.append(2) | mylist.append(2) | ||
mylist.append(3) | mylist.append(3) | ||
+ | </code> | ||
+ | |||
+ | Pentru a extrage un element din listă folosim o construcție de tipul ''lista[indice]'': | ||
+ | |||
+ | <code python> | ||
+ | |||
+ | mylist = [1,2,3] | ||
# Afișarea fiecărui element | # Afișarea fiecărui element | ||
Line 236: | Line 252: | ||
<note> | <note> | ||
- | În toate limbajele de programare numerotarea elementelor dintr-o listă începe de la indicele 0. | + | În toate limbajele de programare numerotarea elementelor dintr-o listă începe de la indicele 0. |
</note> | </note> | ||
+ | |||
+ | ==Funcția range== | ||
+ | <note warning> | ||
+ | Informațiile din această secțiune se aplică doar pentru folosirea limbajului Python pentru micro:bit. | ||
+ | </note> | ||
+ | Pentru a crea o listă cu elemente numere întregi, putem folosi funcția ''range'' care întoarce o listă cu toate numerele întregi dintr-un anumit interval. Funcția are urmăatarea definiție: ''range(start, stop, pas)'', unde ''start'' este prima valoare din listă, ''stop'' este valoarea de oprire (valoarea nu este inclusă), ''pas'' este pasul de incrementare și este un parametru opțional (valoarea default e 1). | ||
+ | |||
+ | **Exemplu** | ||
+ | |||
+ | Pentru a crea o listă cu valori pare de la 2 la 12, vom rula următoarea linie de cod: | ||
+ | |||
+ | <code python> | ||
+ | mylist = range (2, 13, 2) | ||
+ | </code> | ||
==Funcții predefinite pentru gestionarea listelor == | ==Funcții predefinite pentru gestionarea listelor == | ||
Line 279: | Line 309: | ||
</code> | </code> | ||
- | == Parcurgerea eleemntelor dintr-un dicționar == | + | == Parcurgerea elementelor dintr-un dicționar == |
<code python> | <code python> | ||
Line 683: | Line 713: | ||
</code> | </code> | ||
+ | ===== Exerciții ====== | ||
- | ===== Input devices sau butoane ===== | + | - Creați 3 variabile de tipuri diferite, ca mai jos, și afișați-le în consolă: **(0.5p)** |
- | + | - o variabilă //int// cu valoarea 80 | |
- | În schema microcontroller-ului prezentată anterior, se poate observa faptul că [[https://ocw.cs.pub.ro/courses/sde/laboratoare/02_microbit_ro?&#prezentare_bbc_microbit|micro:bit-ul]] are trei butoane. | + | - o variabilă //float// având valoarea 20.2 |
- | + | - o variabilă "string", care va reține șirul "python" | |
- | Cel de pe spate este pentru **reset**. Dacă acest buton este apăsat timp de cinci secunde microcontroller-ul va opri rularea programului care este încarcat. Totodată, dacă butonul de reset este apăsat scurt programul care este flash-uit pe placuță se va reseta. | + | - Utilizând funcția [[https://docs.python.org/2/library/functions.html#type|type]] determinați tipul variabilelor următoare. Pentru afișare puteți folosi [[https://www.w3schools.com/python/ref_func_print.asp|print]], iar pentru a vedea output-ul deschideți serialul //Open Serial//. **(0.5p)** |
- | + | - var1 = 80 | |
- | Pe partea din față se pot observa două butoane A și B, care pot fi accesate în cod astfel //button_a// și //button_b//. Acestea au o metoda //is_pressed()//, care va returna //True// dacă butonul este apăsat, în caz contrar metoda va returna //False//. | + | - var2 = 20.2 |
- | + | - var3 = "microbit" | |
- | În acest exemplu vom folosi condiționalul “if” sau “if statement”. | + | - Scrieți un program care primește ca parametrii de la linia de comandă 4 numere și afișați rezultatul calculuilui a+b*c-d. **(1p)** |
- | + | - Creați o listă cu prenumele colegilor de clasa, acestea se pot repeta. Adăugați cel puțin un element folosind metoda //append()//. Rezolvați următoarele cerințe: **(2p)** | |
- | <code python> | + | - Copiați lista inițială într-o altă listă numită copyList și sortați-o în ordine alfabetică |
- | # Simple decision | + | - Determinați numarul de apariții al fiecarui nume folosind o listă auxiliară care conține elemente distincte |
- | a = 33 | + | - Determinați numele care are numarul maxim de apariții în listă și numele cu numărul minim de apariții (dacă exista mai multe elemente care respectă condiția se vor afișa toate) |
- | b = 200 | + | - Inversați lista copyList și ștergeți ultimul element din lista inițială. |
- | if b > a: | + | - Întocmiți o bază de date al unui magazin de electrocasnice cu ajutorul dicționarului. Adăugati funcționalitatea ca atunci cand se citește de la tastatură un produs să se afișeze prețul acestuia. Se va afișa o eroare dacă produsul nu există "Error" și se caută produse până cand se introduce textul "stop". **(2p)** |
- | print("b is greater than a") | + | - Scrieți un program, care va afișa rezultatul returnat de funcția //digitize(n)//. Această funcție va primi ca si parametru un int și va returna o lista cu cifrele numărului în ordine inversă. **(1p)** Exemplu: 348597 => [7,9,5,8,4,3] |
- | </code> | + | - Creați o clasă Senzori folosită pentru a stoca valori provenind de la următorii senzori: temperatură, lumină, umiditate. Pentru fiecare senzor se pot citi și modifica valorile prin apeluri de funcții. **(1p)** |
- | + | - Creați un program care folosind clasa definită mai sus reține valori provenind de la seturi diferite de senzori pentru următoarele încăperi a unei locuințe si le afișează pe ecran: bucătărie, hol, dormitor, sufragerie. Programul realizează operațiile prin primirea de comenzi din consolă astfel: **(2p)** | |
- | <code python> | + | * ''insert <încăpere> <sensor> <value>'' - unde ''<incapere>'', ''<sensor>'' si ''<value>'' vor fi înlocuiți cu unul din cei 3 senzori și o valoare - inserează o valoarea nouă pentru senzorul respectiv |
- | # Use "elif" to add an additional condition | + | * ''delete <încăpere> <sensor> <value>'' - șterge valoarea pentru senzorul respectiv, valoarea după ștergere va fi 0 |
- | a = 33 | + | * ''print <incapere><sensor>'' - afișează valoarea pentru senzorul din încăperea precizată |
- | b = 33 | + | * ''print <incapere>'' - afișează toți senzorii și valorile aferente pentru încăperea precizată |
- | if b > a: | + | * ''add_room <incapere>'' - adaugă un nou set de senzori pentru o nouă încăpere |
- | print("b is greater than a") | + | * ''del_room <incapere>'' - șterge setul de senzori pentru o încăpere |
- | elif a == b: | + | Dacă se introduce o altă comandă, programul va arunca o excepție. |
- | print("a and b are equal") | + | == Bonus == |
- | </code> | + | - Modificați programele anterioare pentru a afișa valorile pe micro:bit, nu în consolă. |
- | + | - Creați un program care aprinde pe rând fiecare LED de pe micro:bit. | |
- | <code python> | + | - Creați un program care citește temperatura ambientală folosind senzorul de pe micro:bit și o afișează folosind LED-urile. |
- | # The "else" keyword takes anything that has not been included before | + | |
- | a = 200 | + | |
- | b = 33 | + | |
- | if b > a: | + | |
- | print("b is greater than a") | + | |
- | elif a == b: | + | |
- | print("a and b are equal") | + | |
- | else: | + | |
- | print("a is greater than b") | + | |
- | </code> | + | |
- | + | ||
- | <code python> | + | |
- | # Else without elif | + | |
- | a = 200 | + | |
- | b = 33 | + | |
- | if b > a: | + | |
- | print("b is greater than a") | + | |
- | else: | + | |
- | print("b is not greater than a") | + | |
- | </code> | + | |
- | + | ||
- | ==== Exemplul 2 ==== | + | |
- | + | ||
- | Programul urmator va afișa pe display litera ”A” daca butonul A este apăsat, respectiv litera “B” daca butonul B este apăsat. Dacă niciun buton nu este apăsat va afișa pe dislapay o imagine, care reprezintă un emoticon confuz. | + | |
- | + | ||
- | <code python> | + | |
- | from microbit import display, button_a, button_b, Image | + | |
- | + | ||
- | while True: #infinite looop | + | |
- | if button_a.is_pressed(): #check if the button A is pressed | + | |
- | display.scroll("A") | + | |
- | elif button_b.is_pressed(): #check if the button B is pressed | + | |
- | display.scroll("B") | + | |
- | else: | + | |
- | display.show(Image.CONFUSED) | + | |
- | </code> | + | |
- | + | ||
- | + | ||
- | ===== Accelerometru. Gesturi ===== | + | |
- | + | ||
- | Micro:bit poate să recunoască gesturi precum înclinare sau scuturare. | + | |
- | Pe spatele microntroler-ului, în partea de jos, se poate vedea un chip mic, care reprezintă un **accelerometru**, numit [[https://ocw.cs.pub.ro/courses/sde/laboratoare/02_microbit_ro?&#prezentare_bbc_microbit|"Compass and Accelerometer”]]. Acesta poate măsura acclerarea în toate cele trei dimensiuni, anume accelerarea stânga-dreapta, accelerarea față-spate și accelerarea sus-jos. | + | |
- | + | ||
- | Ce este un accelreometru? Un accelerometru are rolul de a măsura și a analiza accelerațiile liniare și unghiulare, de exemplu, masinile moderne folosesc un accelerometru care detectează un accident pentru a declansa airbag-urile. | + | |
- | + | ||
- | ==== Exemplul 3 ==== | + | |
- | În acest exemplu vom explora acclerometrul afișând pe display-ul micr:obit-ului un pătrat dacă acesta este înclinat către stânga, un tringhi dacă acesta este înclinat către dreapta și un diamant dacă este pus cu fața în sus. | + | |
- | + | ||
- | <code python> | + | |
- | from microbit import display, accelerometer, Image | + | |
- | + | ||
- | while True: | + | |
- | if accelerometer.current_gesture() == "left": | + | |
- | display.show(Image.SQUARE) | + | |
- | elif accelerometer.current_gesture() == "right": | + | |
- | display.show(Image.TRIANGLE) | + | |
- | elif accelerometer.current_gesture() == "face up": | + | |
- | display.show(Image.DIAMOND) | + | |
- | else: | + | |
- | display.clear() | + | |
- | </code> | + | |
- | + | ||
- | ===== Direcții. Busolă ===== | + | |
- | + | ||
- | Senzorul pentru [[https://www.youtube.com/watch?v=a3P6LWwPBqM&feature=emb_logo|busolă]] deceteaza câmpuri magnetice ale Pământului și este amplasat tot pe spatele micro:bit-ului, precum acclerometrul. Acesta este folosit pentru a decta dacă un magnet se afla prin preajma micro:bit-ului sau pentru navigare, poate arata direcțiile Nord, Sud, Est și Vest. | + | |
- | + | ||
- | ==== Exemplul 4 ==== | + | |
- | + | ||
- | În acest exemplu vom vedea cum micr:obit-ul poate fi folosit ca o busolă. __Atenție__: Imediat după ce ați rulat codul trebuie să așteptați puțin pană se afisează textul care spune “TITLING FILL”, iar apoi pe rând se va afișa căte un LED; trebuie să înclinați micro:bit-ul până display-ul se va lumina complet. | + | |
- | + | ||
- | <code python> | + | |
- | from microbit import display, compass | + | |
- | compass.calibrate() | + | |
- | + | ||
- | while True: | + | |
- | degrees = compass.heading() | + | |
- | if degrees < 45 or degrees > 315: | + | |
- | display.show('N') | + | |
- | elif degrees < 135: | + | |
- | display.show("E") | + | |
- | elif degrees < 225: | + | |
- | display.show("S") | + | |
- | elif degrees < 315: | + | |
- | display.show("W") | + | |
- | else: | + | |
- | display.show(' ') | + | |
- | </code> | + | |
- | + | ||
- | ===== Microfonul și Speaker-ul ===== | + | |
- | + | ||
- | BBC micro:bit V2 are fixat pe spate microfonul, iar pe partea din față se observa indicatorul, care lumineaza atunci cand acesta aste accesat. Acesta poate măsura nivelul de sunet din jurul plăcuței și poate reacționa la sunete înalte sau mai joase. | + | |
- | + | ||
- | Tot in partea din spate exista pe [[https://www.allaboutcircuits.com/technical-articles/what-is-a-printed-circuit-board-pcb/|PCB]] un difuzor(speaker) magnetic din care rezultă ca output sunetul. | + | |
- | + | ||
- | + | ||
- | ==== Exemplul 5 ==== | + | |
- | Acest exemplu simulează o lumânare. După importarea bibliotecilor se declară un contor numit //lit//, care inițial are valoarea True. Apoi se verifica dacă a fost înregistrat un sunet puternic folosind funcția //was_event()//, care totodată șterge istoricul evenimentelor sonore înainte de a returna. Dacă cea din urma returnează True se schimba valoare contorului, anume valoarea lui //lit//. În cazul în care lumânarea este aprinsă se va afișa pe display o imagine care o simuleaza o lumânare și care va face flacăra să licarească la o poziție random de la 1 la 3. | + | |
- | + | ||
- | Pentru a crea **imaginea** este necesar să dăm valori fiecarui pixel de pe display. Valoarea 0 însemna ca led-ul respectiv este oprit, nu luminează. Valorile între 1 și 9(valoarea maximă) arată nivelul de luminozitate al pixelului. Pentru a reprezenta o linie valorile sunt închise în //""// și se termină cu //:// . În acest exemplu, se observă faptul că fiecare linie din //Image()// reprezintă poziționarea led-urilor de pe display-ul fizic al mico:bit-ului. Prin urmare, analizând prima linie, care sugerează flacăra, toate led-urile sunt oprite cu exceptia celui de pe pozitia 3, care are pixel-ul setat la luminozitate maximă. Restul liniilor sunt asemenea pentru a forma restul lumânării, pozițiile 1 și 5, au pixel-ul setat la valoarea 0, iar restul la valoarea 9. | + | |
- | + | ||
- | Pentru a crea **efectul de licărire** se folosește funcția //set_pixel()//, caruia i se dau ca parametrii linia, coloana și valoarea pixelului. | + | |
- | + | ||
- | <code python> | + | |
- | from microbit import display, microphone, SoundEvent, Image, sleep | + | |
- | import random | + | |
- | + | ||
- | lit = True | + | |
- | + | ||
- | while True: | + | |
- | if microphone.was_event(SoundEvent.LOUD): #check if a loud sound was | + | |
- | lit = not lit | + | |
- | sleep(500) | + | |
- | if lit: | + | |
- | display.show(Image( #candle image | + | |
- | "00900:" | + | |
- | "09990:" | + | |
- | "09990:" | + | |
- | "09990:" | + | |
- | "09990")) | + | |
- | sleep(150) | + | |
- | flicker = random.randint(1, 3) | + | |
- | if flicker != 2: | + | |
- | display.set_pixel(2,0,0) | + | |
- | display.set_pixel(flicker,0,9) | + | |
- | sleep(150) | + | |
- | else: | + | |
- | display.clear() | + | |
- | </code> | + | |
- | + | ||
- | + | ||
- | ===== Senzorul de atingere ===== | + | |
- | + | ||
- | Micro:bit-ul are senzorul de atingere amplasat pe [[https://www.youtube.com/watch?v=spFD3SxxxHQ&feature=emb_logo|logo]], care poate fi folosit ca și input. Acesta poate interacționa cu user-ul precum un buton. | + | |
- | + | ||
- | + | ||
- | + | ||
- | ==== Exemplul 6 ==== | + | |
- | În acest exemplu se verifică dacă senzorul este atins atunci, se va afișa mesajul “Hello” altfel, display-ul va fi neluminat. | + | |
- | + | ||
- | <code python> | + | |
- | from microbit import display, pin_logo | + | |
- | + | ||
- | while True: | + | |
- | if pin_logo.is_touched(): | + | |
- | display.scroll("Hello") | + | |
- | else: | + | |
- | display.clear() #display stays empty | + | |
- | </code> | + | |
- | + | ||
- | ===== Senzorul de temperatura și de lumină ===== | + | |
- | + | ||
- | Senzorul de [[https://youtu.be/mrHn8eZ9eqg|temperatură]] înregistrează cu aproximație temperatura din jurul micr:obit-ului, iar senzorul de [[https://youtu.be/ii0U_FMr-Z4|lumină]] poate înregistra nivelul de lumină prin intermediul LED-urilor. | + | |
- | + | ||
- | ==== Exemplul 7 ==== | + | |
- | + | ||
- | Exemplul urmator afisează temepratura dacă butonul A este apăsat, iar dacă deasupra LED-urilor micro:bit-ul înregistrează o lumină puternică va afișa pe display un soare. Pentru a testa senzorul de lumină, în acest exemplu puteți îndrepta lumina de la lanterna telefonului către plăcuță. | + | |
- | + | ||
- | <code python> | + | |
- | from microbit import display, button_a, Image, temperature | + | |
- | + | ||
- | while True: | + | |
- | if button_a.was_pressed(): | + | |
- | display.scroll(temperature()) #displat the temperature | + | |
- | elif display.read_light_level() > 100: #check the light level | + | |
- | display.show(Image( #sun image | + | |
- | "90909:" | + | |
- | "09990:" | + | |
- | "99999:" | + | |
- | "09990:" | + | |
- | "90909")) | + | |
- | else: | + | |
- | display.clear() | + | |
- | </code> | + | |
- | + | ||
- | ===== Exerciții ===== | + | |
- | + | ||
- | - Scrieți un program care la apăsarea simultană a butoanelor A și B va afișa o imagine care reprezintă "DA", iar dacă niciun buton nu este apăsat va apărea o imagine care reprezintă "NU". Pentru imagini vezi [[https://microbit-micropython.readthedocs.io/en/v2-docs/tutorials/images.html|documentația]]. | + | |
- | - Modificați exercițiul anterior astfel încât la apăsarea butonului A se va afișa litera "A", iar la apăsarea butonului B se va afișa litera "B". | + | |
- | - Scrieți un program care afișeaza pe display numărul curent de scuturări. Când micro bit-ul înregistrează 9 scuturări pe display va apărea o imagine. | + | |
- | - Creați un program care înregistrează numarul de înclinări către stanga și către dreapta. De fiecare data când micro:bit-ul este îndreptat în una dintre cele două părți să se afișeze numărul curent de înclinări către partea respectivă. //Hint//: folosiți metoda [[https://microbit-micropython.readthedocs.io/en/v1.0.1/microbit.html#microbit.sleep|sleep]] | + | |
- | - Scrieți un program care la atingerea logo-ului(senzorul de atingere) să faca toggle între o imagine cu diamant și imagine cu diamant mic. | + | |
- | - Să se scrie un program, care la înregistrarea unui sunet va afișa pe display o imagine și va rosti cu ajutorul speech-ului "ON". Dacă nu este înregistrat niciun sunet display-ul rămâne gol. Afișati nivelul de sunet la o acțiune la alegere(apăsare unui buton, atingerea logo-ului, înclinare etc.) | + | |
- | - Modificați codul de la [[https://ocw.cs.pub.ro/courses/sde/laboratoare/02_microbit_ro?&#senzorul_de_temperatura_si_de_lumina|exemplul 7]] astfel încât micro:bit-ul detectează lumină să folosească speaker-ul pentru a reda muzica JUMP_UP, iar când lumina este oprită să redea muzica JUMP_DOWN. Pentru acesarea bibliotecii "music" vezi [[https://microbit-micropython.readthedocs.io/en/v2-docs/tutorials/music.html|documentația]]. | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | + | ||
+ | ==== ==== | ||
+ | [[https://github.com/UPB-FILS-SdE2/Solutions/tree/main/TP3|Soluții]] | ||