Delay zonder andere functies te verstoren

Arduino specifieke Software
Berichten: 6
Geregistreerd: 12 Mei 2013, 20:17

Delay zonder andere functies te verstoren

Berichtdoor sammie72 » 12 Mei 2013, 21:02

Hoi, mijn eerste post dus zal me even voorstellen: Sander, 40 jaar, net begonnen met Arduino, al een hele tijd met Honda brommers bezig (oude 4-takt). Nu ben ik bezig om mijn oude Honda Chaly te restaureren cq modificeren en probeer ik oud
en nieuwe technologie te verenigen. Ik heb een relais bordje met 4 relais erop, die wil ik gebruiken om A) contact aan/uit te doen (geen sleutel meer nodig want ik rijd alleen nog meetings ed dus voor diefstal cq misbruik ben ik echt niet bang), B) licht moet automatisch aan gaan naarmate het donker word of dat ik een tunnel/donker gebied in ga (ik maak gebruik van een simpele fotocel hiervoor, en C) nog 1 drukknop om te schakelen tussen groot en dim licht. Nu werkt alles goed alleen zou ik een vertraging willen inbouwen zodat ik als ik de tunnel uitga nog een seconde of 5-6 licht aan heb (vraag me niet waarom ;) ). Nu heb ik dit geprobeerd met de DELAY functie maar als ik die gebruik kan ik in die 5-6 sec. geen andere dingen meer doen (nu nog geen probleem maar ik wil de functies straks nog uitbreiden) Hoe kan ik dit het beste aanpakken is nu mijn vraag?

Code: Alles selecteren
#include <Bounce.h>
#define BUTTON1 2                        // knop aan/uit op pin 2
#define relayPin2 9                      // 2de relais op relaisbord pin in2
#define BUTTON2 3                        // groot/klein licht op pin 3
#define relayPin3 10                     // 3de relais op relaisbord pin in3

int sensorPin = 0;              // pin 0 op arduino voor fotocel
int sensorValue = 0;            // variable to store the value coming from the photocell
int relayPin1 = 8;                       // licht relais op pin 8

int ledValue1 = LOW;

                                        // Instantiate a Bounce object with a 5 millisecond debounce time
Bounce bouncer = Bounce( BUTTON1,5 );
Bounce bouncer2 = Bounce( BUTTON2,5 );

void setup() {
 Serial.begin(9600);                    // Zet baud rate naar 9600 op de Arduino
  pinMode(relayPin1, OUTPUT);           // zet de relaisPin1 als een uitgang pin 8
  pinMode(BUTTON1,INPUT);               // zet de button1 als een ingang  pin 2
  pinMode(BUTTON2,INPUT);               // zet de button2 als een ingang  pin 3
  pinMode(relayPin2,OUTPUT);            // zet de relaisPin2 als een uitgang pin 9
  pinMode(relayPin3,OUTPUT);            // zet de relaisPin3 als een uitgang pin 10
 
 }

void loop() {{

  sensorValue = analogRead(sensorPin);  // lees de waarde van de ingang pin lichtsensor
  Serial.println(sensorValue);          // print de waarde naar de  Seriële monitor
  delay(200);

      if (sensorValue < 500)            // als het donker is zet dan het relais aan, licht schakelt aan

      {
              digitalWrite(relayPin1, HIGH);
             
      }
      else
     
      {
       digitalWrite(relayPin1, LOW);    // houd anders het relais uit
      }

}
 
 if ( bouncer.update() ) {              // schakelen tussen groot en dim licht via relais, zodra het donker wordt schakelt relais 1 in
     if ( bouncer.read() == HIGH) {     // en die spanning gaat naar relais 2 (als wisselschakelaar) zodat ik kan switchen met drukknop tussen groot en dim
       if ( ledValue1 == LOW ) {
         ledValue1 = HIGH;
       } else {
         ledValue1 = LOW;
       }
       digitalWrite(relayPin2,ledValue1);
     }
   }
   if ( bouncer2.update() ) {          // simpele aan/uit schakelaar om mijn contact aan te zetten, brommer wordt alleen op meetings gebruikt dus geen zorgen over
     if ( bouncer2.read() == HIGH) {   // misbruik/diefstal. Er komen wel bypass schakelaars in mocht Arduino systeem de geest geven oid.
       if ( ledValue1 == LOW ) {
         ledValue1 = HIGH;
       } else {
         ledValue1 = LOW;
       }
       digitalWrite(relayPin3,ledValue1);
 
 
     }

   }
}


