rtc coding

 avatar
unknown
abc
4 years ago
12 kB
10
Indexable
// sandiproject
// 21/10/21  NanoDS3231propellerClock1 realtime

#include "Wire.h"
#include "RTClib.h"

RTC_DS3231 rtc;
char dataHari[7][12] = {"Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};
String hari;
int tanggal, bulan, tahun, jam, menit, detik;
float suhu;

unsigned long tc,to = 0;
unsigned int j,x,nm,dl,bs,bt;
int i,m,f,r1,r2 = 0;
unsigned char b1[200],b2[200];
byte a,c,c1,c2;
char s;

//int LED1 = 2;
//int LED2 = 3;
int LED3 = 4;
int LED4 = 5;
int LED5 = 6;
int LED6 = 7;
int LED7 = 8;
int LED8 = 9;
int LED9 = 10;
int LED10 = 11;
int LED11 = 12;
int LED12 = A1;
int LED13 = A2;
int LED14 = A3;
int LED15 = 3;
int LED16 = 13;

int sensorPin = 2;
int mode_key = A0;

int minuteSensor = A7;
int hourSensor = A6;

unsigned int n,ADCvalue,propeller_posn;
unsigned long previousTime = 0;

byte hours,minutes,seconds,Day,Date,Month,Year;
byte tempMSB,tempLSB;
int val;

const PROGMEM  unsigned char data[]={0x3f,0x23,0x23,0x3f,0x01,0x13,0x3f,0x03,0x2f,0x2b,0x2b,0x3b,0x2b,0x2b,0x2b,0x3f,0x39,0x09,0x09,0x3f,0x3b,0x2b,0x2b,0x2f,0x3f,0x2b,0x2b,0x2f,0x21,0x27,0x29,0x31,0x3f,0x2b,0x2b,0x3f,0x3b,0x2b,0x2b,0x3f,0x00,0x00,0x15,0x00,0x01,0x40,0x40,0x7f,0x40,0x40,0x00,0x00,0x00,0x41,0x7f,0x41,0x00,0x00,0x00,0x7f,0x20,0x18,0x20,0x7f,0x00,0x00,0x7f,0x49,0x49,0x49,0x41,0x00,0x00,0x40,0x40,0x7f,0x40,0x40,0x00,0x0e,0x15,0x15,0x15,0x0c,0x00,0x1f,0x10,0x0c,0x10,0x0f,0x00,0x1f,0x14,0x14,0x14,0x08,0x00,0x0e,0x15,0x15,0x15,0x0c,0x00,0x1f,0x08,0x10,0x10,0x08,0x00,0x02,0x15,0x15,0x15,0x0f,0x00,0x10,0x7e,0x11,0x01,0x02,0x00,0x1e,0x01,0x01,0x02,0x1f,0x00,0x1f,0x08,0x10,0x10,0x08,0x00,0x0e,0x15,0x15,0x15,0x0c,0x00,0x11,0x11,0x11,0x1f,0x00,0x00,0x03,0x03,0x00,0x00,0x00};

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

  if (! rtc.begin()) {
    Serial.println("RTC Tidak Ditemukan");
    Serial.flush();
    abort();
  }

  //Atur Waktu
  // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  //pinMode(LED1,OUTPUT);  
  //pinMode(LED2,OUTPUT);  
  pinMode(LED3,OUTPUT);  
  pinMode(LED4,OUTPUT);  
  pinMode(LED5,OUTPUT);  
  pinMode(LED6,OUTPUT);  
  pinMode(LED7,OUTPUT);  
  pinMode(LED8,OUTPUT);  
  pinMode(LED9,OUTPUT);  
  pinMode(LED10,OUTPUT);  
  pinMode(LED11,OUTPUT);  
  pinMode(LED12,OUTPUT);  
  pinMode(LED13,OUTPUT);  
  pinMode(LED14,OUTPUT);  
  pinMode(LED15,OUTPUT);  
  pinMode(LED16,OUTPUT);  
  
  pinMode(sensorPin,INPUT_PULLUP); 
  pinMode(mode_key,INPUT_PULLUP); 
      
  attachInterrupt(0, usdl, RISING);     
  if(hours > 11)
  hours = hours - 12;

  Wire.begin();  
  
//=========================================
  ADCvalue = analogRead(minuteSensor);
  if(ADCvalue < 500)
 {
  // DS3231 RTC resets to the deafult time 
  
  hours = 03;    // set hours
  minutes = 00;  // set minutes
  seconds = 00;  // set seconds
  Day = 5;       // 1=Sunday, 7=Saturday
  Date = 21;     // 1 to 31
  Month = 10;
  Year = 21;

  Wire.beginTransmission(0x68);
  Wire.write(0);
  Wire.write(dec2bcd(seconds));
  Wire.write(dec2bcd(minutes));
  Wire.write(dec2bcd(hours));
  Wire.write(dec2bcd(Day));
  Wire.write(dec2bcd(Date));
  Wire.write(dec2bcd(Month));
  Wire.write(dec2bcd(Year));
  Wire.endTransmission();

  while(1)
  {
  digitalWrite(LED11,HIGH);
  delay(200);
  digitalWrite(LED11,LOW);
  delay(200);     
  }
 }
//=========================================

}


