timer starten met knop ?

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

Re: timer starten met knop ?

Berichtdoor dirk ambu » 21 Jun 2013, 17:57

hoi nico
dat klinkt wel een beetje gemeen

ik kom er niet uit ook niet met millis() ik begrijp het gewoon niet :oops:

maar ik geef het nog niet op

groet dirk ambu

Advertisement

Berichten: 85
Geregistreerd: 10 Jan 2013, 14:51
Woonplaats: Waddinxveen

Re: timer starten met knop ?

Berichtdoor Karel » 21 Jun 2013, 18:03

millis() is een functie die 1000sten van seconden sinds het starten van de sketch weergeeft.
Iedere seconde is de waarde die millis() teruggeeft 1000 hoger.
Als jij op je knop drukt en een uur uitstel wilt moet je dus wachten totdat millis() 3.600.000 hoger is dan NU.

Helpt dit?

Groet, Karel
If you think education is expensive, try ignorance! (Derek Bok)

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

Re: timer starten met knop ?

Berichtdoor nicoverduin » 21 Jun 2013, 18:25

dirk ambu schreef:hoi nico
dat klinkt wel een beetje gemeen

ik kom er niet uit ook niet met millis() ik begrijp het gewoon niet :oops:

maar ik geef het nog niet op

groet dirk ambu

Het is sowieso niet gemeen bedoeld maar eerder om je uit te dagen. wat je eerst moet doen is proberen het probleem te beschrijven en op te delen in deel problemen. Eventueel kun je dat uittekenen met een flowchart programma. En daar ik vragen stelde over je voorbeeld programma (dus niet de eerste timer vraag) geeft aan dat ik dus niet geheel begrijp wat het probleem is. De reden dat ik nog niet heb uitgelegd hoe de timers werken is omdat ik vermoed dat de kern van jouw probleem veel dichter bij huis zit (niet verkeerd bedoeld). Dus mijn eerste vraag is wat wil je nu precies bereiken?
Dat je 2 programma's in elkaar schuift is niet belangrijk. Programmeurs doen niet anders (REuse :)). Maar probeer nu eens in een beetje staccato te beschrijven wat je wilt. Dan kunnen we dat opbreken in kleinere deel problemen en dan komt het programma er zo uitrollen.
Als je het namelijk niet kan beschrijven, kan je het ook niet bouwen.... Reden waarom zoveel projecten mislukken omdat de gebruiker een "fransman" is die alleen maar Frans spreekt en de IT'er die wel een beetje Frans spreekt maar onvoldoende om de gebruiker te begrijpen. Dus laten we eerst het probleem goed beschrijven.
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 » 21 Jun 2013, 18:40

hoi karel
ik denk dat ik wel begrijp hoe je de tijd van het systeem kan opvragen maar ja wat dan ?
zeg dat de tijd nu 1000miliseconden is en ik wil daar 1000 bij doen dan is het millis() + 1000 maar hoe omschrijf ik dit in de arduino
maar ik zoek verder

groet dirk ambu

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

Re: timer starten met knop ?

Berichtdoor nicoverduin » 21 Jun 2013, 18:44

dirk ambu schreef:hoi karel
ik denk dat ik wel begrijp hoe je de tijd van het systeem kan opvragen maar ja wat dan ?
zeg dat de tijd nu 1000miliseconden is en ik wil daar 1000 bij doen dan is het millis() + 1000 maar hoe omschrijf ik dit in de arduino
maar ik zoek verder

groet dirk ambu


long tijd = millis() + 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 » 21 Jun 2013, 19:34

nicoverduin schreef:
dirk ambu schreef:hoi nico
dat klinkt wel een beetje gemeen

ik kom er niet uit ook niet met millis() ik begrijp het gewoon niet :oops:

maar ik geef het nog niet op

groet dirk ambu

Het is sowieso niet gemeen bedoeld maar eerder om je uit te dagen. wat je eerst moet doen is proberen het probleem te beschrijven en op te delen in deel problemen. Eventueel kun je dat uittekenen met een flowchart programma. En daar ik vragen stelde over je voorbeeld programma (dus niet de eerste timer vraag) geeft aan dat ik dus niet geheel begrijp wat het probleem is. De reden dat ik nog niet heb uitgelegd hoe de timers werken is omdat ik vermoed dat de kern van jouw probleem veel dichter bij huis zit (niet verkeerd bedoeld). Dus mijn eerste vraag is wat wil je nu precies bereiken?
Dat je 2 programma's in elkaar schuift is niet belangrijk. Programmeurs doen niet anders (REuse :)). Maar probeer nu eens in een beetje staccato te beschrijven wat je wilt. Dan kunnen we dat opbreken in kleinere deel problemen en dan komt het programma er zo uitrollen.
Als je het namelijk niet kan beschrijven, kan je het ook niet bouwen.... Reden waarom zoveel projecten mislukken omdat de gebruiker een "fransman" is die alleen maar Frans spreekt en de IT'er die wel een beetje Frans spreekt maar onvoldoende om de gebruiker te begrijpen. Dus laten we eerst het probleem goed beschrijven.


