timer starten met knop ?

Arduino specifieke Software
Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: timer starten met knop ?

Berichtdoor nicoverduin » 28 Jun 2013, 10:31

Hoi Dirk
Dat klopt. Ik meen dat jij niet de .h file gebruikt? omdat je met de standaard Arduino IDE werkt?

a) je hebt nu 2 verschillende definities van dezelfde functie aanroep. Een heeft de led er wel in staan en de ander niet. Dat gaat in dit verhaal niet op (wel zou het kunnen als je met classes werkt, maar 1 probleem tegelijk :))
b) daarnaast moet je de functie zelf ook aanpassen. Anders krijgt hij 4 parameters binnen terwijl hij er 3 verwacht.

TIP:
De leds schakel je alleen nog maar als de stand van het relay veranderd. Ik zou een aparte routine maken die het relay schakelt adhv een stand die wordt doorgegeven. In diezelfde routine kan je dan ook gelijk de led standen veranderen zoals je ze wilt.
Verder neem ik ff aan dat je bij 2 relays ook 2 aparte sets leds gebruikt, dus moet je 4 leds definiëren.
Zowel processTimer als processTemperature wijzigen de relay standen dus moet je ook in beide de juiste leds meegeven.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Advertisement

Berichten: 144
Geregistreerd: 29 Okt 2012, 16:54

Re: timer starten met knop ?

Berichtdoor dirk ambu » 28 Jun 2013, 17:06

beste Nico

ik heb de h file wel in gebruik op het moment

begrijp ik het goed kijkende naar onderstaande code
Code: Alles selecteren
       setTemperature1 = map(analogRead(TEMP_SET1), 0, 1023, 15,35);
       setTemperature2 = map(analogRead(TEMP_SET2), 0, 1023, 15,35);
       //
       // process timers
       //
       timer1Counter = processTimer(SWITCH1, RELAY1, ledPin1, timer1Counter);
       timer2Counter = processTimer(SWITCH2, RELAY2, ledPin2, timer2Counter);
       //
       // process temperature
       //
       temp1Counter   = processTemperature(RELAY1, ledPin1, TEMP_SENSOR1, setTemperature1, temp1Counter, timer1Counter);
       temp2Counter   = processTemperature(RELAY2, ledPin2, TEMP_SENSOR2, setTemperature2, temp2Counter, timer2Counter);


groet dirk ambu

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: timer starten met knop ?

Berichtdoor nicoverduin » 28 Jun 2013, 20:20

Volgens mij (als ik het goed begreep) heb jij 2 leds per thermostaat en niet een?
En in de .h file staat een prototype van die functies die moet je ook uitbreiden met dezelfde volgorde van de variabelen.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 144
Geregistreerd: 29 Okt 2012, 16:54

Re: timer starten met knop ?

Berichtdoor dirk ambu » 29 Jun 2013, 15:31

beste Nico

ik heb geprobeerd de h.file aan te passen maar ik doe iets fout
hier onder de h.file
Code: Alles selecteren
    // Only modify this file to include
    // - function definitions (prototypes)
    // - include files
    // - extern variable definitions
    // In the appropriate section

    /**
     * Revision control
     * Revision   : $Revision$
     * Author   : $Author$
     * Date      : $Date$
     *
     */

    #ifndef timerswitch_H_
    #define timerswitch_H_
    #include "Arduino.h"
    //add your includes for the project timerswitch here


    //end of add your includes here
    #ifdef __cplusplus
    extern "C" {
    #endif
    void loop();
    void setup();
    #ifdef __cplusplus
    } // extern "C"
    #endif

    //add your function definitions for the project timerswitch here
    //
    // function prototypes
    //
    long processTimer(int, int, int, int, int, int, unsigned long);
    int deBounce (int);


    //Do not add code below this line
    #endif /* timerswitch_H_ */



ik krijg de volgende melding
    termostaat_2.ino: In function 'void loop()':
    termostaat_2:31: error: too many arguments to function 'long int processTimer(int, int, long unsigned int)'
    termostaat_2:139: error: at this point in file
    termostaat_2:31: error: too many arguments to function 'long int processTimer(int, int, long unsigned int)'
    termostaat_2:140: error: at this point in file
    termostaat_2:33: error: too many arguments to function 'long int processTemperature(int, int, int, long unsigned int, long unsigned int)'
    termostaat_2:144: error: at this point in file
    termostaat_2:33: error: too many arguments to function '