void loop() 
{
DateTime now = rtc.now();
  Day    = dataHari[now.dayOfTheWeek()];
  Date = now.day(), DEC;
  Month   = now.month(), DEC;
  Year   = now.year(), DEC;
  hours    = now.hour(), DEC;
  minutes   = now.minute(), DEC;
  seconds   = now.second(), DEC;
  suhu    = rtc.getTemperature();

 if(m == 0)
  { 
    val = digitalRead(sensorPin);    
    while (val == LOW)
  {
    val = digitalRead(sensorPin);
  }
  propeller_posn=50;
  n=0;
  
  while(n < 60)
  {    
  ADCvalue = analogRead(minuteSensor);
  if(ADCvalue < 500)
  {
  minutes = propeller_posn;
  seconds = 0;
  Wire.beginTransmission(0x68);
  Wire.write(0);
  Wire.write(dec2bcd(seconds));
  Wire.write(dec2bcd(minutes));
  Wire.write(dec2bcd(hours));
  Wire.endTransmission();
  }
  ADCvalue = analogRead(hourSensor);
  if(ADCvalue < 500)
  {
  hours = propeller_posn/5;
  seconds = 0;
  Wire.beginTransmission(0x68);
  Wire.write(0);
  Wire.write(dec2bcd(seconds));
  Wire.write(dec2bcd(minutes));
  Wire.write(dec2bcd(hours));
  Wire.endTransmission(); 
  }      
  
  drawMinuteMarker();
  
  if ((propeller_posn==0) || (propeller_posn==5) || (propeller_posn==10) || (propeller_posn==15) || (propeller_posn==20) || (propeller_posn==25) || (propeller_posn==30) || (propeller_posn==35) || (propeller_posn==40) || (propeller_posn==45) || (propeller_posn==50) || (propeller_posn==55))
  drawHourMarker();
    
  if ((propeller_posn==0) || (propeller_posn==15) || (propeller_posn==30) || (propeller_posn==45))
  drawQuarterMarker(); 

  if(propeller_posn == hours*5 - 1)
  digitalWrite(LED6,HIGH);   
  if((propeller_posn == hours*5) || (( propeller_posn == 0 ) && (hours == 0)))
  drawHoursHand();
  if(propeller_posn == hours*5 + 1)
  digitalWrite(LED6,HIGH); 
  if((propeller_posn == 59) && (hours*5 == 0))
  digitalWrite(LED6,HIGH); 
  if(propeller_posn == minutes-1)
  digitalWrite(LED8,HIGH); 
  if(propeller_posn == minutes)
  drawMinutesHand();   
  if(propeller_posn == minutes+1)
  digitalWrite(LED8,HIGH); 
  if((propeller_posn == 0) && (minutes == 59))
  digitalWrite(LED8,HIGH); 
  if((propeller_posn == 59) && (minutes == 0))
  digitalWrite(LED8,HIGH); 
  if(propeller_posn == seconds-1)
  digitalWrite(LED10,HIGH);   
  if(propeller_posn == seconds)
  drawSecondsHand();
  if(propeller_posn == seconds+1)
  digitalWrite(LED10,HIGH);  
  if((propeller_posn == 0) && (seconds == 59))
  digitalWrite(LED10,HIGH);  
  if((propeller_posn == 59) && (seconds == 0))
  digitalWrite(LED10,HIGH);  
  Wire.beginTransmission(0x68);
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(0x68, 3);
  seconds = bcd2dec(Wire.read() & 0x7f);
  minutes = bcd2dec(Wire.read());
  hours = bcd2dec(Wire.read() & 0x3f);

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

  drawInner_Circle();
  delayMicroseconds(dl);
 
  n++;
  propeller_posn++;
  if(propeller_posn == 60)
  propeller_posn=0;
  }  
    val = digitalRead(sensorPin);     
    while (val == HIGH)
    {
    val = digitalRead(sensorPin); 
    } 
  }
if(m == 1)
{
    val = digitalRead(sensorPin);    
    while (val == LOW)
  {
    val = digitalRead(sensorPin);
  }
  i = 0;
  while(i < 200)
  {
  b1[i] = 0x00;
  b2[i] = 0x00;
  i++;    
  }  
  r1 = 0;
  for(i = 0; i < 5; i++)
  {
  b1[r1] = 0;
  r1++;
  }
  nm = hours;
  if(nm == 0)
  nm = 12; 
  nm = nm/10;
  nm = nm%10;
  vt();
  c1 = 0;
  b1[r1] = 0;
  r1++;
  nm = hours;
  if(nm == 0)
  nm = 12;   
  nm = nm%10;
  vt();
  nm = 10;
  vt();
  nm = minutes/10;
  nm = nm%10;
  vt();
  b1[r1] = 0;  
  r1++;
  nm = minutes;
  nm = nm%10;
  vt();
  nm = 10;
  vt();
  nm = seconds/10;
  nm = nm%10;
  vt();
  b1[r1] = 0;
  r1++;
  nm = seconds;
  nm = nm%10;
  vt();
  for(i = 0; i < 33; i++)
  {
  b1[r1] = 0;
  r1++;
  }  

  bt = 10;
  mc();
  r1++;
  nm = tempLSB;
  nm = nm%10;
  vb();
  b1[r1] = 0;  
  r1++;
  nm = tempLSB/10;
  nm = nm%10;
  vb();
  b1[r1] = 0;  
  r1++;
  c1 = 0x10;
  b1[r1] = c1;
  r1++;
  b1[r1] = 0;  
  r1++;
  nm = tempMSB;
  nm = nm%10;
  vb();  
  b1[r1] = 0;  
  r1++;
  nm = tempMSB/10;
  nm = nm%10;
  vb();
  for(i = 0; i < 12; i++)
  {
  b1[r1] = 0;
  r1++;
  }  
  bs = 9;
  bt = 28;
  r2 = 0;  
  mti();
  bs = 50;
  bt = 65;
  r2 = 0;  
  mte();
  bt = r1;
  r1 = 0;
  dc();
  Wire.beginTransmission(0x68);
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(0x68, 3);
  seconds = bcd2dec(Wire.read() & 0x7f);
  minutes = bcd2dec(Wire.read());
  hours = bcd2dec(Wire.read() & 0x3f);
  if(hours > 11)
  hours = hours - 12;
  Wire.beginTransmission(0x68);
  Wire.write(0x11);
  Wire.endTransmission();
  Wire.requestFrom(0x68, 2);
  tempMSB = Wire.read();
  tempLSB = Wire.read();
  tempLSB = (tempLSB >> 6)*25;   
    val = digitalRead(sensorPin);  
    while (val == HIGH)
    {
    val = digitalRead(sensorPin); 
    } 
  }  
}
void displayClear()
  {
  //digitalWrite(LED1,LOW);
  //digitalWrite(LED2,LOW);
  digitalWrite(LED3,LOW);
  digitalWrite(LED4,LOW);
  digitalWrite(LED5,LOW);
  digitalWrite(LED6,LOW);
  digitalWrite(LED7,LOW);
  digitalWrite(LED8,LOW);
  digitalWrite(LED9,LOW);
  digitalWrite(LED10,LOW);
  digitalWrite(LED11,LOW);
  digitalWrite(LED12,LOW);
  digitalWrite(LED13,LOW);
  digitalWrite(LED14,LOW);
  digitalWrite(LED15,LOW);
  digitalWrite(LED16,LOW);  
  }

  void drawMinuteMarker()
  {
  digitalWrite(LED16,HIGH);
  }

  void drawHourMarker()
  {
  digitalWrite(LED15,HIGH);
  digitalWrite(LED14,HIGH); 
  }

  void drawQuarterMarker()
  {
  digitalWrite(LED13,HIGH);
  digitalWrite(LED12,HIGH); 
  }

  void drawHoursHand()
  { 
  //digitalWrite(LED1,HIGH);
  //digitalWrite(LED2,HIGH);
  digitalWrite(LED3,HIGH);
  digitalWrite(LED4,HIGH);
  digitalWrite(LED5,HIGH);
  digitalWrite(LED6,HIGH);
  digitalWrite(LED7,HIGH);
  }

  void drawMinutesHand()
  { 
  //digitalWrite(LED1,HIGH);
  //digitalWrite(LED2,HIGH);
  digitalWrite(LED3,HIGH);
  digitalWrite(LED4,HIGH);
  digitalWrite(LED5,HIGH);
  digitalWrite(LED6,HIGH);
  digitalWrite(LED7,HIGH);
  digitalWrite(LED8,HIGH);
  digitalWrite(LED9,HIGH);
  }

  void drawSecondsHand()
  { 
  //digitalWrite(LED1,HIGH);
  //digitalWrite(LED2,HIGH);
  digitalWrite(LED3,HIGH);
  digitalWrite(LED4,HIGH);
  digitalWrite(LED5,HIGH);
  digitalWrite(LED6,HIGH);
  digitalWrite(LED7,HIGH);
  digitalWrite(LED8,HIGH);
  digitalWrite(LED9,HIGH);
  digitalWrite(LED10,HIGH);
  digitalWrite(LED11,HIGH);  
  }  

  void drawInner_Circle()
  {
  digitalWrite(LED3,HIGH);  
  delayMicroseconds(dl/50);
  digitalWrite(LED3,LOW);
  }  
