Leds aansturen

IDE gerelateerde berichten
Berichten: 15
Geregistreerd: 14 Aug 2013, 08:11
Woonplaats: Hardenberg

Leds aansturen

Berichtdoor whitedxi » 14 Aug 2013, 22:35

Beste allen,

Ik ben dus bezig om een "Drag christmas tree" te maken.
Ik probeer ondertussen veel te leren van dit arduino project om mogelijk nog meer te kunnen doen met arduino hierna.
Omdat het ineens schrijven van zo'n project niet meteen zal lukken heb ik al verschillende dingen gelezen op internet en al wat dingetjes gemaakt om meer te weten te komen over het programmeren.

Toen begonnen met het deel1 "project"
Ik wil hier de lichten van achterelkaar laten oplichten maar zonder delay functie.
Ik kwam op het volgende:

int led1 = 11;
int led2 = 10;
int led3 = 9;
int led4 = 8;
unsigned long start;
unsigned long druk1;
int knop1 = 3;
unsigned long stled1;
unsigned long stled2;
unsigned long stled3;
unsigned long stled4;


void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(knop1, INPUT);



}

void loop()
{


if (digitalRead(knop1)==HIGH)
{
start = millis();
stled1=start+500;
stled2=start+1000;
stled3=start+1500;
stled4=start+2000;
delay(250); // for debounce

}
if (millis()>=stled1)
{
digitalWrite (led1, HIGH);
digitalWrite (led2, LOW);
digitalWrite (led3, LOW);
digitalWrite (led4, LOW);
}
else if (millis()>=stled2)
{
digitalWrite (led1, LOW);
digitalWrite (led2, HIGH);
digitalWrite (led3, LOW);
digitalWrite (led4, LOW);

}

else if (millis()>=stled3)
{
digitalWrite (led1, LOW);
digitalWrite (led2, LOW);
digitalWrite (led3, HIGH);
digitalWrite (led4, LOW);

}


else if (millis()>=stled4)
{
digitalWrite (led1, LOW);
digitalWrite (led2, LOW);
digitalWrite (led3, LOW);
digitalWrite (led4, HIGH);

}
}

Waarom werkt dit niet? Waar zit de kronkel in mijn hoofd?
Ik wil de delay functie niet gebruiken omdat ik hierna een reactietimer erbij wil maken die een valse start registreerd.

Ik wacht nog op de hardware maar tot nu toe had ik dit geschreven voor het hele project wat niet werkt op het moment maar volgens mij wel beschrijft wat ik wil gaan doen uiteindelijk:






unsigned long clockstart; //start counting
unsigned long light1=500; //start counting
unsigned long light2=1000; //start counting
unsigned long light3=1500; //start counting
unsigned long reactiontimer = 1500; //reaction timer
unsigned long reactiontimerstart; //reaction timer start
unsigned long reactiontimerend; //reaction timer end
unsigned long reactiontimeelapsed; //reaction time
unsigned long tracktimestart; //Time of run start
unsigned long tracktimeend; //einde run
unsigned long tracktime; // time of run

void setup() {

Serial.begin(9600); // open communication port
pinMode(13, OUTPUT); //led pre-stage
pinMode(12, OUTPUT); //led stage
pinMode(11, OUTPUT); //geel1
pinMode(10, OUTPUT); //geel2
pinMode(9, OUTPUT); //geel3
pinMode(8, OUTPUT); //groen
pinMode(7, OUTPUT); //rood
pinMode(3, INPUT);//startknopstarter
pinMode(4, INPUT);//resetknop
}