het programma ziet er nu als volgens uit
Code: Alles selecteren

    /**
     * @mainpage Timerswitch program
     * \n This program has relays that can be switched on and off based on
     * a switch status or time limit.
     * \n The time limit is currently set for 1 hour but my be extended with
     * 15 minutes under the condition that a button corresponding to a relay is
     * not pressed for longer than 5 seconds. If the button is pushed for more than
     * 5 seconds, the timer is reset and switched off.
     * @author Nico Verduin
     * @date 21-6-2013
     */

    /**
     * Revision control
     * Revision   : $Revision$
     * Author   : $Author$
     * Date      : $Date$
     *
     */

   // #include "timerswitch.h"

    //
    // global variables
    //
    unsigned long    timer1Counter;              // timer 1
    unsigned long    timer2Counter;              // timer 2
    unsigned long    temp1Counter;               // timer 1 for temperature
    unsigned long    temp2Counter;               // timer 2 for temperature
    float            temperatureSensor1;         // temperature sensor 1
    float            temperatureSensor2;         // temperature sensor 2
    unsigned int     setTemperature1;            // set temperature 1
    unsigned int     setTemperature2;            // set temperature 2
    //
    // arduino pins
    //
    #define RELAY1             4             // pin 4
    #define RELAY2             5             // pin 5
    //#define RELAY3             6             // pin 6
    //#define RELAY4             7             // pin 7
    #define ledPin1            9             //pin 9
    #define ledPin2           10             // pin 10
    #define ledPin3           11             //pin 11
    #define ledPin4           12             //pin 12
    #define SWITCH1            2             // pin 2
    #define SWITCH2            3             // pin 3
    #define TEMP_SENSOR1       A0            // analog pin A0 Sensor1
    #define TEMP_SENSOR2       A1            // analog pin A1 Sensor2
    #define TEMP_SET1          A2            // analog pin A2 set temp 1
    #define TEMP_SET2          A3            // analog pin A3 set temp 2
    //
    // other settings
    //
    #define ON                    LOW       // on/off
    #define OFF                  HIGH
    #define TIME_TO_PRESS       3000L       // time to push button for reset 5000L
    #define HOUR             3600000L       // 3.6 million milliseconds in hour
    #define QUARTER           900000L       // 900000 millsecs in 15 minutes
    #define FIVEMINUTES       100000L       // 5 minutes period 300000L
    #define DEBOUNCE_TIME        100        // 100 mSec debounce time

    /**
     * @name setup()
     * Initializes the IO ports and resets any variables
     */

    void setup()
    {
       //
       // set pins input output. analog pins do not need to be setup
       //
       pinMode(RELAY1, OUTPUT);
       pinMode(RELAY2, OUTPUT);
       //pinMode(RELAY3, OUTPUT);
      // pinMode(RELAY4, OUTPUT);
       pinMode(ledPin1, OUTPUT);
       pinMode(ledPin2, OUTPUT);
       pinMode(ledPin3, OUTPUT);
       pinMode(ledPin4, OUTPUT);
       pinMode(SWITCH1, INPUT);
       pinMode(SWITCH2, INPUT);
       //
       // pull up resistors
       //
       digitalWrite(SWITCH1, HIGH);
       digitalWrite(SWITCH2, HIGH);
       //
       // make sure relays are switched off
       //
       digitalWrite(RELAY1, LOW);
       digitalWrite(RELAY2, LOW);
       //digitalWrite(RELAY3, LOW);
       //digitalWrite(RELAY4, LOW);
       //
       // test led,s
       //
       digitalWrite(ledPin1, HIGH);                        //make sure led works
       delay (200);
       digitalWrite(ledPin1, LOW);                         //make sure led works
       delay (200);
       digitalWrite(ledPin2, HIGH);                        //make sure led works
       delay (200);
       digitalWrite(ledPin2, LOW);                         //make sure led works
       delay (200);
       digitalWrite(ledPin3, HIGH);                        //make sure led works
       delay (200);
       digitalWrite(ledPin3, LOW);                         //make sure led works
       delay (200);
       digitalWrite(ledPin4, HIGH);                        //make sure led works
       delay (200);
       digitalWrite(ledPin4, LOW);                         //make sure led works
       delay (1000);

       
       
       // other variables
       //
       timer1Counter = 0L;      // timer counters
       timer2Counter = 0L;
    }

    /**
     * @name Loop()
     * continues to loop through this routine until Arduino is switched off
     * This routine just processes each timer in sequence
     */
    void loop()
    {
       //
       // read temperature settings from potmeters
       //
       setTemperature1 = map(analogRead(TEMP_SET1), 0, 1023, 15,35);
       setTemperature2 = map(analogRead(TEMP_SET2), 0, 1023, 15,35);
       //
       // process timers
       //
       timer1Counter = processTimer(SWITCH1, RELAY1, ledPin1, ledPin2, timer1Counter);
       timer2Counter = processTimer(SWITCH2, RELAY2, ledPin3, ledPin4, timer2Counter);
       //
       // process temperature
       //
       temp1Counter   = processTemperature(RELAY1, ledPin1, ledPin2, TEMP_SENSOR1, setTemperature1, temp1Counter, timer1Counter);
       temp2Counter   = processTemperature(RELAY2, ledPin3, ledPin4, TEMP_SENSOR2, setTemperature2, temp2Counter, timer2Counter);
    }

    /**
     * @name long procesTimer(int button, int relay, int setTemp, long counter)
     * @param button    button to process
     * @param relay      relay to process
     * @param counter   timer value to compare to millis
     * @return          long with new timer value
     *
     * this routine receives the timer value, button and relay.
     * \n It tests if the button is pressed. If so:
     * \n a) it just keeps counting time until the button is released.
     * \n b) it checks how long the button was pressed:
     * \n    - if more (or equal to) than TIME_TO_PRESS, rest counter and relay
     * \n    - if not check if the counter was running:
     * \n      * if so  Add 15 minutes
     * \n      * if not start the timer at one hour
     * \n If button not pressed:
     * \n a) if current time is greater(or equal to) timer value:
     * \n    - Reset the timer
     * \n    - Switch relay off
     *
     */

    long processTimer(int button, int relay, unsigned long counter){

       unsigned long returnCounter;   // return value
       unsigned long localCounter;      // counter for pressed time

       returnCounter = counter;      // if unchanged we have the right value

       //
       // check if a button is pressed
       // if so check if it is a TIME_TO_PRESS press
       //
       if (deBounce(button) == ON){
          //
          // button is pressed. No see for how long
          //
          localCounter = millis();
          //
          // now wait until button is released so don't forget to let go :)
          //
          while(1) {
             //
             // check if button is released
             //
             if (deBounce(button) == OFF){
                //
                // yes so quit this loop
                //
                break;
             }
          }
          //
          // the button is released check if we are passed the time limit
          // the time is corrected for 2 x the DEBOUNCE_TIME as this time is
          // already lost in the deBounce routine.
          //
          if ((millis() - localCounter) >= (TIME_TO_PRESS - (DEBOUNCE_TIME * 2))) {
             //
             // yes so switch the relay off
             //
             returnCounter = 0L;
             digitalWrite(relay, LOW);
          } else {
             //
             // The time pressed was less than the TIME_TO_PRESS so check
             // if we have to switch the relay on for one hour or add 15 minutes
             //
             if (returnCounter == 0L) {
                //
                // No it wasn't so switch the relay on and set the timer
                //
                returnCounter = millis() + HOUR;
                //
             } else {
                //
                // it was already running so just add 15 minutes
                //
                returnCounter += QUARTER;
             }
          }
       } else {
          //
          // no button was pressed so just check the timer
          //
          if (millis() >= returnCounter) {
             //
             // yes so switch off the relay and the timer
             //
             returnCounter = 0L;
             digitalWrite(relay, LOW);
          }
       }
       return returnCounter;
   
   
    }

   
   
   
    /**
     * @name deBounce(int button)
     * @param button button pin to read and do debouncing
     * @returns state of button
     *
     * Reads a button and waits DEBOUNCE_TIME mSec and tests again
     * Returns read if value unchanged and zero if it has changed for
     * DEBOUNCE_TIME time
     */
    int deBounce(int button) {
       int state;               // value of pin
       //
       // read the button
       //
       state = digitalRead(button);
       delay(DEBOUNCE_TIME);      // now wait a little time
       //
       // now check if it has changed
       //
       if (digitalRead(button) != state) {
          return OFF;            // the state has changed so consider it off
                            // if it went on halfway this routine it will
                            // have stabilized by the next time we read here
       } else {
          //
          // return the button value
          //
          return state;
       }
    }
    /**
     * @name long processTemperature(int relay , int sensor, int tempSet, long tempCtr, long timerCtr)
     * @param relay      relay pin
     * @param sensor   sensor pin
     * @param tempSet   Set temperature as int value
     * @param tempCtr   5 minute counter for temp readings
     * @param timerCtr   Main timer counter. If not 0 this timer is active
     * @return          long with new timer value for temperature readings
      *
     * this routine checks the timer counter. If non zeroe this timer is active.
     * next check if the temp ctr has passed 5 minutes. If so check the temperature.
     * \n Next check if the temperature is higher than the set temperature. If so
     * switch the relay on. If it is below then the relay will be switched off.
     */

    long processTemperature(int relay , int sensor, int tempSet, unsigned long tempCtr, unsigned long timerCtr){

       unsigned int      tempReading;         // temperature from LM35
       float          convertedTemp;         // temperature in degrees

       //
       // first check if a counter is running and if not if it should be running
       //
       if (timerCtr != 0L) {
          //
          // there is a timer running so let's see if we need to read the temperature
          //
          if (millis() >= tempCtr) {
             //
             // yes so let's read the sensor
             //
             tempReading = analogRead(sensor);
             //
             // and convert it to a temperature
             //
             convertedTemp = (5.0 * tempReading *100.0)/1024.0;
             //
             // now check if we are above the set temperature
             //
             if (convertedTemp > tempSet) {
                //
                // switch the relay on
                //
                digitalWrite(relay, HIGH);
                digitalWrite(ledPin1, HIGH); // klopt deze plek voor de ledpin? want ik begrijp niet goed hoe dit werkt omdat je spreek over relay en niet over relay1 ?
             } else {
                //
                // switch the relay off
                //
                digitalWrite(relay, LOW);
                digitalWrite(ledPin1, LOW);// klopt deze plek ?
             }
             //
             // set the temperature for the next sensing period
             //
             tempCtr = millis() + FIVEMINUTES;
          }
       } else {
          //
          // no activity so reset the tempCtr timer
          //
          tempCtr = 0L;
       }
       //
       // and hand the timer back
       //
       return tempCtr;
    }


