Uitleg Arduino Timer Sketch

Toon hier Uw afgeronde projecten aan anderen.
Gebruikers-avatar
Berichten: 700
Geregistreerd: 05 Mrt 2012, 21:56
Woonplaats: Appingedam

Uitleg Arduino Timer Sketch

Berichtdoor pjh » 09 Jun 2014, 22:53

Iemand vroeg me te helpen met een Arduino sketch die ´twee tijden tussen schakelaars´ op een ´4 digit 7 segment LED display´moet tonen. Een eenvoudige timer dus. En toen de Sketch klaar was kwam de vraag of ik het wilde toelichten.
Uitleggen wat je doet vind ik lastig, maar een goede manier je eigen gaten op te sporen. En uiteindelijk stop je heel veel tijd in het project van een ander... Daarom plaats ik hier een link naar mijn uitleg van ´zijn´ sketch.
Misschien dat iemand er wat aan heeft. Het laat in ieder geval genadeloos zien wat mijn nivo is (ahum).
Zinvol commentaar zeer welkom. ;)
https://sites.google.com/site/arduinotimer/

Advertisement

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

Re: Uitleg Arduino Timer Sketch

Berichtdoor nicoverduin » 10 Jun 2014, 09:48

Wat ik zelf zou hebben gedaan was de gehele uitleg in de code hebben verwerkt. Verder prima programma zo op eerste gezicht :) Maar dat wist je wel :)
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Uitleg Arduino Timer Sketch

Berichtdoor shooter » 10 Jun 2014, 11:13

tjonge pjh je moet nog veel bijleren hoor :lol:

ja nico heeft gelijk uitleg is zinvoller in een programma.

laat de 'opdrachtgever' een flowsheet maken, (moet toch gebeuren voor school)
een CADtekening van het geheel moet toch ook gemaakt worden, alsmede een aansluitschema.

je uitleg met die prescaler is niet helemaal correct.

debounce heb je hier niet ndoig, want je moet toch altijd gaan kijken naar de andere schakelaar.
Gebruik van delay samen met interrupts werkt niet goed (delay gebruikt namelijk de timer) dus je zult hier iets anders moeten verzinnen.
beter helemaal geen delay gebruiken, maar andere manier verzinnen (met millis() zoals we wel vaker doen)
de delay in de eerste regel van je loop, beinvloedt de display heel erg.
de rest komt nog.
paul deelen
shooter@home.nl

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

Re: Uitleg Arduino Timer Sketch

Berichtdoor pjh » 10 Jun 2014, 14:22

kijk, daar ga ik wat aan hebben. thanx

De enige delay die ik in mijn programma gebruik is wanneer er al een externe interrupt is geweest. Die beinvloed dus het display alleen wanneer de knop geactiveerd is. Dan knippert het display even, wat functioneel niet veel uit maakt.
Maar ik kan het mis hebben....
Desalniettemin ga ik het herschrijven zonder delay.
/////////////
Al klaar:
En precies zoals "we eerder deden"
Omdat ik toch de tijd van de laatse knopdruk heb, kan ik zo de delay voorkomen:
if (flag_2 && (millis()-tijd_2) > debounce){...}
Maar ben bang dat ik er dan nog niet helemaal ben.


Code: Alles selecteren
volatile unsigned long tijd_1;
volatile unsigned long tijd_2;
volatile int flag_1 = 0;
volatile int flag_2 = 0;

int flag = 0;
long nieuw_interval;

const int diepteGeheugen = 32;
int actie[diepteGeheugen];
unsigned long tijd[diepteGeheugen];
long teller = 0;

int schakelaar_1_Pin = 53; // AANPASSEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
int schakelaar_2_Pin = 51; // AANPASSEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

int van ;
int naar ;

int debounce = 20;

int helderheid = 1; // 1 = maximaal gedimd licht

int cijfer[] = {
  63, 6, 91, 79, 102, 109, 125, 7, 127, 111};

int anode[] = {
  22, 23, 24, 25 };  // AANPASSEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
int kathode[] = {
  5,6,7,8,9,10,11 };  // AANPASSEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

int digit[] = {
  8, 8, 8, 8};

void setup(){
  Serial.begin(9600);

  attachInterrupt(0, sens1, CHANGE);
  attachInterrupt(1, sens2, CHANGE);

  pinMode(2, INPUT);
  pinMode(3, INPUT);

  pinMode(schakelaar_1_Pin, INPUT);
  pinMode(schakelaar_2_Pin, INPUT);

  for (int i = 0; i < 4; i++){
    pinMode(anode[i], OUTPUT);
  }
  for (int i = 0; i < 7; i++){
    pinMode(kathode[i], OUTPUT);
  }
}

void sens1(){
  if (!flag_1){
    flag_1 = 1;
    tijd_1 = millis();
  }
}

void sens2(){
  if (!flag_2){
    flag_2 = 1;
    tijd_2 = millis();
  }
}

void loop(){
  schrijf_Display();

  if (flag_1 && (millis()-tijd_1) > debounce){

    actie[teller] = 1 - digitalRead(2);

    tijd[teller] = tijd_1;
    flag_1 = 0;
    flag = 1;

  }

  if (flag_2 && (millis()-tijd_2) > debounce){

    actie[teller] = 3 - digitalRead(3);

    tijd[teller] = tijd_2;

    flag_2 = 0;
    flag = 1;
  }

  if (flag){
    flag = 0;

    int schak1 = digitalRead(schakelaar_1_Pin);
    int schak2 = digitalRead(schakelaar_2_Pin);

    if(schak2 == 1){
      van = 1;
      naar = 1;
    }
    else if((schak1 == 0) && (schak2 == 0)){
      van = 1;
      naar = 2;
    }
    else if((schak1 == 1) && (schak2 == 0)){
      van = 3;
      naar = 0;
    }

    if (actie[teller] == (naar)){

      int laatste_4 = 0;
      for (int j = (diepteGeheugen -1); j > 0; j--){

        if ((actie[(teller+j)%diepteGeheugen] == (van)) && (!laatste_4)){
          nieuw_interval = tijd[teller] - tijd[(teller+j)%diepteGeheugen];
          laatste_4 = 1;
          wijzigGetal(nieuw_interval);
        }
      }
    }
    teller++;
    if (teller > diepteGeheugen) teller=0;
  }
}

void wijzigGetal(long getal){
  int milliSec = getal % 10;
  int centiSec = (getal/10) % 10;
  int decaSec = (getal/100) % 10;
  int Sec = (getal/1000) % 10;
  digit[0]= Sec;
  digit[1]= decaSec;
  digit[2]= centiSec;
  digit[3]= milliSec;
}

void schrijf_Display(){
  for (int dig=0; dig<4; dig++){
    for (int seg=0; seg<7; seg++){
      if(cijfer[digit[dig]]&(1<<seg)){
        digitalWrite(kathode[seg], HIGH);
      }
      else{
        digitalWrite(kathode[seg], LOW);//
      }
    }
    digitalWrite(anode[dig], HIGH);
    delayMicroseconds(helderheid);
    digitalWrite(anode[dig], LOW);
  }
}

Terug naar Afgeronde projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 9 gasten