#include <RTClib.h>
#define USING_DS3231 0 // mettre à 1 pour la DS3231
#if USING_DS3231
RTC_DS3231 rtc;
#else
RTC_DS1307 rtc;
#endif
// Motor and clock parameters
// 2048 * 90 / 12 = 15360
#define STEPS_PER_ROTATION 15360 // steps for a full turn of minute rotor
// ports used to control the stepper motor
// if your motor rotate to the opposite direction,
// change the order as {2, 3, 4, 5};
const byte port[] = {2, 3, 4, 6};
const uint32_t delaytime = 4; // wait for a single step of stepper
const int seq[4][4] = {
{ LOW, LOW, HIGH, LOW},
{ LOW, LOW, LOW, HIGH},
{HIGH, LOW, LOW, LOW},
{ LOW, HIGH, LOW, LOW}
};
const uint32_t uneMinute = 3; // devrait être 60 mais pour le test on met 3 secondes
DateTime tempsPrecedent;
void rotate(int step) {
static int phase = 0;
int i, j;
int delta = (step > 0) ? 1 : 3;
int dt = 20;
step = (step > 0) ? step : -step;
for (j = 0; j < step; j++) {
phase = (phase + delta) % 4;
for (i = 0; i < 4; i++) {
digitalWrite(port[i], seq[phase][i]);
}
delay(dt);
if (dt > delaytime) dt--;
}
// power cut
for (i = 0; i < 4; i++)digitalWrite(port[i], LOW);
}
void setup() {
Serial.begin (115200);
for (byte i = 0; i < 4; i++) pinMode(port[i], OUTPUT);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
while (true) yield();
}
#if USING_DS3231
if (rtc.lostPower()) rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // DS3231
#else
if (! rtc.isrunning())rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // DS1307
#endif
tempsPrecedent = rtc.now();
}
void loop() {
DateTime maintenant = rtc.now();
TimeSpan deltaT = maintenant - tempsPrecedent;
if (deltaT.totalseconds() >= uneMinute) {
rotate(256);
tempsPrecedent = rtc.now();
}
delay(1000);
}