in de h.file zie ik alleen de (long processTimer) staan klopt dit ? of moet ik het zelfde aanmaken voor (processTemperature)

verder heb ik nog niet al de leds verder benoemt in het programma maar alleen ledPin1 om te proberen ik neem aan dat dit niet de error veroorzaakt

zou je hier nog een blik op willen werpen voor mij


mijn dank is groot


groet dirk ambu

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: timer starten met knop ?

Berichtdoor nicoverduin » 29 Jun 2013, 17:25

Ik ga het deze keer niet voor je oplossen:
hint/tip:
a) gooi die .h maar weg want je werkt toch met de gewone Arduino IDE. En niet vergeten deze ook uit het begin van het programma te halen. De IDE maakt dan zelf een prototype file aan (voor jou onzichtbaar).
b) Je roept een functie aan met een aantal parameters. De functie zelf denkt er veel minder te krijgen.... Dus goed kijken naar je functies....
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 144
Geregistreerd: 29 Okt 2012, 16:54

Re: timer starten met knop ?

Berichtdoor dirk ambu » 30 Jun 2013, 11:16

hoi Nico

het begint erop te lijken dat het gaat werken
ik heb nu 1 led per counter toegevoegd en geen error meer
vanavond maar eens kijken of het ook echt met de hardware werkt deze moet ik nog voorzien van een instel mogelijkheid voor de temperatuur
maar ik heb nu het volgende
Code: Alles selecteren


    /**
     * @mainpage Timerswitch program
     * \n This program has relays that can be switched on and off based on
     * a switch status or time limit.
     * \n The time limit is currently set for 1 hour but my be extended with
     * 15 minutes under the condition that a button corresponding to a relay is
     * not pressed for longer than 5 seconds. If the button is pushed for more than
     * 5 seconds, the timer is reset and switched off.
     * @author Nico Verduin
     * @date 21-6-2013
     */

    /**
     * Revision control
     * Revision   : $Revision$
     * Author   : $Author$
     * Date      : $Date$
     *
     */



    //
    // global variables
    //
    unsigned long    timer1Counter;              // timer 1
    unsigned long    timer2Counter;              // timer 2
    unsigned long    temp1Counter;               // timer 1 for temperature
    unsigned long    temp2Counter;               // timer 2 for temperature
    float            temperatureSensor1;         // temperature sensor 1
    float            temperatureSensor2;         // temperature sensor 2
    unsigned int     setTemperature1;            // set temperature 1
    unsigned int     setTemperature2;            // set temperature 2
    //
    // arduino pins
    //
    #define RELAY1             4             // pin 4
    #define RELAY2             5             // pin 5
    //#define RELAY3             6             // pin 6
    //#define RELAY4             7             // pin 7
    #define LEDPIN1            9             //pin 9
    #define LEDPIN2           10             // pin 10
    #define LEDPIN3           11             //pin 11
    #define LEDPIN4           12             //pin 12
    #define SWITCH1            2             // pin 2
    #define SWITCH2            3             // pin 3
    #define TEMP_SENSOR1       A0            // analog pin A0 Sensor1
    #define TEMP_SENSOR2       A1            // analog pin A1 Sensor2
    #define TEMP_SET1          A2            // analog pin A2 set temp 1
    #define TEMP_SET2          A3            // analog pin A3 set temp 2
    //
    // other settings
    //
    #define ON                    LOW       // on/off
    #define OFF                  HIGH
    #define TIME_TO_PRESS       3000L       // time to push button for reset 5000L
    #define HOUR             3600000L       // 3.6 million milliseconds in hour
    #define QUARTER           900000L       // 900000 millsecs in 15 minutes
    #define FIVEMINUTES       100000L       // 5 minutes period 300000L
    #define DEBOUNCE_TIME        100        // 100 mSec debounce time

    /**
     * @name setup()
     * Initializes the IO ports and resets any variables
     */

    void setup()
    {
       //
       // set pins input output. analog pins do not need to be setup
       //
       pinMode(RELAY1, OUTPUT);
       pinMode(RELAY2, OUTPUT);
       //pinMode(RELAY3, OUTPUT);
      // pinMode(RELAY4, OUTPUT);
       pinMode(LEDPIN1, OUTPUT);
       pinMode(LEDPIN2, OUTPUT);
       pinMode(LEDPIN3, OUTPUT);
       pinMode(LEDPIN4, OUTPUT);
       pinMode(SWITCH1, INPUT);
       pinMode(SWITCH2, INPUT);
       //
       // pull up resistors
       //
       digitalWrite(SWITCH1, HIGH);
       digitalWrite(SWITCH2, HIGH);
       //
       // make sure relays are switched off
       //
       digitalWrite(RELAY1, LOW);
       digitalWrite(RELAY2, LOW);
       //digitalWrite(RELAY3, LOW);
       //digitalWrite(RELAY4, LOW);
       //
       // test led,s
       //
       digitalWrite(LEDPIN1, HIGH);                        //make sure led works
       delay (200);
       digitalWrite(LEDPIN1, LOW);                         //make sure led works
       delay (200);
       digitalWrite(LEDPIN2, HIGH);                        //make sure led works
       delay (200);
       digitalWrite(LEDPIN2, LOW);                         //make sure led works
       delay (200);
       digitalWrite(LEDPIN3, HIGH);                        //make sure led works
       delay (200);
       digitalWrite(LEDPIN3, LOW);                         //make sure led works
       delay (200);
       digitalWrite(LEDPIN4, HIGH);                        //make sure led works
       delay (200);
       digitalWrite(LEDPIN4, LOW);                         //make sure led works
       delay (1000);

       
       
       // other variables
       //
       timer1Counter = 0L;      // timer counters
       timer2Counter = 0L;
    }

    /**
     * @name Loop()
     * continues to loop through this routine until Arduino is switched off
     * This routine just processes each timer in sequence
     */
    void loop()
    {
       //
       // read temperature settings from potmeters
       //
       setTemperature1 = map(analogRead(TEMP_SET1), 0, 1023, 15,35);
       setTemperature2 = map(analogRead(TEMP_SET2), 0, 1023, 15,35);
       //
       // process timers
       //
       timer1Counter = processTimer(SWITCH1, RELAY1, LEDPIN1, timer1Counter);
       timer2Counter = processTimer(SWITCH2, RELAY2, LEDPIN2, timer2Counter);
       //
       // process temperature
       //
       temp1Counter   = processTemperature(RELAY1, LEDPIN1, TEMP_SENSOR1, setTemperature1, temp1Counter, timer1Counter);
       temp2Counter   = processTemperature(RELAY2, LEDPIN2, TEMP_SENSOR2, setTemperature2, temp2Counter, timer2Counter);
    }

    /**
     * @name long procesTimer(int button, int relay, int ledpin, int setTemp, long counter)
     * @param button    button to process
     * @param relay      relay to process
     * @param ledpin     ledpin to process
     * @param counter   timer value to compare to millis
     * @return          long with new timer value
     *
     * this routine receives the timer value, button and relay.
     * \n It tests if the button is pressed. If so:
     * \n a) it just keeps counting time until the button is released.
     * \n b) it checks how long the button was pressed:
     * \n    - if more (or equal to) than TIME_TO_PRESS, rest counter and relay
     * \n    - if not check if the counter was running:
     * \n      * if so  Add 15 minutes
     * \n      * if not start the timer at one hour
     * \n If button not pressed:
     * \n a) if current time is greater(or equal to) timer value:
     * \n    - Reset the timer
     * \n    - Switch relay off
     * \n    - Switch ledpin off
     *
     */

    long processTimer(int button, int relay, int ledpin, unsigned long counter){

       unsigned long returnCounter;   // return value
       unsigned long localCounter;      // counter for pressed time

       returnCounter = counter;      // if unchanged we have the right value

       //
       // check if a button is pressed
       // if so check if it is a TIME_TO_PRESS press
       //
       if (deBounce(button) == ON){
          //
          // button is pressed. No see for how long
          //
          localCounter = millis();
          //
          // now wait until button is released so don't forget to let go :)
          //
          while(1) {
             //
             // check if button is released
             //
             if (deBounce(button) == OFF){
                //
                // yes so quit this loop
                //
                break;
             }
          }
          //
          // the button is released check if we are passed the time limit
          // the time is corrected for 2 x the DEBOUNCE_TIME as this time is
          // already lost in the deBounce routine.
          //
          if ((millis() - localCounter) >= (TIME_TO_PRESS - (DEBOUNCE_TIME * 2))) {
             //
             // yes so switch the relay off
             //
             returnCounter = 0L;
             digitalWrite(relay, LOW);
             digitalWrite(ledpin,LOW);
          } else {
             //
             // The time pressed was less than the TIME_TO_PRESS so check
             // if we have to switch the relay on for one hour or add 15 minutes
             //
             if (returnCounter == 0L) {
                //
                // No it wasn't so switch the relay on and set the timer
                //
                returnCounter = millis() + HOUR;
                //
             } else {
                //
                // it was already running so just add 15 minutes
                //
                returnCounter += QUARTER;
             }
          }
       } else {
          //
          // no button was pressed so just check the timer
          //
          if (millis() >= returnCounter) {
             //
             // yes so switch off the relay and the timer
             //
             returnCounter = 0L;
             digitalWrite(relay, LOW);
             digitalWrite(ledpin, LOW);
          }
       }
       return returnCounter;
   
   
    }

   
   
   
    /**
     * @name deBounce(int button)
     * @param button button pin to read and do debouncing
     * @returns state of button
     *
     * Reads a button and waits DEBOUNCE_TIME mSec and tests again
     * Returns read if value unchanged and zero if it has changed for
     * DEBOUNCE_TIME time
     */
    int deBounce(int button) {
       int state;               // value of pin
       //
       // read the button
       //
       state = digitalRead(button);
       delay(DEBOUNCE_TIME);      // now wait a little time
       //
       // now check if it has changed
       //
       if (digitalRead(button) != state) {
          return OFF;            // the state has changed so consider it off
                            // if it went on halfway this routine it will
                            // have stabilized by the next time we read here
       } else {
          //
          // return the button value
          //
          return state;
       }
    }
    /**
     * @name long processTemperature(int relay , int ledpin , int sensor, int tempSet, long tempCtr, long timerCtr)
     * @param relay      relay pin
     * @param ledpin   ledpin pin
     * @param sensor   sensor pin
     * @param tempSet   Set temperature as int value
     * @param tempCtr   5 minute counter for temp readings
     * @param timerCtr   Main timer counter. If not 0 this timer is active
     * @return          long with new timer value for temperature readings
      *
     * this routine checks the timer counter. If non zeroe this timer is active.
     * next check if the temp ctr has passed 5 minutes. If so check the temperature.
     * \n Next check if the temperature is higher than the set temperature. If so
     * switch the relay and ledpin on. If it is below then the relay and ledpin will be switched off.
     */

    long processTemperature(int relay , int ledpin , int sensor, int tempSet, unsigned long tempCtr, unsigned long timerCtr){

       unsigned int      tempReading;         // temperature from LM35
       float          convertedTemp;         // temperature in degrees

       //
       // first check if a counter is running and if not if it should be running
       //
       if (timerCtr != 0L) {
          //
          // there is a timer running so let's see if we need to read the temperature
          //
          if (millis() >= tempCtr) {
             //
             // yes so let's read the sensor
             //
             tempReading = analogRead(sensor);
             //
             // and convert it to a temperature
             //
             convertedTemp = (5.0 * tempReading *100.0)/1024.0;
             //
             // now check if we are above the set temperature
             //
             if (convertedTemp > tempSet) {
                //
                // switch the relay on
                //
                digitalWrite(relay, HIGH);
                digitalWrite(ledpin, HIGH);
             } else {
                //
                // switch the relay off
                //
                digitalWrite(relay, LOW);
                digitalWrite(ledpin, LOW);
             }
             //
             // set the temperature for the next sensing period
             //
             tempCtr = millis() + FIVEMINUTES;
          }
       } else {
          //
          // no activity so reset the tempCtr timer
          //
          tempCtr = 0L;
       }
       //
       // and hand the timer back
       //
       return tempCtr;
    }