beste Nico

ik begrijp je bedoeling maar het is soms wat frustrerend maar ik zal proberen om het te beschrijven

project omschrijving
ik heb twee ruimtes die geventileerd moeten worden als de temperatuur te hoog wordt
in de ruimtes zitten koel vans die lucht aanzuigen uit een kelder
als de temperatuur te hoog wordt dan wil ik op een knop drukken waardoor de fan gaat draaien voor 1 uur
als de temperatuur na 45 minuten niet genoeg is terug gelopen dan wil ik weer op dezelfde knop drukken waardoor er 15 minuten bij komen het de fan daardoor nog 30 minuten draait
ter controle dat de fan is aangestuurd door de arduino gaat er een ledje groen branden zodra de fan uit is gaat deze rood branden
zodra ik dit werkend heb wil ik er een thermostaat functie bij bouwen en een luchtvochtigheid sensor maar dat is pas later
dit als al lastig genoeg

wat heb ik aan hardware
1 x arduino uno
1 x Relay Shield V1.0 van Seeed Studio
1 x home made kasje met twee drukknopjes maak contacten en daar in 2 groen/rood ledjes kasje is voorzien van bekabeling
1 x voeding 12 volt

hoever ben ik
arduino uno met home made kasje werkt
de aansturing voor de koelvans werkt
hiervoor heb ik onderstaande code gemaakt / geknipt en geplakt :)

Code: Alles selecteren
const int  buttonPin = 2;      // the pin that the pushbutton is attached to pin 2 is fan 1
const int  buttonPin1 = 3;     // the pin that the pushbutton is attached to pin 3 is fan 2

const int ledPin = 9;          // the pin that the LED is attached to is groen fan 1
const int ledPin1 = 10;         // the pin that the LED is attached to is rood fan 1
const int ledPin2 = 11;        // the pin that the LED is attached to is groen fan 2
const int ledPin3= 12;          // the pin that the LED is attached to is rood fan 2

const int relayPin1 = 4;          // the pin that the LED is attached to is groen fan 1
const int relayPin2 = 5;          // the pin that the LED is attached to is groen fan 1
const int relayPin3 = 6;          // the pin that the LED is attached to is groen fan 2 
const int relayPin4 = 7;          // the pin that the LED is attached to is groen fan 2



// Variables will change:
int buttonPushCounter1 = 0;    // counter for the number of button presses
int buttonPushCounter = 0;     // counter for the number of button presses
int buttonState1 = 0;          // current state of the button
int buttonState = 0;           // current state of the button
int lastButtonState1 = 0;      // previous state of the button
int lastButtonState = 0;       // previous state of the button


void setup() {
                               
  pinMode(buttonPin, INPUT);                          // initialize the button pin as a input
  digitalWrite(buttonPin, HIGH);                      // turn on pullup resistors
  pinMode(buttonPin1, INPUT);
  digitalWrite(buttonPin1, HIGH);                     // turn on pullup resistors 
  pinMode(ledPin, OUTPUT);                            // initialize the LED as an output
  pinMode(ledPin1,OUTPUT);
  pinMode(ledPin2,OUTPUT);
  pinMode(ledPin3,OUTPUT);
 
  pinMode(relayPin1,OUTPUT);                            // initialize the relaypin as an output
  pinMode(relayPin2,OUTPUT);
  pinMode(relayPin3,OUTPUT);
  pinMode(relayPin4,OUTPUT);
}

