7. Valgustundliku takisti abil valguse mõõtmine ja kuvamine arvuti ekraanil—Serial monitor
<- eelmine peatükk
järgmine peatükk ->
7.0. Seos eelmiste peatükkidega
Eelnenud peatükkides oleme uurinud LED-i juhtimist. Oleme kasutanud for-tsükliga ja if/else abil LED vilgutamist. Oleme saanud ka esimese kogemuse digitaal- ja analoog-signaali erinevustest—teame, mis moodi jagunevad viigud Arduino digitaal-viikude reas ning mida tähendab lainelise kriipsukese kujuline markeering viigu tähistusel.
Me teame täpselt, miks me ei programmeri tavalist digitaalviiku analogWrite() korraldusi täitma.
Meenutame ka viiendat peatükki, milles panime tööle vooluahela, millega saime INPUT-ina toimiva lüliti abil juhtida LED-i. Mis veel võiks toimida sarnaselt lülitiga ja anda INPUT-i, mille alusel tehakse midagi (toimub mingi OUTPUT)?
7.1. Eesmärk ja selgitused
Selle peatüki läbinud õpilane oskab
7.2. Töövahendid on paljuski samad, muutused märgitud punasega.
7.3. Tegevused
Kordamise huvides võime võtta viienda peatüki materjalist vooluahela kohta tehtud skeemi ja selle kiirelt tööle panna: saame võtta viiendast peatükist ka programmi. Kui teeme seda, siis mõistagi peame võtma töövahendina lisaks ka ühe lüliti ja veel ühe takisti.
Võime mõelda nii, et meie uus skeem sarnaneb viiendas peatükis kasutatud skeemile, milles lüliti asemel on fototakisti ja puudub LED.
Fototakisti (Light Dependent Resistor—LDR)
Muudab oma takistust vastavalt valguse muutustele. Vihjasime viiendas peatükis, et lüliti toimib nagu INPUT--sisend. Nüüd paneme lüliti asemele anduri. Andur annab sisendit (INPUT).
Lülitiga on lihtsam kui LDR-i abil meie skeemi läbivat voolu nulli ajada: valgust ei pruugi suuta LDR-i eest päevasel ajal piisavalt varjata, ent lülitiga vooluahela katkestamise korral sarnast muret ei ole.
Kuivõrd LDR on takisti, siis tuleb temast mõelda kui takistist. Takisti ühendamine erines dioodi ühendamisest—ei olnud oluline, kumb LDR-i kahest viigust GND-suunale jäi—takisti funktsionnerib endiselt takistina.
LED-i me sedakorda ei kasuta. Viiendas peatükis kasutatud digitaal-viikude reas olevate viikude (OUTPUT nii digitalWrite() kui ka analogWrite() korral; INPUT vaid digitalRead() korral) asemel peame kasutama ANALOG IN tähistusega viigureas paiknevaid viikusid, sest vaid need on ette nähtud sissetuleva (INPUT) analoog-signaali (programmis kasutame analogRead()) vastuvõtmiseks.
NB! Arduino viigud jagame käesoleva tunni mõistes kaheks viigurühmaks—veenduge ise: osadele viigutähistustele on lisatud suur ’A’. See tähendab, et need viigud võimaldavad Arduinol töötlemiseks vastu võtta anduritelt analoog-kujul tulevat signaali.
Viiku tähistame numbriga neil juhtudel
|funktsioonid:||Arduino viigud, millele ühendada:|
|digitalWrite()||Digitaalviigud|
|digitalRead()||Digitaalviigud|
|analogWrite()||Digitaalviigud, millel on PWM tähistus|
Viigu tähistuse alguses on A, millele lisandub number:
|analogRead()||ANALOG IN tähistusega viigud|
Leidke A0, A1, A2, A3, A4, A5.
Kokku kuus viiku. Selguse huvides nimetame neid kuute viiku edaspidi Arduino UNO-l asuva tähistuse järgi Analog-in viikudeks. Digitaal- ning PWM-viikudega (st digitaalviikude reas asuvate viikudega 2-13) oleme juba eespool tutvust teinud.
Vooluahel saab välja nägema nagu on toodud pildil. Uurige ka erinevust/sarnasust viienda peatüki vooluahela pildiga.
- Esimeseks erinevuseks on, et valgusele reageeriva takisti infot korjame Analog-in tüüpi viigule ja isegi mitte kriipsukesega tähistatud digitaalviigule. Niisiis ühendame valgustundliku takisti esimese Analog-in tüüpi viiguga, milleks on A0.
- Voolu võtame seekord vaid 5V viigult—see on viievoldise pingega viik : sarnaselt toimisime ka lülitiosaga viiendas peatükis. Vaadake ka viiendas peatükis lüliti abil LED juhtimist vooluahelaga.
- Ja igaks juhuks—veenduge, et LED-i me viievoldise toite külge ilma takistita ei ühendanud—vastake mõttes küsimusele, et miks me nii ei toiminud? Ning kas LED ei olnud mitte OUTPUT? Seega suur erinevus INPUT-komponentidest!
7.4. Järgmisena koostame programmi
Võime lihtsuse huvides kiirelt kohendada ka Arduino IDE-st leitavat: File -> Examples -> 0.1Basics-> AnalogInOutSerial. Muide, see töötaks antud vooluahela peal ka kohendamata kujul, ent ju see ei oleks nii efektiivne, kui näiteks õpetajal koos õpilastega vajalik programmitekst samm-haaval kirja panna. Seega võtame menüüst: File -> New
Meie ees on järgmine lõik:
void setup() { // put your setup code here, to run once: } void loop() { // put your main code here, to run repeatedly: }
asume seda täiendama.
Kõigepealt määrame kollase juhtmega LDR-ilt A0 viigule saadetava signaali tarvis sellesama viigu kui analogInPin—sellega loeme LDR-ilt lähtuvat signaali. Kuna see viik ei muutu, siis võime selle ette lisada ka const. Vajame veel muutujat, et „kinni püüda“ seda, mis elektrooniliselt laekub viigule A0: selleks lisame muutuja LDR, millele algväärtuseks anname nulli. Mõlemad tähistatud kollasega. Saame järgneva teksti.
const int analogInPin = A0; int LDR = 0; void setup() { } void loop() {
Võime kontrollida, kas antud programmitekst kompileerub. Tõsi, et kompileerub, ent kuna meil ei ole sisu ei void setup() ega void loop() osas, siis midagi ei tehta.
Meie eesmärgiks on aga asuda valgustundlikult takistilt muutujasse '''LDR laekuvaid väärtusi kirjutama Arduino IDE-s programmi töö jälgimiseks sobilikku eraldi aknasse--Serial monitori aknasse. Lisame selleks järgmised käsud:
void setup() osasse paneme ühekordse käsu Serial.begin(). Selle käsu argumendiks peame panema ka nn baud rate—st sümbolite edastamise kiiruse. Antud juhul anname baud rate 9600.
void loop() osasse aga paneme muutuja LDR tarvis instruktsiooni, et seda tuleb lugeda A0 viigult ja seejärel loetu välja printida Serial monitoriga—printkäsu lõpus ln märgib rida: inglise keeles ’line’. Kui seda mitte lisada, saame kõik numbrid üksteise järgi ja see oleks üsna segane pilt: võime seda ka korra näitlikkuse huvides katsetada, ent väärtuse muutumise jälgimiseks see ei sobi.
Kasutame järgnevat programmi—käivitame selle:
int analogInPin = A0; int LDR = 0; void setup() { Serial.begin(9600); } void loop() { LDR = analogRead(analogInPin); Serial.println(LDR); }
Kui veateadet ei tulnud, siis avame Serial monitori, klikkides Arduino IDE ülemisel real paremal pool asuvale märgile.
Kui kõik toimib, siis näeme avanevas aknas kiirelt lisandumas fototakistilt loetavat arvulist väärtust—Analog-in viigult tulevat infot. Saame seda mõjutada näppu vastu fototakisti valgustundlikku plaati asetades: märkame, et näitajad muutuvad sõrmega valgustundlikku takistit puutudes väiksemaks.
Põhimõtteliselt oleme teinud oma esimese andmebaasi, kuhu kirjutame fototakistiga mõõdetud väärtusi.
Et meid huvitavad andmed oleks kuidagi ajaliselt paremini struktureeritud, peaksime aga reguleerima nende kirjapanekut Serial monitori aknas. Selleks saame näiteks loendada iga infokogumist, korjata infot näiteks iga kahe sekundi järel.
Teeme programmi täiendused:
Kuna soovime igale mõõtmisele ette anda selle mõõtmise numbri ja loendame neid for-tsükli abil, siis peame igas tsükliosas ka uuesti „mõõtma“ valgustakistilit tulevat signaali, seega paneme analogInPin lugemise tsüklisse ja seega ei ole meil enam vajadust muutuja LDR järele. Mis juhtuks siis, kui real
Serial.println(analogRead(analogInPin));
oleks analogInPin asemel hoopis muutuja LDR? Kuidas sellisel juhul programm toimetaks valgustakisti näiduga?
int analogInPin = A0; //int LDR = 0; int i = 1; void setup() { Serial.begin(9600); } void loop() { //LDR = analogRead(analogInPin); for ( i = 0; i = i +1;){ Serial.print(i); Serial.print(".mõõtmine: "); Serial.println(analogRead(analogInPin)); delay(2000); } }
- Saame sedakorda lugeda veidi paremini takistilt tuleva signaali kohta käivat näitu: katsetame selle näidu muutmist valgusega manipuleerides.
7.5. Kodutöö
Kirjutage Serial monitori midagi juurde, näiteks lisage iga rea lõppu „;“ Nii et tekiks järgmine pilt:
- Muutke Serial monitori poolt registreeritavat infot ajaliselt—näiteks pange valminud seadeldis mõõtma valgust Teie toas iga poole tunni järel ning jätke see kuni hommikuni tööle.
Kas toimis? Mida saate selle põhjal öelda valguse tugevuse kohta? Kas selles peatükis omandatu abil võiks näiteks olla võimalik uurida taimede kasvuks vajalikku valgust?
- Katsetage ja mängige programmiga. Kirjutage oma muudetud programmi ka kommentaarid.
- Katsetage Serial.print ja Serial.println käskudega Serial monitori poolt info esitamise muutmist. Kõige huvitavamast tehke ekraani-ülesvõte ja saatke see õpetajale—tal on huvitava ülesvõtte üle hea meel.