Hi
I have already written code for an analog clock that uses a stepper motor for the output. The code works but it losses accuracy over a few week.
The circuit board size means that space is a premium so the smallest RTC I can find is the DS2417.
I have never used a RTC and have no idea on where to start with adding it to my code to make the accuracy better.
Here is my original clock code
#define SP1 8
#define SP2 9
#define SP3 10
#define SP4 11
#define SET_PIN 7
#include "myPushSwitch.h"
// Set input has internal pullup; LOW when active; no double-click; no double-click delay; use default debounce time
PushSwitch setSwitch(SET_PIN, INPUT_PULLUP, LOW, false);
const uint32_t ONE_MINUTE = 60 * 1000UL;
const uint32_t MAX_SET_STEP_INTERVAL = 1000UL;
const uint32_t MIN_SET_STEP_INTERVAL = 50UL;
const uint32_t SET_STEP_DELTA = 100UL;
void parkMotor()
{
// step 0
digitalWrite(SP1, LOW);
digitalWrite(SP2, LOW);
digitalWrite(SP3, LOW);
digitalWrite(SP4, LOW);
}
void stepMotor(uint16_t tickLength)
{
// step 0
digitalWrite(SP1, LOW);
digitalWrite(SP2, HIGH);
digitalWrite(SP3, HIGH);
digitalWrite(SP4, HIGH);
delayMicroseconds(tickLength);
// step 1
digitalWrite(SP1, LOW);
digitalWrite(SP2, HIGH);
digitalWrite(SP3, HIGH);
digitalWrite(SP4, LOW);
delayMicroseconds(tickLength);
// step 2
digitalWrite(SP1, HIGH);
digitalWrite(SP2, HIGH);
digitalWrite(SP3, HIGH);
digitalWrite(SP4, LOW);
delayMicroseconds(tickLength);
// step 3
digitalWrite(SP1, HIGH);
digitalWrite(SP2, LOW);
digitalWrite(SP3, LOW);
digitalWrite(SP4, LOW);
delayMicroseconds(tickLength);
// step 4
digitalWrite(SP1, HIGH);
digitalWrite(SP2, LOW);
digitalWrite(SP3, LOW);
digitalWrite(SP4, HIGH);
delayMicroseconds(tickLength);
// step 5
digitalWrite(SP1, LOW);
digitalWrite(SP2, LOW);
digitalWrite(SP3, LOW);
digitalWrite(SP4, HIGH);
delayMicroseconds(tickLength);
// step 6
digitalWrite(SP1, LOW);
digitalWrite(SP2, HIGH);
digitalWrite(SP3, HIGH);
digitalWrite(SP4, HIGH);
delayMicroseconds(tickLength);
// idle
parkMotor();
}
uint32_t lastStepTime;
uint32_t stepInterval;
void setup()
{
Serial.begin(115200);
Serial.println("program started");
pinMode(SP1, OUTPUT);
pinMode(SP2, OUTPUT);
pinMode(SP3, OUTPUT);
pinMode(SP4, OUTPUT);
parkMotor();
setSwitch.begin();
lastStepTime = millis();
stepInterval = ONE_MINUTE;
}
void loop()
{
switchEvent event = setSwitch.update();
if (event == switchPressed)
{
Serial.print("switch pressed - ");
stepInterval = MAX_SET_STEP_INTERVAL;
Serial.println(stepInterval);
}
else if (event == switchReleased)
{
lastStepTime = millis();
stepInterval = ONE_MINUTE;
Serial.println("switch released");
}
if (millis() - lastStepTime > stepInterval)
{
lastStepTime = millis();
Serial.println("tick");
stepMotor(6000);
switchState state = setSwitch.read();
if (state == switchWasPressed)
{
Serial.print("switch still pressed - ");
if (stepInterval > (MIN_SET_STEP_INTERVAL + SET_STEP_DELTA))
{
stepInterval -= SET_STEP_DELTA;
}
else
{
stepInterval = MIN_SET_STEP_INTERVAL;
}
Serial.println(stepInterval);
}
}
}
Any help would be appreciated.
Thank You