void loop() {

  buttonState1 = digitalRead(buttonPin1);              // read the pushbutton input pin1
  if (buttonState1 != lastButtonState1)                // compare the buttonState to its previous state
    {                                                  // if the state has changed, increment the counter
      if (buttonState1 == HIGH)                        // if the current state is HIGH then the button
          {                                            // went from off to on.
          buttonPushCounter1++;                           
          }
      lastButtonState1 = buttonState1;                 // save the current state as the last state for next time through the loop
      if (buttonPushCounter1 % 2 == 0)                 // turns on the LED every four button pushes by checking the modulo of the button push counter.
                                                       // the modulo function gives you the remainder of the division of two numbers;
            {
              digitalWrite(ledPin, HIGH);
              delay(1000);                             // wait for a second
              digitalWrite(relayPin1, HIGH);
            }
       else
            {
             digitalWrite(ledPin1, LOW);
             delay(1000);                              // wait for a second
             digitalWrite(relayPin1, LOW);
            }
    }
  buttonState = digitalRead(buttonPin);                  // read the pushbutton input pin
  if (buttonState != lastButtonState)                  // compare the buttonState to its previous state
    {                                                  // if the state has changed, increment the counter
      if (buttonState == HIGH)                         // if the current state is HIGH then the button
          {                                            // went from off to on.
          buttonPushCounter++;                           
          }
 
      lastButtonState = buttonState;                   // save the current state as the last state for next time through the loop
      if (buttonPushCounter % 2 == 0)                  // turns on the LED every four button pushes by checking the modulo of the button push counter.
                                                       // the modulo function gives you the remainder of the division of two numbers;
            {
              digitalWrite(ledPin2, HIGH);
              delay(1000);                             // wait for a second
              digitalWrite(relayPin2, HIGH);
            }
       else
            {
             digitalWrite(ledPin2, LOW);
             delay(1000);                              // wait for a second
             digitalWrite(relayPin2, LOW);
            }
     }
}


misschien kan het ook anders maar dit werk op zich goed

wat wil ik graag hebben
1 systeem is standby de ledjes branden groen (ledPin en ledPin2 zijn HIGH)
2 (actie) druk op knop 1 (buttonpin)
relayPin1gaat van low naar HIGH
ledpin gaat van HIGH naar low
ledpin1 gaat van low naar HIGH
de tijd van het systeem wordt opgeroepen
hier wordt bij opgeteld 60 minuten
dit is de tijd dat de schakeling actief blijft
3 (actie2) tussentijds wordt er op knop 1 gedrukt (buttonpin) nog voordat de 60 minuten om zijn
de tijd die over is wordt opgeroepen (zeg 30 minuten)
hier wordt 15 minuten aan toegevoegd de nieuwe tijdsduur is nu weer 45 minuten en telt weer af
4 tijd is om
relayPin1gaat van HIGH naar LOW
ledpin gaat van LOW naar HIGH
ledpin1 gaat van HIGH naar LOW

meer kan ik er niet van maken ik hoop dat dit het duidelijker maakt

groet dirk ambu

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

Re: timer starten met knop ?

Berichtdoor nicoverduin » 21 Jun 2013, 21:30

Zonder dat helel led verhaal had ik dit 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 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 RELAY1             3             // pin 3
#define RELAY2             4            // pin 4
#define SWITCH1            5            // pin 5
#define SWITCH2          6            // pin 6
//
// 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 DEBOUNCE_TIME      100            // 100 mSec debounce time

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

void setup()
{
   //
   // set pins input output
   //
   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()
{
   timer1Counter = processTimer(SWITCH1, RELAY1, timer1Counter);
   timer2Counter = processTimer(SWITCH2, RELAY2, 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, 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;
            digitalWrite(relay, 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);
      }
   }
   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;
   }
}


En 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, unsigned long);
int deBounce (int);

//Do not add code below this line
#endif /* timerswitch_H_ */
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 » 21 Jun 2013, 22:55

beste Nico

bedankt voor de hulp hier had ik zelf nooit achter gekomen
ik heb het nu werkend maar nog niet helemaal ik krijg de h file niet aangemaakt of anders gezegd ik doe iets fout
echter als ik #include "timerswitch.h" uit de sketch haal dan werkt het programma wel zoals ik het zou willen

heb je een linkje hoe ik de h fil moet opslaan ?

mijn dank ik is groot
ik ga er even mee verder om de ledjes enzo er in te plakken
als ik het af heb zet de code hier weer neer

groet dirk ambu

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

Re: timer starten met knop ?

Berichtdoor nicoverduin » 21 Jun 2013, 23:03

Die .h file had je in dezelfde folder moeten zetten als waar de sketch staat. Maar als je de Arduino IDE gebruikt is het niet nodig. Ik werk met Eclipse, SVN en Doxygen en dan is het wel nodig(voor Eclipse dan). Maar probeer nu de logica erachter te volgen. En je kan nu gemakkelijk een 3e ruimte toevoegen. Gewoon een pin definieren voor het relais, de button en een counter creeren en aanroepen en je bent klaar.
's alleen jammer dat de code nog wat vernaggelt wordt. in het source staat alles keurig onder elkaar (in Eclipse dan)
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 » 21 Jun 2013, 23:09

oke dan probeer ik dat nog even
en een zondag ga ik me er verder in verdiepen morgen moet ik werken
een zondag eens kijken hoe het werkt als ik de ledjes er bij heb staan
en dan kijken hoe ik er een temperatuur sensor bij kan bouwen


groet dirk ambu

VorigeVolgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: odixlpihmave, Seo-Ul-Gag en 17 gasten