groet
dirk ambu

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: timer starten met knop ?

Berichtdoor nicoverduin » 30 Jun 2013, 11:52

Ziet er goed uit :)
Als je nu helemaal klaar bent geef ik je wel de versie waarbij je een class thermostat hebt. Dan wordt het nog eenvoudiger :). Maar ik zit nog te wachten tot je de juiste klacht geeft van hoe je nu moet ontwikkelen :).
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 144
Geregistreerd: 29 Okt 2012, 16:54

Re: timer starten met knop ?

Berichtdoor dirk ambu » 30 Jun 2013, 12:14

hoi Nico

ik heb de hadrware nog niet helemaal af dus komen nog niet al de klachten boven
ik kon niet wachten tot vanavond dus toch maar even de 2de leds toe gevoegd
en dit lijkt nu ook te werken al begrijp ik niet goed de benamingen
want dit lijkt vast te liggen met ledpin1 als int naam werkte het niet maar met ledpinn werkt het wel daar kan ik mijn vinger nog niet opleggen
ik dacht dat je in deze zin long processTemperature(int relay , int ledpin , int ledpinn, int sensor, int tempSet, unsigned long tempCtr, unsigned long timerCtr) neer kon zetten wat je wil
dus ook long processTemperature(int relay , lamp0 , int lamp1, int sensor, int tempSet, unsigned long tempCtr, unsigned long timerCtr) maar dat lijkt niet te werken
heeft dit iets te maken met de arduino software waar alleen vasten benamingen voor verwijzingen gebruikt kunnen worden ?

