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.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj2lD9xRrxnxWeHbnoOg6ip5QQt1eQoijfIjM7tKvA2RqAx372ZE_H3mEtvNY5eU2DV0zj7W8kZLRud4V94bYqZ0KWyWo0l3VZoKSQnXivyroDm-KBpDM7Agk1UQm7HMWGBOImKntOYW_4E/s200/ONOFF_1.png)
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
/***************************************
*
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