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 » 26 Jul 2013, 12:06

Range veranderen in 150 tot 350 en dan delen door 10.
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 » 05 Okt 2013, 12:25

hoi nico

ik ben weer bezig met dit project waarbij ik een lcd scherm (20x4) heb toegevoegd
echter loop ik tegen een probleem aan wat ik niet begrijp
het lijkt in de harware te zitten en niet zozeer in de software
ik heb het lcd scherm werkend maar de waardes beïnvloeden elkaar te veel

het probleem (de uitdaging )

als het programma start krijg ik op het lcd scherm de waarden te staan van lm35 1 met daaronder de gewenste waarde van potmeter 1
daaronder krijg ik dan lm35 2 met daaronder weer de gewenste waarde van potmeter 2

lcd rij 1 lm35 1 ( waarde 22 )
lcd rij 2 gewenste waarde potmeter 1 (waarde 15 )
lcd rij 3 lm35 2 ( waarde 22)
lcd rij 4 gewenste waarde potmeter 2 ( waarde 15)


als ik nu aan potmeter 1 draai en de waarde wordt 35 dan gaat alles goed en werkt alles naar wens

maar als ik aan potmeter 2 draai dan verander ook de waarde van lm35 1 op de lcd deze loopt op tot 41 en loopt mee terug als ik de potmeter terug draai

waar gaat ik nu fout

hier onder de code die ik hiervoor heb gemaakt


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 dirk ambu
     * @date 25-9-2013
     */

    /**
     * Revision control
     * Revision   : $Revision$
     * Author   : $Author$
     * Date      : $Date$
     *
     */
  #include <Wire.h>
  #include <LCD.h>
  #include <LiquidCrystal_I2C.h>
     
    #define I2C_ADDR    0x27  // Define I2C Address where the PCF8574A is
    #define BACKLIGHT_PIN     3
    #define En_pin  2
    #define Rw_pin  1
    #define Rs_pin  0
    #define D4_pin  4
    #define D5_pin  5
    #define D6_pin  6
    #define D7_pin  7
     
    int n = 1;
     
    LiquidCrystal_I2C       lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);


    //
    // 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
   
    unsigned int      tempReading1;           // temperature from LM35 1
    unsigned int      tempReading2;           // temperature from LM35 2
    float             convertedTemp1;         // temperature in degrees 1
    float             convertedTemp2;         // temperature in degrees 2
    //
    // arduino pins
    //
    // porten die nog vrij zijn 0 1 8 13 A4 A5 icsp
    #define RELAY1             7            // pin 4
    #define RELAY2             4             // pin 5
    //#define RELAY3             5             // pin 6
    //#define RELAY4             6             // 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 3600000L
    #define QUARTER             900000L       // 900000 millsecs in 15 minutes 900000L
    #define FIVESECONDS           5000L       // 5 minutes period 300000L 100000L
    #define DEBOUNCE_TIME        100        // 100 mSec debounce time 100

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

    void setup()
    {
            lcd.begin (20,4,LCD_5x8DOTS);
     
     
     lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); // init the backlight
       //lcd.setBacklight(HIGH);     // Backlight on
       //
       // 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 (2000);
       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()
    {
  //  unsigned int      tempReading1;           // temperature from LM35
   // unsigned int      tempReading2;           // temperature from LM35
    //float             convertedTemp1;         // temperature in degrees
    //float             convertedTemp2;         // temperature in degrees
    tempReading1 = analogRead(TEMP_SENSOR1);
    tempReading2 = analogRead(TEMP_SENSOR2);
    convertedTemp1 = (5.0 * tempReading1 *35.0)/1024.0;
    convertedTemp2 = (5.0 * tempReading2 *35.0)/1024.0;
   
   
       
    int value1 = map(analogRead(TEMP_SET1), 0, 1023, 1500 ,3500 );   
    int value2 = map(analogRead(TEMP_SET2), 0, 1023, 1500 ,3500 );
   
   
   
     int value = analogRead(TEMP_SENSOR1);
     float millivolts1 = (value / 1024.0) * 5000;
     float celsius1 = millivolts1 / 10;

     int value3 = analogRead(TEMP_SENSOR2);
     float millivolts2 = (value3 / 1024.0) * 5000;
     float celsius2 = millivolts2 / 10;
     
     int value5 = (analogRead(TEMP_SET1), 0, 1023, 1500 ,3500 );
     float millivolts5 = (value1 / 10);
     float celsius5 = millivolts5 / 10;
     
     int value6 = (analogRead(TEMP_SET2), 0, 1023, 1500 ,3500 );
     float millivolts6 = (value2 / 10);
     float celsius6 = millivolts6 / 10;
     
 
     
      lcd.home ();                     // go home     
      lcd.print("Woonkamer");
      lcd.setCursor ( 13, 0 );         // go to the next line
      lcd.print(celsius1);
      lcd.setCursor ( 13, 1 );         // go to the next line
      lcd.print(celsius5);
      lcd.setCursor ( 0, 1 );          // go to the next line
      lcd.print("Gewenst temp");
      lcd.setCursor ( 13, 2 );         // go to the next line
      lcd.print(celsius2);
      lcd.setCursor ( 13, 3 );         // go to the next line
      lcd.print(celsius6);
      lcd.setCursor ( 0, 2 );          // go to the next line
      lcd.print("Slaapkamers");
      lcd.setCursor (0, 3 );           // go to the next line
      lcd.print("Gewenst temp");
      lcd.setBacklight(HIGH);          // Backlight on
      //lcd.on(); // Switch fully on the LCD (backlight and LCD)
       //
       // 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, 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 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 *35.0)/1024.0;
        // hier nog wat veranderen //////////////////////////////////////////////////////////////////     
    int value = analogRead(TEMP_SENSOR1);
    float millivolts1 = (value / 1024.0) * 5000;
    float celsius1 = millivolts1 / 10;

             //
             // 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 uit 
               
             }
             //
             // set the temperature for the next sensing period
             //
             tempCtr = millis() + FIVESECONDS;
             
          }
      } else {
          //
          // no activity so reset the tempCtr timer
          //
         tempCtr = 0L;
        }
       //
       // and hand the timer back
       //
       return tempCtr;
    }