de code ziet er nu zo uit
Code: Alles selecteren

    /**
     * @mainpage Timerswitch program
     * \n This program has relays that can be switched on and off based on
     * a switch status or time limit.
     * \n The time limit is currently set for 1 hour but my be extended with
     * 15 minutes under the condition that a button corresponding to a relay is
     * not pressed for longer than 5 seconds. If the button is pushed for more than
     * 5 seconds, the timer is reset and switched off.
     * @author Nico Verduin
     * @date 21-6-2013
     */

    /**
     * Revision control
     * Revision   : $Revision$
     * Author   : $Author$
     * Date      : $Date$
     *
     */



    //
    // global variables
    //
    unsigned long    timer1Counter;              // timer 1
    unsigned long    timer2Counter;              // timer 2
    unsigned long    temp1Counter;               // timer 1 for temperature
    unsigned long    temp2Counter;               // timer 2 for temperature
    float            temperatureSensor1;         // temperature sensor 1
    float            temperatureSensor2;         // temperature sensor 2
    unsigned int     setTemperature1;            // set temperature 1
    unsigned int     setTemperature2;            // set temperature 2
    //
    // arduino pins
    //
    #define RELAY1             4             // pin 4
    #define RELAY2             5             // pin 5
    //#define RELAY3             6             // pin 6
    //#define RELAY4             7             // pin 7
    #define LEDPIN1            9             //pin 9
    #define LEDPINN2           10             // pin 10
    #define LEDPIN3           11             //pin 11
    #define LEDPINN4           12             //pin 12
    #define SWITCH1            2             // pin 2
    #define SWITCH2            3             // pin 3
    #define TEMP_SENSOR1       A0            // analog pin A0 Sensor1
    #define TEMP_SENSOR2       A1            // analog pin A1 Sensor2
    #define TEMP_SET1          A2            // analog pin A2 set temp 1
    #define TEMP_SET2          A3            // analog pin A3 set temp 2
    //
    // other settings
    //
    #define ON                    LOW       // on/off
    #define OFF                  HIGH
    #define TIME_TO_PRESS       3000L       // time to push button for reset 5000L
    #define HOUR             3600000L       // 3.6 million milliseconds in hour
    #define QUARTER           900000L       // 900000 millsecs in 15 minutes
    #define FIVEMINUTES       100000L       // 5 minutes period 300000L
    #define DEBOUNCE_TIME        100        // 100 mSec debounce time

    /**
     * @name setup()
     * Initializes the IO ports and resets any variables
     */

    void setup()
    {
       //
       // set pins input output. analog pins do not need to be setup
       //
       pinMode(RELAY1, OUTPUT);
       pinMode(RELAY2, OUTPUT);
       //pinMode(RELAY3, OUTPUT);
      // pinMode(RELAY4, OUTPUT);
       pinMode(LEDPIN1, OUTPUT);
       pinMode(LEDPINN2, OUTPUT);
       pinMode(LEDPIN3, OUTPUT);
       pinMode(LEDPINN4, OUTPUT);
       pinMode(SWITCH1, INPUT);
       pinMode(SWITCH2, INPUT);
       //
       // pull up resistors
       //
       digitalWrite(SWITCH1, HIGH);
       digitalWrite(SWITCH2, HIGH);
       //
       // make sure relays are switched off
       //
       digitalWrite(RELAY1, LOW);
       digitalWrite(RELAY2, LOW);
       //digitalWrite(RELAY3, LOW);
       //digitalWrite(RELAY4, LOW);
       //
       // test led,s
       //
       digitalWrite(LEDPIN1, HIGH);                         //make sure led works
       delay (200);
       digitalWrite(LEDPIN1, LOW);                          //make sure led works
       delay (200);
       digitalWrite(LEDPINN2, HIGH);                        //make sure led works
       delay (200);
       digitalWrite(LEDPINN2, LOW);                         //make sure led works
       delay (200);
       digitalWrite(LEDPIN3, HIGH);                         //make sure led works
       delay (200);
       digitalWrite(LEDPIN3, LOW);                          //make sure led works
       delay (200);
       digitalWrite(LEDPINN4, HIGH);                        //make sure led works
       delay (200);
       digitalWrite(LEDPINN4, LOW);                         //make sure led works
       delay (200);
       digitalWrite(LEDPIN1, HIGH);                         //make sure led works
       delay (200);
       digitalWrite(LEDPIN1, LOW);                          //make sure led works
       delay (200);
       digitalWrite(LEDPINN2, HIGH);                        //make sure led works
       delay (200);
       digitalWrite(LEDPINN2, LOW);                         //make sure led works
       delay (200);
       digitalWrite(LEDPIN3, HIGH);                         //make sure led works
       delay (200);
       digitalWrite(LEDPIN3, LOW);                          //make sure led works
       delay (200);
       digitalWrite(LEDPINN4, HIGH);                        //make sure led works
       delay (200);
       digitalWrite(LEDPINN4, LOW);                         //make sure led works
       delay (1000);

       
       
       // other variables
       //
       timer1Counter = 0L;      // timer counters
       timer2Counter = 0L;
    }

    /**
     * @name Loop()
     * continues to loop through this routine until Arduino is switched off
     * This routine just processes each timer in sequence
     */
    void loop()
    {
       //
       // read temperature settings from potmeters
       //
       setTemperature1 = map(analogRead(TEMP_SET1), 0, 1023, 15,35);
       setTemperature2 = map(analogRead(TEMP_SET2), 0, 1023, 15,35);
       //
       // process timers
       //
       timer1Counter = processTimer(SWITCH1, RELAY1, LEDPIN1, LEDPINN2, timer1Counter);
       timer2Counter = processTimer(SWITCH2, RELAY2, LEDPIN3, LEDPINN4, timer2Counter);
       //
       // process temperature
       //
       temp1Counter   = processTemperature(RELAY1, LEDPIN1, LEDPINN2, TEMP_SENSOR1, setTemperature1, temp1Counter, timer1Counter);
       temp2Counter   = processTemperature(RELAY2, LEDPIN3, LEDPINN4, TEMP_SENSOR2, setTemperature2, temp2Counter, timer2Counter);
    }

    /**
     * @name long procesTimer(int button, int relay, int setTemp, long counter)
     * @param button    button to process
     * @param relay      relay to process
     * @param counter   timer value to compare to millis
     * @return          long with new timer value
     *
     * this routine receives the timer value, button and relay.
     * \n It tests if the button is pressed. If so:
     * \n a) it just keeps counting time until the button is released.
     * \n b) it checks how long the button was pressed:
     * \n    - if more (or equal to) than TIME_TO_PRESS, rest counter and relay
     * \n    - if not check if the counter was running:
     * \n      * if so  Add 15 minutes
     * \n      * if not start the timer at one hour
     * \n If button not pressed:
     * \n a) if current time is greater(or equal to) timer value:
     * \n    - Reset the timer
     * \n    - Switch relay off
     *
     */

    long processTimer(int button, int relay, int ledpin, int ledpinn, unsigned long counter){

       unsigned long returnCounter;   // return value
       unsigned long localCounter;      // counter for pressed time

       returnCounter = counter;      // if unchanged we have the right value

       //
       // check if a button is pressed
       // if so check if it is a TIME_TO_PRESS press
       //
       if (deBounce(button) == ON){
          //
          // button is pressed. No see for how long
          //
          localCounter = millis();
          //
          // now wait until button is released so don't forget to let go :)
          //
          while(1) {
             //
             // check if button is released
             //
             if (deBounce(button) == OFF){
                //
                // yes so quit this loop
                //
                break;
             }
          }
          //
          // the button is released check if we are passed the time limit
          // the time is corrected for 2 x the DEBOUNCE_TIME as this time is
          // already lost in the deBounce routine.
          //
          if ((millis() - localCounter) >= (TIME_TO_PRESS - (DEBOUNCE_TIME * 2))) {
             //
             // yes so switch the relay off
             //
             returnCounter = 0L;
             digitalWrite(relay, LOW);
             digitalWrite(ledpinn,LOW);
          } else {
             //
             // The time pressed was less than the TIME_TO_PRESS so check
             // if we have to switch the relay on for one hour or add 15 minutes
             //
             if (returnCounter == 0L) {
                //
                // No it wasn't so switch the relay on and set the timer
                //
                returnCounter = millis() + HOUR;
                //
             } else {
                //
                // it was already running so just add 15 minutes
                //
                returnCounter += QUARTER;
             }
          }
       } else {
          //
          // no button was pressed so just check the timer
          //
          if (millis() >= returnCounter) {
             //
             // yes so switch off the relay and the timer
             //
             returnCounter = 0L;
             digitalWrite(relay, LOW);
             digitalWrite(ledpinn, HIGH);
             digitalWrite(ledpin, LOW);
          }
       }
       return returnCounter;
   
   
    }

   
   
   
    /**
     * @name deBounce(int button)
     * @param button button pin to read and do debouncing
     * @returns state of button
     *
     * Reads a button and waits DEBOUNCE_TIME mSec and tests again
     * Returns read if value unchanged and zero if it has changed for
     * DEBOUNCE_TIME time
     */
    int deBounce(int button) {
       int state;               // value of pin
       //
       // read the button
       //
       state = digitalRead(button);
       delay(DEBOUNCE_TIME);      // now wait a little time
       //
       // now check if it has changed
       //
       if (digitalRead(button) != state) {
          return OFF;            // the state has changed so consider it off
                            // if it went on halfway this routine it will
                            // have stabilized by the next time we read here
       } else {
          //
          // return the button value
          //
          return state;
       }
    }
    /**
     * @name long processTemperature(int relay , int sensor, int tempSet, long tempCtr, long timerCtr)
     * @param relay      relay pin
     * @param sensor   sensor pin
     * @param tempSet   Set temperature as int value
     * @param tempCtr   5 minute counter for temp readings
     * @param timerCtr   Main timer counter. If not 0 this timer is active
     * @return          long with new timer value for temperature readings
      *
     * this routine checks the timer counter. If non zeroe this timer is active.
     * next check if the temp ctr has passed 5 minutes. If so check the temperature.
     * \n Next check if the temperature is higher than the set temperature. If so
     * switch the relay on. If it is below then the relay will be switched off.
     */

    long processTemperature(int relay , int ledpin , int ledpinn, int sensor, int tempSet, unsigned long tempCtr, unsigned long timerCtr){

       unsigned int      tempReading;         // temperature from LM35
       float          convertedTemp;         // temperature in degrees

       //
       // first check if a counter is running and if not if it should be running
       //
       if (timerCtr != 0L) {
          //
          // there is a timer running so let's see if we need to read the temperature
          //
          if (millis() >= tempCtr) {
             //
             // yes so let's read the sensor
             //
             tempReading = analogRead(sensor);
             //
             // and convert it to a temperature
             //
             convertedTemp = (5.0 * tempReading *100.0)/1024.0;
             //
             // now check if we are above the set temperature
             //
             if (convertedTemp > tempSet) {
                //
                // switch the relay on
                //
                digitalWrite(relay, HIGH);     // relay is aan
                digitalWrite(ledpinn, LOW);    // rode led is uit
                digitalWrite(ledpin, HIGH);    // groene led is aan
             } else {
                //
                // switch the relay off
                //
                digitalWrite(relay, LOW);       // relay is uit
                digitalWrite(ledpinn, HIGH);    // rode led is aan
                digitalWrite(ledpin, LOW);      // groene led is aan 
             }
             //
             // set the temperature for the next sensing period
             //
             tempCtr = millis() + FIVEMINUTES;
          }
       } else {
          //
          // no activity so reset the tempCtr timer
          //
          tempCtr = 0L;
       }
       //
       // and hand the timer back
       //
       return tempCtr;
    }



