timer starten met knop ?

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

Re: timer starten met knop ?

Berichtdoor dirk ambu » 06 Okt 2013, 19:44

hoi nico

dat casting begrijp ik niet en ik kan niet precies vinden op google wat het is
het probleem heb ik wel weten op te lossen en dat viel niet mee
ik heb een hoop veranderd maar het werkt

nu de volgende uitdaging
twee arduino,s aan elkaar koppelen

heeft iemand een tip een voorbeeld waar ik iets van kan leren

Advertisement

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

Re: timer starten met knop ?

Berichtdoor nicoverduin » 06 Okt 2013, 20:00

Die heb je meerdere malen gehad:
- de code netjes maken
- I2C heb je niet goed staan
Maar je slaat ze allemaal in de wind.
En Casting c++ geeft toch voldoende mogelijkheden
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, 21:26

hoi nico

ik heb de code een stuk op geruimd maar ik ben nog bezig met de juiste informatie toe te voegen zodat het voor iedereen leesbaar is
dat I2C dat ik niet goed heb staan dat begrijp ik niet goed
ik heb de code zo werkend van internet geplukt en wat aangepast ik denk dat de waardes die nu serial lijkt aan te sturen een verwijzing is naar de library
ik maak gebruik van een ander library dan die standard bij mijn arduino software zat
maar ik ben beginnend dus ik kan het zeker mis hebben

ik begrijp uit jou antwoorden dat het lcd scherm een adres heeft om hem mee aan te sturen hoe kan ik dat achterhalen ?

en met ze in de wind slaan ik begrijp het gewoon niet
dus heb ik het hele weekend zitten zoeken op internet en in het programma zitten spitten
ik heb wel gemerkt dat het uitprinten van de code mij een hoop inzicht geeft

over het casting
begrijp ik het goed dat je daarmee ergens een waarden vast kan zetten waardoor je door het intypen van casting deze waarde op die plek zet ?


zeg casting1 = (5.0 * tempReading2 *100)/1024.0;

krijg ik dan het volgenden ?

convertedTemp1 = casting1
convertedTemp2 = casting1

of zit ik er echt helemaal naast ??

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

Re: timer starten met knop ?

Berichtdoor dirk ambu » 09 Okt 2013, 21:12

beste nico

ik begin zo langzaamaan hoofdpijn te krijgen van mijn project
ik kom er net achter dat als ik een timer laat lopen van een van de knoppen dat dan de waarde van de lm35 veranderd
en als ik aan de potmeters draai dat ze dan ook veranderen
ik begrijp er niets meer van
ik heb al veel lopen zoeken in de software en de hard ware maar ik kan het niet vinden
iedere keer als ik denk twee stappen vooruit te gaan dan ga ik vaak ook weer 3 stappen achteruit pffff


dus ik ben weer terug gegaan naar de door jou gemaakte software om te kijken of het daar ook al was
en ja ook daar heb ik het probleem
[list=]
temperatuur uitlezen ter controle
convertedTemp 7.69
tempset 15
convertedTemp 7.86
tempset 15
convertedTemp 7.86
tempset 15
convertedTemp 7.69
tempset 35 potmeter 1 A2 draai ik hier naar vol
convertedTemp 7.86
tempset 35
convertedTemp 9.23 lm 35 waarde stijgt ?
tempset 35
convertedTemp 6.32 lm 35 waarde zakt ik doe niets ?
tempset 35
convertedTemp 8.54
tempset 35
convertedTemp 6.15
tempset 35
convertedTemp 8.72
tempset 15
convertedTemp 6.32
tempset 15
convertedTemp 12.82 hier draai ik aan potmeter 2 die op A3 zit aan gesloten
tempset 15
convertedTemp 9.57
tempset 15
convertedTemp 7.52
tempset 15
convertedTemp 9.74
tempset 15
[/list]


enige idee wat hier fout gaat ?

