Zdravím, chtěl jsem se s Vámi podělit o svůj kód. Vím, že tento modul je celkem starý a moc se už nepoužívá, přesto se s ním asi začátečníci jako já potkají. Mě například přišel v krabičce se spoustou ostatního. Teprve se učím, ale podařilo se zprovoznit MH-Real TIME Clock module 2 a spolu s 16x2 LDC displejem si udělat hodiny.
Oříšek pro mne byl ale počáteční nastavení času do modulu – samozřejmě je to jednoduché to tam napsat ručně. Ale protože programátor je v zásadě velmi líný tvor a lenost je matka pokroku, napsal jsem takovou rutinu, která uloží do modulu automaticky čas při kompilaci a nahrání do modulu (procedura se jmenuje AutoSetBuildTime). Má to nějaké omezení, například pokud nebudete u PC a vyndáte baterku, nahraje se automaticky čas při poslední kompilaci.
// ** Modified by MaaRty **
// ** To set the build time into RTC module automatically - **
// ** - is necessary to unplug the battery or CVV before compiling **
//
// Ukazka pouziti DS1302-knihovny k udelani hodin -
// - pomoci DS1302 a 16x2 LCD displaye s pouzitim I2C prevodniku.
// Show how to use the DS1302l ibrary to get clock working -
// - on the 16x2 LCD display with I2C
//
// DS1302: CLK pin -> Arduino UNO Digital 2
// DAT pin -> Arduino UNO Digital 3
// RST pin -> Arduino UNO Digital 4
// VCC pin -> Arduino UNO 5V POWER
// GND pin -> Arduino UNO GND
// LCD16x2 I2C:
// GND -> Arduino UNO GND
// VCC -> Arduino UNO 5V POWER
// SDA -> Arduino UNO SDA
// SLC -> Arduino UNO SLC
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DS1302RTC.h>
#include <Time.h>
#include <TimeLib.h>
#include <string.h>
// Init the DS1302
// Set pins: RST, DAT, CLK
DS1302RTC RTC(4, 3, 2);
// Optional connection for RTC module
//#define DS1302_GND_PIN 33
//#define DS1302_VCC_PIN 35
// Init the LCD
// initialize the library with the numbers of the interface pins
// set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27,16,2);
void setup()
{
lcd.init(); //inicializace lcd // initialize the lcd
lcd.backlight(); // rozsviceni // open the backlight
// Hodiny bezi nebo ne? pokud ne nastavi cas // Clock runing? If not set time.
// RTC.haltRTC(true); // true - nebezi, false bezi (casovac) // true - running
if(RTC.haltRTC()){
lcd.print("Clock stopped!");
//Aktualizace datumu a casu manualne //manual set time and date
//setTime(22, 29, 00, 02, 03, 2019);
//setTime(hour,minute,second,day,month,year);
//RTC.set(now());
//AKTUALIZACE CASU AUTOMATICKY NA BULID TIME // ------
// Automatically sets the time when the code is compiled //
AutoSetBuildTime();
RTC.haltRTC(false);
}
else
lcd.print("Clock working.");
delay(500);
lcd.setCursor(0,1);
if (RTC.writeEN())
lcd.print("Write allowed.");
else
lcd.print("Write protected.");
delay ( 2000 );
// Setup time library
lcd.clear();
lcd.print("RTC Sync");
setSyncProvider(RTC.get); // the function to get the time from the RTC
if(timeStatus() == timeSet)
lcd.print(" Ok!");
else
lcd.print(" FAIL!");
delay ( 2000 );
lcd.clear();
}
void loop()
{
static int sday = 0; // Saved day number for change check
// Display time centered on the upper line
lcd.setCursor(3, 0);
print2digits(hour());
lcd.print(" ");
print2digits(minute());
lcd.print(" ");
print2digits(second());
// Update in 00:00:00 hour only
if(sday != day()) {
// Display abbreviated Day-of-Week in the lower left corner
lcd.setCursor(0, 1);
lcd.print(dayShortStr(weekday()));
// Display date in the lower right corner
lcd.setCursor(5, 1);
lcd.print(" ");
print2digits(day());
lcd.print("/");
print2digits(month());
lcd.print("/");
lcd.print(year());
}
// Warning!
if(timeStatus() != timeSet) {
lcd.setCursor(0, 1);
lcd.print(F("RTC ERROR: SYNC!"));
}
// Save day number
sday = day();
// Wait small time before repeating :)
delay (100);
}
//AKTUALIZACE CASU AUTOMATICKY NA BULID TIME // ------
// Automatically sets the time when the code is compiled //
void AutoSetBuildTime()
{
char input[] =__TIME__ " " __DATE__; //Input
String H,M,S,D,N,Y; // Output
const char del[] = " :,"; //Delimiters
char *token;
int i=0;
char *array[6]; // Number of variables to save
int Hi,Mi,Si,Di,Ni,Yi;
token = strtok(input, del);
while( token != NULL ) //splitted
{
array[i++] = token;
token = strtok(NULL, del);
}
H = array[0];
Hi = H.toInt();
M = array[1];
Mi = M.toInt();
S = array[2];
Si = S.toInt();
D = array[4];
Di = D.toInt();
N = array[3]; // prevod mesicu na cisla :) // month to number
if (N == "Jan")
Ni = 1;
else if ( N == "Feb")
Ni = 2 ;
else if ( N == "Mar")
Ni = 3 ;
else if ( N == "Apr")
Ni = 4 ;
else if ( N == "May")
Ni = 5 ;
else if ( N == "Jun")
Ni = 6 ;
else if ( N == "Jul")
Ni = 7 ;
else if ( N == "Aug")
Ni = 8 ;
else if ( N == "Sep")
Ni = 9 ;
else if ( N == "Oct")
Ni = 10 ;
else if ( N == "Nov")
Ni = 11 ;
else if ( N = "Dec")
Ni = 12 ;
Y = array[5];
Yi = Y.toInt();
setTime(Hi,Mi,Si,Di,Ni,Yi);
RTC.set(now());
}
//-------------------------------------------------
//Prints alway two digits to display (00)
void print2digits(int number) {
if (number >= 0 && number < 10) {
lcd.write('0');
}
lcd.print(number);
}
Takže to shrnu. Kód je kompletní rozchození hodin RTC modulu DS1302 na 16x2 LCD display s I2C sběrnicí a automatickým nahráním aktuálního času z PC při kompilaci (musí být prvně odpojen zdroj pro nové nastavení času). Kód je popsán podrobně v poznámkách.