rtc coding
unknown
abc
4 years ago
12 kB
13
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...