loading

This is a rather crazy clock: the Arduino reads a real time clock module and then a servo controlled "finger" punches in each number on a Grove 4-digit display. You have to see the video to understand.,

I haven't really show how to build it as I doubt anyone would want such a beast but I have included the code in case anyone is interested in how to hook everything up.

Ciao as this is my final project. LLAP.

Step 1: Servos, Switches and Arduino

First photo shows 4 contact push buttons glued into a piece of wood.

Second photo shows finger using 1 servo to push and pull finger up and down.

Third photo shows slider servo that pushes finger left and right.,

Final photo shows 4 digit display and Arduino Uno. I used a RTC clock module to get real time and a GROVE 4-digit display (TM1637) which only needs two wires to control (not 12 wires like some displays).

Step 2: Here Is Arduino Sketch...

#include Wire.h

#include SoftwareSerial.h

//put brackets around library names

#include Suli.h

#include Four_Digit_Display_Arduino.h

#include Wire.h

#include "RTClib.h"

#include Servo.h

#include SoftwareSerial.h

Servo servo1,servo2,servo3;

const int buttonPin4 = 13,buttonPin3=11,buttonPin2=12; int val1,val2,val3,val4; int but1,but2,but3,but4,curMin,oldMin,keyPress; Four_Digit_Display_Arduino disp;

void myServo(int curAngle,int newAngle,int angleInc,int incDelay,int servoNum) { if (curAngle < newAngle) { for(int angle=curAngle;angle < newAngle;angle += angleInc) { if (servoNum == 1) servo1.write(angle); if (servoNum == 2) servo2.write(angle); if (servoNum == 3) servo3.write(angle); delay(incDelay); } } else if (curAngle > newAngle) { for(int angle=curAngle;angle > newAngle;angle -= angleInc) { if (servoNum == 1) servo1.write(angle); if (servoNum == 2) servo2.write(angle); if (servoNum == 3) servo3.write(angle); delay(incDelay); } } } /*-----( Declare objects )-----*/ RTC_DS1307 rtc; // Create a RealTimeClock object void keyDown() { servo1.write(43); delay(250); } void keyUp() { servo1.write(120); delay(100); } void slideFinger(int pos) { servo3.write(pos); delay(1000); } int getKeyPress(int switchNo) { while(1) { int but = digitalRead(switchNo); delay(20); if (but==LOW) { Serial.print("but=low");Serial.println(but); but=HIGH; return 1; } } } void setup() { Serial.begin(9600); // Set up for Serial Monitor to be able to see this work servo1.attach(7); // finger servo delay(10);delay(1000); servo1.write(90); servo3.attach(9); //slider servo delay(10); servo3.write(90); delay(5000);

Wire.begin(); disp.begin(2,3); disp.clear(); disp.pointOn(); pinMode(buttonPin4,INPUT_PULLUP); pinMode(buttonPin3,INPUT_PULLUP); rtc.begin(); // Start the RTC library code

/*----( SET the date and time. Comment OUT these lines after setting )----*/ // Put these "//" in front of the line you do NOT want to use // following line sets the RTC to the date & time this sketch was compiled rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // This line sets the RTC with an explicit date & time, for example to set // May 21, 2015 at 6pm you would call: (use 24 hour time) // rtc.adjust(DateTime(2015, 5, 21, 18, 0, 0));

}//--(end setup )---

void loop() { ////String testString = "4"; //val4 = testString.toInt(); //val4= testString.charAt(1); //val4=9; //disp.pointOn(); //disp.begin(2,3); //disp.clear(); DateTime now = rtc.now(); // Read data from the RTC Chip curMin = now.minute() % 10; //keyPress = getKeyPress(); if (curMin != oldMin) { disp.clear(); val1 = now.hour() / 10; val2 = now.hour() % 10; val3 = now.minute() / 10; val4 = now.minute() % 10; slideFinger(36); //move slider for (int i=0;i <= val4;i++) { keyDown(); // finger down Serial.print("keypress=");Serial.println(i); if (getKeyPress(13) == 1) { disp.display(3,i); delay(10); keyUp(); //finger up delay(100); } // disp mins } slideFinger(72); //move slider for (int i=0;i <= val3;i++) { keyDown(); // finger down Serial.print("keypress=3.");Serial.println(i); if (getKeyPress(11) == 1) { disp.display(2,i); delay(10); keyUp(); //finger up delay(100); } // disp mins } slideFinger(101); //move slider for (int i=0;i <= val2;i++) { keyDown(); // finger down Serial.print("keypress=");Serial.println(i); if (getKeyPress(12) == 1) { disp.display(1,i); delay(10); keyUp(); //finger up delay(100); } // disp mins } slideFinger(139); //move slider for (int i=0;i <= val1;i++) { keyDown(); // finger down Serial.print("keypress=");Serial.println(i); if (getKeyPress(10) == 1) { disp.display(0,i); delay(10); keyUp(); //finger up delay(100); } // disp mins } //disp.display(0, now.hour() / 10); //disp.display(1, now.hour() % 10); //disp.display(2, now.minute() / 10); //disp.display(3, now.minute() % 10); servo3.write(90); delay(3000); // disp.clear(); //disp.display(0,1); delay(3000); //disp.pointOff(); //disp.pointOn();

Serial.print(now.year(), DEC); // Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(' '); Serial.print(now.hour() % 10 , DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); oldMin = curMin; } // oldMin }

About This Instructable

465views

7favorites

License:

Bio: I am an American teaching English at Shangluo University, Shaanxi. I like making machines that do interesting but fairly useless things - I call them Quixotic ... More »
More by JimRD:Arduino Controlled Morse Code Key and Transmitter Magnetic Levitating Globe Tear-apart and Fix Morse Code Key (and Sounder) Made From Steak-knife and Multi-tester 
Add instructable to: