tiistai 20. helmikuuta 2018

Ohjelmoinnin valinnaiskurssi: Arduino-ohjelmointia (osa 3)

Jatkoimme sensoreihin tutustumista tekemällä kytkennän Project 7: Temperature Alarm. Tässä lämpötilasensorin antama jännitearvo muunnetaan ensin celsiusasteiksi, jota sitten käytetään ehtolauseessa. Ledin tilalle otetaan summeri, joka laitetaan soimaan kun lämpötila nousee riittävän korkeaksi. Rakensimme kytkennän tämän ohjeen mukaisesti:

Project 7: Temperature Alarm
image source: http://image.dfrobot.com/image//Blog/
Tätäkin kytkentää lähdimme tutkimaan sensori edellä, eli katsoimme ensin sarjamonitorin avulla, millaisia arvoja lämpötilasensori syöttää meille.

int SUMMERI = 8;
int SENSORI = 0;
int arvo = 0;

void setup() {
    pinMode(SUMMERI, OUTPUT);        
    Serial.begin(9600);        
}

void loop() {
    arvo = analogRead(SENSORI);  
    Serial.println(arvo);              
}

Lämpötilan sensorin raaka-arvot liikkuivat 50 (huoneen lämpötila) ja 60 välillä (uloshengitys). 
LM-35 lämpötilasensori on toimii lineaarisesti, eli kun lämpötila kasvaa asteella, sensorin jännite kasvaa 10mV. Sen yhtälö on siis:

Vout = 10mV/°C * T    (LM35 datasheet)

Koska käytämme 5.0V jännitettä ja analogRead muuntaa jännitearvot kokonaisluvuiksi välille 0-1024, sensorin antama raaka-arvo (x) voidaan muuttaa celsiusasteiksi seuraavan kaavan avulla:

T(x) = (5.0 * x * 100.0) / 1024   (Arduino Playground)

Seuraavaksi teimme apufunktion (arvoLampotilaksi), joka muuttaa raaka-arvon lämpötilaksi.

int SUMMERI = 8;
int SENSORI = 0;
int arvo = 0;
double lampotila = 0;

void setup() {
    pinMode(SUMMERI, OUTPUT);        
    Serial.begin(9600);        
}

double arvoLampotilaksi(int x){
  double temp = 0;
  temp = (5.0*x*100)/1024;
  return temp;
}

void loop() {
    arvo = analogRead(SENSORI);  
    lampotila = arvoLampotilaksi(arvo);
    Serial.println(lampotila);
}

Seuraavaksi otimme käytöön ehtolauseen ja summerin. Jos lämpötila nousee riittävän suureksi, summeri alkaa soida.

int SUMMERI = 8;
int SENSORI = 0;
int arvo = 0;
double lampotila = 0;

void setup() {
    pinMode(SUMMERI, OUTPUT);        
    Serial.begin(9600);        
}

double arvoLampotilaksi(int x){
  double temp = 0;
  temp = (5.0*x*100)/1024;
  return temp;
}

void loop() {
    arvo = analogRead(SENSORI);  
    lampotila = arvoLampotilaksi(arvo);
    Serial.println(lampotila);

    if(lampotila > 27){
      tone(SUMMERI, 2000);
      delay(2); 
    } else {
      noTone(SUMMERI);
    }
}

Summerin ääni ei järin korvia huumaa, joten kokeilimme myös mallikoodin mukaista hienompaa hälyytysääntä. Tosin tämän koodaaminen olikin jo hieman haastavampaa monelle ja koodin aukiselittäminenkin jäi tasolla "summerin sisääntuloa vaihdellaan for-loopin avulla"...

int SUMMERI = 8;
int SENSORI = 0;
int arvo = 0;
double lampotila = 0;
float sinVal = 0;
int toneVal = 0;

void setup() {
    pinMode(SUMMERI, OUTPUT);        
    Serial.begin(9600);        
}

double arvoLampotilaksi(int x){
  double temp = 0;
  temp = (5.0*x*100)/1024;
  return temp;
}

void loop() {
    arvo = analogRead(SENSORI);  
    lampotila = arvoLampotilaksi(arvo);
    Serial.println(lampotila);

    if(lampotila > 27){
      for(int x = 0; x < 180; x++){
            sinVal = (sin(x*(3.1412/180)));
            toneVal = 2000+(int(sinVal*1000));
            tone(SUMMERI, toneVal);
            delay(2); 
     }   
    } else {
      noTone(SUMMERI);
    }
}
Temperature Alarm - kytkentä näyttää tältä

NOTE: Tämän projektin kanssa hämmennystä aiheutti summerin + merkki, joka näytti olevan väärällä puolella summeria ja tästä johtui se, että alkuun ääntä ei tullut lainkaan.




Ei kommentteja:

Lähetä kommentti