LCD hodiny s RTC a využitím času kompilace

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.

Další podobné články

ROBOTICKÉ RAMENO

Stavebnice obsahuje všechny potřebné díly na sestavení robotnického ramene včetně spojovacího materiálu, pouze je nutné dokoupit čtyři kusy MIKRO SERV SG90. Dále je nutné dokoupit řídící jednotku já jsem použil domácí zásoby ARDUINO NANO a pro něho pak modul ARDUINO NANO IO SHIELD pro jednoduchost zapojení. Díly pro sestavení ramene jdou dobře tzv. vylamovat „vypadávají skoro sami. K servům pokud použijete nové tak doporučuji je před montáží odzkoušet zda jsou funkční v plném rozsahu tj. od 0° do 180°, po namontování a zjištění že servo nefunguje to pak opravdu dost zahýbá s nervy. 

Electronic TiltMaze

Cílem tohoto projektu je vytvoření jednoduchého ovládacího systému, který umožňuje naklápění dvou servomotorů pomocí analogového joysticku. Platforma řízená servomotory může simulovat pohyb například v ose X a Y — tedy naklánění doleva/doprava a dopředu/dozadu. Tento systém může sloužit jako základ pro různé aplikace:

- Manuální ovládání kamery nebo senzoru (např. na pohyblivé konstrukci nebo robotovi)
- Interaktivní ovládací panel pro školní projekty nebo herní ovladač