#include #include "RTClib.h" RTC_DS1307 RTC; /* Uses 3.5 digit display GL-3P402 without additional hardware - rely on POV for user to see time :) Pinout: D3 Se Sb Sd Sc D0 Sa | | | | | | | Dig3 Dig2 Dig1 Dot Dig0 | | | | | | Sf D2 Sg D1 Dot+ Dot- S = segment D = digit Segments: aaa b c b c ddd e f e f ggg TinyRTC I2C module connected as follows: TinyRTC VCC - Arduino 5V TinyRTC GND - Arduino GND TinyRTC SDA - Arduino A4 TinyRTC SCL - Arduino A5 */ // pins for selecting segments int pinA = 4; int pinB = 5; int pinC = 6; int pinD = 7; int pinE = 8; int pinF = 9; int pinG = 10; int pinDot = 13; // pins for selecting digits int dig0 = 12; int dig1 = 11; int dig2 = 3; int dig3 = 2; int dot = 1; // init void setup() { // init Wire library for I2C comms Wire.begin(); // init Clock library RTC.begin(); // if its not already running start it if (! RTC.isrunning()) { // reset the halt bit to make sure it runs RTC.adjust(DateTime(0,0)); // following line sets the RTC to the date & time this sketch was compiled RTC.adjust(DateTime(__DATE__, __TIME__)); } // configure all as outputs - this is COMMON CATHODE display so inverse of what you expect pinMode(pinA,OUTPUT); pinMode(pinB,OUTPUT); pinMode(pinC,OUTPUT); pinMode(pinD,OUTPUT); pinMode(pinE,OUTPUT); pinMode(pinF,OUTPUT); pinMode(pinG,OUTPUT); pinMode(pinDot,OUTPUT); // we use INPUT_PULLUP to isolate unselected digits by sinking the signals pinMode(dig0,INPUT_PULLUP); pinMode(dig1,INPUT_PULLUP); pinMode(dig2,INPUT_PULLUP); pinMode(dig3,INPUT_PULLUP); // dot is independent - not multiplexed pinMode(dot,OUTPUT); } void loop() { // get the latest time DateTime now = RTC.now(); int iM1 = now.minute() % 10; int iM2 = now.minute() / 10; int iH2 = now.hour() % 10; int iH1 = now.hour() / 10; int iS = now.second(); // enable one digit at a time and send the number to it pinMode(dig0,OUTPUT); DoNum(iM1); pinMode(dig0,INPUT_PULLUP); pinMode(dig1,OUTPUT); DoNum(iM2); pinMode(dig1,INPUT_PULLUP); pinMode(dig2,OUTPUT); DoNum(iH2); pinMode(dig2,INPUT_PULLUP); pinMode(dig3,OUTPUT); if (iH1 == 0) { blank(); } else { DoNum(iH1); } pinMode(dig3,INPUT_PULLUP); digitalWrite(pinDot, (iS & 1) ? LOW : HIGH); } // blank is no signals void blank() { outNum(B00000000); } // output a number - send binary pattern in sequence to pins // each bit relates to one segment - top bit not used void DoNum(int i) { switch(i) { case 0: outNum(B01110111); break; case 1: outNum(B00010010); break; case 2: outNum(B01011101); break; case 3: outNum(B01011011); break; case 4: outNum(B00111010); break; case 5: outNum(B01101011); break; case 6: outNum(B01101111); break; case 7: outNum(B01010010); break; case 8: outNum(B01111111); break; case 9: outNum(B01111011);; break; } } void outNum(byte bNum) { // cycle through all pins and set to correct thing for pin // delay if we turn it on so users eye can see it int iSeg[7] = { pinA, pinB, pinC, pinD, pinE, pinF, pinG }; for (int i=0; i<8; i++) { bNum = bNum << 1; if (bNum & 128) { digitalWrite(iSeg[i], LOW); delayMicroseconds(1600); } digitalWrite(iSeg[i], HIGH); } }
How to add button to control hour and minute ? Thank’s