verder kan ik de A4 ingang van mijn arduino uno niet gebruiken ter vervanging van A3 want dan loopt het lcd scherm vast
komt dit door dat het lcd scherm deze toch gebruikt ?
lcd scherm heb ik aan gesloten op SCL en SDA


ik hoop dat iemand me verder kan helpen om dit op te lossen


groet dirk ambu

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

Re: timer starten met knop ?

Berichtdoor nicoverduin » 05 Okt 2013, 14:19

Mijn eerste reactie zou zijn:
Waarom gebruik je LCD I2C (is een 2 wire verbinding) en gaat vervolgens parallel aansturen???????
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 » 05 Okt 2013, 16:25

hoi nico

ik maak gebruik van sda en scl
de library die ik heb gevonden stuurt het zo aan
hij werk met alleen een plus een min en sda scl

waar maakt jij uit op dat ik het parallel aanstuur als ik vragen mag

want dan weet ik mischien waar het fout gaat

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

Re: timer starten met knop ?

Berichtdoor nicoverduin » 05 Okt 2013, 16:59

LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);

En als ik dit bekijk : https://bitbucket.org/fmalpartida/new-l ... /wiki/Home

zou je3 dit moeten hebben:

LiquidCrystal_I2C lcd(I2C_ADDR); // Set the LCD I2C address

En hier heb je besloten om de "MAP" maar geheel weg te laten:
Code: Alles selecteren
    int value5 = (analogRead(TEMP_SET1), 0, 1023, 1500 ,3500 );
     float millivolts5 = (value1 / 10);
     float celsius5 = millivolts5 / 10;
     
     int value6 = (analogRead(TEMP_SET2), 0, 1023, 1500 ,3500 );


En wat netter programmeren zou ook geen kwaad kunnen. Heb ik je een prachtig gedocumenteerd programma gegeven, laat je de stijl al gelijk weer los...... niet handig.
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 » 05 Okt 2013, 17:27

je heb helemaal gelijk dat ik er een rommeltje van maakt

maar het valt niet mee om netje een programma te maken zoals je zelf ook zeg een werkt programma is nog geen goed programma

ik heb gewoon te veel haast om het werkt te krijgen en dan wordt ik slordig
en dat kosten me net 1 arduino uno