void displayResult()
{
float h,m,s,ms;
unsigned long processortime;
reactiontimeelapsed=reactiontimerend-reactiontimerstart;
processortime=reactiontimeelapsed%3600000;
processortime=processortime%60000;
s=int(processortime/1000);
ms=processortime%1000;
Serial.print("Raw elapsed time: ");
Serial.println(reactiontimeelapsed);
Serial.print("Reactiontime: ");
Serial.print(s,0);
Serial.print("s ");
Serial.print(ms,0);
Serial.println("ms");
Serial.println();
}
void displayResult2()
{
float h,m,s,ms;
unsigned long processortime2;
tracktime=tracktimeend-tracktimestart;
processortime2=tracktime%3600000;
processortime2=processortime2%60000;
s=int(processortime2/1000);
ms=processortime2%1000;
Serial.print("Raw elapsed time: ");
Serial.println(tracktime);
Serial.print("Tracktime: ");
Serial.print(s,0);
Serial.print("s ");
Serial.print(ms,0);
Serial.println("ms");
Serial.println();

}
void loop()
{

if(analogRead(0) > 750)
{
digitalWrite(13, HIGH);
} else{
digitalWrite(13, LOW);
}
if(analogRead(1) > 750)
{
digitalWrite(12, HIGH);
} else{
digitalWrite(12, LOW);
}
if(digitalRead(3)==HIGH && digitalRead (12)==HIGH) //button pushed and stage is lit
{
Serial.println("Start signal received");
delay (250); //debounce
clockstart=millis();
}


if (clockstart = clockstart+500)
{
digitalWrite (11,HIGH);
Serial.println("Light one");
}
if (clockstart < clockstart+1000)
Serial.println("Light two");
{
digitalWrite (10,HIGH);

}
if (clockstart < clockstart+1500)
Serial.println("Light Three");
{
digitalWrite (9,HIGH);

}

if(analogRead(2) > 750 && clockstart < reactiontimer) //reaction time laser
{
Serial.println("To soon!!!"); // Laser broken before green light
Serial.println("BYE RUN!!!"); // Laser broken before green light
digitalWrite (7, HIGH); //red light
digitalWrite (9, LOW);
digitalWrite (10, LOW);
digitalWrite (11, LOW);
}
if(clockstart == reactiontimer) //start
{
Serial.println("GO!!!"); // Laser broken after green light
digitalWrite (8, HIGH);
digitalWrite (9, LOW);
digitalWrite (10, LOW);
digitalWrite (11, LOW);
reactiontimerstart=millis();
}
if (analogRead(2) < 750) //reactiontimerlaser broken
{
reactiontimerend=millis();
displayResult();
tracktimestart=millis();
}
if (analogRead(5) < 750) //end laser
{
tracktimeend=millis();
displayResult2();
}
if (digitalRead(4) == HIGH)
{
clockstart=0; //start counting RESET
reactiontimerstart=0; //reaction timer start RESET
reactiontimerend=0; //reaction timer end RESET
reactiontimeelapsed=0; //reaction time RESET
tracktimestart=0; //Time of run start RESET
tracktimeend=0; //einde run RESET
tracktime=0; // time of run RESET

}

}
*Arduino nOOb but I am learning*

Advertisement

Berichten: 15
Geregistreerd: 14 Aug 2013, 08:11
Woonplaats: Hardenberg

Re: Leds aansturen

Berichtdoor whitedxi » 14 Aug 2013, 22:36

Alvast bedankt voor het meedenken :D
*Arduino nOOb but I am learning*

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

Re: Leds aansturen

Berichtdoor nicoverduin » 15 Aug 2013, 10:16

Je kan hem toch helemaal testen zonder dat je de feitelijke hardware hebt?

Ik doe dit als volgt:

Code: Alles selecteren

#define DEBUG
void Testcases();



Dan definieer ik een zooi fake pinnen

Code: Alles selecteren
#ifdef DEBUG
//
// pin simulators
//
bool pin_BUTTON_PLAY;         // fakes the play button
bool pin_BUTTON_FF;            // fakes the FF button
bool pin_BUTTON_VOL_PLUS;         // fakes the vol+ button
bool pin_BUTTON_VOL_MIN;         // fakes the vol- button
bool pin_RESET_IN;            // fakes the reset in pin


