Programăm funcționalitățile
Prototipul asamblat săptămâna trecută a trecut testul la rece: nimic nu joacă, nimic nu freacă, firele au drum curat. Dar deocamdată e un obiect care doarme. Azi îi scrieți creierul — iar Python-ul pe care l-ai învățat în clasa a VIII-a se întâlnește, în sfârșit, cu un obiect pe care îl poți uda, aprinde sau hrăni.
La finalul lecției vei ști să traduci comportamentul dorit al obiectului în program Python, să testezi codul în simulator înainte de prototip și să faci două plăci să comunice prin radio.
De la comportament la program
Nu începe cu codul. Începe cu o frază: ce trebuie să facă obiectul, spusă în forma „dacă..., atunci..., altfel...". Pentru sistemul de udat:
Dacă solul e mai uscat decât pragul stabilit, atunci pornește pompa 5 secunde, altfel nu face nimic. Verifică din nou peste un minut.
Fraza asta e deja algoritmul — condiție, acțiune, repetare, tot ce ai învățat despre structuri de control, doar că de data asta „acțiunea" mișcă apă adevărată. Fiecare echipă își scrie comportamentul complet în 3–5 astfel de fraze înainte să deschidă editorul. Cine nu-l poate spune în cuvinte nu-l poate spune nici în Python.
Aceeași gimnastică, la celelalte proiecte: „dacă senzorul de lumină citește sub prag ȘI senzorul de mișcare detectează pe cineva, atunci aprinde lampa 60 de secunde" — lampa de la subsol; „dacă au trecut 8 ore de la ultima dozare, atunci rotește dozatorul un sfert de tură" — hrănitorul. Observă că a doua frază nu are senzor deloc: condiția ei e timpul. Comportamentul dictează componentele, nu invers.
Codul pas cu pas
Schema legăturilor, ca să știm despre ce vorbește codul:
Iar programul, în MicroPython, construit exact pe fraza-comportament:
from microbit import *
PRAG = 500 # sub această valoare, solul e considerat uscat
DURATA_UDARE = 5000 # milisecunde de pompare
PAUZA = 60000 # o verificare pe minut
while True:
umiditate = pin0.read_analog() # 0 = complet uscat ... 1023 = foarte umed
if umiditate < PRAG:
pin1.write_digital(1) # releul pornește pompa
sleep(DURATA_UDARE)
pin1.write_digital(0) # oprire — obligatoriu!
sleep(PAUZA)
Trei lucruri de observat, pentru orice proiect, nu doar pentru udat:
- Constantele au nume, cu majuscule, la începutul programului. Când profesorul de biologie vă spune că mușcatele vor mai multă apă, schimbați
DURATA_UDAREîntr-un singur loc, nu vânați cifre prin cod. - Orice pornire are o oprire. Linia
pin1.write_digital(0)nu e opțională — fără ea, prima udare devine inundație. La lampa cu senzor, la hrănitor, la orice: scrie oprirea în același moment în care scrii pornirea. PRAGnu se ghicește, se măsoară. Înfige senzorul în pământ uscat și citește valoarea pe ecranul plăcii, apoi în pământ proaspăt udat. Pragul bun e între cele două citiri. Asta se numește calibrare — și e diferența dintre un senzor și un ornament.
Și de ce releu, de fapt? Pentru că placa micro
scoate pe pin un semnal firav, de câțiva miliamperi — suficient să aprindă un LED, mult prea puțin pentru motorul pompei. Releul e un întrerupător comandat: semnalul mic al plăcii îi spune când să închidă circuitul mare al pompei, alimentat separat de la acumulator. Cele două circuite nu se ating — de aceea pompa nu se leagă niciodată direct la placă, oricât de tentant arată firele.Încă o regulă de igienă, moștenită din toate modulele de programare: codul echipei stă pe contul echipei, nu pe telefonul cuiva, iar fiecare versiune care funcționează se salvează cu dată în nume — udare-v3-19mai.py. Când versiunea de azi o ia razna, vă întoarceți la cea de ieri în zece secunde, în loc să reconstruiți din memorie.
Două obiecte care vorbesc
Unele proiecte au nevoie de o pereche de plăci: senzorul e afară, la obiect, iar în clasă un panou arată starea. Plăcile micro
comunică prin radio — și aici intră tot ce știi despre rețele.Placa de la obiect transmite:
from microbit import *
import radio
radio.config(group=7) # canalul echipei noastre
radio.on()
while True:
umiditate = pin0.read_analog()
radio.send("picatura:" + str(umiditate))
sleep(60000)
Placa din clasă recepționează:
from microbit import *
import radio
radio.config(group=7) # ACELAȘI grup, altfel nu se aud
radio.on()
while True:
mesaj = radio.receive()
if mesaj is not None and mesaj.startswith("picatura:"):
valoare = int(mesaj.split(":")[1])
if valoare < 500:
display.show("U") # uscat — se udă în curând
else:
display.show("O") # ok
sleep(200)
Mai observă prefixul picatura: din mesaj. Chiar și pe grupul vostru, mesajul își spune expeditorul — un mini-protocol de doar câteva caractere. Receptorul verifică prefixul înainte să creadă conținutul, exact cum un browser nu acceptă orice pachet care bate la ușă.
Testează codul înainte de prototip
Nimeni nu încearcă un cod nou direct pe pompa de lângă electronica voastră proaspăt uscată. Scara de testare, treaptă cu treaptă:
- Simulatorul — editorul de MicroPython din browser are un micro virtual: tragi de valoarea pinului analogic și vezi dacă logica reacționează la prag. Aici se prind greșelile de gândire, gratis.
- Placa reală, sarcină falsă — în locul releului cu pompă, un LED pe pinul 1. LED aprins 5 secunde = pompă pornită 5 secunde. Aici se prind greșelile de conectare.
- Sarcina reală, condiții controlate — releu, pompă, dar rezervorul deasupra unui lighean, nu deasupra jardinierei. Abia acum curge apă.
Exersează
- Scrieți comportamentul complet al obiectului vostru în fraze „dacă..., atunci..., altfel..." — toate funcționalitățile, inclusiv ce face obiectul când nu face nimic.
- Implementați funcționalitatea principală în MicroPython, cu constante numite la început și cu oprirea scrisă lângă fiecare pornire. Treceți codul prin toate cele trei trepte de testare și notați în jurnal data trecerii fiecărei trepte.
- Calibrați senzorul vostru (umiditate, lumină, distanță — ce are proiectul): notați în portofoliu valorile măsurate în cele două situații extreme și pragul ales între ele.
- Echipele cu două plăci: puneți în funcțiune legătura radio pe grupul echipei, cu prefix de expeditor în mesaj. Celelalte echipe: adăugați pe afișajul plăcii un semn distinct pentru fiecare stare a obiectului.
- Provocare. Adăugați obiectului un jurnal propriu: la fiecare acțiune (udare, aprindere, dozare), programul afișează sau transmite prin radio un contor. Câte udări au fost azi? Datele acestea, culese o săptămână, devin argumentul-cifră de la revista finală: „obiectul a economisit X litri față de udarea zilnică cu stropitoarea".
Verifică-te
Se încarcă activitatea…
Se încarcă activitatea…
Se încarcă activitatea…