waar ik achter ben is dat enkelen versie,s terug werkten het nog wel
er gaat dus iets fout vanaf het moment dat ik de gewensten temperatuur wil berekenen achter de komma
ik ga even kijken of dat komt door het weglaten van de map



dat LiquidCrystal_I2C lcd(I2C_ADDR); // Set the LCD I2C address begrijp ik niet omdat mijn lcd geen address heeft
de versie die ik heb daarvan kan je er volgens internet ook geen 2 achter elkaar plaatsen met verschillenden teksten
omdat ze geen vast adres hebben zoiets heb ik begrepen

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

Re: timer starten met knop ?

Berichtdoor dirk ambu » 05 Okt 2013, 18:18

beste nico

met wat zoeken en veranderen is het mij gelukt om er voor te zorgen dat de potmeter de lm35 niet meer beïnvloed
maar nu heb ik het volgende probleem
het lukt mij niet om de instel waarde tussen de 15.00 en 35.00 graden te krijgen
hij regelt nu van 0 naar 35.00
het lijkt erop dat hij dit nu alleen doet op het lcd scherm want er schakelt nu niets meer :oops:

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 dirk ambu
     * @date 21-6-2013
     */

    /**
     * Revision control
     * Revision   : $Revision$
     * Author   : $Author$
     * Date      : $Date$
     *
     */
  #include <Wire.h>
  #include <LCD.h>
  #include <LiquidCrystal_I2C.h>
     
    #define I2C_ADDR    0x27  // Define I2C Address where the PCF8574A is
    #define BACKLIGHT_PIN     3
    #define En_pin  2
    #define Rw_pin  1
    #define Rs_pin  0
    #define D4_pin  4
    #define D5_pin  5
    #define D6_pin  6
    #define D7_pin  7
     
    int n = 1;
     
    LiquidCrystal_I2C       lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);


    //
    // 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
   
    //unsigned int      tempReading1;           // temperature from LM35 1
    //unsigned int      tempReading2;           // temperature from LM35 2
    //float             convertedTemp1;         // temperature in degrees 1
    //float             convertedTemp2;         // temperature in degrees 2
    //
    // arduino pins
    //
    // porten die nog vrij zijn 0 1 8 13 A4 A5 icsp
    #define RELAY1             7            // pin 4
    #define RELAY2             4             // pin 5
    //#define RELAY3             5             // pin 6
    //#define RELAY4             6             // 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 3600000L
    #define QUARTER             900000L       // 900000 millsecs in 15 minutes 900000L
    #define FIVESECONDS           5000L       // 5 minutes period 300000L 100000L
    #define DEBOUNCE_TIME        100        // 100 mSec debounce time 100

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

    void setup()
    {
            lcd.begin (20,4,LCD_5x8DOTS);
     
     
     lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); // init the backlight
       //lcd.setBacklight(HIGH);     // Backlight on
       //
       // 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 (2000);
       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()
    {
    unsigned int      tempReading1;           // temperature from LM35
    unsigned int      tempReading2;           // temperature from LM35
    float             convertedTemp1;         // temperature in degrees
    float             convertedTemp2;         // temperature in degrees
    tempReading1 = analogRead(TEMP_SENSOR1);
    tempReading2 = analogRead(TEMP_SENSOR2);
    convertedTemp1 = (5.0 * tempReading1 *35.0)/1024.0;
    convertedTemp2 = (5.0 * tempReading2 *35.0)/1024.0; 
   
     int value = analogRead(TEMP_SENSOR1);
     float millivolts1 = (value / 1024.0) * 5000;
     float celsius1 = millivolts1 / 10;

     int value3 = analogRead(TEMP_SENSOR2);
     float millivolts2 = (value3 / 1024.0) * 5000;
     float celsius2 = millivolts2 / 10;
     
     int value4 = analogRead(TEMP_SET1);//, 0, 1023, 1500 ,3500 );
     float millivolts3 = (value4 / 1024.0) * 350;
     float celsius3 = millivolts3 / 10;
     
     int value5 = analogRead(TEMP_SET2);//, 0, 1023, 1500 ,3500 );
     float millivolts4 = (value5 / 1024.0) * 350;
     float celsius4 = millivolts4 / 10;
 
     int value1 = map(analogRead(TEMP_SENSOR1), 0, 1023, 1500 ,3500 );   
     int value2 = map(analogRead(TEMP_SENSOR2), 0, 1023, 1500 ,3500 );
     int value6 = map(analogRead(TEMP_SET1), 0, 1023, 1500 ,3500 );   
     int value7 = map(analogRead(TEMP_SET2), 0, 1023, 1500 ,3500 );
       
 
     
      lcd.home ();                     // go home     
      lcd.print("Woonkamer");
      lcd.setCursor ( 13, 0 );         // go to the next line
      lcd.print(celsius1);
      lcd.setCursor ( 13, 1 );         // go to the next line
      lcd.print(celsius3);
      lcd.setCursor ( 0, 1 );          // go to the next line
      lcd.print("Gewenst temp");
      lcd.setCursor ( 13, 2 );         // go to the next line
      lcd.print(celsius2);
      lcd.setCursor ( 13, 3 );         // go to the next line
      lcd.print(celsius4);
      lcd.setCursor ( 0, 2 );          // go to the next line
      lcd.print("Slaapkamers");
      lcd.setCursor (0, 3 );           // go to the next line
      lcd.print("Gewenst temp");
      lcd.setBacklight(HIGH);          // Backlight on
      //lcd.on(); // Switch fully on the LCD (backlight and LCD)
       //
       // 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, 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 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 *35.0)/1024.0;
        // hier nog wat veranderen //////////////////////////////////////////////////////////////////     
    int value = analogRead(TEMP_SENSOR1);
    float millivolts1 = (value / 1024.0) * 350;
    float celsius = millivolts1 / 10;

             //
             // 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 uit 
               
             }
             //
             // set the temperature for the next sensing period
             //
             tempCtr = millis() + FIVESECONDS;
             
          }
      } else {
          //
          // no activity so reset the tempCtr timer
          //
         tempCtr = 0L;
        }
       //
       // and hand the timer back
       //
       return tempCtr;
    }




