Kode Program:
/* * * Pin on DMD P10 GPIO NODEMCU Pin on DS3231 NODEMCU Pin on Buzzer NODEMCU 2 A GPIO16 D0 SCL D1 (GPIO 5) + RX (GPIO 3) 4 B GPIO12 D6 SDA D2 (GPIO 4) - GND 8 CLK GPIO14 D5 VCC 3V 10 SCK GPIO0 D3 GND GND 12 R GPIO13 D7 1 NOE GPIO15 D8 3 GND GND GND Catatan : o Perlu Power Eksternal 5V ke LED P10. */ //Tambahan AB 1 #include <Wire.h> #include <RtcDS3231.h> RtcDS3231<TwoWire> Rtc(Wire); #include <Timer.h> #include <HJS589.h> #include <fonts/ABLED_ArialRMTB10b_Hrfx7.h> #include <fonts/ABLed_numTwCenMTCond25_5x16.h> #include <fonts/ABLed_numTWMTCondes11b_5x7.h> //---------------------------- // SETUP DMD HJS589 #define DISPLAYS_WIDE 3 //2 #define DISPLAYS_HIGH 1 HJS589 Disp(DISPLAYS_WIDE, DISPLAYS_HIGH); // Jumlah Panel P10 yang digunakan (KOLOM,BARIS) //---------------------------------------------------------------------- // HJS589 P10 FUNGSI TAMBAHAN UNTUK NODEMCU ESP8266 void ICACHE_RAM_ATTR refresh() { Disp.refresh(); timer0_write(ESP.getCycleCount() + 80000); } void Disp_init() { Disp.setDoubleBuffer(true); Disp.start(); timer0_attachInterrupt(refresh); Disp.clear(); } //SETUP RTC //year, month, date, hour, min, sec and week-day(Senin 0 sampai Ahad 6) //DateTime dt(2018, 12, 20, 16, 30, 0, 3); RtcDateTime now; //char weekDay[][7] = {"AHAD", "SENIN", "SELASA", "RABU", "KAMIS", "JUM'AT", "SABTU", "AHAD"}; // array hari, dihitung mulai dari senin, hari senin angka nya =0, char weekDay[][7] = {"Ahad", "Senin", "Selasa", "Rabu", "Kamis", "Jum'at", "Sabtu", "Ahad"}; // array hari, dihitung mulai dari senin, hari senin angka nya =0, //char monthYear[][4] = { "DES", "JAN", "FEB", "MAR", "APR", "MEI", "JUN", "JUL", "AGU", "SEP", "OKT", "NOV", "DES" }; char monthYear[][4] = { "12", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12" }; //TIMER Timer tBlink; //---------------------------------------------------------------------- // SETUP void setup() { Serial.begin(115200); //Buzzer pinMode(LED_BUILTIN, OUTPUT); delay(50); //RTC D3231 int rtn = I2C_ClearBus(); // clear the I2C bus first before calling Wire.begin() if (rtn != 0) { Serial.println(F("I2C bus error. Could not clear")); if (rtn == 1) { Serial.println(F("SCL clock line held low")); } else if (rtn == 2) { Serial.println(F("SCL clock line held low by slave clock stretch")); } else if (rtn == 3) { Serial.println(F("SDA data line held low")); } } else { // bus clear, re-enable Wire, now can start Wire Arduino master Wire.begin(); } Rtc.Begin(); if (!Rtc.GetIsRunning()) { Rtc.SetIsRunning(true); } Rtc.Enable32kHzPin(false); Rtc.SetSquareWavePin(DS3231SquareWavePin_ModeNone); //Rtc.SetDateTime(RtcDateTime(2021, 1, 7, 17, 34, 00)); Serial.println("Setup RTC selesai"); //DMD Disp_init(); Disp.setBrightness(80); //(20); //TIMER tBlink.oscillate(LED_BUILTIN, 500, HIGH); } //---------------------------------------------------------------------- // LOOP void loop() { //tMain.update(); tBlink.update(); Serial.println("tesSlash4()"); lightAllPixel(1000); clearDisplay(1000); lightAllPixel(1000); clearDisplay(1000); lightAllPixel(4000); clearDisplay(1000); Disp.clear(); tesSlash(40); tesBackSlash(40); clearDisplay(1000); tesSlash2(40); tesBackSlash2(40); tesHorLine(70); tesVertLine(70); //verticalLine(4000); //tesAllPixel(); //delay(2000); //Disp.clear(); } //---------------------------------------------------------------------- // ALARM SHOLAT BERJALAN SAAT MASUK WAKTU SHOLAT void clearDisplay(int t) { Disp.drawFilledRect(0,0,15,96,0); Disp.swapBuffers(); delay(t); } void tesHorLine(int t) { for (int y=0; y<18; y++) { Disp.drawLine(0,y,96,y,1); Disp.drawLine(0,y-1,96,y-1,0); Disp.drawLine(0,y-2,96,y-2,0); Disp.swapBuffers(); delay(t); } } void tesVertLine(int t) { for (int x=0; x<98; x++) { Disp.drawLine(x,0,x,15,1); Disp.drawLine(x-1,0,x-1,15,0); Disp.drawLine(x-2,0,x-2,15,0); Disp.swapBuffers(); delay(t); } } void tesSlash(int t) { int x; int y; for(int i=0; i<160; i=i+1) { y = 0; for (x=i; x>i-16; x--) { for (int c=0; c<16; c++) { if (c==0 || c==1 || c==4 || c==5 || c==8 || c==9 || c==12 || c==13) { Disp.setPixel(x-c,y,1); } else { Disp.setPixel(x-c,y,0); } } y++; } Disp.swapBuffers(); delay(t); } } void tesSlash2(int t) { for(int x=0; x<113; x++) { Disp.drawLine(x,0,x-15,15,1); Disp.drawLine(x-1,0,x-15-1,15,0); Disp.drawLine(x-2,0,x-15-2,15,0); Disp.swapBuffers(); delay(t); } } void tesBackSlash2(int t) { for(int x=96; x>-64; x--) { Disp.drawLine(x,0,x+15,15,1); Disp.drawLine(x+1,0,x+15+1,15,0); Disp.drawLine(x+2,0,x+15+2,15,0); Disp.swapBuffers(); delay(t); } } void tesBackSlash(int t) { int x; int y; for(int i=96; i>-64; i=i-1) { y = 0; for (x=i; x<i+16; x++) { for (int c=0; c<16; c++) { if (c==0 || c==1 || c==4 || c==5 || c==8 || c==9 || c==12 || c==13) { Disp.setPixel(x+c,y,1); } else { Disp.setPixel(x+c,y,0); } } y++; } Disp.swapBuffers(); delay(t); } } void lightAllPixel(int t) { Disp.drawFilledRect(0,0,95,15,1); Disp.swapBuffers(); delay(t); } //---------------------------------------------------------------------- // I2C_ClearBus menghindari gagal baca RTC (nilai 00 atau 165) int I2C_ClearBus() { #if defined(TWCR) && defined(TWEN) TWCR &= ~(_BV(TWEN)); //Disable the Atmel 2-Wire interface so we can control the SDA and SCL pins directly #endif pinMode(SDA, INPUT_PULLUP); // Make SDA (data) and SCL (clock) pins Inputs with pullup. pinMode(SCL, INPUT_PULLUP); delay(2500); // Wait 2.5 secs. This is strictly only necessary on the first power // up of the DS3231 module to allow it to initialize properly, // but is also assists in reliable programming of FioV3 boards as it gives the // IDE a chance to start uploaded the program // before existing sketch confuses the IDE by sending Serial data. boolean SCL_LOW = (digitalRead(SCL) == LOW); // Check is SCL is Low. if (SCL_LOW) { //If it is held low Arduno cannot become the I2C master. return 1; //I2C bus error. Could not clear SCL clock line held low } boolean SDA_LOW = (digitalRead(SDA) == LOW); // vi. Check SDA input. int clockCount = 20; // > 2x9 clock while (SDA_LOW && (clockCount > 0)) { // vii. If SDA is Low, clockCount--; // Note: I2C bus is open collector so do NOT drive SCL or SDA high. pinMode(SCL, INPUT); // release SCL pullup so that when made output it will be LOW pinMode(SCL, OUTPUT); // then clock SCL Low delayMicroseconds(10); // for >5uS pinMode(SCL, INPUT); // release SCL LOW pinMode(SCL, INPUT_PULLUP); // turn on pullup resistors again // do not force high as slave may be holding it low for clock stretching. delayMicroseconds(10); // for >5uS // The >5uS is so that even the slowest I2C devices are handled. SCL_LOW = (digitalRead(SCL) == LOW); // Check if SCL is Low. int counter = 20; while (SCL_LOW && (counter > 0)) { // loop waiting for SCL to become High only wait 2sec. counter--; delay(100); SCL_LOW = (digitalRead(SCL) == LOW); } if (SCL_LOW) { // still low after 2 sec error return 2; // I2C bus error. Could not clear. SCL clock line held low by slave clock stretch for >2sec } SDA_LOW = (digitalRead(SDA) == LOW); // and check SDA input again and loop } if (SDA_LOW) { // still low return 3; // I2C bus error. Could not clear. SDA data line held low } // else pull SDA line low for Start or Repeated Start pinMode(SDA, INPUT); // remove pullup. pinMode(SDA, OUTPUT); // and then make it LOW i.e. send an I2C Start or Repeated start control. // When there is only one I2C master a Start or Repeat Start has the same function as a Stop and clears the bus. /// A Repeat Start is a Start occurring after a Start with no intervening Stop. delayMicroseconds(10); // wait >5uS pinMode(SDA, INPUT); // remove output low pinMode(SDA, INPUT_PULLUP); // and make SDA high i.e. send I2C STOP control. delayMicroseconds(10); // x. wait >5uS pinMode(SDA, INPUT); // and reset pins as tri-state inputs which is the default state on reset pinMode(SCL, INPUT); return 0; // all ok }
Tidak ada komentar:
Posting Komentar