Advertisement

Berichten: 9
Geregistreerd: 20 Feb 2013, 20:43

Re: Delay zonder andere functies te verstoren

Berichtdoor ON5MF » 12 Mei 2013, 21:28

delay() is een commando die je eigenlijk moet mijden als de pest. (Tenzij je echt weet waarom je ze nodig hebt)

Een andere, betere manier om een vertraging in te bouwen kan je zien in Blink Without Delay
huidig Arduino project: universele banddecoder om volautomatisch antennes en bandpasfilters te schakelen

Gebruikers-avatar
Berichten: 229
Geregistreerd: 20 Jan 2013, 12:01

Re: Delay zonder andere functies te verstoren

Berichtdoor astrofrostbyte » 12 Mei 2013, 23:01

Voor het sturen van je brommerverlichting als het donker of licht wordt zou je de vertraging ook kunnen vervangen door een diepe middeling.
Dit geeft dan automatisch een vertraging afhankeijk van samplingtijd en middelingsdiept, en het geheel is minder gevoelig voor kortstondige donker/licht momenten.

Mischien ook kijken of het mogelijk is om de photocel alleen gevoelig te maken voor zonlicht en ongevoelig voor kunstmatig licht.
Gear: Arduino- Uno,Due,Ethernet,Mega2560 , OLS LogicAnalyser, TDS1002, Rigol DG1022, J-Link EDU, BusPirate

Berichten: 6
Geregistreerd: 12 Mei 2013, 20:17

Re: Delay zonder andere functies te verstoren

Berichtdoor sammie72 » 13 Mei 2013, 07:18

Hartelijk bedankt beide heren. Omdat ik vrij nieuw ben met arduino en zijn taal moet ik denk ik gaan voor de eerste optie die genoemd is, ik had gisteren even gekeken naar de "blink without delay" functie en denk dat ik daar wel uit kan komen als ik er even voor ga zitten. De 2de optie zegt mij helemaal niets helaas, dat is echt iets teveel voor mij maar toch hartelijk dank voor het aandragen van deze tip :D . Als ik wat verder ben gekomen dan laat ik het even weten.

Berichten: 6
Geregistreerd: 12 Mei 2013, 20:17

Re: Delay zonder andere functies te verstoren

Berichtdoor sammie72 » 13 Mei 2013, 16:01

Nu ben ik al een x aantal uren aan het "studeren" om deze simpele code te doorgronden en er een "gewone" delay mee te maken, ik zie het alleen niet. Heb al verschillende manieren geprobeerd om de code te implementeren in mijn code maar of het relay gaat knipperen of ik zie het ledje van het relais zwak branden wat ook niet helemaal de bedoeling is. Wat doe ik fout?

als ik hieronder onder digitalWrite.... "delay(4000);" werkt het wel gewoon maar zodra ik aan de slag ga met de BlinkWithoutDelay gaat het hier niet goed.

Code: Alles selecteren
 if (sensorValue < 500)            //als het donker is zet dan het relais aan
     
      {
              digitalWrite(relayPin1, HIGH);
       
      }

Berichten: 9
Geregistreerd: 20 Feb 2013, 20:43

Re: Delay zonder andere functies te verstoren

Berichtdoor ON5MF » 13 Mei 2013, 17:46

Even doorredeneren op de BlinkWithoutDelay:
- telkens de waarde van je sensor < 500 moet je de timer resetten: StartTime=millis()
- je lamp mag pas uitgaan 5 seconden na de laatste reset van je timer: if StartTime+5000>=millis()

=> niet vergeten de variabele StartTime te declareren: long StartTime=0

Code: Alles selecteren
      if (sensorValue < 500)            // als het donker is zet dan het relais aan, licht schakelt aan
      {
              digitalWrite(relayPin1, HIGH);
              Starttime=millis();             
      }
      else if (StartTime+5000>=millis())     
      {
       digitalWrite(relayPin1, LOW);    // houd anders het relais uit (of zet het uit...)
      }


