Table of Contents

 

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:

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 <math.h>
#include <LiquidCrystal.h>
 
// 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:

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 <LiquidCrystal.h> 
// Ultrahelianduri funktsioone sisaldav teek
#include <NewPing.h> 
 
// 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.