tiistai 19. huhtikuuta 2016

ON - OFF - säätö ja Serial Send

Aiemmassa käytävävalosovelluksessa hämäräkytkin toimi tavallaan ON–OF – säätimenä. Se antoi luvan kytkeä valot päälle ja pois. Helpompi on kuitenkin ymmärtää tässä yhteydessä huonetermostaatti tai talon öljypoltin. Kun lämpötila laskee, kytketään lämmitysteho päälle, ja kun lämpötila nousee hystereesin verran, kytketään teho pois.
Kun esimerkiksi veden keitin kytketään päälle, ei vesi kiehu heti, vaan kuluu jokin aika. Riippuu veden määrästä, kylmän veden lämpötilasta ja vedenkeittimen tehosta. Kaikissa prosesseissa on aina hitautta. Tästä johtuu, että lämpötila jatkaa vielä hetken nousuaan sen jälkeen, kun teho on kytketty pois. Samoin tapahtuu toiseen suuntaan. Kun termostaatti huomaa lämpötilan laskeneen, jatkaa se vielä hiukan laskuaan, ennen kuin se ehtii nousta termostaatin asetusarvon tasolle. Lämpötila siis sahaa edestakaisin asetusarvon molemmin puolin. Tämä ei tietenkään koske ainoastaan vain lämmitystä, vaan kaikkea ON-OFF-säätöä.

Tässä sovelluksessa käytetään edellistä kytkentää. Painike tosin jää pois. Toinen muutos on se, että LEDi joko palaa täysillä tai on sammuneena.


Toinen oleellinen muutos on kondensaattorin muuttaminen kymmenkertaiseksi. Tämä siksi, että vilkkuminen olisi silmälle havainnollisempaa. Käytän edellistä kuvaa merkitsemällä muutokset. Tästä on nähtävissä myös video. Siinä on alussa 35% asetusarvo, minkä tilalle syötetään tietokoneesta sarjaliikenteellä (send – ikkunasta) uudeksi asetusarvoksi 73%. Lähetyshetki näkyy lyhyenä välähdyksenä ja sen jälkeen seuraa yhtenäinen latausvaihe, minkä jatkoksi vilkutus hitaammalla nopeudella. Video on osoitteessa: antinarduvideo14. youtube.com

Ohjelma 14
/***************************************
 *  Ohjelma_14
 *  21.04.2016
 *  ON-OFF-säädin, asetusarvo seriel
 **************************************/

// MÄÄRITTELYT:
unsigned long Ulo_MilliSek = 0;
unsigned long Ulo_UusiMilliSek = 0;
const long CoL_EroSekunti = 999;
int Int_Sekunti = 0;
boolean Bol_Tulosta = true; // Tulostusta ohjataan kellolla

// LDR valovastus ja LEDi
const int Con_LDRTulo = 0;
const int Con_Valo = 3;
int Int_Mittaus = 0;
int Int_LDRTulo = 0;

// Sarjaliikenne
char Cha_Merkki = 48; // ASCII vastaa nollaa (0)
int Int_Numero = 0;
int Int_Asetusarvo = 50;
const int Con_Hyster = 10;

// ASETUKSET:
void setup(){                 
 Serial.begin(9600);         
 pinMode(Con_Valo, OUTPUT);
}// Asetuksen loppu

// PÄÄLOOPPI Varsinainen suoritusosa. Jatkuva suoritus
void loop(){
// Sisäisen kellon käyttö
Ulo_MilliSek = millis();
  if(Ulo_MilliSek - Ulo_UusiMilliSek > CoL_EroSekunti){
    Ulo_UusiMilliSek = Ulo_MilliSek;
    Int_Sekunti++;
    if(Bol_Tulosta == true){Fun_Tulostus();}
     if(Int_Numero > 0){Int_Asetusarvo = Int_Numero;}
      Int_Numero = 0;
  }
 
// Analogiatulon käsittely
Int_LDRTulo = analogRead(Con_LDRTulo);
Int_LDRTulo = constrain(Int_LDRTulo, 600, 750);
Int_Mittaus = map(Int_LDRTulo, 600, 750, 0, 100);

// Sarjaliikenteen käsittely
if(Serial.available()){
 Cha_Merkki = Serial.read();
 if(isDigit(Cha_Merkki)){
  Int_Numero = (Int_Numero * 10) + (Cha_Merkki -'0');}
} // Serial.available loppu

// LEDin ohjaus 0% tai 100%
if(Int_Mittaus < Int_Asetusarvo - Con_Hyster){
  digitalWrite(Con_Valo, HIGH);}
if(Int_Mittaus > Int_Asetusarvo){
  digitalWrite(Con_Valo, LOW);}

delay(1);
} // Pääohjelma LOPPU

// FUNKTIOT
void Fun_Tulostus(){
//Serial.print("Teksti :");  Serial.println(Muuttuja);
Serial.print("Asetusarvo :");  Serial.println(Int_Asetusarvo);

}

Ohjelman alussa on tavalliset määrittelyt. Sarjaliikennesyöttöä varten määritellään Merkki, mikä on tyyppiä character. Se alku arvotetaan kokonaisluvulla 48, mikä on numeron nolla (0) ASCII-numero. Muuttuja Asetusarvo saa oletukseksi 50% ja Hystereesi 10%. Näitä käytettään tehon (tässä tapauksessa LEDin) ohjauksessa.
Pääohjelmassa luetaan ensin analogiatulo muuttujaan LDRTulo, minkä jälkeen rajoitetaan lukualueelle 600 .. 750. Seuraavaksi lukualue muutetaan 0 .. 100% alueelle ja sijoitetaan muuttujaan Mittaus.

Uusi asetusarvo syötetään sarjaliikenteellä ohjelmointityökalusta. Ohjelma tutkii, onko sarjaliikennepuskurissa dataa (if(Serial.available(){  } Jos on, niin merkki luetaan käskyllä Serial.read() ja sijoitetaan muuttujaan Merkki. Sitten katsotaan, onko lähetetty merkki numero (if(isDigit(Cha_Merkki)){ ja tämän if-lauseen sisällä lähetetty luku otetaan talteen muuttujaan Numero. Koska sarjaliikenteessä kukin merkki tulee peräkkäin, pitää lukua kasvattaa kymmenellä ennen uutta merkkiä. Seuraavaksi uudesta tulevasta merkistä vähennetään ’0’, mikä on ASCII – merkki nolla (0) eli desimaalisena 48. Täten jäljelle jää todellinen numero. Koska tässä asetusarvoa ei ole rajoitettu välille 0 .. 100, voi tietokoneelta lähettää pidempiäkin lukusarjoja (kokeilun vuoksi, ei tämän sovelluksen takia). Ylärajana on integerin lukualue.


Ei kommentteja:

Lähetä kommentti