Er zijn vermoedelijk nog wel andere oplossingen en ik heb deze niet getest (geen Arduino bij de hand momenteel) maar dit zou moeten werken denk ik.

En je loop blijft hierdoor wel draaien, met delay() hangt ie telkens een tijdje.
huidig Arduino project: universele banddecoder om volautomatisch antennes en bandpasfilters te schakelen

Berichten: 6
Geregistreerd: 12 Mei 2013, 20:17

Re: Delay zonder andere functies te verstoren

Berichtdoor sammie72 » 13 Mei 2013, 18:48

Hoi,

je oplossing gaat bij mij niet werken helaas, denk dat na else if (StartTime+5000>=millis()) nog iets mist...en dat is eigenlijk wat mij dus al de hele dag bezig houd.

Ik had ook zoiets in mijn hoofd dat de sensor <500 de timer moest resetten maar een simpele "delay" is hiermee nog niet gemaakt helaas.

Berichten: 9
Geregistreerd: 20 Feb 2013, 20:43

Re: Delay zonder andere functies te verstoren

Berichtdoor ON5MF » 13 Mei 2013, 20:45

Wat doet ie of doet ie niet als je hem laat lopen?

Met 'het werkt niet' zonder details kan niemand een diagnose stellen.

Maar er stak sowieso al een foutje in de code die ik doorstuurde. (ontbrekende hoofdletter in 1 van de StartTime) Deze is beter:
Code: Alles selecteren
          if (sensorValue < 500)            // als het donker is zet dan het relais aan, licht schakelt aan
          {
                  digitalWrite(relayPin1, HIGH);
                  StartTime=millis();             
          }
          else if (StartTime+5000>=millis())     
          {
           digitalWrite(relayPin1, LOW);    // houd anders het relais uit (of zet het uit...)
          }
huidig Arduino project: universele banddecoder om volautomatisch antennes en bandpasfilters te schakelen

Berichten: 6
Geregistreerd: 12 Mei 2013, 20:17

Re: Delay zonder andere functies te verstoren

Berichtdoor sammie72 » 13 Mei 2013, 20:52

Aha, gevonden:

Code: Alles selecteren
      if (sensorValue < 500)            // als het donker is zet dan het relais aan, licht schakelt aan
      {
              digitalWrite(relayPin1, HIGH);
              Starttime=millis();             
      }
             if (millis() - StartTime) >= 5000)   //kan iemand even aangeven of perse de "else" hier nog voor moet?   
      {
       digitalWrite(relayPin1, LOW);    // houd anders het relais uit (of zet het uit...)
      }


Dit werkt nu dus zoals het moet werken, vraag mij alleen af of ik de "else" er nog in moet zetten?

Berichten: 6
Geregistreerd: 12 Mei 2013, 20:17

Re: Delay zonder andere functies te verstoren

Berichtdoor sammie72 » 13 Mei 2013, 21:03

ON5MF schreef:Wat doet ie of doet ie niet als je hem laat lopen?

Met 'het werkt niet' zonder details kan niemand een diagnose stellen.

Maar er stak sowieso al een foutje in de code die ik doorstuurde. (ontbrekende hoofdletter in 1 van de StartTime) Deze is beter:
Code: Alles selecteren
          if (sensorValue < 500)            // als het donker is zet dan het relais aan, licht schakelt aan
          {
                  digitalWrite(relayPin1, HIGH);
                  StartTime=millis();             
          }
          else if (StartTime+5000>=millis())     
          {
           digitalWrite(relayPin1, LOW);    // houd anders het relais uit (of zet het uit...)
          }


Die van de hoofdletter had ik al snel opgemerkt, het probleem was eigenlijk dat het relais aan ging maar net zo hard weer uit ging zonder "delay". Nu heb ik deze (millis() - StartTime) >= 5000) en dat werkt dus wel . Het is voor een nieuweling soms best lastig om oplossingen te vinden, alhoewel de delay functie voor mij super makkelijk was begrijp ik ook dat de delay functie zijn beperkingen had en zodoende alles "on hold" zette. Nu heb ik mijzelf met behulp van jullie weer over een drempel gezet en zodoende weer wat geleerd. Dus bedankt voor de hulp bij deze :)

Volgende

Terug naar Arduino software

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 10 gasten