// hobbyprojects // 15-06-2019 NanoDS3231propellerClock1.ino #include "Wire.h" 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() { //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 = 12; // set hours minutes = 15; // set minutes seconds = 00; // set seconds Day = 2; // 1=Sunday, 7=Saturday Date = 11; // 1 to 31 Month = 6; Year = 19; 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() { 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; }