how to make Propeller LED Pendulum Clock

 Propeller LED Pendulum Clock






 website JLCPCB 

EasyEDA Website design 

Scheme and code below


      




Warning

All design rights reserved The product cannot be sold or promoted, only personal use, for amateurs and university students for their projects, is allowed


      
        

how to make Propeller LED Pendulum Clock




how to make Propeller LED Pendulum Clock










code

// hobbyprojects
// 27-05-2020  Propeller_LED_Pendulum_Clock.ino

char ch;
int sensorPin = 2;
unsigned int i,n,c,nc,k,d,y,bn,mp,m = 0;
float dl;
unsigned long timecurr,timeold,previousTime = 0;
int hours = 12;
int minutes = 15;
int seconds = 00;
uint16_t timer_count_A=0; 
byte number,t,a,temp,data = 0;
int val;

const PROGMEM  unsigned char data1[]={0x3e,0x22,0x22,0x3e,0x00,0x12,0x3e,0x02,0x2e,0x2a,0x2a,0x3a,0x2a,0x2a,0x2a,0x3e,0x38,0x08,0x08,0x3e,0x3a,0x2a,0x2a,0x2e,0x3e,0x2a,0x2a,0x2e,0x20,0x26,0x28,0x30,0x3e,0x2a,0x2a,0x3e,0x3a,0x2a,0x2a,0x3e,0x64,0x63,0x62,0x61,0x60,0x5F,0x5E,0x5D,0x5C,0x5B,0x5A,0x59,0x58,0x57,0x56,0x55,0x54,0x53,0x52,0x51,0X51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F,0x60,0x61,0x62,0x63,0x64,0x10,0x38,0x10,0x10,0x38,0x38,0x7c,0x7F,0x7f,0x7F,0x7c,0x38,0x38,0x10,0x10,0x38,0x10,0x04,0x0e,0x1f,0x0e,0x04,0x3e,0x08,0x08,0x3e,0x00,0x00,0x1c,0x22,0x22,0x1c,0x00,0x00,0x3e,0x2a,0x2a,0x14,0x00,0x00,0x3e,0x2a,0x2a,0x14,0x00,0x20,0x10,0x0e,0x10,0x20,0x00,0x00,0x3e,0x28,0x28,0x10,0x00,0x00,0x3e,0x28,0x2c,0x12,0x00,0x00,0x1c,0x22,0x22,0x1c,0x00,0x00,0x0c,0x02,0x02,0x3c,0x00,0x00,0x3e,0x2a,0x2a,0x22,0x00,0x00,0x1c,0x22,0x22,0x22,0x00,0x00,0x20,0x20,0x3e,0x20,0x20,0x00,0x00,0x12,0x2a,0x2a,0x24};

void setup() 
{
  DDRD = 0xFA;
  DDRB = 0xFF;
  DDRC = 0x3F;
  PORTD = 0x05;
  PORTB = 0x00;      
  PORTC = 0x00;  

  if(hours > 11) 
  hours = hours - 12;

  m = 0;

   UBRR0 = 832;   // baud rate 1200bps
   UCSR0C |= (1 << UCSZ01) | (1 << UCSZ00); 
   UCSR0B |= (1 << RXEN0) | (1 << TXEN0) | (1 << RXCIE0);  

  attachInterrupt(0, us_time, RISING);    
}

