Onafhankelijk knipperen

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 1
Geregistreerd: 31 Aug 2013, 12:25

Onafhankelijk knipperen

Berichtdoor Noor91 » 31 Aug 2013, 12:29

Hoi mensen!

Ik ben vrij nieuw met Arduino. Het enige dat me tot nu lukt is een looplicht maken tussen verschillende leds, zowel met de blink optie in het arduino programma als met blinkwithoutdelay. Waar ik alleen niet uitkom is mijn led's op verschillende tussenpozen, onafhankelijk van elkaar, te laten knipperen. Het mag dus geen looplicht zijn, maar 3 leds die op 3 verschillende tempo's knipperen..

Kan iemand me hier mee helpen?
Alvast bedankt!

Advertisement

Berichten: 77
Geregistreerd: 06 Okt 2012, 10:57

Re: Onafhankelijk knipperen

Berichtdoor Beamer » 31 Aug 2013, 15:20

Als de blinkwithoutdelay gebruikt zou de de blinktijd met een random functie kunnen aan en uitzetten.

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

Re: Onafhankelijk knipperen

Berichtdoor nicoverduin » 31 Aug 2013, 20:00

Damn..... ik heb tijd tekort. Ik heb hem al klaar: Een library om een led mooi smooth the faden. Echter als je uit en aan in een tabel zet dan is het gewoon knipperen. Mooie ervan is dat je er meerdere instances van kan maken waardoor je elke led met een eigen tempo kan laten knipperen. Heb je ff geduld? Weekje denk ik?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Onafhankelijk knipperen

Berichtdoor pjh » 31 Aug 2013, 22:47

Damn..... ik heb tijd tekort

:D Zo herkenbaar... :D

Maar daarom is er kort door de bocht. Een alternatieve, vaak minder elegante wijze om om je doel te bereiken.
Echter: elegantie mag natuurlijk niet ten koste gaan van de robuustheid.

Ik zat even te aan de interne timer van de ATMega / Arduino. Daar kun je ook op triggeren.
Ter illustratie heb ik onderstaande sketch gemaakt.

Dit heb ik gedaan:
- ik neem de millis(), dus miliseconden.
- deze deel ik door 100, dus 10den van seconden
- ik neem de modulus 100 van bovenstaande en krijg zo
==> een getal van 0 - 99, waarbij elke stap 10 miliseconden is.

Door nu een Switch case op deze variabele modKlok te zetten, krijg ik 100 getriggerde events per 10 seconden, zonder 'extra' interrupt.
In de sketch komen 1, 10, 20, 50, 60, 70, 80, 90 overeen met respectievelijk
0,1 seconde pin 11 HIGH, rest LOW
1,0 seconde pin 12 HIGH, rest LOW
2,0 seconde pin 13 HIGH, rest LOW
5 seconden alles HIGH
6 sec...t/m 9 seconden

Mijn idee: werkbaar, indien er verder niets van het programma wordt verwacht.
Nogmaals: dit is waarschijnlijk geen goede manier van programmeren.

Code: Alles selecteren
const int led[] = {
  11,12,13};
int modKlok;
int modKlokOud;

void setup(){
  for (int i = 0; i < 3; i++){
    pinMode(led[i], OUTPUT);
  }
}

void loop(){
  unsigned long klok = millis()/100;
  int modKlok = klok % 100;

  if (modKlok != modKlokOud){
    modKlokOud = modKlok;

    switch (modKlok){
    case 1:
      digitalWrite(led[0], HIGH);
      digitalWrite(led[1], LOW);
      digitalWrite(led[2], LOW);
      break;
    case 10:
      digitalWrite(led[0], LOW);
      digitalWrite(led[1], HIGH);
      digitalWrite(led[2], LOW);
      break;
    case 20:
      digitalWrite(led[0], LOW);
      digitalWrite(led[1], LOW);
      digitalWrite(led[2], HIGH);
      break;
    case 50:
      digitalWrite(led[0], HIGH);
      digitalWrite(led[1], HIGH);
      digitalWrite(led[2], HIGH);
      break;
    case 60:
      digitalWrite(led[0], LOW);
      digitalWrite(led[1], HIGH);
      digitalWrite(led[2], HIGH);
      break;
    case 70:
      digitalWrite(led[0], HIGH);
      digitalWrite(led[1], LOW);
      digitalWrite(led[2], HIGH);
      break;
    case 80:
      digitalWrite(led[0], HIGH);
      digitalWrite(led[1], HIGH);
      digitalWrite(led[2], LOW);
      break;
    case 90:
      digitalWrite(led[0], LOW);
      digitalWrite(led[1], LOW);
      digitalWrite(led[2], LOW);
      break;
    }
  }
}

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

Re: Onafhankelijk knipperen

Berichtdoor nicoverduin » 01 Sep 2013, 11:10

En anders krijg je dit:
Code: Alles selecteren
#include "clHeartbeat.h"

clHeartbeat htb1 (10,  500L, 1); // flash at 500msec
clHeartbeat htb2 (11, 1000L, 1); // flash at 1000 msec
clHeartbeat htb3 (13,  250L, 1); // flash at 250 msec

void setup(){
}

void loop(){
   htb1.Update();
   htb2.Update();
   htb3.Update();

}
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Onafhankelijk knipperen

Berichtdoor pjh » 01 Sep 2013, 15:50

mooie syntax om je sketch overzichtelijk te houden.
Alle goodies zitten in clHeartbeat.h
Staat ´ie al op GitHub? :P

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

Re: Onafhankelijk knipperen

Berichtdoor nicoverduin » 02 Sep 2013, 07:59

Nee nog niet
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

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

Re: Onafhankelijk knipperen

Berichtdoor nicoverduin » 02 Sep 2013, 08:36

Ik heb hem ff in Github gezet : https://github.com/nicoverduin/clHeartbeat
Nog verder niet. Gewoon beide files in een library zetten met dezelfde naam en dan bovenstaand voorbeeld proberen.
Fading werkt alleen op een PWM pin. Knipperen op alle pins.
Documentatie volgt nog
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Re: Onafhankelijk knipperen

Berichtdoor pjh » 02 Sep 2013, 10:39

Super!

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 7 gasten