![]() |
| × | 1 | |||
![]() |
| × | 1 |
Servo Clock
Use Aduino NANO for control Rc Servo to tell the Time clock, along with a RTC module DS3231 for time keeping
- 5,496 views
- 5 comments
- 12 respects
Components and supplies
Necessary tools and machines
| ||||
|
About this project
I want to decorate my home with some strange clock, so I get some idea to use RC Servo to display the time in a half circle Because Servo can move only 0 degree to 180 degree
Hour hand rotate clockwise from 0-23 hours
Minute hand rotate clockwise form 0-59 minute
I divided the second 0-30 rotate clockwise and 31-0 second rotate counter-clockwise
Code
#include <LiquidCrystal.h>
#include <RTClib.h>
#include <SPI.h>
#include <Wire.h>
#include <Servo.h>
Servo Second_Servo;
Servo Minute_Servo;
Servo Hour_Servo;
RTC_DS3231 RTC;
LiquidCrystal lcd(13, 12, 5, 4, 3, 2);
int value = 0;
int HOUR;
int MINUTE;
int SECOND;
int DAY;
int MONTH;
int YEAR;
int HOUR_READ;
int MINUTE_READ;
int SECOND_READ;
int DAY_READ;
int MONTH_READ;
int YEAR_READ;
int HOUR_SERVO_READ;
int MINUTE_SERVO_READ;
int SECOND_SERVO_READ;
int increase = LOW;
int decrease = LOW;
int select = LOW;
int buttonStateSelect;
int buttonStateIncrease;
int buttonStateDecrease;
int last_select_State = LOW;
int last_increase_State = LOW;
int last_decrease_State = LOW;
const int buttonPin_select = 6;
const int buttonPin_increase = 7;
const int buttonPin_decrease = 8;
const int ledPin = 13;
int ledState = LOW ;
long lastDebounceTime = 0;
long debounceDelay = 55;
long Timestamp;
void setup ()
{
pinMode(buttonPin_select, INPUT_PULLUP);
pinMode(buttonPin_increase, INPUT_PULLUP);
pinMode(buttonPin_decrease, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, ledState);
Serial.begin(9600);
Timestamp = millis();
lcd.begin(16, 2);
lcd.clear();
Wire.begin();
RTC.begin();
//RTC.adjust(DateTime(__DATE__, __TIME__));
if (! RTC.isrunning()) {
Serial.println("RTC is NOT running!");
RTC.adjust(DateTime(__DATE__, __TIME__));
}
Second_Servo.attach(11);
Minute_Servo.attach(10);
Hour_Servo.attach(9);
Second_Servo.write(12);
delay(500);
Minute_Servo.write(3);
delay(500);
Hour_Servo.write(18);
delay(500);
}
void loop ()
{
//******************************* select *******************************************************
int select = digitalRead(buttonPin_select);
if (select != last_select_State) {
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (select != buttonStateSelect) {
buttonStateSelect = select;
if (buttonStateSelect == LOW) {
value = value + 1;
ledState = HIGH;
if (value > 6){
value = 0;
lcd.noBlink();
}
Serial.print("select ");Serial.println (value);
}else
{
ledState = LOW;
}
}
}
digitalWrite(ledPin, ledState);
last_select_State = select;
//************************************* increase ************************************************************
int select_increase = digitalRead(buttonPin_increase);
if (select_increase != last_increase_State)
{
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (select_increase != buttonStateIncrease) {
buttonStateIncrease = select_increase;
if (buttonStateIncrease == LOW) {
if(value ==1)
{
DateTime now = RTC.now();
HOUR_READ = now.hour();
HOUR_READ++;
if (HOUR_READ > 23)
{
HOUR_READ = 0;
}
HOUR = dectobcd (HOUR_READ);
Wire.beginTransmission(0x68); // address DS3231
Wire.write(0x02); // select register
Wire.write(HOUR); // hours (BCD)
Wire.endTransmission();
ledState = HIGH;
Serial.println(HOUR_READ,DEC);
Serial.println("increase hour");
}
if(value == 2)
{
DateTime now = RTC.now();
MINUTE_READ = now.minute();
MINUTE_READ++;
if (MINUTE_READ > 59)
{
MINUTE_READ = 0;
}
MINUTE = dectobcd (MINUTE_READ);
Wire.beginTransmission(0x68); // address DS3231
Wire.write(0x01); // select register
Wire.write(MINUTE); // minutes (BCD)
Wire.endTransmission();
ledState = HIGH;
Serial.println(MINUTE_READ,DEC);
Serial.println("increase minutes");
}
if(value == 3)
{
DateTime now = RTC.now();
SECOND_READ = now.minute();
SECOND_READ++;
if (SECOND_READ > 58)
{
SECOND_READ = 0;
}
SECOND = dectobcd (SECOND_READ);
Wire.beginTransmission(0x68); // address DS3231
Wire.write(0x00); // select register
Wire.write(SECOND); // second (BCD)
Wire.endTransmission();
ledState = HIGH;
Serial.println(SECOND_READ,DEC);
Serial.println(" increase second");
}
if(value == 4)
{
DateTime now = RTC.now();
DAY_READ = now.day();
DAY_READ++;
if (DAY_READ > 31)
{
DAY_READ = 1;
}
DAY = dectobcd (DAY_READ);
Wire.beginTransmission(0x68); // address DS3231
Wire.write(0x04); // select register
Wire.write(DAY); // second (BCD)
Wire.endTransmission();
ledState = HIGH;
Serial.println(DAY_READ,DEC);
Serial.println(" increase day");
}
if(value == 5)
{
DateTime now = RTC.now();
MONTH_READ = now.month();
MONTH_READ++;
if (MONTH_READ > 12)
{
MONTH_READ = 1;
}
MONTH = dectobcd (MONTH_READ);
Wire.beginTransmission(0x68); // address DS3231
Wire.write(0x05); // select register
Wire.write(MONTH); // month (BCD)
Wire.endTransmission();
ledState = HIGH;
Serial.println(MONTH_READ,DEC);
Serial.println(" increase month");
}
if(value == 6)
{
DateTime now = RTC.now();
YEAR_READ = now.year();
YEAR_READ++;
YEAR = dectobcd (YEAR_READ);
Wire.beginTransmission(0x68); // address DS3231
Wire.write(0x06); // select register
Wire.write(YEAR); // year (BCD)
Wire.endTransmission();
ledState = HIGH;
Serial.println(YEAR_READ,DEC);
Serial.println(" increase year");
}
}else
{
ledState = LOW;
}
}
}
digitalWrite(ledPin, ledState);
last_increase_State = select_increase;
//************************************************* Decrease ***************************************************************
int select_decrease = digitalRead(buttonPin_decrease);
if (select_decrease != last_decrease_State)
{
lastDebounceTime = millis();
}
if ((millis() - lastDebounceTime) > debounceDelay) {
if (select_decrease != buttonStateDecrease) {
buttonStateDecrease = select_decrease;
if (buttonStateDecrease == LOW) {
if(value ==1)
{
DateTime now = RTC.now();
HOUR_READ = now.hour();
HOUR_READ-- ;
if (HOUR_READ < 0)
{
HOUR_READ = 23;
}
HOUR = dectobcd (HOUR_READ);
Wire.beginTransmission(0x68); // address DS3231
Wire.write(0x02); // select register
Wire.write(HOUR); // hour (BCD)
Wire.endTransmission();
ledState = HIGH;
Serial.println(HOUR_READ,DEC);
Serial.println("decrease hour");
}
if(value == 2)
{
DateTime now = RTC.now();
MINUTE_READ = now.minute();
MINUTE_READ--;
if (MINUTE_READ < 0)
{
MINUTE_READ = 59;
}
MINUTE = dectobcd (MINUTE_READ);
Wire.beginTransmission(0x68); // address DS3231
Wire.write(0x01); // select register
Wire.write(MINUTE); // minutes (BCD)
Wire.endTransmission();
ledState = HIGH;
Serial.println(MINUTE_READ,DEC);
Serial.println("decrease minute");
}
if(value == 3)
{
DateTime now = RTC.now();
SECOND_READ = now.second();
SECOND_READ--;
if (SECOND_READ < 0)
{
SECOND_READ = 59;
}
SECOND = dectobcd (SECOND_READ);
Wire.beginTransmission(0x68); // address DS3231
Wire.write(0x00); // select register
Wire.write(SECOND); // second (BCD)
Wire.endTransmission();
ledState = HIGH;
Serial.println(SECOND_READ,DEC);
Serial.println( "decrease secound");
}
if(value == 4)
{
DateTime now = RTC.now();
DAY_READ = now.day();
DAY_READ--;
if (DAY_READ < 1)
{
DAY_READ = 31;
}
DAY = dectobcd (DAY_READ);
Wire.beginTransmission(0x68); // address DS3231
Wire.write(0x04); // select register
Wire.write(DAY); // day (BCD)
Wire.endTransmission();
ledState = HIGH;
Serial.println(DAY_READ,DEC);
Serial.println(" decrease day");
}
if(value == 5)
{
DateTime now = RTC.now();
MONTH_READ = now.month();
MONTH_READ--;
if (MONTH_READ < 1)
{
MONTH_READ = 12;
}
MONTH = dectobcd (MONTH_READ);
Wire.beginTransmission(0x68); // address DS3231
Wire.write(0x05); // select register
Wire.write(MONTH); // month (BCD)
Wire.endTransmission();
ledState = HIGH;
Serial.println(MONTH_READ,DEC);
Serial.println(" decrease month");
}
if(value == 6)
{
DateTime now = RTC.now();
YEAR_READ = now.year();
YEAR_READ--;
if (YEAR_READ < 2000)
{
YEAR_READ = 2000;
}
YEAR = dectobcd (YEAR_READ);
Wire.beginTransmission(0x68); // address DS3231
Wire.write(0x06); // select register
Wire.write(YEAR); // year (BCD)
Wire.endTransmission();
ledState = HIGH;
Serial.println(YEAR_READ,DEC);
Serial.println(" decrease year");
}
}else
{
ledState = LOW;
}
}
}
digitalWrite(ledPin, ledState);
last_decrease_State = select_decrease;
//*************************************************************************************
if (millis() > Timestamp + 1000)
{
DateTime now = RTC.now();
lcd.clear();
lcd.home();
if (now.hour() < 10)
{
lcd.setCursor(4,0);
lcd.print("0");lcd.print(now.hour(),DEC);lcd.print(":");
HOUR_SERVO_READ = DEC_To_Hour_Servo(now.hour());
Hour_Servo.write(HOUR_SERVO_READ);
}
else
{
lcd.setCursor(4,0);
lcd.print(now.hour(),DEC);
lcd.print(":");
HOUR_SERVO_READ = DEC_To_Hour_Servo(now.hour());
Hour_Servo.write(HOUR_SERVO_READ);
}
if (now.minute() < 10)
{
lcd.print("0");lcd.print(now.minute(), DEC);lcd.print(":");
MINUTE_SERVO_READ = DEC_To_Minute_Servo(now.minute());
Minute_Servo.write(MINUTE_SERVO_READ);
}
else
{
lcd.print(now.minute(), DEC);lcd.print(":");
MINUTE_SERVO_READ = DEC_To_Minute_Servo(now.minute());
Minute_Servo.write(MINUTE_SERVO_READ);
}
if (now.second() < 10)
{
lcd.print("0");lcd.print(now.second(), DEC);
SECOND_SERVO_READ = DEC_To_Second_Servo (now.second());
Second_Servo.write(SECOND_SERVO_READ);
}
else
{
lcd.print(now.second(), DEC);
SECOND_SERVO_READ = DEC_To_Second_Servo (now.second());
Second_Servo.write(SECOND_SERVO_READ);
}
lcd.setCursor(3, 1);
if (now.day() < 10)
{
lcd.print("0");lcd.print(now.day(), DEC);lcd.print("/");
}
else
{
lcd.print(now.day(), DEC);lcd.print("/");
}
if (now.month() < 10)
{
lcd.print("0");lcd.print(now.month(), DEC);lcd.print("/");
}
else
{
lcd.print(now.month(), DEC);lcd.print("/");
}
if (now.year() < 10)
{
lcd.print("0");lcd.print(now.year(), DEC);
}
else
{
lcd.print(now.year(), DEC);
}
Serial.println(RTC.oscillatorCheck());
if (value == 1){
lcd.blink();
lcd.setCursor(5, 0);
}
if (value == 2){
lcd.blink();
lcd.setCursor(8, 0);
}
if (value == 3){
lcd.blink();
lcd.setCursor(11, 0);
}
if (value == 4){
lcd.blink();
lcd.setCursor(4, 1);
}
if (value == 5){
lcd.blink();
lcd.setCursor(7, 1);
}
if (value == 6){
lcd.blink();
lcd.setCursor(12, 1);
}
Timestamp = millis();
}
}
int dectobcd ( int decvalue)
{
int result;
switch (decvalue)
{
case 0 : result = (0x00);break;
case 1 : result = (0x01);break;
case 2 : result = (0x02);break;
case 3 : result = (0x03);break;
case 4 : result = (0x04);break;
case 5 : result = (0x05);break;
case 6 : result = (0x06);break;
case 7 : result = (0x07);break;
case 8 : result = (0x08);break;
case 9 : result = (0x09);break;
case 10: result = (0x10);break;
case 11 : result = (0x11);break;
case 12 : result = (0x12);break;
case 13 : result = (0x13);break;
case 14 : result = (0x14);break;
case 15 : result = (0x15);break;
case 16 : result = (0x16);break;
case 17 : result = (0x17);break;
case 18 : result = (0x18);break;
case 19 : result = (0x19);break;
case 20 : result = (0x20);break;
case 21 : result = (0x21);break;
case 22 : result = (0x22);break;
case 23 : result = (0x23);break;
case 24 : result = (0x24);break;
case 25 : result = (0x25);break;
case 26 : result = (0x26);break;
case 27 : result = (0x27);break;
case 28 : result = (0x28);break;
case 29: result = (0x29);break;
case 30 : result = (0x30);break;
case 31 : result = (0x31);break;
case 32 : result = (0x32);break;
case 33 : result = (0x33);break;
case 34 : result = (0x34);break;
case 35 : result = (0x35);break;
case 36 : result = (0x36);break;
case 37 : result = (0x37);break;
case 38 : result = (0x38);break;
case 39 : result = (0x39);break;
case 40 : result = (0x40);break;
case 41 : result = (0x41);break;
case 42 : result = (0x42);break;
case 43 : result = (0x43);break;
case 44 : result = (0x44);break;
case 45 : result = (0x45);break;
case 46 : result = (0x46);break;
case 47 : result = (0x47);break;
case 48 : result = (0x48);break;
case 49 : result = (0x49);break;
case 50 : result = (0x50);break;
case 51 : result = (0x51);break;
case 52 : result = (0x52);break;
case 53 : result = (0x53);break;
case 54 : result = (0x54);break;
case 55 : result = (0x55);break;
case 56 : result = (0x56);break;
case 57 : result = (0x57);break;
case 58 : result = (0x58);break;
case 59 : result = (0x59);break;
// ***************************************************YEAR CONVERT LOOP UP TABLE******************************************************
case 1999 : result = (0x1999);break;
case 2000 : result = (0x2000);break;
case 2001 : result = (0x2001);break;
case 2002 : result = (0x2002);break;
case 2003 : result = (0x2003);break;
case 2004 : result = (0x2004);break;
case 2005 : result = (0x2005);break;
case 2006 : result = (0x2006);break;
case 2007 : result = (0x2007);break;
case 2008 : result = (0x2008);break;
case 2009 : result = (0x2009);break;
case 2010 : result = (0x2010);break;
case 2011 : result = (0x2011);break;
case 2012 : result = (0x2012);break;
case 2013 : result = (0x2013);break;
case 2014 : result = (0x2014);break;
case 2015 : result = (0x2015);break;
case 2016 : result = (0x2016);break;
case 2017 : result = (0x2017);break;
case 2018 : result = (0x2018);break;
case 2019 : result = (0x2019);break;
case 2020 : result = (0x2020);break;
case 2021 : result = (0x2021);break;
case 2022 : result = (0x2022);break;
case 2023 : result = (0x2023);break;
case 2024 : result = (0x2024);break;
case 2025 : result = (0x2025);break;
case 2026 : result = (0x2026);break;
case 2027 : result = (0x2027);break;
case 2028 : result = (0x2028);break;
case 2029 : result = (0x2029);break;
case 2030 : result = (0x2030);break;
case 2031 : result = (0x2031);break;
case 2032 : result = (0x2032);break;
case 2033 : result = (0x2033);break;
case 2034 : result = (0x2034);break;
case 2035 : result = (0x2035);break;
case 2036 : result = (0x2036);break;
case 2037 : result = (0x2037);break;
case 2038 : result = (0x2038);break;
case 2039 : result = (0x2039);break;
case 2040 : result = (0x2040);break;
case 2041 : result = (0x2041);break;
case 2042 : result = (0x2042);break;
case 2043 : result = (0x2043);break;
case 2044 : result = (0x2044);break;
case 2045 : result = (0x2045);break;
case 2046 : result = (0x2046);break;
case 2047 : result = (0x2047);break;
case 2048 : result = (0x2048);break;
case 2049 : result = (0x2049);break;
case 2050 : result = (0x2050);break;
default : result = (0x00);
}
return result;
}
//888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888
int DEC_To_Second_Servo ( int Second_Servo_Value)
{
int result;
switch (Second_Servo_Value)
{
case 0 : result = (12);break;
case 1 : result = (18);break;
case 2 : result = (23);break;
case 3 : result = (29);break;
case 4 : result = (35);break;
case 5 : result = (40);break;
case 6 : result = (45);break;
case 7 : result = (50);break;
case 8 : result = (55);break;
case 9 : result = (60);break;
case 10: result = (66);break;
case 11 : result = (71);break;
case 12 : result = (76);break;
case 13 : result = (81);break;
case 14 : result = (86);break;
case 15 : result = (92);break;
case 16 : result = (97);break;
case 17 : result = (103);break;
case 18 : result = (109);break;
case 19 : result = (114);break;
case 20 : result = (119);break;
case 21 : result = (124);break;
case 22 : result = (130);break;
case 23 : result = (135);break;
case 24 : result = (140);break;
case 25 : result = (146);break;
case 26 : result = (151);break;
case 27 : result = (157);break;
case 28 : result = (163);break;
case 29 : result = (169);break;
case 30 : result = (175);break;
case 31 : result = (169);break;
case 32 : result = (163);break;
case 33 : result = (157);break;
case 34 : result = (152);break;
case 35 : result = (146);break;
case 36 : result = (140);break;
case 37 : result = (135);break;
case 38 : result = (130);break;
case 39 : result = (124);break;
case 40 : result = (118);break;
case 41 : result = (113);break;
case 42 : result = (108);break;
case 43 : result = (103);break;
case 44 : result = (97);break;
case 45 : result = (92);break;
case 46 : result = (86);break;
case 47 : result = (81);break;
case 48 : result = (76);break;
case 49 : result = (71);break;
case 50 : result = (65);break;
case 51 : result = (60);break;
case 52 : result = (55);break;
case 53 : result = (50);break;
case 54 : result = (44);break;
case 55 : result = (40);break;
case 56 : result = (35);break;
case 57 : result = (29);break;
case 58 : result = (24);break;
case 59 : result = (18);break;
default : result = (10);
}
return result;
}
int DEC_To_Minute_Servo ( int Minute_Servo_Value)
{
int result;
switch (Minute_Servo_Value)
{
case 0 : result = (1);break;
case 1 : result = (176);break;
case 2 : result = (173);break;
case 3 : result = (170);break;
case 4 : result = (166);break;
case 5 : result = (164);break;
case 6 : result = (160);break;
case 7 : result = (157);break;
case 8 : result = (153);break;
case 9 : result = (151);break;
case 10: result = (148);break;
case 11 : result = (145);break;
case 12 : result = (142);break;
case 13 : result = (139);break;
case 14 : result = (136);break;
case 15 : result = (133);break;
case 16 : result = (129);break;
case 17 : result = (126);break;
case 18 : result = (123);break;
case 19 : result = (120);break;
case 20 : result = (118);break;
case 21 : result = (115);break;
case 22 : result = (112);break;
case 23 : result = (109);break;
case 24 : result = (106);break;
case 25 : result = (103);break;
case 26 : result = (99);break;
case 27 : result = (96);break;
case 28 : result = (93);break;
case 29 : result = (90);break;
case 30 : result = (87);break;
case 31 : result = (84);break;
case 32 : result = (81);break;
case 33 : result = (78);break;
case 34 : result = (75);break;
case 35 : result = (72);break;
case 36 : result = (69);break;
case 37 : result = (66);break;
case 38 : result = (64);break;
case 39 : result = (61);break;
case 40 : result = (58);break;
case 41 : result = (55);break;
case 42 : result = (52);break;
case 43 : result = (49);break;
case 44 : result = (46);break;
case 45 : result = (43);break;
case 46 : result = (40);break;
case 47 : result = (37);break;
case 48 : result = (34);break;
case 49 : result = (31);break;
case 50 : result = (28);break;
case 51 : result = (25);break;
case 52 : result = (22);break;
case 53 : result = (19);break;
case 54 : result = (17);break;
case 55 : result = (14);break;
case 56 : result = (11);break;
case 57 : result = (8);break;
case 58 : result = (6);break;
case 59 : result = (3);break;
default : result = (0);
}
return result;
}
int DEC_To_Hour_Servo ( int Hour_Servo_Value)
{
int result;
switch (Hour_Servo_Value)
{
case 1 : result = (168);break;
case 2 : result = (161);break;
case 3 : result = (154);break;
case 4 : result = (147);break;
case 5 : result = (141);break;
case 6 : result = (133);break;
case 7 : result = (127);break;
case 8 : result = (121);break;
case 9 : result = (114);break;
case 10: result = (107);break;
case 11 : result = (101);break;
case 12 : result = (94);break;
case 13 : result = (87);break;
case 14 : result = (81);break;
case 15 : result = (75);break;
case 16 : result = (69);break;
case 17 : result = (63);break;
case 18 : result = (56);break;
case 19 : result = (50);break;
case 20 : result = (44);break;
case 21 : result = (37);break;
case 22 : result = (31);break;
case 23 : result = (25);break;
case 24 : result = (19);break;
default : result = (18);
}
return result;
}
Comments
Author
Published on
January 31, 2019Members who respect this project
you might like