Merkurino 01 a hodiny RTC

Jak si naprogramovat budík? Jak spouštět čerpadlo jen v určitý čas podle změřené teploty?

K Merkurinu (Arduinu) stačí připojit modul s obvodem reálného času (DS1307) do konektoru pro seriovou komunikaci zvanou I2C.

modul RTC na i2c

modul RTC na i2c

Zapojení je jednoduché, stačí 4 vodiče nebo piny.
0V (Gnd),
+5V (Vcc),
data (Sda) na vstup A4 a
hodiny (Scl) na vstup A5.

Zobrazení reálného času

Zobrazení reálného času

připojení modulu

Připojení modulu

Příklad nastavení a čtení času:

// popis Merkurino 01: www.MerkurRobot.cz
// rtc modul na i2c - jen čtení času s ds1307
#include "Wire.h" // knihovna pro i2c komunikaci
#define DS1307_ADDRESS 0x68
byte zero = 0x00; //workaround for issue #527

#include <LiquidCrystal.h>
LiquidCrystal lcd(13, 12, 8, 7, 4, 2);
// definice proměnných
int lcd_key = 0;
int adc_key_in = 0;

char cas[8]; //pole znaků pro čas
char datum[10]; //pole znaků pro datum

void setup(){   // procedura setup ----------------------------
  Wire.begin();
  Serial.begin(9600);
  //setDateTime(); //MUST CONFIGURE IN FUNCTION
         //pokud chceme nastavit čas v hodinách,
         //zrušit lomítka a nastavit ve funkci přesný čas.
         //Po nastavení opět zapoznámkovat
  lcd.begin(16, 2); // start LCD library
  lcd.setCursor(0,0); // nastavení pozice kurzoru
  lcd.print("Nyni");  
  lcd.setCursor(0,1); //
  lcd.print("je:");                  
} // konec procedura setup ----------------------------

//----------------------------------------------------------
void loop(){  // procedura loop ----------------------------
  printDate();
  lcd.setCursor(8,0); // nastavení pozice kurzoru
  lcd.print(cas);
  lcd.setCursor(6,1); // nastavení pozice kurzoru
  lcd.print(datum);
  delay(1000);
} // konec procedura loop ----------------------------------
//----------------------------------------------------------

// procedury pro nastavení a čtení času v hodinách ds1307 -------
void setDateTime(){ 
  byte second =00; //0-59
  byte minute =53; //0-59
  byte hour =14; //0-23
  byte weekDay = 0; //1-7 (0-6, neděle – sobota
  byte monthDay =19; //1-31
  byte month = 9; //1-12
  byte year= 14; //0-99 (msd’s 4-digit year ignored
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero); //stop Oscillator
  Wire.write(decToBcd(second));
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(weekDay));
  //DS1307 RTC Libraries And Examples V2.1.Docx 11
  Wire.write(decToBcd(monthDay));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.write(zero); //start
  Wire.endTransmission();
}
byte decToBcd(byte val){
  // Convert normal decimal numbers to binary coded decimal
  return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val){
  // Convert binary coded decimal to normal decimal numbers
  return ( (val/16*10) + (val%16) );
}
void printDate(){
  // Reset the register pointer
  Wire.beginTransmission(DS1307_ADDRESS);
  Wire.write(zero);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_ADDRESS, 7);
  int second = bcdToDec(Wire.read());
  int minute = bcdToDec(Wire.read());
  int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
  int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday -Saturday
  int monthDay = bcdToDec(Wire.read());
  int month = bcdToDec(Wire.read());
  int year = bcdToDec(Wire.read());
  //print the date EG 23.01.2011 23:59:59
  sprintf(cas,"%02d:%02d:%02d",hour,minute,second);
  sprintf(datum,"%02d.%02d.20%02d",monthDay,month,year);
  Serial.print(datum); Serial.print(" "); Serial.print(cas);
  Serial.println();
  
}
// konec procedur pro nastavení a čtení času v hodinách ds1307 -------

Napsat komentář