Code: Alles selecteren


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

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



    //
    // global variables
    //
    unsigned long    timer1Counter;              // timer 1
    unsigned long    timer2Counter;              // timer 2
    unsigned long    temp1Counter;               // timer 1 for temperature
    unsigned long    temp2Counter;               // timer 2 for temperature
    float            temperatureSensor1;         // temperature sensor 1
    float            temperatureSensor2;         // temperature sensor 2
    unsigned int     setTemperature1;            // set temperature 1
    unsigned int     setTemperature2;            // set temperature 2
    //
    // arduino pins
    //
    // 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                  900000L       // 3.6 million milliseconds in hour 3600000L
    #define QUARTER               90000L       // 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()
    {
       Serial.begin(9600);
       //
       // 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;
       //
       // serial controlen uitlezing
       //
         Serial.begin(9600);
         Serial.print("temperatuur uitlezen ter controle");
         Serial.println();
       
       
    }

    /**
     * @name Loop()
     * continues to loop through this routine until Arduino is switched off
     * This routine just processes each timer in sequence
     */
    void loop()
    {

       //
       // read temperature settings from potmeters
       //
       setTemperature1 = map(analogRead(TEMP_SET1), 0, 1023, 15,35);
       setTemperature2 = map(analogRead(TEMP_SET2), 0, 1023, 15,35);
       //
       // process timers
       //
       timer1Counter = processTimer(SWITCH1, RELAY1, LEDPIN1, LEDPINN2, timer1Counter);
       timer2Counter = processTimer(SWITCH2, RELAY2, LEDPIN3, LEDPINN4, timer2Counter);
       //
       // process temperature
       //
       temp1Counter   = processTemperature(RELAY1, LEDPIN1, LEDPINN2, TEMP_SENSOR1, setTemperature1, temp1Counter, timer1Counter);
       temp2Counter   = processTemperature(RELAY2, LEDPIN3, LEDPINN4, TEMP_SENSOR2, setTemperature2, temp2Counter, timer2Counter);
    }

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

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

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

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

       //
       // check if a button is pressed
       // if so check if it is a TIME_TO_PRESS press
       //
       if (deBounce(button) == ON){
          //
          // button is pressed. No see for how long
          //
          localCounter = millis();
          //
          // now wait until button is released so don't forget to let go :)
          //
          while(1) {
             //
             // check if button is released
             //
             if (deBounce(button) == OFF){
                //
                // yes so quit this loop
                //
                break;
             }
          }
          //
          // the button is released check if we are passed the time limit
          // the time is corrected for 2 x the DEBOUNCE_TIME as this time is
          // already lost in the deBounce routine.
          //
          if ((millis() - localCounter) >= (TIME_TO_PRESS - (DEBOUNCE_TIME * 2))) {
             //
             // yes so switch the relay off
             //
             returnCounter = 0L;
             digitalWrite(relay, LOW);
             digitalWrite(ledpinn,LOW);
           
          } else {
             //
             // The time pressed was less than the TIME_TO_PRESS so check
             // if we have to switch the relay on for one hour or add 15 minutes
             //
             if (returnCounter == 0L) {
                //
                // No it wasn't so switch the relay on and set the timer
                //
                returnCounter = millis() + HOUR;
                //
             } else {
                //
                // it was already running so just add 15 minutes
                //
                returnCounter += QUARTER;
             }
          }
       } else {
          //
          // no button was pressed so just check the timer
          //
          if (millis() >= returnCounter) {
             //
             // yes so switch off the relay and the timer
             //
             returnCounter = 0L;
             digitalWrite(relay, LOW);
             digitalWrite(ledpinn, 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) {
        // Serial.print("timerCtr");
        // Serial.println(timerCtr);
          //
          // 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;
             //
             // serial print ter controle
             //
             Serial.print("convertedTemp  ");
             Serial.println(convertedTemp);
             
                 Serial.print("tempset  ");
              Serial.println(tempSet);
             //
             // now check if we are above the set temperature
             //
             if (convertedTemp > tempSet) {
               //
               //serial print de set temperatuur
               //
         
               
                //
                // 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;
             
         //  Serial.print("tempCtr  ");
       //    Serial.println(tempCtr);
          }
      } else {
          //
          // no activity so reset the tempCtr timer
          //
         tempCtr = 0L;
        }
       //
       // and hand the timer back
       //
       return tempCtr;
    }





ik hoor het graag

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

Re: timer starten met knop ?

Berichtdoor nicoverduin » 09 Okt 2013, 21:50

Je waarneming klopt precies. Dat is wat je toen wilde. als de timers lopen, moest er gemeten worden en werken de knoppen. Dus het programma doet precies wat je toen wilde.
Wat is de waarde van de potmeters die je gebruikt?
De oorzaak van zwevende meting komt omdat je geen gebruik maak van een referentie spanning (dat is een andere setting voor de analogRead en een andere formule).
Het lijkt erop dat de 5V van de arduino (want dat is nu de referentie spanning) niet stabiel genoeg is. Een beetje zweving geeft elke keer een andere integer waarde terug bij de analogRead en dus ook een andere temperatuur lezing.
De LM35 heeft maar een beperkt bereik voor de analoge waarde waardoor een beetje zweving gelijk een andere waarde geeft.
Oorzaken van voeding zweving:
- leds die aangesloten zijn zonder de serie weerstand (ook heel goed voor het slopen van de processor)
- relais direct aansluiten op een pin zonder een transistor of optokoppelaar
- teveel periferie op de 5V aansluiting
Vooralsnog doet de software het goed.
Laatst gewijzigd door nicoverduin op 09 Okt 2013, 22:07, in totaal 1 keer gewijzigd.
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 » 09 Okt 2013, 22:07

dus ik begrijp dat mijn uitleg niet geheel was zoals ik het bedoelde

de potmeters zijn 10k

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

Re: timer starten met knop ?

Berichtdoor nicoverduin » 09 Okt 2013, 22:08

dirk ambu schreef:dus ik begrijp dat mijn uitleg niet geheel was zoals ik het bedoelde

de potmeters zijn 10k
Dan heb je nog een mooie uitdaging. Zie verder ook mijn andere opmerkingen boven.
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 » 09 Okt 2013, 22:16

hoi nico

ik heb de leds aangesloten door alleen op de min een weerstand te gebruiken is dit fout ?
voor de relais heb ik gebruik gemaakt van een relais kaartje zoals deze http://www.marktplaats.nl/a/hobby-en-vr ... ousPage=lr
teveel periferie ? dat zeg mij helemaal niets


om gebruik te maken van een referentie spanning doe ik dit in de code hieronder wel ?

Code: Alles selecteren
    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 *100)/1024.0;
    convertedTemp2 = (5.0 * tempReading2 *100)/1024.0; 
   // Serial.println(TEMP_SENSOR1);   
   
   //setTemperature1 = map(analogRead(TEMP_SET1), 0, 1023, 0,3500);
   
 
 // Serial.println(convertedTemp1);
  // Serial.println(convertedTemp2);
   
     int value = analogRead(TEMP_SENSOR1);
     float millivolts1 = (value / 1023.0) * 5000;
     float celsius1 = millivolts1 / 10;

     int value3 = analogRead(TEMP_SENSOR2);
     float millivolts2 = (value3 / 1023.0) * 5000;
     float celsius2 = millivolts2 / 10;
     
     int value4 = analogRead(TEMP_SET1);
     float millivolts3 = (value4 / 1023.0) * 350;
     float celsius3 = millivolts3 / 10;
     
     int value5 = analogRead(TEMP_SET2);
     float millivolts4 = (value5 / 1023.0) * 350;
     float celsius4 = millivolts4 / 10;
     //
     //



