====== Projekt 4 Andurite lugemine ja väärtuse kuvamine ====== Arduino LCD laiendusplaadi peal on andurite ühendamiseks olemas 5 sisend/väljund viiku koos toite- ja maapotentsiaali viikudega. See teeb andurite ühendamise väga lihtsaks, sest ei pea eraldi toite viike juurde tekitama, et mitu andurit ühendata.\\ Ühendada Arduino LCD laiendusplaadiga vajalikud andurid: * Temperatuuriandur: signaal - A1 (kasutada pingejaguriga kaablit) * Ultraheli kaugusandur: trigger - A2, echo - A3 * Infrapunalähedusandur: signaal - A4 {{:et:arduino:sensorss:projekt4.jpg?800|}} ===== Näide #4.1 Temperatuuriandur koos matemaatika teegiga ===== Takistuslikud analoogandurid ühendatakse mikrokontrolleriga selliselt, et see moodustab pingejaguri. Sama käib ka NTC temperatuurianduri kohta. Antud juhul tuleb lisaks andurile ühendada väline takisti 10 kΩ sisendviigu ja maapotentsiaali vahele. AK06 robotiehitamise komplekt puhul kasutada juba komplektis kaasa tulnud pingejaguri kaablit, millel on takisti juba küljes. \\ Temperatuurianduri analoogväärtuse lugemine tehakse peatsüklis, aga töötlemine lisafunktsioonis //Termistor//, kus võetakse sisendiks termistori väärtus ning Seinhart-Hart valemi rakendamisel väljastatakse temperatuur Celsiuse skaalas. Analoogsisendi väärtuse võtmine on programmi kompaktsuse mõttes kirjutatud funktsiooni //Termistor// väljakutsumisel parameetri kohale. Saadud temperatuur kirjutatakse ekraanile sama funktsiooni lõpus. /* Nimetus: Näide #4.1 Kirjeldus: Temperatuuriandur koos matemaatika teegiga Programm kasutab Steinhart-Hart termistori valemit: temperatuur kelvinites = 1 / {A + B[ln(R)] + C[ln(R)]^3} kus A = 0.001129148, B = 0.000234125 ja C = 8.76741E-08 */ // Vajalike teekide kaasamine #include #include // LCD objekti tekitamine ja ühendusviikude määramine. LiquidCrystal lcd(8, 9, 4, 5, 6, 7); const int andur = A1; // Viik kuhu on ühendatud temperatuuriandur (termistor) void setup() { lcd.begin(16, 2); // LCD ridade ja veergude määramine vastavalt riistvarale lcd.print("Temperatuur"); // Ekraanile teksti kuvamine delay (1000); // 1 sekundiline viide enne põhitsüklit } void loop() { /* Funktsiooni Termistor väljakutsumine, mis kasutab parameetrina temperatuurianduri hetkväärtust */ Termistor(analogRead(andur)); delay(1000); // 1 sekundiline viide lcd.clear(); // Ekraani puhastamine vanadest andmetest } /* Funktsioon konverteerib saadud anduri väärtuse temperatuuri väärtuseks Celsiuse skaalas */ void Termistor(int RawADC) { // Lokaalsete muutujate defineerimine double Temp; long Takistus; // Valem: Takistus = (1024 * JaguriTakisti/ADC) - JaguriTakisti Takistus = ((10240000/RawADC) - 10000); // Arvutame hinnangulise takistuse // Esimese rea ekraanil kuvamine lcd.setCursor(0, 0); lcd.print("AD="); lcd.print(RawADC); // Analoogsisendi väärtuse kuvamine lcd.setCursor(8, 0); lcd.print("U="); lcd.print(((RawADC*5.0)/1024.0),3); // Pinge väärtuse kuvamine // Teise rea ekraanil kuvamine lcd.setCursor(0, 1); lcd.print("R="); lcd.print(Takistus); // Takistuse väärtuse kuvamine Temp = log(Takistus); // Naturaallogaritmi võtmine takistuse väärtusest // Steinhart-Hart termistori valemi kaudu temperatuur kelvinites Temp = 1/(0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp))* Temp); Temp = Temp - 273.15; // Konverteerime Kelvini skaalast Celsiuse skaalasse lcd.setCursor(8, 1); lcd.print("T="); lcd.print(Temp); // Temperatuuri väärtuse kuvamine } ===== Näide #4.2 Kaugus- ja lähedusandurid ===== Kaugust hindavaid andureid on mõõtmismeetodi järgi üldjuhul kahte tüüpi: * Lähedust tuvastavad andurid - objekt on või ei ole näha. * Kaugust mõõtvad andurid - tagastab objekt kauguse. Antud projektis kasutame mõlemast tüübist ühte andurit. Esimesse kategooriasse kuulub infrapunalähedusandur, mis mõõdab tagasi peegelduva valguse hulka. Teisest kategooriast on kasutusel ultraheli kaugusandur, mis töötab heli peegeldusel.\\ Näiteprogrammi eesmärk on teha anduritega mõõtmisi ja mõõtetulemused kuvada ekraanile. Anduritelt info saamiseks on vaja need kõigepealt seadistada. Infrapunaanduri puhul on vaja ainult ühte digitaalset sisendviiku, milleks pole vaja eraldi seadistustoiminguid teha. Infrapunaanduri oleku lugemine käib tavapärase käsuga //digitalRead//. Ultraheliandur on keerukam ja lihtsuse mõttes võtame kasutusele teegi //NewPing//, mis nõuab seadistamiseks vaid objekti tekitamist. Objekti olemasolul saab anda andurile käsu kauguse mõõtmiseks käsuga //ping_cm//.\\ //NewPing// teegi saab alla laadida siit: [[http://playground.arduino.cc/Code/NewPing|]]\\ Abi teegi lisamisel leiab tarkvara peatükist ja veebilehelt siit: [[https://www.arduino.cc/en/guide/libraries#toc4|]] /* Nimetus: Näide #4.2 Kirjeldus: LCD laiendusplaadi kasutamine kaugus- ja lähedusanduritega */ // Vajalike teekide kaasamine // LCD ekraani funktsioone sisaldav teek #include // Ultrahelianduri funktsioone sisaldav teek #include // Andurite ühendusviikude määramine const int ultraheliKaugusandur_TRIGGER = A2; const int ultraheliKaugusandur_ECHO = A3; const int infrapunaLahedusandur = A4; /* Globaalsed muutujad ja konstandid */ const int ultraheliKaugusandur_maksimumKaugus = 200; int ultraheliKaugus, infrapunaNaebObjekti; // LCD objekti tekitamine ja ühendusviikude määramine LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Ultraheli kaugusanduri objekti tekitamine koos viikude ühendamisega NewPing sonar(ultraheliKaugusandur_TRIGGER, ultraheliKaugusandur_ECHO, ultraheliKaugusandur_maksimumKaugus); void setup() { // LCD ridade ja veergude määramine vastavalt riistvarale lcd.begin(16, 2); // Selgitavate tekstide kuvamine ekraanil lcd.print("Kaugus:"); lcd.setCursor(0, 1); lcd.print("Naeb:"); } void loop() { // Ultrahelianduriga kaguse mõõtmine sentimeetrites ja muutujasse salvestamine ultraheliKaugus = sonar.ping_cm(); // Lähedusanduri väärtuse lugemine ja muutujasse salvestamine infrapunaNaebObjekti = digitalRead(infrapunaLahedusandur); // Kursori esimesele reale ja tähemärgile 9 nihutamine lcd.setCursor(9, 0); // Ekraani kaugusanduri mõõdetud kauguse kuvamine lcd.print(ultraheliKaugus); /* Trükime üle järgnevad kolm tähemärki tühikutega, et vana lugemi väärtus ei jääks ekraanil näha */ lcd.print(" "); // Kursori teisele reale ja tähemärgile 9 nihutamine lcd.setCursor(9, 1); // Kui infrapunalähedusanduri väljund on kõrge, siis kirjuta ekraanile "ei" if(infrapunaNaebObjekti == 1) lcd.print("ei "); // Kui infrapunalähedusanduri väljund on madal, siis kirjuta ekraanile "jah" else lcd.print("jah"); // Väike viide, et tekst ekraanil oleks loetavam delay(500); } ===== Harjutused ===== === Harjutus #4.1 === Modifitseerida näiteprogrammi nii, et potentsiomeetriga määratakse temperatuuri nivoo, mis salvestatakse nupuga programmi mällu ja selle nivoo ületamisel käivitatakse täiturmehhanism (milleks on LED).\\ Lisaülesanne: Kombineerida LED-i heleduse programm ja eelnev temperatuuri lugemise programm, kus LED-i heledus sõltub sellest, kui palju nivootemperatuuri ületati (1 kraad: heledus 25 %, 2 kraadi: heledus 50 %, 3 kraadi: heledus 75 % ja 5 kraadi: heledus 100% === Harjutus #4.2 === Modifitseerida näiteprogrammi vastavalt vajadusele, et selgitada välja kumb anduritest reageerib kauguse muutusele kiiremini. Võimalusel kontrollida tulemust veebist.