timer starten met knop ?

Arduino specifieke Software
Berichten: 144
Geregistreerd: 29 Okt 2012, 16:54

Re: timer starten met knop ?

Berichtdoor dirk ambu » 23 Jun 2013, 22:27

beste nico

na wat zoeken is het mij gelukt om de ledjes eraan toe te voegen ik denk dat ik de timer nu voor een groot deel begrijp
hieronder de code zoals ik hem nu heb aangepast en wil gaan gebruiken
voor het testen heb ik de tijden even veranderd anders moet ik zo lang wachten :)
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
    //
    // arduino pins
    //
    #define ledPin1               9            // pin 12 the pin that the LED is attached to is rood achterhuis
    #define ledPin2               10            // pin 11 the pin that the LED is attached to is groen achterhuis
    #define ledPin3               12            // pin 9 the pin that the LED is attached to is groen voorhuis
    #define ledPin4               11            // pin 10 the pin that the LED is attached to is rood voorhuis
    #define RELAY1                4             // pin 4
    #define RELAY2                5             // pin 5
    #define RELAY3                6             // pin 6 nog niet in gebruik
    #define RELAY4                7             // pin 7 nog niet in gebruik
    #define SWITCH1               3             // pin 2
    #define SWITCH2               2             // pin 3
    //
    // other settings
    //
    #define ON                LOW            // on/off
    #define OFF              HIGH
    #define TIME_TO_PRESS        3000L       // time to push button for reset 3 sec
    #define HOUR              36000L       // 3.6 million milliseconds in hour
    #define QUARTER            9000L       // 900000 millsecs in 15 minutes
    #define DEBOUNCE_TIME         100        // 100 mSec debounce time

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

    void setup()
    {
       //
       // set pins input output
       //
       pinMode(ledPin1, OUTPUT);
       pinMode(ledPin2, OUTPUT);
       pinMode(ledPin3, OUTPUT);
       pinMode(ledPin4, OUTPUT);
       pinMode(RELAY1, OUTPUT);
       pinMode(RELAY2, OUTPUT);
      // pinMode(RELAY3, OUTPUT);
       //pinMode(RELAY4, 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
       //
       digitalWrite(ledPin3, HIGH);
       delay (100);
       digitalWrite(ledPin3, LOW);
       delay (100);
       digitalWrite(ledPin4, HIGH);
       delay (100);
       digitalWrite(ledPin4, LOW);
       delay (100);
       digitalWrite(ledPin1, HIGH);
       delay (100);
       digitalWrite(ledPin1, LOW);
       delay (100);
       digitalWrite(ledPin2, HIGH);
       delay (100);
       digitalWrite(ledPin2, LOW);
       delay (100);
       digitalWrite(ledPin1, HIGH);
       delay (100);
       digitalWrite(ledPin1, LOW);
       delay (100);
       digitalWrite(ledPin2, HIGH);
       delay (100);
       digitalWrite(ledPin2, LOW);
       delay (100);
       digitalWrite(ledPin3, HIGH);
       delay (100);
       digitalWrite(ledPin3, LOW);
       delay (100);
       digitalWrite(ledPin4, HIGH);
       delay (100);
       digitalWrite(ledPin4, LOW);
       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()
    {
       timer1Counter = processTimer(SWITCH1, RELAY1, RELAY4, ledPin1, ledPin2, timer1Counter);
       timer2Counter = processTimer(SWITCH2, RELAY2, RELAY3, ledPin3, ledPin4, timer2Counter);
    }

    /**
     * @name long procesTimer(int button, int relay, 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 relay2, 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(relay2, HIGH);
             digitalWrite(ledPin, HIGH);
             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;
                digitalWrite(relay, HIGH);
                digitalWrite(relay2, LOW);
                digitalWrite(ledPin, LOW);
                digitalWrite(ledPinn, HIGH);
             } 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(relay2, HIGH);
             digitalWrite(ledPin, HIGH);
             digitalWrite(ledPinn, 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;
       }
    }

wat ik alleen zou willen weten is of het mogelijk is om onderstaande code makkelijker te maken en zo ja hoe ?
Code: Alles selecteren
  //
       // test led
       //
       digitalWrite(ledPin3, HIGH);
       delay (100);
       digitalWrite(ledPin3, LOW);
       delay (100);
       digitalWrite(ledPin4, HIGH);
       delay (100);
       digitalWrite(ledPin4, LOW);
       delay (100);
       digitalWrite(ledPin1, HIGH);
       delay (100);
       digitalWrite(ledPin1, LOW);
       delay (100);
       digitalWrite(ledPin2, HIGH);
       delay (100);
       digitalWrite(ledPin2, LOW);
       delay (100);
       digitalWrite(ledPin1, HIGH);
       delay (100);
       digitalWrite(ledPin1, LOW);
       delay (100);
       digitalWrite(ledPin2, HIGH);
       delay (100);
       digitalWrite(ledPin2, LOW);
       delay (100);
       digitalWrite(ledPin3, HIGH);
       delay (100);
       digitalWrite(ledPin3, LOW);
       delay (100);
       digitalWrite(ledPin4, HIGH);
       delay (100);
       digitalWrite(ledPin4, LOW);
       delay (1000);
       //


ik hoor het graag

groet dirk ambu

Advertisement

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

Re: timer starten met knop ?

Berichtdoor nicoverduin » 23 Jun 2013, 23:59

Je zou dit kunnen doen dan wordt de rij gewoon afgewerkt

Code: Alles selecteren
// Do not remove the include below
#include "testLed.h"
//
// define the led pins. Define as many as you wish
//
#define ledPin1   8
#define ledPin2   9
#define ledPin3   10
#define ledPin4   11
//
// prototype for functions. Not needed in Arduino IDE, but needed in ECLIPSE
//
void flashLeds();
//
// array containing leds. Just add an extra on if more are needed
//
char ledArray[] = {ledPin1, ledPin2, ledPin3, ledPin4};


void setup()
{
   //
   // set led output pins
   //
   for (unsigned int i = 0; i < sizeof(ledArray); i++) {
      pinMode(ledArray[i], OUTPUT);
   }
}

// The loop function is called in an endless loop
void loop()
{
   //
   // flash leds
   //
   flashLeds();
}

void flashLeds(){
   //
   // loop through the array
   //
   for (unsigned int i = 0; i < sizeof(ledArray); i++) {
      //
      // switch the pins on by on on for 100 msec
      //
      digitalWrite(ledArray[i], HIGH);
      delay(100);
      digitalWrite(ledArray[i], LOW);
      //
      // delay 100 msec between each led
      // except the last one. That should be 1 second
      //
      if(i != (sizeof(ledArray) -1)) {
         delay(100);
      } else {
         delay(1000);
      }

   }
}


Maar dan wordt gewoon de tabel af gewerkt of je maakt 2 tabellen waarbij de eerste tabel alle Led pinnen bevat terwijl de tweede tabel aangeeft hoe de volgorde is. Door het op deze manier te definieren heb je alle flexibiliteit.

Code: Alles selecteren
// Do not remove the include below
#include "testLed.h"
//
// define the led pins. Define as many as you wish
//
#define ledPin1   8
#define ledPin2   9
#define ledPin3   10
#define ledPin4   11
//
// prototype for functions. Not needed in Arduino IDE, but needed in ECLIPSE
//
void flashLeds();
//
// array containing leds. Just add an extra on if more are needed
//
char ledArray[] = {ledPin1, ledPin2, ledPin3, ledPin4};


void setup()
{
   //
   // set led output pins
   //
   for (unsigned int i = 0; i < sizeof(ledArray); i++) {
      pinMode(ledArray[i], OUTPUT);
   }
}

// The loop function is called in an endless loop
void loop()
{
   //
   // flash leds
   //
   flashLeds();
}

void flashLeds(){
   //
   // loop through the array
   //
   for (unsigned int i = 0; i < sizeof(ledArray); i++) {
      //
      // switch the pins on by on on for 100 msec
      //
      digitalWrite(ledArray[i], HIGH);
      delay(100);
      digitalWrite(ledArray[i], LOW);
      //
      // delay 100 msec between each led
      // except the last one. That should be 1 second
      //
      if(i != (sizeof(ledArray) -1)) {
         delay(100);
      } else {
         delay(1000);
      }

   }
}
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 » 24 Jun 2013, 18:23

beste nico

kijkende naar de code dan neemt de code die jij voorstelt best wat ruimte in het is nog aardig wat tekst
het lijkt mij alleen wel beter geen idee waarom het voordeel lijkt mij vooral te zitten in het feit dat het programma dan gewoon door loopt
zou je mij wat meer info kunnen geven over waarom het beter zou zijn om jou stukje tekst te gebruiken dan wel mij stukje tekst
zodat ik dat beter kan begrijpen

ik heb vandaag een poging gedaan om een temperatuur sturing te maken en dat lijkt gelukt
mag ik jou vragen hier naar te kijken wat ik namelijk niet goed krijg is dat de uitlezing een temperatuur aan geeft tussen de 0 en zeg 40 graden wat doe ik fout ?
Code: Alles selecteren
 float tempc;
 
int tempPin = 0; // is data temp lm35
int ledPin =13; //is de led port die we gaan gebruiken als test
int fan1 = 5; // zit op port 5



void setup ()
{
 Serial.begin(9600);
 pinMode(ledPin, OUTPUT);
 pinMode(fan1, OUTPUT);
}


void loop()
{
 tempc = analogRead(tempPin);//talking the temp
 tempc =(5.0*tempc*100.0)/1024.0;//convert temp in gragde
Serial.println((byte)tempc);
if (tempc>25)//hier temp invullen wanneer hij aan of uit moet gaan
{
  digitalWrite(ledPin, HIGH);
  digitalWrite(fan1, HIGH);
}
 else
 {
  digitalWrite(ledPin,LOW);
  digitalWrite(fan1,LOW);
 }

delay(3000);


en zou je mij een hint kunnen geven hoe ik het nu verder aan moet pakken
want wat ik wil is dat de schakeling aan of uit gaat aan de hand van de temperatuur
maar dan alleen als het tijd programma loopt
wat ik bedoel
ik druk op knop 1
timer 1 gaat aftellen van 60 minuten naar 0
in deze tijd wil ik de temperatuur op 20 graden houden
arduino leest om de 5 seconden de temperatuur en vergelijkt deze met een vaste waarde die is ingesteld op 20 graden
komt het hier onder dan gaat relais 1 van fan 1 uit kom ik er boven dan gaat relais 1 van fan 1 weer aan
dit blijft zo werken tot dat de timer weer op 0 staat

ik hoop dat ik het een beetje begrijpelijk heb omschreven

maar waar moet de tekst nu tussen ?

groet dirk ambu

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

Re: timer starten met knop ?

Berichtdoor nicoverduin » 24 Jun 2013, 18:44

Een van de redenen dat ik een voorstander van mijn stijl van programmeren is:
a) ik al gauw 5x tot 10x zoveel commentaar erin knal
b) Ik een vervent tegenstander ben van hardcoded programming. Dus zoveel mogelijk externe definities
c) ik van mening ben dat ik wat flexibeler ben als ik de volgorde van de leds wil wijzigen of er ff een led bij wil doen. Dat is bij mij 2 regels aanpassen en klaar.
Heb je het programma al getest wat je nu hierboven laat zien?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: timer starten met knop ?

Berichtdoor nicoverduin » 24 Jun 2013, 19:48

Dit zou het dan worden:
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             3             // pin 3
#define RELAY2             4            // pin 4
#define SWITCH1            5            // pin 5
#define SWITCH2          6            // pin 6
#define TEMP_SENSOR1      0            // analog pin A0 Sensor1
#define TEMP_SENSOR2      1            // analog pin A1 Sensor2
#define TEMP_SET1         2            // analog pin A2 set temp 1
#define TEMP_SET2         3            // analog pin A3 set temp 2
//
// other settings
//
#define ON                LOW            // on/off
#define OFF             HIGH
#define TIME_TO_PRESS       5000L         // time to push button for reset
#define HOUR            3600000L      // 3.6 million milliseconds in hour
#define QUARTER            900000L         // 900000 millsecs in 15 minutes
#define FIVEMINUTES         300000L         // 5 minutes period
#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(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);
   //
   // 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, timer1Counter);
   timer2Counter    = processTimer(SWITCH2, RELAY2, timer2Counter);
   //
   // process temperature
   //
   temp1Counter   = processTemperature(RELAY1, TEMP_SENSOR1, setTemperature1, temp1Counter, timer1Counter);
   temp2Counter   = processTemperature(RELAY2, 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);
         } else {
            //
            // switch the relay off
            //
            digitalWrite(relay, 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;
}
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 » 24 Jun 2013, 21:22

nicoverduin schreef:Een van de redenen dat ik een voorstander van mijn stijl van programmeren is:
a) ik al gauw 5x tot 10x zoveel commentaar erin knal
b) Ik een vervent tegenstander ben van hardcoded programming. Dus zoveel mogelijk externe definities
c) ik van mening ben dat ik wat flexibeler ben als ik de volgorde van de leds wil wijzigen of er ff een led bij wil doen. Dat is bij mij 2 regels aanpassen en klaar.
Heb je het programma al getest wat je nu hierboven laat zien?


beste nico

bovenstaande code had ik vanmiddag werkend alleen geeft hij een waarde tussen de 0 en 255 maar ik wil graag 0 tot 40 graden geen idee wat ik fout doe
ik denk dat hier iets fout zit
Code: Alles selecteren
tempc =(5.0*tempc*100.0)/1024.0;/

deze tekst heb ik van internet geplukt omdat het niet wilde lukken
al bij al begint het toch al echt iets te worden
ik wil proberen om hierop door te bouwen en er een thermostaat van te maken voor in de woonkamer
alleen dat is nog wel ver weg want dan moet ik op basis van de dag in de week programmeren
al ben ik wel al wat stukken code tegen gekomen op het net

maar eerst dit maar even afmaken

bedankt voor het toevoegen van de code voor de temperatuur
die ga ik even proberen en proberen te ontcijferen

groet dirk ambu

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

Re: timer starten met knop ?

Berichtdoor nicoverduin » 24 Jun 2013, 21:41

Dan moet je dit maar eens goed doorlezen : http://playground.arduino.cc/Main/LM35HigherResolution

De formule is o zich juist. Een LM35 geeft een spanning tot rond de 1V af. Door de referentiespanning op 1.1 te zetten wordt de analoge poort beter gebruikt tot zo goed als 100%.
Ik zou trouwens zelf de formule: tempc = (5.0 * float(tempc) * 100.0) / 1024.0;

Daarnaast is het soms wat beter om de variabelen te splitsen. Is gemakkelijker om te debuggen.
Daarnaast lees je een unsigned integer analogRead() en stop je in een float. Dat is de goden verzoeken.

De analoge poort geeft een waarde af tussen de 0-1023 (10 bits = 2^10). De waarde die je dan leest is bereik * waarde in volts. Het bereik is standaard Vcc = rond de 5V. Je moet dus eerst de waarde in een int veld lezen en dan in de formule evt. converteren als float.

om een float af te drukken kun je beter dit gebruiken
Code: Alles selecteren

char str[50];
dtostrf(str, 5, 3, floatingPointGetal);
Serial.write(str);
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 » 27 Jun 2013, 22:11

beste nico

bedankt voor de info
waar ik nog tegen aanloop zijn de ledjes
wat ik zou willen is dat
als relay1 HIGH is dan is ook ledPin1 HIGH en ledpin2 LOW
en anders
als relay1 LOW is dan is ledpin1 LOW en ledpin2 HIGH


iederen verandering die ik maak levert een error op die ik er niet uit krijg

ik hoor het graag

groet dirk

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

Re: timer starten met knop ?

Berichtdoor nicoverduin » 27 Jun 2013, 22:50

welke error?
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 » 28 Jun 2013, 08:58

beste Nico

ik dacht dat ik op deze plek de leds toe zou moeten voegen
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, timer2Counter);
       //
       // process temperature
       //
       temp1Counter   = processTemperature(RELAY1, TEMP_SENSOR1, setTemperature1, temp1Counter, timer1Counter);
       temp2Counter   = processTemperature(RELAY2, TEMP_SENSOR2, setTemperature2, temp2Counter, timer2Counter);
    }
zoals ik in boven staande ledPin1 heb toegevoegd maar dan krijg ik de volgende error

termostaat_2.cpp.o: In function `loop':
C:\Program Files\Arduino/termostaat_2.ino:139: undefined reference to `processTimer(int, int, int, unsigned long)'
ik maak hier uit op dat er ergens is aangegeven dat er een verwijzing is die zegt dat er maar 3 items mogen worden aangeroepen klopt dit ? of zit ik fout ?

ik hoor het graag
groet dirk

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 18 gasten