Arduino RTC saat modulü projesi

Mçınar

Hectopat
Katılım
5 Ağustos 2019
Mesajlar
461
Arduino üzerinde RTC saat modülüyle 1 senede çalması için alarm devresi kurma projesi üzerinde çalışıyorum. İnternet üzerinden bulduğum devre şeması ve kodlar üzerinde belirli değişikliklere gittim onlar üzerinde bahsedeyim.



Şu anki hatalarım:



Benim projemde (LCD ekran ve 12C modülü ve butonlar olmadan yapmaya çalışıyorum. Bunları iptal ediyorum. Aşağıdaki kodlar üzerinde LCD. Olan yerleri seri port ekranı üzerinde görmek istediğim için LCD olan kod bloklarını serial.print ile seri ekranda göstermesini istedim. Arkadaşlar yanlış yaptığım ya da şunu yanlış düşünmüşsün dediğiniz yerler varsa önerilerinizi bekliyorum.

SetCursor() kod bloklarını lcd ile ilgili old. için iptal ettim.

Proje kodları;

**************************************************

[CODE title="Proje kodları"]#Define rtc_clk 4 // clock.
#Define rtc_dat 3 // data.
#Define rtc_rst 2 // enable.

#Define btn_al A0.
#Define btn_dn A0//A1
#Define btn_up A0//A2
#Define btn_set A0//A3

#Define al_buzz 11.

//#İnclude <LCD.h>
//#İnclude <LiquidCrystal_I2C.h>
//Liquidcrystal_ı2C LCD(0x27, 2, 1, 0, 4, 5, 6, 7);

Unsigned long timeupdate = 0;
Unsigned long timebutton = 0;
Unsigned long timealarm = 0;
Bool buttonpress = false;
Byte alarmon = 0;
Bool alarmsw = 1;
Byte setmode = 0;
Byte setalarm = 0;

Byte daysofmonth[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
Const char* months[13] = {"---", "oca", "sub", "mar", "nıs", "may", "haz", "tem", "agu", "eyl", "eki", "kas", "ara"};
Const char* wdays[8] = {"---", "pts", "sal", "car", "per", "cum", "cts", "paz"};

Byte hh, mm, SS; // hour, minute, second (saat, dakika, saniye)
Byte dd, mm, yy; // day, month, year (gün, ay, yıl)
Byte dw; // day of the week (haftanın kaçıncı günü)
Byte AE, ah, am; // alarm: Enabled, hour, minute (alarm: Etkin, saat, dakika)

Static byte bcd2bin (byte val) {
Return val - 6 * (val >> 4);
}

Static byte bin2bcd (byte val) {
Return val + 6 * (val / 10);
}

// DS1302 communication from GitHub - NeiroNx/RTCLib: A library that makes interfacing DS1302, DS1307, DS3231, PCF8583, PCF8563, RTC_Millis Real Time Clock modules easy.
Void rtc_write(byte val) {
Pinmode(rtc_dat, output);
Shiftout(rtc_dat, rtc_clk, lsbfırst, val);
}

Void rtc_write_reg(byte addr, byte val) {
Digitalwrite(rtc_rst, hıgh);
Rtc_write(addr);
Rtc_write(val);
Digitalwrite(rtc_rst, Low);
}

Byte rtc_read() {
Pinmode(rtc_dat, ınput);
Byte Value = 0;
For (byte i = 0; i < 8; i++) {
Value |= (digitalread(rtc_dat) << i);
Digitalwrite(rtc_clk, hıgh);
Digitalwrite(rtc_clk, Low);
}
Return Value;
}

Byte rtc_read_reg(byte addr) {
Digitalwrite(rtc_rst, hıgh);
Rtc_write(addr);
Byte val = rtc_read();
Digitalwrite(rtc_rst, Low);
Return val;
}

Void rtc_read_time() {
Digitalwrite(rtc_rst, hıgh);
Rtc_write(0xbf); // veri bloğu okuma modu.

Byte ss_reg = rtc_read();
İf (bitread(ss_reg, 7)) {// saat durdu.
//Serial.clear();
// Serial.println().setCursor(0, 0);
Serial. Print("RTC not running");
// Serial.println().setCursor(0, 1);
Serial. Print("saati ayarla");
Return; // to do.
}

SS = bcd2bin(ss_reg & 0x7F);
Mm = bcd2bin(rtc_read());
Hh = bcd2bin(rtc_read());
Dd = bcd2bin(rtc_read());
Mm = bcd2bin(rtc_read());
Dw = bcd2bin(rtc_read());
Yy = bcd2bin(rtc_read());
Digitalwrite(rtc_rst, Low);
}
/*
Void initTimeDisplay() {
lcd.clear();
LCD. Setcursor(6, 0); LCD. Print(':');
LCD. Setcursor(9, 0); LCD. Print(':');
LCD. Setcursor(2, 1); LCD. Print('-');
LCD. Setcursor(6, 1); LCD. Print('-');
LCD. Setcursor(11, 1); LCD. Print(',');
}
*/

Void updateDisplay() {
rtc_read_time();

// LCD. Setcursor(7, 0);
İf (mm < 10) serial. Print('0');
Serial. Print(mm, dec);

// Serial.println().setCursor(4, 0);
İf (hh < 10) serial. Print('0');
Serial. Print(hh, dec);

// Serial.println().setCursor(0, 1);
İf (dd < 9) serial. Print('0');
Serial. Print(dd, dec);

//Serial.println().setCursor(13, 1);
Serial. Print(wdays[dw]);

//Serial.println().setCursor(3, 1);
Serial. Print(months[MM]);

//Serial.println().setCursor(7, 1);
Serial. Print(yy + 2000, dec);

//Lcd. Setcursor(15, 0);
AE? Serial. Print('*'): Serial. Print(' ');
}

Void setVariable() { //zaman ayarları----------------------------------
// Serial.println.clear();
//Serial. Setcursor(0, 0);
Serial. Println("ayar");
//Serial. Setcursor(0, 1);
Serial. Println("< >");

Rtc_write_reg(0x8e, 0x00);

Switch (setmode) {
Case 1: // year.
// Serial. Println. Setcursor(7, 0);
Serial. Print("yil");
// Serial. Println. Setcursor(6, 1);
Serial. Print(yy + 2000, dec);
Break;
Case 2: // month.
Rtc_write_reg(0x8C, bin2bcd(yy));

//Serial. Println. Setcursor(7, 0);
Serial. Print("ay");
// Serial. Println. Setcursor(6, 1);
Serial. Print(months[MM]);
Break;
Case 3: // day.
Rtc_write_reg(0x88, bin2bcd(mm));

// Serial. Println. Setcursor(7, 0);
Serial. Print("gun");
//Serial. Println. Setcursor(6, 1);
İf (dd < 10) serial. Print('0');
Serial. Println(dd, dec);
Break;
Case 4: // day of week.
Rtc_write_reg(0x86, bin2bcd(dd));

// Serial. Println. Setcursor(7, 0);
Serial. Print("HAF. Gunu");
// Serial. Println. Setcursor(6, 1);
Serial. Print(wdays[dw]);
Break;
Case 5: // hour.
Rtc_write_reg(0x8a, bin2bcd(dw));

// Serial. Println. Setcursor(7, 0);
Serial. Print("saat");
// Serial. Println. Setcursor(6, 1);
İf (hh < 10) serial. Print('0');
Serial. Print(hh, dec);
Break;
Case 6: // minutes.
Rtc_write_reg(0x84, bin2bcd(hh));

// Serial. Println. Setcursor(7, 0);
Serial. Print("dakika");
//Serial. Println. Setcursor(6, 1);
İf (mm < 10) serial. Print('0');
Serial. Print(mm, dec);
Break;
Case 7:
Rtc_write_reg(0x82, bin2bcd(mm));
Rtc_write_reg(0x80, 0x00); // saatin durmadığından ve saniyeleri sıfırladığından emin ol.
Default:
Setmode = 0;
Rtc_write_reg(0x8e, 0x80); // yazma koruması.
// initTimeDisplay();
// updateTime()
//updateDisplay();
}
}

Void adjustvariable(char a = 1) {
// Serial. Setcursor(6, 1);
Serial. Print(" ");
//Serial. Setcursor(6, 1);
Char t;

Switch (setmode) {
Case 1: // year.
T = yy; t += a;
İf ((t >= 0) && (t < 100)) yy = t;
Serial. Print(yy + 2000, dec);
Break;
Case 2: // month.
T = mm; t += a;
İf ((t > 0) && (t <= 12)) mm = t;
Serial. Print(months[MM]);
Break;
Case 3: // day.
T = dd; t += a;
İf ((t > 0) && (t <= daysofmonth[MM])) dd = t;
İf (dd < 10) serial. Println('0');
Serial. Println(dd, dec);
Break;
Case 4: // day of week.
T = dw; t += a;
İf ((t > 0) && (t <= 7)) dw = t;
Serial. Println(wdays[dw]);
Break;
Case 5: // hour.
T = hh; t += a;
İf ((t >= 0) && (t < 24)) hh = t;
İf (hh < 10) serial. Println('0');
Serial. Println(hh, dec);
Break;
Case 6: // minutes.
T = mm; t += a;
İf ((t >= 0) && (t < 60)) mm = t;
İf (mm < 10) serial. Println('0');
Serial. Println(mm, dec);
Break;
}

Switch (setalarm) {
Case 1: // enable.
AE = 1 - AE;
AE? Serial. Print("evet"): Serial. Print("hayir");
Break;
Case 2: // hour.
T = ah; t += a;
İf ((t >= 0) && (t < 24)) ah = t;
İf (ah < 10) serial. Print('0');
Serial. Print(ah, dec);
Break;
Case 3: // minutes.
T = am; t += a;
İf ((t >= 0) && (t < 60)) am = t;
İf (am < 10) serial. Print('0');
Serial. Print(am, dec);
Break;
}
}

Void setAlVariable() {
// lcd.clear();
//Serial. Setcursor(0, 0);
Serial. Print("alarm");
//Serial. Setcursor(0, 1);
Serial. Print("< >");

Rtc_write_reg(0x8e, 0x00);

Switch (setalarm) {
Case 1: // alarm enabled.
//Serial. Setcursor(6, 0);
Serial. Print("etkin");
// Serial. Setcursor(6, 1);
AE? Serial. Print("evet"): Serial. Print("hayir");
Break;
Case 2: // alarm hour.
Rtc_write_reg(0xc0, AE);
İf (AE == 0) { // is disabled, do not ask for ah and am.
Setalarm = 0;
Rtc_write_reg(0x8e, 0x80); // yazma koruması.
// initTimeDisplay();
//updateTime()
//updateDisplay();
Return;
}

// Serial. Setcursor(6, 0);
Serial. Println("saat");
// Serial. Setcursor(6, 1);
İf (ah < 10) serial. Print('0');
Serial. Println(ah, dec);
Break;
Case 3: // alarm minute.
Rtc_write_reg(0xc2, ah);

// Serial. Setcursor(6, 0);
Serial. Println("dakika");
// Serial. Setcursor(6, 1);
İf (am < 10) serial. Print('0');
Serial. Println(am, dec);
Break;
Case 4:
Rtc_write_reg(0xc4, am);
Default:
Setalarm = 0;
Rtc_write_reg(0x8e, 0x80); // yazma koruması.
// initTimeDisplay();
// updateTime()
//updateDisplay();
}
}

Void setup() {
Pinmode(rtc_rst, output);
Pinmode(rtc_clk, output);
Pinmode(rtc_dat, ınput);
Digitalwrite(rtc_rst, Low);

Pinmode(btn_al, ınput_pullup);
Pinmode(btn_dn, ınput_pullup);
Pinmode(btn_up, ınput_pullup);
Pinmode(btn_set, ınput_pullup);

Pinmode(al_buzz, output);
Digitalwrite(al_buzz, Low);

Delay(1000);

// Serial. Begin(16, 2);
// LCD. Setbacklightpin(3, posıtıve);
// LCD. Setbacklight(hıgh);

Std: Get; alarm info.
AE = rtc_read_reg(0xc1);
Ah = rtc_read_reg(0xc3);
Am = rtc_read_reg(0xc5);

İf ((ah > 23) || (am > 59)) {
AE = 0;
Ah = 0;
Am = 0;
}

//updateTime();
// updateDisplay();
}

Void loop() {
Unsigned long current = millis();

İf ((current >= timeupdate + 1000) && (setmode + setalarm == 0)) {
İf (SS == 0) {
updateDisplay();
İf (AE && (hh == ah) && (mm == am)) alarmon = true;
Else alarmon = false;
}

// Display seconds.
// Serial. Setcursor(10, 0);
İf (SS < 10) serial. Print('0');
Serial. Print(SS, dec);

// İncrement seconds.
SS++;
İf (SS == 60) SS = 0;

Timeupdate = current;
}

İf (current >= timebutton + 10) {
İf ((digitalread(btn_set) == Low) && (setalarm == 0)) {
Buttonpress = true;
Setmode++;
setVariable();
}

İf ((digitalread(btn_up) == Low) && (setmode || setalarm)) {
Buttonpress = true;
Adjustvariable(1);
}

İf ((digitalread(btn_dn) == Low) && (setmode || setalarm)) {
Buttonpress = true;
Adjustvariable(-1);
}

İf ((digitalread(btn_al) == Low) && (setmode == 0)) {
Buttonpress = true;
İf (alarmon) {
Alarmon = 0;
Digitalwrite(al_buzz, Low);
//Serial. Setcursor(0, 0); serial. Print(" ");
// Serial. Setcursor(13, 0); serial. Print(" ");
}
Else {
Setalarm++;
setAlVariable();
}
}

Timebutton = current;
İf (buttonpress) {
Timebutton += 200; // 200 ms tuş basma araları.
Buttonpress = false;
}
}

İf (current >= timealarm + 300) {
İf (alarmon) {
Digitalwrite(al_buzz, alarmsw);
// Serial. Setcursor(0, 0);
Alarmsw? Serial. Print("<<<"): Serial. Print(" ");
// Serial. Setcursor(13, 0);
Alarmsw? Serial. Print(">>>"): Serial. Print(" ");
Alarmsw = 1 - alarmsw;
Timealarm = current;
}
Else.
Digitalwrite(al_buzz, Low);
}
}[/CODE]
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…