donderdag 23 februari 2012

Arduino - Experiment 3c - mm:ss teller

Als laatste in deze reeks komt de mm:ss teller.

Omdat er maar 14 uitgangen zijn heb ik de BCD tellers aangepast, de tientallen hoeven immers maar tot 5 te tellen (BCD 101). Hierdoor kon ik voor de tientallen de D uitsparen. Ik hoef dan geen 16 pinnen te hebben, maar 14. (komt dat even mooi uit!)

De code is als volgt:


#define BIT_A1 0
#define BIT_B1 1
#define BIT_C1 2
#define BIT_D1 3
#define BIT_A2 4
#define BIT_B2 5
#define BIT_C2 6
#define BIT_A3 7
#define BIT_B3 8
#define BIT_C3 9
#define BIT_D3 10
#define BIT_A4 11
#define BIT_B4 12
#define BIT_C4 13




int a=0;   // A1
int b=0;   // B1
int c=0;   // C1
int d=0;   // D1
int x=0;   // counter
int a1=0;   // A2
int b1=0;   // B2
int c1=0;   // C2
int x1=0;   // counter
int a2=0;   // A3
int b2=0;   // B3
int c2=0;   // C3
int d2=0;   // D3
int x2=0;   // counter
int a3=0;   // A4
int b3=0;   // B4
int c3=0;   // C4




int new_a=0;
int new_b=0;
int new_c=0;
int new_d=0;
int new_a1=0;
int new_b1=0;
int new_c1=0;
int new_a2=0;
int new_b2=0;
int new_c2=0;
int new_d2=0;
int new_a3=0;
int new_b3=0;
int new_c3=0;




void setup(){
  
  pinMode(BIT_A1,OUTPUT);    //set all pin in OUTPUT mode
  pinMode(BIT_B1,OUTPUT);
  pinMode(BIT_C1,OUTPUT);
  pinMode(BIT_D1,OUTPUT);
  pinMode(BIT_A2,OUTPUT);
  pinMode(BIT_B2,OUTPUT);
  pinMode(BIT_C2,OUTPUT);
  pinMode(BIT_A3,OUTPUT);
  pinMode(BIT_B3,OUTPUT);
  pinMode(BIT_C3,OUTPUT);
  pinMode(BIT_D3,OUTPUT);
  pinMode(BIT_A4,OUTPUT);
  pinMode(BIT_B4,OUTPUT);
  pinMode(BIT_C4,OUTPUT);  
}


void loop(){


do
{
  do
{
do
{


 delay(1000);                
  if  (!a) new_a=1; 
  else new_a=0;
  if ((b && !a) || (!b && a && !d)) new_b=1;
  else new_b=0;
 if ((!c && b && a) || (c && !a) || ( c && !b)) new_c=1;
 else new_c=0;
 if ((!d && c && b && a) || (d && !a)) new_d=1;
 else new_d=0;


  
 a=new_a;
 b=new_b;  
 c=new_c;
 d=new_d; 
  


 if(a==1) digitalWrite(BIT_A1,HIGH);
 else digitalWrite(BIT_A1,LOW);
 if(b==1) digitalWrite(BIT_B1,HIGH);
 else digitalWrite(BIT_B1,LOW);
 if(c==1) digitalWrite(BIT_C1,HIGH);
 else digitalWrite(BIT_C1,LOW);
 if(d==1) digitalWrite(BIT_D1,HIGH);
 else digitalWrite(BIT_D1,LOW);
  
  
 x = x + 1; 


} while (x < 10);
x=0;                
  if  (!a1) new_a1=1; 
  else new_a1=0;
  if ((b1 && !a1) || (!b1 && a1 && !c1)) new_b1=1;
  else new_b1=0;
  if ((!c1 && b1 && a1) || (c1 && !a1 && !b1)) new_c1=1;
  else new_c1=0;
 
  
  a1=new_a1;
  b1=new_b1;  
  c1=new_c1;
  


  if(a1==1) digitalWrite(BIT_A2,HIGH);
  else digitalWrite(BIT_A2,LOW);
  if(b1==1) digitalWrite(BIT_B2,HIGH);
  else digitalWrite(BIT_B2,LOW);
  if(c1==1) digitalWrite(BIT_C2,HIGH);
  else digitalWrite(BIT_C2,LOW);
  
  x1 = x1 + 1;


} while (x1 < 6);

x1=0;
  if  (!a2) new_a2=1; 
  else new_a2=0;
  if ((b2 && !a2) || (!b2 && a2 && !d2)) new_b2=1;
  else new_b2=0;
  if ((!c2 && b2 && a2) || (c2 && !a2) || ( c2 && !b2)) new_c2=1;
  else new_c2=0;
  if ((!d2 && c2 && b2 && a2) || (d2 && !a2)) new_d2=1;
  else new_d2=0;


  
  a2=new_a2;
  b2=new_b2;  
  c2=new_c2;
  d2=new_d2; 
  


  if(a2==1) digitalWrite(BIT_A3,HIGH);
  else digitalWrite(BIT_A3,LOW);
  if(b2==1) digitalWrite(BIT_B3,HIGH);
  else digitalWrite(BIT_B3,LOW);
  if(c2==1) digitalWrite(BIT_C3,HIGH);
  else digitalWrite(BIT_C3,LOW);
  if(d2==1) digitalWrite(BIT_D3,HIGH);
  else digitalWrite(BIT_D3,LOW);
  
  
  x2 = x2 + 1;


} while (x2 < 10);


x2=0;


if  (!a3) new_a3=1; 
else new_a3=0;
if ((b3 && !a3) || (!b3 && a3 && !c3)) new_b3=1;
else new_b3=0;
if ((!c3 && b3 && a3) || (c3 && !a3 && !b3)) new_c3=1;
else new_c3=0;


  
a3=new_a3;
b3=new_b3;  
c3=new_c3;



if(a3==1) digitalWrite(BIT_A4,HIGH);
else digitalWrite(BIT_A4,LOW);
if(b3==1) digitalWrite(BIT_B4,HIGH);
else digitalWrite(BIT_B4,LOW);
if(c3==1) digitalWrite(BIT_C4,HIGH);
else digitalWrite(BIT_C4,LOW);
}


Om het filmpje wat sneller te laten lopen heb ik wat met de delay gespeeld, eerst is delay 100, daarna 10.

Het ziet er dan als volgt uit: