This is an old revision of the document!


 

Projekt 4 Andurite lugemine ja väärtuse kuvamine

Arduino LCD laiendusplaadi peal on andurite ühendamiseks olemas 5 sisend/väljund viiku koos toite ja maa 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
  • Infrapuna lähedusandur: signaal - A4

Näide #4.1 Temperatuuri andur koos matemaatika teegiga

Takistuslikud analoogandurid ühendatakse mikrokontrolleriga selliselt, et see moodustab pingejaguri. Sama käib ka NTC temperatuurianduri kohta, mis on tegelikkuses takisti, mille takistuse suurus sõltub temperatuurist. Antud juhul tuleb lisakas andurile ühendada väline takisti 10 kΩ sisendviigu ja maa vahele. Kui kasutusel on AK06 robotiehitamise komplekt, siis 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: Temperatuuri andur 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>
 
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // LCD objekti tekitamine koos ühendusviikudega
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"); // Ekraani teksti kuvamine
  delay (1000); // 1 sekundiline viide enne põhitsüklit 
} 
 
void loop() 
{
 /* Funktsiooni Termistor() välja kutsumine, 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 skaalal */
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 Kelvinid Celciustesse
  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 infrapuna lähedusandur, mis mõõdab tagasi peegelduva valguse hulka. Konkreetsel anduril on võimalik seadistada tuvastatavat kaugust anduri tundlikkuse reguleerimise abil. Teisest kategooriast on kasutusel ultraheliandur, mis mõõdab heli tagasi peegeldumise aega ja väljastab selle mikrokontrollerile pulsilaiuse kujul. Kuna heli kiirus on enamvähem konstantne, siis saab selle järgi arvutada hinnangulise kauguse. Näiteprogrammis teeb kasutaja eest selle töö ära tarkvarateek.
Näiteprogrammi eesmärk on teha anduritega mõõtmisi ja mõõtetulemused kuvada ekraanile. Anduritelt info saamiseks on vaja need kõigepealt seadistada. Infrapuna anduri puhul on vaja ainult ühte digitaalset sisendviiku, milleks pole vaja eraldi seadistustoiminguid teha. Infrapuna anduri oleku lugemine käib tavapärase käsuga digitalRead(). Ultraheliandur on natukene 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 sentimeetrites funktsiooniga ping_cm().
NewPing teegi saab alla laadida siit: http://playground.arduino.cc/Code/NewPing
Juhendi teegi lisamiseks leiab 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> 
// Ultraheli anduri 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() 
{
  // Ultrahelianduri kaguse mõõtmine sentimeetrites ja muutujasse salvestamine
  ultraheliKaugus = sonar.ping_cm();
 
  // Digitaalse lähedusanduri väärtuse lugemine ja muutujasse salvestamine
  infrapunaNaebObjekti = digitalRead(infrapunaLahedusandur); 
 
  // Kursori esimesele reale nihutamine, tähemärgile 9
  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 nihutamine, tähemärgile 9
  lcd.setCursor(9, 1); 
 
  // Kui infrapuna lähedusanduri väljund on kõrge siis kirjuta "ei"
  if(infrapunaNaebObjekti == 1) lcd.print("ei "); 
 
  // Kui infrapuna lähedusanduri väljund on madal siis kirjuta "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.

et/arduino/sensorss/project2.1492439424.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0