wat doe ik allemaal fout
of heb ik het op een verkeerde manier geprobeerd op te lossen

ik hoor het graag

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

Re: timer starten met knop ?

Berichtdoor nicoverduin » 05 Okt 2013, 23:31

Een paar dingen die mij opvallen die mogelijk de oorzaak kunnen zijn:
- Je alloceert variabelen elke keer opnieuw in de routines. In loop maak je elke keer weer nieuwe door ze als int .... = functie uit te voeren. Dat gaat niet goed. De functie loop wordt niet beindigd dus het zou best kunnen dat je door je ram geheugen gaat.
- Je moet variabelen die je in een loop gebruikt gewoon bovenin de functie maken of global maken .
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 » 06 Okt 2013, 09:48

hoi nico

ik denk dat ik het probleem heb gevonden waardoor hij niet meer schakelt
als via print serial kijk dan kloppen de waardes niet
Code: Alles selecteren
             convertedTemp = (5.0 * tempReading *35.0)/1024.0;
        // hier nog wat veranderen //////////////////////////////////////////////////////////////////     
    int value = analogRead(TEMP_SENSOR1);
    float millivolts1 = (value / 1024.0) * 350;
    float celsius = millivolts1 / 10;
             //
             // now check if we are above the set temperature
             //
             Serial.println(convertedTemp);
                Serial.println(tempSet);
             if (convertedTemp > tempSet) {
               

dit is wat ik krijg via print serial

    8.37
    15
    8.54
    15
    8.54
    15
    8.54
    35 potmeter naar maximaal gedraaid
    8.37
    35
    8.54
    35
    8.37
    35
    8.37
    35
    8.54
    35
    8.54
    35
    8.54
    35
    8.54
    35
    8.37
    35
    8.54
    35

boven in het programma heb ik gezegd dat de waarde tussen 0.00 en de 35.00 mag zijn
onder in het programma heb ik gezegd dat de waarde tussen de 15 en 35 moet zijn
daarnaast klopt de waarde van convertedTemp niet deze zegt nu dat het 8,54 is terwijl het hoger in het programma 24 is

ik ga dus even zoeken waar ik de berekening verkeerd heb ingevoerd

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

Re: timer starten met knop ?

Berichtdoor nicoverduin » 06 Okt 2013, 12:09

Ik zou het begrip "casting" in de C taal eens googelen
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 17 gasten