/* BILGE kokeilu UNO 24.10.2016 */ //Constants // Tulot const int sw_manu = 2; // Manu const int sw_auto = 3; // Auto const int sw_power = 4; // Power const int sw_reset = 5; // Reset const int sw_testi = 6; // Testi const int analog_0 = A0; //Analog Pot 1 - 10 const int analog_1 = A1; //Analog DIP-vastukset // Lahdot const int led_pump = 13; // LED-Pump/Manu/(Testi) const int led_auto = 12; // LED-Auto const int led_time = 11; // LED-Time const int led_power = 10; // LED-Power const int summeri = 9; // const int led_testi = 8; // Tassa se simuloi "testi" const int led_reset = 7; // Tassa se simuloi "reset" // //------------ VARIABLES (will change)--------------------- int ana_arvo ; // Analogi arvo int dip_arvo ; // Aika alue DIP/Vastukset unsigned long vanha_milli; // aikageneraattorissa unsigned long nyky_milli; // unsigned long aika_1ms = 1; // unsigned long tahti_1 = 0; // Aikagen. tahti 1ms unsigned long tahti_10= 0 ; // Aikagen. tahti 10ms unsigned long tahti_100= 0 ; // Aikagen. tahti 100ms int tahti_1s = 0; // Aikagen. tahti 1sekunti int tahti_10s = 0 ; // Aikagen. tahti 10sekuntia int tahti_1m ; // Aikagen. tahti 1minuutti int tahti_10m ; // Aikagen. tahti 10minuuttia unsigned long reset_tahti; // Debounce laskenta aikagener. int vanha_reset; // reset-debounce int nyky_reset; // reset debounce int reset_tila; // Reset ON tai OFF int reset_apu1; // Valimuisti reset int reset_apu2; // Valimuisti reset long int timeout_1; // Time OUT. Pitää olla long int ???? int power_apu1 = 0; // Valimuisti power int alarm_rek = 0b00000000; // Hälytyksien summarek. bitit 0-7 int power_alarm = 0; // Hälytyksen apu-merkkaus int time_alarm = 0; // Hälytyksen käsittely int manu_alarm = 0; // Hälytyksen käsittely int auto_alarm = 0; // Hälytyksen käsittely int test_alarm = 0; // Hälytyksen käsittely int reset_1 = 0; // Naihin luetaan tila int level_1 = 0; // joita kasitellaan int auto_1 = 0; // ohjelmassa int manu_1 = 0; // " int power_1 = 0; // " int testi_1 = 0; // " int summeri_1 = 0; //========================================================== /*Hälytykset alarm_rek: * LEDIT TAHTI APUREK * 0 TIME ALARM = LEVEL ON * 1 A+M OFF (EI SUMM.) A3 T4 * 2 POWER A3 T1 * 3 AUTO ON/LEVEL ON A1+A2 T1/T2 * 4 MANU ON/LEVEL ON A0+A2 ON/T2 * 5 MANU ON/LEVEL OFF A0+A2 ON/T3 * 6 MANU OFF/LEVEL ON A0+A2 T2/ON * 7 A+M (OFF)/LAVEL ON A0+A1+A2 T3 */ void setup() { pinMode(sw_reset, INPUT_PULLUP); //Reset 5 pinMode(sw_auto, INPUT_PULLUP); //Auto 3 pinMode(sw_manu, INPUT_PULLUP); //Manu 2 pinMode(sw_power, INPUT_PULLUP); //Power 4 pinMode(sw_testi, INPUT_PULLUP); //Power 6 pinMode(led_pump, OUTPUT); //Manu 13 pinMode(led_auto, OUTPUT); //Auto 12 pinMode(led_time, OUTPUT); //Time 11 pinMode(led_power, OUTPUT); //Power 10 pinMode(summeri, OUTPUT); //Buzzer 9 pinMode(led_testi, OUTPUT); // Testi 8 pinMode(led_reset, OUTPUT); // Testi reset 7 Serial.begin(9600);// nyky_milli = 0; // Resetissa millis= 0 } //============================================================= void loop() { nyky_milli = millis(); // // Kutsu alirutiineja power_tila(); // call power analog_tila(); // call analog (ennen manua) manu_tila(); // call pumppu auto_tila(); // call auto timeout_tila(); // call timeout reset_painike(); // call reset testi_tila(); // call testi alarm(); // call alarm aikagen(); // Aikageneraattori if (testi_1 == HIGH) // Paina "testi" niin "Printtaus" printti(); // Sarjamonitori } //======================== END of LOOP =========================== void power_tila() { if (power_alarm == LOW) // Kun alarm niin apumuisti power_1 = digitalRead (sw_power); power_1 =! power_1; // HUOM! Aktiivi =0, sisksi komplementti if (power_1 == HIGH) { // digitalWrite(led_power, HIGH); } else { power_alarm = HIGH; // Käytetään resetissä bitSet ((alarm_rek),2); // 2= Power, käyt. vilkkurutiinissa if (tahti_10 <= 4 ) // OFF-aika { power_apu1 = LOW; } else { power_apu1 = HIGH; } digitalWrite (led_power, power_apu1); } } //================================================================ void manu_tila() { manu_1 = digitalRead (sw_manu); manu_1 =! manu_1; // HUOM! Aktiivi =0, siksi komplementti if (manu_1 == LOW ) // { digitalWrite(led_pump, LOW); // Ei aktiivi timeout_1 = ana_arvo ; // Uusi timeout laskenta } else { digitalWrite(led_pump, HIGH); } } //========================================================= void auto_tila() { auto_1 = digitalRead (sw_auto); auto_1 =! auto_1; // HUOM! Aktiivi =0, siksi komplementti if (auto_1 == HIGH ) // { digitalWrite(led_auto, HIGH); } else { digitalWrite(led_auto, LOW); } } //================================================================ void analog_tila() { /* Valitse vastukset niin että saat DIP-kytkimillä * asetettua dip_arvo : <= 250, <= 500, <= 750, 751 < * HUOM! vertailu ">=" täytyy olla ilman "välilyöntiä" * !! Kokeilussa (dip_arvo)käytän potikkaa, siksi: * jos pot > 500 < 700 niin se skaalaa max. mitä pot on esim. 660 * eli: hae vastusarvot niin lähelle rajaa kuin mahd. * Hysteresis =5 jotta timeout ei olisi+ heti =0 */ ana_arvo = analogRead(analog_0); // Analogi tulo A0 dip_arvo = analogRead(analog_1); // DIP-arvo asetetaan //vastuksilla DIP-kytkimien kautta if ((dip_arvo) <= 250) // Aika on 0-10 ana_arvo = map(ana_arvo,0,1023,5,350); // if ((dip_arvo) <= 500) // Aika on 0-20 ana_arvo = map(ana_arvo,0,1023,5,500); // if ((dip_arvo) <= 750) // Aika on 0-30 ana_arvo = map(ana_arvo,0,1023,5,750); // if ((dip_arvo) > 750) // Aika on 0-40 ana_arvo = map(ana_arvo,0,1023,5,1023); // } //================================================================ void timeout_tila() { // timeout_1 "ladataan" uudestaan kun MANU EI ole "aktiivinen" if (timeout_1 >= 1 ) // "Count down" laskenta aikagen.:ssa {digitalWrite (led_time, LOW); } else { time_alarm = HIGH ; // Hälytys bitSet ((alarm_rek),0); // Alarm 0= TIME, vilkkurutiini digitalWrite (led_time, HIGH); } } //================================================================ void testi_tila() { testi_1 = digitalRead (sw_testi); testi_1 =! testi_1; // HUOM! Aktiivi =0, siksi komplementti if (testi_1 == HIGH ) { digitalWrite(led_testi, HIGH); } else { digitalWrite(led_testi, LOW); } } //================================================================ void reset_painike() { // Ensin Debounce nyky_reset = digitalRead(sw_reset); //100mS=debounce nyky_reset =! nyky_reset ; // Koska aktiivi =0, niin käänteinen if ((nyky_reset == HIGH ) && (reset_tahti <=1)) {reset_apu1 = HIGH ; } else { reset_apu1 = LOW ;} if (nyky_reset == LOW) reset_tahti = 1000 ; // KOKEILUAIKA DEBOUNCE //RESET if ((time_alarm == HIGH)||(power_alarm == HIGH)) {if (reset_apu1 == HIGH) // Ensimmäinen kuittaus? // Kyllä {if (nyky_reset == HIGH ) { reset_apu1 = HIGH ; summeri_1 = LOW ; // Summeri OFF } else { summeri_1 = HIGH ; } if ((reset_apu1 == HIGH)&&(nyky_reset == LOW)) // Käykö 0:ssa? { reset_apu2 = HIGH ; // Kyllä } else { reset_apu2 = LOW ; summeri_1 = LOW ; power_alarm = LOW; time_alarm = LOW ; reset_apu1 = LOW ; reset_apu2 = LOW ; } } } digitalWrite (led_reset, reset_apu1); } //================================================================ void alarm() { if (reset_apu1 == HIGH) // Summeri kuitattu? {summeri_1 = LOW ; // } else if ((time_alarm == HIGH) || (power_alarm == HIGH)) // {if (tahti_10 >= 4) { summeri_1 = HIGH ; } else {summeri_1 = LOW;} } digitalWrite(summeri, summeri_1); } //================================================================ void aikagen() { // Perustahti 1ms if (nyky_milli - vanha_milli > (aika_1ms /100)) { ++tahti_1 ; } // Laske 10ms vanha_milli = nyky_milli; if (tahti_1 >= 10 ) // Onko kulunut 1ms { tahti_1 = 0 ; ++tahti_10 ; } // Laske 100ms if (tahti_10 >= 10) // Onko kulunut 10ms { (tahti_10 = 0); ++tahti_100 ; //Timeout ladataan uudestaaan kun ei hälytys if (timeout_1 >= 1) // Asetettu aika: ana_arvo koe: 25,5 -- timeout_1 ;} // Mitattu aika: 25,7sek. // Laske 1sek if (tahti_100 >= 10) // Onko kulunut 100ms { (tahti_100 = 0); ++tahti_1s ;} //KOKEILU PITÄÄ OLLA ABOUT 100mS if (reset_tahti >= 1) // --reset_tahti; // Laske 10sek // if (tahti_1s >= 10) // Onko kulunut 1sek // { (tahti_1s = 0); // ++tahti_10s; } // Laske 1min if (tahti_1s >= 60) // Onko kulunut 10sek { (tahti_1s = 0); ++tahti_1m;} // Laske 10min if (tahti_1m >= 10) // Onko kulunut 10ms { (tahti_1m = 0); ++tahti_10m ;} } // Return //============================================================ void printti() { // Kutsutaan Loopissa vain jos "test" //Serial.print("DIP arvo: "); //Serial.println(dip_arvo); //Serial.print("Analogi arvo: "); //Serial.println(ana_arvo); Serial.print("Timeout: "); Serial.println (timeout_1); /* * Serial.print("Tahti 1: "); Serial.println(tahti_1); Serial.print("Tahti: "); Serial.print(tahti_10m); Serial.print(tahti_1m); Serial.print(" min "); Serial.print(tahti_1s); // Huom: käytössä on 10sek laskuri Serial.print(","); Serial.print(tahti_100); Serial.print(tahti_10); Serial.println(" sek. "); Serial.println(" "); */ Serial.print("Alarm Power: "); Serial.println(power_alarm); Serial.print("Alarm Timeout: "); Serial.println(time_alarm); Serial.print("Reset tahti: "); Serial.println(reset_tahti); Serial.print("Nyky Reset: "); Serial.println(nyky_reset); Serial.print("Reset Apu1: "); Serial.println(reset_apu1); Serial.print("Reset Apu2: "); Serial.println(reset_apu2); Serial.println(" "); //Serial.end(); }