want dit heb ik gebruikt in de sketch die ik nu aan het maken ben
alleen gebruik ik dit hier voor om de waarde weer te geven op het lcd scherm
en dat kijkt goed te werken deze gaat niet mee of bijna niet met het verdraaien van de potmeters


ik hoor het graag

al zijn de aspirientjes nu wel bijna op

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

Re: timer starten met knop ?

Berichtdoor dirk ambu » 09 Okt 2013, 22:20

nicoverduin schreef:
dirk ambu schreef:dus ik begrijp dat mijn uitleg niet geheel was zoals ik het bedoelde

de potmeters zijn 10k
Dan heb je nog een mooie uitdaging. Zie verder ook mijn andere opmerkingen boven.



doel je dan op de 10k potmeters ?

of de spanning want de voeding die ik nu gebruik is erg stabiel hij geeft alleen 12,3 volt af bij 4 ampère

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

Re: timer starten met knop ?

Berichtdoor nicoverduin » 09 Okt 2013, 22:34

teveel periferie betekent andere apparaten die ook aan de 5V hangen. De spanningsregelaar van de Arduino kan max 500mA aan. En als je een 12V adapter gebruikt is het vaak nog minder omdat die regulator te heet gaat worden. Ik weet niet waar de relais hun 5V vandaan halen? van de 5V pin? Want alles bij elkaar zou best wel eens de reden kunnen zijn voor een instabiele voeding. De processor kan daar op zich wel tegen, maar als je een analoge lezing wil doen met een LM35 die in jouw geval een bereik heeft van 10mV / C = bij bereik van 0-35 graden slechts 350mV. Het bereik van de analog pin is 0-5V dus 0.35V/5V = ongeveer 8% van het hele bereik wordt in jouw geval gebruikt.
En dan ga je ook nog met 2 cijfers achter de komma werken.....
als je een hogere precisie wil gebruiken moet je gebruik gaan maken van de referentie spanning van de Arduino (zie : http://playground.arduino.cc/Main/LM35HigherResolution). zie tevens onderste stuk over de 0.5 graden nauwkeurigheid.
Maar dat geldt dan voor alle analoge pinnen. Dus ook voor de potmeters. Daar zal iets anders voor verzonnen moeten worden.
En van die asperientjes.... tja ieder zijn vak.... ik doe dit pas 38 jaar..... geen hoofdpijn :)
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 24 gasten