// Changes:
//
// GFX and SSD1306 libraries are not used. Remove the include.
// NUM_LEDS set to 16.
// Put all the global variables above setup().
// Added strip.begin() and strip.show() in setup().
// Removed pinMode and digitalWrite for the neopixel pin.
// Added strip.fill() when ST is not zero.
//
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
// #include <Adafruit_GFX.h>
// #include <Adafruit_SSD1306.h>
#include <Adafruit_NeoPixel.h>
#include <EasyButton.h>
#define neo 11
#define NUM_LEDS 16
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
#define ButtonDown 5 //กำหนดปุ่มลดเป็นขา 5
#define ButtonUp 4 //กำหนดปุ่มเพิ่มเป็นขา 4
#define ButtonSetting 3 //กำหนดปุ่มเพิ่มเป็นขา 3
String st = "OFF" ; //ตัวแปรไว้เก็บข้อความ ON OFF เพื่อนำมาแสดงจอ
LiquidCrystal_I2C lcd(I2C_ADDR, LCD_COLUMNS, LCD_LINES);
// Adafruit_SSD1306 display(128, 64, &Wire, 4);
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, neo, NEO_GRB);
uint32_t color = strip.Color(75, 250, 100);
RTC_DS1307 rtc;
String dow[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
int h, m, s, h2, m2, h3, m3; //กำหนดตัวแปรเก็บค่าเวลา เวลาจริง เวลาเปิด เวลาปิด
unsigned char ST = 0; //ตัวแปรสถานะการตั้งค่า
void setup() {
// Serial.begin(115200);
Serial.begin(9600);
// pinMode(neo, OUTPUT); //ตั้งขา 10 เป็น OUTPUT ขาพัดลม
pinMode(ButtonUp, INPUT_PULLUP); //ตั้งเป็น INPUT
pinMode(ButtonDown, INPUT_PULLUP); //ตั้งเป็น INPUT
pinMode(ButtonSetting, INPUT_PULLUP); //ตั้งเป็น INPUT
lcd.init(); //ใช้งาน จอ LCD
lcd.backlight(); //ใช้งานไฟหน้าจอ
if (! rtc.begin()) { //เช็คว่าเชื่อมต่อกับ Ds1307 ได้ไหม
Serial.println("Couldn't find RTC"); //หากเชื่อมต่อไม่ได้ให้แจ้งเตื่อน
Serial.flush(); //เคลียข้อมูล
// abort();
}
lcd.setCursor(1, 0); //เซตตำแหน่งการแสดงผลหน้าจอ
lcd.print("HELLO"); //แสดงตัวอักษร
strip.begin();
strip.show();
delay(1000); //หน่วงเวลา
}
void loop() {
DateTime now = rtc.now(); //ดึงค่าเวลาจริง
h = now.hour(); //ดึงเวลา ชั่วโมง
m = now.minute(); //ดึงค่าเวลานาที
s = now.second(); //ดึงค่าเวลาวินาที
if ( digitalRead(ButtonSetting) == LOW ) { //หากกดปุ่มตั้งค่า
ST++; //เพิ่มค่าตัวแปร ST
if (ST == 5) { //หากค่าตัวแปร ST = 5
lcd.clear(); //เคลียร์หน้าจอ
ST = 0; //ให้ค่าตัวแปรเป็น 0
}
// while (digitalRead(ButtonSetting) == LOW) {} //รอจนกว่าจะปล่อยปุ่มตั้งค่า
} else if (digitalRead(ButtonUp) == LOW ) { //หากกดปุ่มเพิ่ม
if (ST == 1) { //หากตัวแปร ST = 1
h2++; //เพิ่มค่าตัวแปร
} else if (ST == 2) { //หากตัวแปร ST = 2
m2++; //เพิ่มค่าตัวแปร
} else if (ST == 3) { //หากตัวแปร ST = 3
h3++; //เพิ่มค่าตัวแปร
} else if (ST == 4) { //เพิ่มค่าตัวแปร
m3++; //เพิ่มค่าตัวแปร
}
} else if (digitalRead(ButtonDown) == LOW ) { //หากกดปุ่มลด
if (ST == 1) { //หากตัวแปร ST = 1
h2--; //ลดค่าตัวแปร
} else if (ST == 2) { //หากตัวแปร ST = 2
m2--; //ลดค่าตัวแปร
} else if (ST == 3) { //หากตัวแปร ST = 3
h3--; //ลดค่าตัวแปร
} else if (ST == 4) { //หากตัวแปร ST = 4
m3--; //ลดค่าตัวแปร
}
}
show(); //ทำงานในฟังก์ชันแสดงหน้าจอ LCD
delay(200); //หน่วงเวลา
}
void show() { //ฟังก์ชันแสดงหน้าจอ
if (ST == 0) { //หากตัวแปร ST = 0
lcd.setCursor(0, 0); //เซตตำแหน่งการแสดงผลหน้าจอ
lcd.print(String(h) + ":" + String(m) + ":" + String(s) + " ");
lcd.setCursor(9, 0); //เซตตำแหน่งการแสดงผลหน้าจอ
lcd.print("ST:" + st);
check(); //ทำงานฟังก์ชัน เช็คเวลาว่าตรงกับการตั้งค่า
} else {
strip.fill(color); // <- ADDED
strip.show(); // <- ADDED
lcd.clear();
if (ST == 1) { //หากตัวแปร ST = 1
if (h2 < 10) {
lcd.setCursor(2, 0); //เซตตำแหน่งการแสดงผลหน้าจอ
} else {
lcd.setCursor(3, 0); //เซตตำแหน่งการแสดงผลหน้าจอ
}
} else if (ST == 2) { //หากตัวแปร ST = 2
if (h2 < 10 && m2 < 10) {
lcd.setCursor(4, 0);
} else if (h2 < 10 || m2 < 10) {
lcd.setCursor(5, 0); //เซตตำแหน่งการแสดงผลหน้าจอ
} else {
lcd.setCursor(6, 0); //เซตตำแหน่งการแสดงผลหน้าจอ
}
} else if (ST == 3) { //หากตัวแปร ST = 3
if (h3 < 10) {
lcd.setCursor(9, 0); //เซตตำแหน่งการแสดงผลหน้าจอ
} else {
lcd.setCursor(10, 0); //เซตตำแหน่งการแสดงผลหน้าจอ
}
} else if (ST == 4) { //หากตัวแปร ST = 4
if (h3 < 10 && m3 < 10) {
lcd.setCursor(11, 0); //เซตตำแหน่งการแสดงผลหน้าจอ
} else if (h3 < 10 || m3 < 10) {
lcd.setCursor(12, 0); //เซตตำแหน่งการแสดงผลหน้าจอ
} else {
lcd.setCursor(13, 0); //เซตตำแหน่งการแสดงผลหน้าจอ
}
}
lcd.print("*"); //แสดง *
}
lcd.setCursor(2, 1); //เซตตำแหน่งการแสดงผลหน้าจอ
lcd.print(String(h2) + ":" + String(m2)); //แสดงเวลาเปิด
lcd.setCursor(9, 1); //เซตตำแหน่งการแสดงผลหน้าจอ
lcd.print(String(h3) + ":" + String(m3)); //แสดงเวลาปิด
}
void check() { //ฟังก์ชั้นตรวสอบเวลา
for (int i = 33; i > 0; i--) {
strip.setPixelColor(i - 6, color); // Draw 'head' pixel
strip.setPixelColor(i - 1, 0); // Erase 'tail'
strip.show();
delay(28);
}
if (h2 == h) { //หากชั่วโมงตรงกัน
if (m2 == m) { //หากนาทีตรงกัน
st = "ON " ; //เปลี่ยนเป็นคำว่า ON
// digitalWrite(neo, HIGH); //สั่งงานเปิด
//เปิดการทำงาน
}
}
if (h3 == h) { //หากชั่วโมงตรงกัน
if (m3 == m) { //หากนาทีตรงกัน
st = "OFF" ; //เปลี่ยนเป็นคำว่า OFF
// digitalWrite(neo, LOW); //สั่งงานปิด
//ปิดการทำงาน
}
}
}