Всем привет. Давно уже не писал тут, собственно помогите поправить код: Код (Text): #include "Wire.h" #define DS1307_I2C_ADDRESS 0x68 #include "OasisLED.h" #include <Arduino.h> #include <IRremote.h> #include <RCSwitch.h> int RECV_PIN = 11; uint8_t clockPin = 3; uint8_t strobePin = 2; uint8_t dataPin = 4; OasisLED ledDisplay = OasisLED(clockPin, strobePin, dataPin); IRrecv irrecv(RECV_PIN); decode_results results; RCSwitch mySwitch = RCSwitch(); byte decToBcd(byte val) { return ( (val/10*16) + (val%10) ); } byte bcdToDec(byte val) { return ( (val/16*10) + (val%16) ); } void setDateDs1307(byte second, // 0-59 byte minute, // 0-59 byte hour, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28/29/30/31 byte month, // 1-12 byte year) // 0-99 { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.write(decToBcd(second)); Wire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.write(decToBcd(dayOfWeek)); Wire.write(decToBcd(dayOfMonth)); Wire.write(decToBcd(month)); Wire.write(decToBcd(year)); Wire.endTransmission(); } void getDateDs1307(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 7); *second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read()); } void setup() { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; Wire.begin(); ledDisplay.initialize(); Serial.begin(9600); irrecv.enableIRIn(); // Start the receiver mySwitch.enableTransmit(10); mySwitch.setPulseLength(237); second = 30; minute = 00; hour = 23; dayOfWeek = 7; dayOfMonth = 17; month = 5; year = 15; // setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); } void loop() { printTime(); } void printTime() { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); ledDisplay.setValue(hour*100+minute); if(irrecv.decode(&results)) { Serial.println(results.value, HEX); if ((results.value == 0x36) || (results.value == 0x10036)) { mySwitch.send(7652200,24); } delay (500); irrecv.resume(); } } Часы начинают отставать со временем. Как внести корректировку? Спасибо
Общий принцип такой - Допустим, часы отстают на секунду в сутки. Тогда раз в сутки, например в 00 часов - вызываете команду setDate с текущим временем + 1 секунда. Не в тот раздел запостили вопрос - причем тут Микроконтроллеры?
Лучшим выходом, пмсм, будет отказ от DS1307 в пользу DS3231 - они сильно точнее. Общение с ними на том уровне, что нужно вам - такое же.