groet dirk

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: timer starten met knop ?

Berichtdoor nicoverduin » 30 Jun 2013, 12:39

In de aanroep geef je gewoon aan welke pinnen je gebruikt
in de functie geef je aan hoe je ze gaat benoemen in de functie. Dat betekent dat je niet dezelfde benaming mag gebruiken. Het enige wat geldt dat de volgorde consequent moet zijn.
Bijv. als je 6 x int en een char doorgeeft en je functie definitie gaat uit van 1 x char en 6 x int, dan gaat het fout.
Dus doe je er goed aan om de benamingen in je functies consequent te houden en niet nu zomaar iets nemen.
Verder is het handiger als je een foutboodschap krijgt waar je niet uit komt, deze ook te publiceren.. Nu ben je een klant die naar de garage gaat: "meneer er viel wat af van mijn auto en nu rijdt hij vreemd.... "
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 144
Geregistreerd: 29 Okt 2012, 16:54

Re: timer starten met knop ?

Berichtdoor dirk ambu » 01 Jul 2013, 17:49

nicoverduin schreef:In de aanroep geef je gewoon aan welke pinnen je gebruikt
in de functie geef je aan hoe je ze gaat benoemen in de functie. Dat betekent dat je niet dezelfde benaming mag gebruiken. Het enige wat geldt dat de volgorde consequent moet zijn.
Bijv. als je 6 x int en een char doorgeeft en je functie definitie gaat uit van 1 x char en 6 x int, dan gaat het fout.
Dus doe je er goed aan om de benamingen in je functies consequent te houden en niet nu zomaar iets nemen.
Verder is het handiger als je een foutboodschap krijgt waar je niet uit komt, deze ook te publiceren.. Nu ben je een klant die naar de garage gaat: "meneer er viel wat af van mijn auto en nu rijdt hij vreemd.... "


hoi Nico

de fout zat bij mij ik had een typ fout gemaakt
maar ik heb iets anders wat nog niet lijkt te werken en dat is de temperatuur regeling
allereerst kan ik nu wel aan de potmeter draaien maar waar zet ik deze dan op ? dat kan ik nu niet zien
verder kan ik niet zien wat de temperatuur is op het moment waardoor ik niet weet welke kant ik de potmeter op moet draaien
het lijkt er nu op dat het relay alleen uit gaat als de exacte temperatuur is bereikt en dat is niet de bedoeling
op het moment dat de temperatuur is gezakt onder de 20 graden dan moet het relay afvallen daarboven moet het opkomen

is dit de klacht waarvan jij dacht dat ik daar mee zou komen ??

de potmeter werkt deze heb ik als test even uitgelezen via serial print en dit geldt ook voor de temperatuur sensor

ik hoor het graag

groet dirk ambu

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 19 gasten