void loop() 
{
    val = digitalRead(sensorPin);  
    while (val == LOW)
  {
    update_time();   
    val = digitalRead(sensorPin);
  }

  a=0; 
  k=82;
  n=0;
  nc=0;
  number = 9;
  c = 44; 
  
  while(n < 120)
  {
  if(m == 0)
  {
  mp = 15;
  bn = 0; 

  while(bn < 5)
  {
  img();
  } 

  number=hours;
  if(number == 0)
  number = 12;
  number=number/10;
  c = 24;    
  Display();

  number=hours;
  if(number == 0)
  number = 12;  
  number=number%10;    
  c = 29;  
  Display();

  c = 34;
  data = 0x0A;
  Display_();

  number=minutes;
  number=number/10;
  c = 36;    
  Display();

  number=minutes;
  number=number%10;    
  c = 41;  
  Display();

  c = 46;
  data = 0x0A;
  Display_();

  number=seconds;
  number=number/10;
  c = 48;    
  Display();

  number=seconds;
  number=number%10;    
  c = 53;  
  Display();

  mp = 61;
  bn = 0; 
  while(bn < 5)
  {
  img();
  }   
  }
  if (a==0)    
  drawMinuteMarker();
  if ((k==0) || (k==10) || (k==20) || (k==30) || (k==40) || (k==50) || (k==60) || (k==70) || (k==80) || (k==90) || (k==100) || (k==110))
  {
  drawHourMarker();
  }
  if ((k==0) || (k==30) || (k==60) || (k==90))
  {
  drawQuarterMarker();  
  }
  if((k == hours*10) || (( k == 0 ) && (hours == 0)))
  {
  drawHoursHand();
  }
  if(m == 0)
  { 
  if(k == hours*10 - 2)
  digitalWrite(5,HIGH);
  if(k == hours*10 + 2)
  digitalWrite(5,HIGH);
  if((k == 118) && (hours == 0)) 
  digitalWrite(5,HIGH); 
  }
  else
  { 
  if(k == hours*10 - 2)
  digitalWrite(9,HIGH);
  if(k == hours*10 + 2)
  digitalWrite(9,HIGH);
  if((k == 118) && (hours == 0)) 
  digitalWrite(9,HIGH); 
  }
  
  if(k == minutes*2)
  {
  drawMinutesHand();   
  }
  if(m == 0)
  {  
  if(k == minutes*2 + 2)
  digitalWrite(7,HIGH);
  if(k == minutes*2 - 2)
  digitalWrite(7,HIGH);  
  if((k == 0) && (minutes == 59))
  digitalWrite(7,HIGH);
  if((k == 118) && (minutes == 0))
  digitalWrite(7,HIGH);
  }
  else
  {
  if(k == minutes*2 + 2)
  digitalWrite(11,HIGH);
  if(k == minutes*2 - 2)
  digitalWrite(11,HIGH);  
  if((k == 0) && (minutes == 59))
  digitalWrite(11,HIGH);
  if((k == 118) && (minutes == 0))
  digitalWrite(11,HIGH);    
  }
  
  if(k == seconds*2)
{
  drawSecondsHand();
}


  if(m == 0)
  {
  if(k == seconds*2 + 2)
  digitalWrite(9,HIGH);
  if(k == seconds*2 - 2)
  digitalWrite(9,HIGH);  
  if((k == 0) && (seconds == 59))
  digitalWrite(9,HIGH);
  if((k == 118) && (seconds == 0))
  digitalWrite(9,HIGH);
  }
  else
  {
  if(k == seconds*2 + 2)
  digitalWrite(13,HIGH);
  if(k == seconds*2 - 2)
  digitalWrite(13,HIGH);  
  if((k == 0) && (seconds == 59))
  digitalWrite(13,HIGH);
  if((k == 118) && (seconds == 0))
  digitalWrite(13,HIGH);
  }      

if(m == 0)
  {
  c = (pgm_read_byte(&(data1+40)[t]));

  bn = 0;     
   
  while(bn < 17)
  {       
  if(n==c)
  {

  temp = pgm_read_byte(&(data1+80)[bn]);
    
  PORTC = temp >> 1;

  if(temp & 1)
  digitalWrite(13,HIGH);  
  else
  digitalWrite(13,LOW);     
  
  }
  bn++; 
  c++; 
  }
  }

  delayMicroseconds(dl);
  Clear();
  if ((k == 80) || (k == 81))
  {    
  }
  else
  delayMicroseconds(dl*3);

  a++;
  if(a == 2)
  a=0;
  n++;
  k++;
  if(k == 120)
  k=0;
  }

    val = digitalRead(sensorPin);  
    
    while (val == HIGH)
    {
    update_time();  
    val = digitalRead(sensorPin); 
    }    
}

  void Display()
{
  if(n==c+0)
  {
  temp = (pgm_read_byte(&(data1+number*4)[0]));
  PORTC = temp >> 1;
  }
  if(n==c+1)
  {
  temp = (pgm_read_byte(&(data1+number*4)[1]));
  PORTC = temp >> 1;
  }
  if(n==c+2)
  {
  temp = (pgm_read_byte(&(data1+number*4)[2]));
  PORTC = temp >> 1;
  }
  if(n==c+3)
  {
  temp = (pgm_read_byte(&(data1+number*4)[3]));
  PORTC = temp >> 1;
  }

  c++;
  c++;
  c++;
  c++;
  c++; 

  void Display_()
  {
  if(n==c)
  PORTC = data;    
  }

  void img()
  {
  if(n==mp)
  PORTC = pgm_read_byte(&(data1+97)[bn]);
  bn++; 
  mp++; 
  }  

void Clear()
  {
    for (int i = 3; i <= 20; i++)
    {
    digitalWrite(i,LOW);
    }    
  }

  void drawMinuteMarker()
  {
    if(m == 0)
    {  
    digitalWrite(12,HIGH);
    }
    else
    {  
    digitalWrite(A5,HIGH); 
    }    
  }
  
  void drawHourMarker()
  {
    if(m == 0)
    {  
    digitalWrite(11,HIGH);
    }
    else
    {  
    digitalWrite(A4,HIGH);
    digitalWrite(A3,HIGH);    
    }  
  }

  void drawQuarterMarker()
  {
    if(m == 0)
    {  
    digitalWrite(10,HIGH);
    }
    else
    {  
    digitalWrite(A2,HIGH);
    digitalWrite(A1,HIGH);    
    }  
  }

  void drawHoursHand()
  {
    if(m == 0)
    {    
    for (int i = 3; i <= 6; i++)
    {
    digitalWrite(i,HIGH);
    }
    }
    else
    {     
    for (int i = 3; i <= 10; i++)
    {
    digitalWrite(i,HIGH);
    }
    } 
  }

  void drawMinutesHand()
  { 
    if(m == 0)
    {   
    for (int i = 3; i <= 8; i++)
    {
    digitalWrite(i,HIGH);
    }
    }
    else
    {     
    for (int i = 3; i <= 12; i++)
    {
    digitalWrite(i,HIGH);
    }
    } 
  }

  void drawSecondsHand()
  { 
    if(m == 0)
    {     
    for (int i = 3; i <= 10; i++)
    {
    digitalWrite(i,HIGH);
    }
    }
    else
    {     
    for (int i = 3; i <= 14; i++)
    {
    digitalWrite(i,HIGH);
    }
    }    
  }

void update_time()  
{
 if (millis() >= (previousTime)) 
{
   previousTime = previousTime + 25;
   t++;
   if (t == 40)
   {
   t = 0;
   seconds++;
   }   

  if(seconds == 60)
  {
  seconds = 0;
  minutes++;
  }

  if(minutes == 60)
  {
  minutes = 0;
  hours++;
  }

  if(hours > 11) 
  hours = hours - 12;

}      
}

   void us_time()
{    
  n = 0;
  timecurr = micros()-timeold;
  timeold = micros(); 
  if(m == 0)   
  dl = timecurr/1000;
  else
  dl = timecurr/650;  

ISR(USART_RX_vect)
  ch=UDR0;
  if (ch == '1')
  {  
  hours--;
  if(hours < 0)
  hours = 11;
  ch = '0';
  }
  if (ch == '2')
  {  
  hours++;
  if(hours == 12)
  hours = 0;
  ch = '0';
  }
  if (ch == '3')
  {  
  minutes--;
  if(minutes < 0)
  minutes = 59;
  ch = '0';
  }  
  if (ch == '4')
  {  
  minutes++;
  if(minutes == 60)
  minutes = 0;
  ch = '0';
  } 
  if (ch == '5')
  {  
  seconds = 0;
  ch = '0';
  } 
  if (ch == '6')
  {  
  m++;
  if(m == 2)
  m = 0;
  ch = '0';
  } 
}

Previous Post Next Post

نموذج الاتصال