Vielä jatkokysymys. Viittaan yllä olevaan koodinpätkään.
Mikä olisi järkevin tapa tehdä pääohjelmaan (loop) sellainen
ehtolause, joka toteutuu kun ala-ylä-normaali hysteriisin
tila vaihtuu suuntaan taikka toiseen? Nythän molemmat
funktiot palauttavat joko 1 tai 0. Molemmat voivat olla
samanaikaisesti arvossa 0 (silloin kun ollaan sallitulla
alueella), ja toinen voi olla kerrallaan arvossa 1.
Elikkäs peräkkäin kutsumalla saadaan
00 tai 01 tai 10
Näistä tarttis saada tilan muutos eli onkohan se hienosti
state transition ulos. Sorvasin allaolevan, toimii, mutta
ei näytä kovin elegantilta…
[code]
static int ala_edellinen_arvo = 0;
static int yli_edellinen_arvo = 0;
static int ala, yla;
float voltage = 3;
//arvo, raja, hyst leikitään vaikka asteen kymmenyksiä,
//Paluuarvo 1, mikäli ledin tulisi vilkkua (arvo alle rajan)
int ala_hysteerinen_termari(float arvo, float raja, float hyst){
if(ala_edellinen_arvo){
raja += hyst;
}else{
raja -= hyst;
}
ala_edellinen_arvo = (arvo < raja);
return ala_edellinen_arvo;
}
//arvo, raja, hyst leikitään vaikka asteen kymmenyksiä,
//Paluuarvo 1, mikäli ledin tulisi vilkkua (arvo yli rajan)
int yli_hysteerinen_termari(float arvo, float raja, float hyst){
if(yli_edellinen_arvo){
raja -= hyst;
}else{
raja += hyst;
}
yli_edellinen_arvo = (arvo > raja);
return yli_edellinen_arvo;
}
void setup() {
pinMode(A0, INPUT);
Serial.begin(9600);
ala = ala_hysteerinen_termari(voltage, 2.5, 0.1);
yla = yli_hysteerinen_termari(voltage, 4.0, 0.1);
}
// the loop routine runs over and over again forever:
void loop() {
// read the input on analog pin 0:
int sensorValue = analogRead(A0);
// Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
voltage = sensorValue * (5.0 / 1023.0);
// print out the value you read:
Serial.println(voltage);
Serial.print("Alaraja: ");
Serial.println (ala_hysteerinen_termari(voltage, 2.5, 0.1));
Serial.print("Ylaraja: ");
Serial.println (yli_hysteerinen_termari(voltage, 4.0, 0.1));
if (ala_hysteerinen_termari(voltage, 2.5, 0.1) != ala || yli_hysteerinen_termari(voltage, 4.0, 0.1) != yla)
{
Serial.println(“Transitio”);
ala = ala_hysteerinen_termari(voltage, 2.5, 0.1);
yla = yli_hysteerinen_termari(voltage, 4.0, 0.1);
}
delay(1000);
}[/code]