#define BLYNK_PRINT Serial #define BLYNK_USE_DIRECT_CONNECT #include #include #include #include #define fontB u8g2_font_fub20_tr #define fontS u8g2_font_6x10_tf #define fontTitle u8g2_font_fub14_tr #include #include #include #include #include WidgetLED led1(V1); WidgetTable table; WidgetRTC wRTC; BLYNK_ATTACH_WIDGET(table, V2); int rowCount = 0; bool clearTable = false, cancelRecord = true; // You should get Auth Token in the Blynk App. // Go to the Project Settings (nut icon). char auth[] = "0_P55EW_UC3w9ixC47KvHipX4VT-zQ-8"; BLYNK_CONNECTED() { // Synchronize time wRTC.begin(); if (clearTable == true) { table.clear(); } cancelRecord = false; } #include #include #define Stat_LED 27 //pins for AQM1248 #define SCK 18 #define MOSI 23 #define RST 17 #define CS 25 #define RS 26 //pins for switch #define BTN3 32 //pins for S9705 #define S_RESET 14 #define LUX 33 U8G2_ST7565_AK_AQM1248_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ SCK, /* data=*/ MOSI, /* cs=*/ CS, /* dc=*/ RS, /* reset=*/ RST); volatile int iCount; hw_timer_t *timer1 = NULL; portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED; void IRAM_ATTR onTimer() { portENTER_CRITICAL_ISR(&timerMux); //start interrupting process iCount = 1; portEXIT_CRITICAL_ISR(&timerMux); //end interruputing process } int tCount = 0; int bCount = 0; int lCount = 0; int timeOut = 0; String startTime = ""; bool rStat = false, bStat = false, lStat = false; void sLED() { switch (lStat) { case true: digitalWrite(Stat_LED, LOW); lStat = false; break; case false: digitalWrite(Stat_LED, HIGH); lStat = true; break; } } int getNowTime(int *selector) { int tData = NULL; switch (*selector) { case 0://return second tData = tCount % 60; break; case 1://return minute tData = tCount / 60; break; case 2://return hour tData = tCount / 360; break; default: tData = 0; } return tData; } String showNowTime(void *any) { int nTime[2]; nTime[0] = tCount % 60; //record second nTime[1] = (int) tCount / 60; //record minute nTime[2] = (int) nTime[1] / 60; //record hour String message = (String)nTime[2] + ":" + (String)nTime[1] + ":" + (String)nTime[0]; return message; } void recordTime() { if (cancelRecord == false|| rStat == true) { if (rStat == false) { rStat = true; startTime = (String)hour() + ":" + (String)minute() + ":" + (String)second(); Serial.println("recording has started"); u8g2.clearBuffer(); u8g2.drawStr(20, 10, "Start Recording..."); u8g2.sendBuffer(); delay(500); } else { int tData = tCount; rStat = false; //send acction Serial.println("recording has finished"); u8g2.clearBuffer(); u8g2.drawStr(20, 10, "Finished"); u8g2.sendBuffer(); table.pickRow(rowCount); rowCount++; String bName = (String)rowCount + "at" + startTime; table.addRow(rowCount, bName, showNowTime(NULL)); //initial data tCount = 0; } } } void dispCmd(uint8_t cmd) { digitalWrite(RS, LOW); digitalWrite(CS, LOW); SPI.transfer(cmd); digitalWrite(CS, HIGH); } void initialDisp() { dispCmd(0xAE); //Display off dispCmd(0xA0); //ADC normal dispCmd(0xC8); dispCmd(0xA3); //power supply dispCmd(0x2C); delay(2); dispCmd(0x2E); delay(2); dispCmd(0x2F); //contrast dispCmd(0x23); dispCmd(0x81); dispCmd(0x1C); //display setting dispCmd(0xA4); dispCmd(0x40); dispCmd(0xA6); dispCmd(0xAF); //Diplay on } void initialLUX() { digitalWrite(S_RESET, HIGH); delay(5); digitalWrite(S_RESET, LOW); } void turnLessPower() { u8g2.clearBuffer(); u8g2.drawStr(0, 0, "Turn to Suspend Mode..."); u8g2.sendBuffer(); delay(1000); esp_deep_sleep_start(); } void setup() { // put your setup code here, to run once: Serial.begin(115200); esp_deep_sleep_pd_config(ESP_PD_DOMAIN_RTC_PERIPH, ESP_PD_OPTION_AUTO); gpio_pullup_en(GPIO_NUM_0); // use pullup on GPIO gpio_pulldown_dis(GPIO_NUM_0); // not use pulldown on GPIO esp_deep_sleep_enable_ext0_wakeup(GPIO_NUM_32, 0); // pinMode(Stat_LED, OUTPUT); pinMode(SCK, OUTPUT); pinMode(MOSI, OUTPUT); pinMode(RST, OUTPUT); pinMode(CS, OUTPUT); pinMode(RS, OUTPUT); pinMode(BTN3, INPUT_PULLUP); pinMode(S_RESET, OUTPUT); pinMode(LUX, INPUT); initialLUX(); initialDisp(); timer1 = timerBegin(0, 80, true); timerAttachInterrupt(timer1, &onTimer, true); timerAlarmWrite(timer1, 1000000, true); timerAlarmEnable(timer1); Blynk.setDeviceName("IoT BookMark"); Blynk.begin(auth); Blynk.syncAll(); u8g2.begin(); u8g2.clearBuffer(); u8g2.setFlipMode(0); u8g2.setFont(fontS); u8g2.setFontRefHeightExtendedText(); u8g2.setDrawColor(1); u8g2.setFontPosTop(); u8g2.setFontDirection(0); u8g2.drawStr(0, 0, "Please wait..."); u8g2.sendBuffer(); delay(200); if (digitalRead(BTN3) == LOW) { u8g2.drawStr(0, 8, "clear data..."); u8g2.sendBuffer(); delay(200); clearTable = true; } u8g2.clearBuffer(); u8g2.setFont(fontTitle); u8g2.drawStr(0, 0, "IoT Book"); u8g2.drawStr(0, 18, "Mark"); u8g2.setFont(fontS); u8g2.drawStr(20, 40, "Made by Sdxhc234"); u8g2.sendBuffer(); delay(500); } void loop() { // put your main code here, to run repeatedly: u8g2.clearBuffer(); if (Blynk.connected() != true && rStat == false) { timeOut++; u8g2.drawStr(0, 16, "Please Connect"); u8g2.drawStr(0, 32, "Your SmartPhone..."); u8g2.sendBuffer(); cancelRecord = true; } if (timeOut > 1000) { timeOut = 0; turnLessPower(); } if (rStat == false) { u8g2.drawStr(0, 0, "Pless Button"); u8g2.drawStr(0, 8, "for record reading."); u8g2.sendBuffer(); } Blynk.run(); Blynk.virtualWrite(0, pulseIn(LUX, HIGH)); if ( digitalRead(BTN3) == LOW) { bCount++; Serial.println(bCount); } if (bCount > 0 && digitalRead(BTN3) == HIGH) { switch (bCount >= 20) { case true: bCount = 0; if (rStat == false) { turnLessPower(); break; } else { sLED(); break; } case false: bCount = 0; recordTime(); break; } } if (LUX > 1000 && rStat == false) { lCount++; } if (lCount > 120) { turnLessPower(); } if (iCount > 0) { portENTER_CRITICAL(&timerMux); iCount = 0; portEXIT_CRITICAL(&timerMux); if (rStat == true) { tCount++; Serial.println(showNowTime(NULL)); // xTaskCreatePinnedToCore(sLED,"BlinkLED", 4096, NULL,1,NULL,0); u8g2.clearBuffer(); u8g2.drawStr(0, 0, "Reading..."); u8g2.setCursor(0, 10); u8g2.setFont(u8g2_font_fub20_tr); u8g2.print(showNowTime(NULL)); u8g2.setFont(u8g2_font_6x10_tf); u8g2.sendBuffer(); } } }