Dan een routine om alle pinnen als CSV naar Serial te sturen

Code: Alles selecteren
#ifdef DEBUG

/**
 * @name displayPins()
 * toont alle pinnen en hun waarden in een CSV format output
 */
void displayPins(const char *str) {
   Serial.print(str);                  // meegegeven tekst
   Serial.print(";");
   Serial.print(pin_BUTTON_PLAY);         //Play Button
   Serial.print(";");
   Serial.print(pin_BUTTON_FF);            // FF Button
   Serial.print(";");
   Serial.print(pin_BUTTON_VOL_PLUS);      // Vol+ Button
   Serial.print(";");
   Serial.print(pin_BUTTON_VOL_MIN);         // VoL- Button
   Serial.print(";");
   Serial.print(pin_RESET_IN);            // Reset in
   Serial.println(";");

#endif



in de loop zet je dan boven aan het volgende zodat je je eigen testcases can toevoegen

Code: Alles selecteren
void loop()
{
#ifdef DEBUG
   Testcases();
#endif



en daar waar je een pin aftest kun je het volgende doen

Code: Alles selecteren
#ifdef DEBUG
   if (pin_BUTTON_PLAY) {
#else
   if (digitalRead(BUTTON_PLAY) == AAN) {
#endif


En als je dan de pin waarden naar de Serial wilt sturen omdat er een conditie is veranderd

Code: Alles selecteren
#ifdef DEBUG
    displayPins("Play Aangezet");
#endif


Tenslotte je eigen testcases

Code: Alles selecteren
#ifdef DEBUG
void Testcases() {

#define TESTCASE1
//#define TESTCASE2
//#define TESTCASE3
//#define TESTCASE4
//#define TESTCASE5

#ifdef TESTCASE1
   //
   // test case 1: Play 1x ingedrukten weer los gelaten
   //
   static int testCase1A = 0;  // play button = aan
   static int testCase1B = 0;  // play button is uit
   static int testCase1C = 0;  // stand na 10 seconden

   if (testCase1C == 0 && testCase1B == 1) {
      if (millis() > 10000) {
         pin_BUTTON_PLAY = false;
         testCase1C = 1;
         displayPins("Testcase 1C na 10 seconden");
      }
   }
   if (testCase1B == 0 && testCase1A == 1) {
      pin_BUTTON_PLAY = false;
      testCase1B = 1;
      displayPins("Test Case 1B play knop losgelaten");
   }
   if (testCase1A == 0) {
      pin_BUTTON_PLAY = true;
      testCase1A = 1;
      displayPins("Test Case 1A Play knop ingedrukt");
   }
#endif

}
#endif



Het ziet er misschien heel omslachtig uit, maar uiteindelijk krijg ik zo alle info als CVS in de Serial monitor die ik nog in EXCEL verder bewerk en ik kan alle toestand veranderingen volgen.
Voor je analoge inputs zou je consequent altijd in een variabele lezen en kan je deze truuk ook uithalen. Ik schrijf software voor derden op deze manier omdat ik vaak de feitelijke hardware helemaal niet hebt en op deze manier kan ik alles gewoon testen.

Haal je vervolgens het "#define DEBUG" statement eruit dan wordt niets van de DEBUG code meegenomen.

't is maar een idee.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 15
Geregistreerd: 14 Aug 2013, 08:11
Woonplaats: Hardenberg

Re: Leds aansturen

Berichtdoor whitedxi » 15 Aug 2013, 13:36

Hoi Nico,

Ik zal eens een poing wagen als ik thuis ben. Vreemde blijft dat als ik het deel:

int led1 = 11;
int led2 = 10;
int led3 = 9;
int led4 = 8;
unsigned long start;
unsigned long druk1;
int knop1 = 3;
unsigned long stled1;
unsigned long stled2;
unsigned long stled3;
unsigned long stled4;


void setup() {
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(knop1, INPUT);



}

void loop()
{


if (digitalRead(knop1)==HIGH)
{
start = millis();
stled1=start+500;
stled2=start+1000;
stled3=start+1500;
stled4=start+2000;
delay(250); // for debounce

}
if (millis()>=stled1)
{
digitalWrite (led1, HIGH);
digitalWrite (led2, LOW);
digitalWrite (led3, LOW);
digitalWrite (led4, LOW);
}
else if (millis()>=stled2)
{
digitalWrite (led1, LOW);
digitalWrite (led2, HIGH);
digitalWrite (led3, LOW);
digitalWrite (led4, LOW);

}

else if (millis()>=stled3)
{
digitalWrite (led1, LOW);
digitalWrite (led2, LOW);
digitalWrite (led3, HIGH);
digitalWrite (led4, LOW);

}


else if (millis()>=stled4)
{
digitalWrite (led1, LOW);
digitalWrite (led2, LOW);
digitalWrite (led3, LOW);
digitalWrite (led4, HIGH);

}
}

Met de wel aanwezige hardware (knop en leds) test ik niet het verwachte led gedrag krijg.
*Arduino nOOb but I am learning*

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

Re: Leds aansturen

Berichtdoor nicoverduin » 15 Aug 2013, 15:24

Waar ga jij vanuit met de schakelaar? Nu is het een beetje zwevend. Je zou beter:
- een pull-down weerstand (4K7) naar GND kunnen nemen en dat naar VCC kunnen schakelen of
- de interne pull-up gebruiken (digitalWrite(knop1, HIGH) en naar GND switchen
- een externe pull-up gebruiken en dan naar GND switchen
Verder ziet de coder er wel goed uit.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: Leds aansturen

Berichtdoor nicoverduin » 15 Aug 2013, 16:34

Volgens mij moet dit ook werken. Er vanuitgaande dat de knop LOW wordt getrokken als je hem aanzet.

Code: Alles selecteren
#define LED1   11         // door defines te gebruiken, wordt er geen geheugen gebruikt
#define LED2   10
#define LED3   9
#define   LED4   8
#define KNOP1   3
//
// led tabel
//
int leds[] = { LED1, LED2, LED3, LED4};
unsigned long start;
unsigned long druk1;
unsigned long stled1;
unsigned long stled2;
unsigned long stled3;
unsigned long stled4;
/**
 * @name SchakelLeds(int led)
 * @param led   led die aangezet moet worden
 * Zet de led dis ie meegegeven aan en de andere uit
 */
void SchakelLeds(int led) {
   for (int i = 0; i < sizeof(leds); i++) {
      //
      // led nummer met een verminderen ivm array indexing (begint bij 0)
      if ((led-1) == i) {
         //
         // deze moet aan
         //
         digitalWrite(leds[i], HIGH);
      } else {
         digitalWrite(leds[i], LOW);
      }
   }
}
void setup() {
   //
   // pin definities
   //
   for (int i = 0; i < sizeof(leds); i++) {
      pinMode(leds[i], OUTPUT);
   }
   pinMode(KNOP1, INPUT);
   digitalWrite(KNOP1, HIGH);

}

void loop() {
   //
   // lees of de knop is ingedrukt. Overigens wel lastig. soms kun je beter de knop op LOW testen omdat je dan
   // een pull kan gebruiken (4K7 naar Vcc of de interne) en dan naar GND switchen
   //
   if (digitalRead(KNOP1) == LOW) {
      start = millis();
      stled1 = start + 500;
      stled2 = start + 1000;
      stled3 = start + 1500;
      stled4 = start + 2000;
      delay(250); // for debounce
   }
   //
   // test of er tussen de leds geschakeld moet worden
   //
   if (millis() >= stled1) {
      SchakelLeds(1);
   } else if (millis() >= stled2) {
      SchakelLeds(2);
   } else if (millis() >= stled3) {
      SchakelLeds(3);
   } else if (millis() >= stled4) {
      SchakelLeds(4);
   }
}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 15
Geregistreerd: 14 Aug 2013, 08:11
Woonplaats: Hardenberg

Re: Leds aansturen

Berichtdoor whitedxi » 16 Aug 2013, 18:35

Ik snap er niks van. Ook de code hierboven (die naar mijn idee hetzelfde is maar voor mij beginner lastiger te lezen) doet hetzelfde als mijn code...

Ik wil dit bereiken zeg maar (eerste deel):
http://youtu.be/-s5lz3gaHEw
*Arduino nOOb but I am learning*

Berichten: 15
Geregistreerd: 14 Aug 2013, 08:11
Woonplaats: Hardenberg

Re: Leds aansturen

Berichtdoor whitedxi » 16 Aug 2013, 21:35

Ha ik ben al wat verder. Ik snap niet waarom maar millis start direct bij het starten van de arduino. Nu ben ik zo ver dat de laatste led brand bij het starten, alles uitgaat, de leds achter elkaar aan en uitgaan en de groene led blijft branden vervolgens weer.


 

int led1 = 11;
int led2 = 10;
int led3 = 9;
int led4 = 8;
long start;
unsigned long druk1;
int knop1 = 3;
unsigned long stled1;
unsigned long stled2;
unsigned long stled3;
unsigned long stled4;
unsigned long stled5;

 int ledState = LOW; // ledState used to set the LED
 int ledPin = 0; // will store last time LED was updated
 
 
 
 
// the follow variables is a long because the time, measured in miliseconds,
 // will quickly become a bigger number than can be stored in an int.
 long interval = 500; // interval at which to blink (milliseconds)
 
void setup() {
   pinMode(led1, OUTPUT);
   pinMode(led2, OUTPUT);
   pinMode(led3, OUTPUT);
   pinMode(led4, OUTPUT);
   pinMode(knop1, INPUT);
   Serial.begin(9600); // open communication po
   
    
    
   
   
 }
 
void loop()
 {
     

   if (digitalRead(knop1)==HIGH)
   {
    Serial.println("Start signal received");
    start = millis();
    stled1=start+750;
    stled2=start+1250;
    stled3=start+1750;
    stled4=start+2250;
    delay(250); // for debounce
    
            
   } 
   if (millis()>=stled1 && millis()<=stled2)
   {
     Serial.println("led1");
      digitalWrite (led1, HIGH);
      digitalWrite (led2, LOW);
      digitalWrite (led3, LOW);
      digitalWrite (led4, LOW);
   }
   if (millis()>=stled2 && millis()<=stled3)
   {
     Serial.println("led2");
     digitalWrite (led1, LOW);
     digitalWrite (led2, HIGH);
     digitalWrite (led3, LOW);
     digitalWrite (led4, LOW);
     
   }
   
 if (millis()>=stled3 && millis()<=stled4)
   {
     Serial.println("led3");
     digitalWrite (led1, LOW);
     digitalWrite (led2, LOW);
     digitalWrite (led3, HIGH);
     digitalWrite (led4, LOW);
     
   }
 
   
 if (millis()>=stled4)
   {
     Serial.println("led4");
     digitalWrite (led1, LOW);
     digitalWrite (led2, LOW);
     digitalWrite (led3, LOW);
     digitalWrite (led4, HIGH);
     
   }
   
   
 }

*Arduino nOOb but I am learning*

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

Re: Leds aansturen

Berichtdoor nicoverduin » 16 Aug 2013, 21:49

Maar hoe is die knop nu geschakeld?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 15
Geregistreerd: 14 Aug 2013, 08:11
Woonplaats: Hardenberg

Re: Leds aansturen

Berichtdoor whitedxi » 16 Aug 2013, 21:57

Afbeelding
*Arduino nOOb but I am learning*

Volgende

Terug naar Arduino IDE

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 13 gasten