byte dec2bcd(byte val)
{
  return((val/10*16)+(val%10));
}
byte bcd2dec(byte val)
{
  return((val/16*10)+(val%16));
}
void dc()
{
  while(r1 < bt)
 { 
  c = b1[r1];  
 if(c & 1)
  PORTC |= (1<<1);  
  else
  PORTC &= ~(1<<1);     
  if(c & 2)
  PORTC |= (1<<2);   
  else
  PORTC &= ~(1<<2);  
  if(c & 4)
  PORTC |= (1<<3);    
  else
  PORTC &= ~(1<<3); 
  if(c & 8)
  PORTD |= (1<<3);  
  else
  PORTD &= ~(1<<3);  
  if(c & 16)
  PORTB |= (1<<5);  
  else
  PORTB &= ~(1<<5);  
  c = b2[r1];
  if(c & 1)
  PORTD |= (1<<6);
  else
  PORTD &= ~(1<<6);   
  if(c & 2)
  PORTD |= (1<<7);  
  else
  PORTD &= ~(1<<7);  
  if(c & 4)
  PORTB |= (1<<0);   
  else
  PORTB &= ~(1<<0); 
  if(c & 8)
  PORTB |= (1<<1);  
  else
  PORTB &= ~(1<<1);   
  if(c & 16)
  PORTB |= (1<<2);   
  else
  PORTB &= ~(1<<2);
  if(c & 32)
  PORTB |= (1<<3);
  else
  PORTB &= ~(1<<3);
  if(c & 64)
  PORTB |= (1<<4);  
  else
  PORTB &= ~(1<<4);  
  delayMicroseconds(dl);  
  displayClear();
  delayMicroseconds(dl*2);
  r1++;
 }  
}
 void vt()
 {
  j=nm*4;
  i = 0;  
  while(i <= 3)
  { 
  c1 = (pgm_read_byte(&(data+j)[i]));
  c1 >>= 1; 
  b1[r1] = c1;
  i++;
  r1++;
  }
 }
 void vb() 
{
  j=nm*4;
  i = 3;  
  while(i >= 0)
 { 
  c = (pgm_read_byte(&(data+j)[i]));
  s=0;
  for(a = 0; a < 8; a++)
  {
    s <<= 1;
    s |= c & 1;
    c >>= 1;
  }
  s >>= 2;
  b1[r1] = s;
  i--;
  r1++;  
}
} 
 void mti()
 {
  r2 = 0;
  while(r2 < bt)
  { 
  c1 = (pgm_read_byte(&(data+45)[r2]));
  b2[r2+bs] = c1;
  r2++;
  }
 } 
 void mc()
 {
  r2 = 0;
  while(r2 < bt)
  { 
  c1 = (pgm_read_byte(&(data+139)[r2]));
  b1[r1] = c1;
  r1++;
  r2++;
  }
 }  
 void mte()
 {
  i = 0;
  r2 = bt;
  while(r2 >= 0)
  { 
  c = (pgm_read_byte(&(data+73)[r2]));
  s=0;
  for(a = 0; a < 8; a++)
  {
    s <<= 1;
    s |= c & 1;
    c >>= 1;
  }
  s = s >> 1;
  b2[i+bs] = s;
  r2--;
  i++;
  }
 } 
   void usdl()
{    
  f = 0;
  n = 0;
  tc = micros()-to;
  to = micros(); 
  f = 1;
  dl = tc/550; 
  if(bit_is_clear(PINC, 0))
  m = 1;
  else
  m = 0;   
} 
Editor is loading...