#include <Adafruit_SSD1306.h>
#include <Wire.h>
#include <Arduino.h>
#include <ezButton.h>
#define DEBOUNCE_TIME 60 // the debounce time in millisecond, increase this time if it still chatters
//#define BUTTON_PIN 2 // GIOP2 pin connected to button
//#define BUTTON_PIN 15 // GIOP15 pin connected to button
//#define BUTTON_PIN 4 // GIOP4 pin connected to button
ezButton buttonIncreasePin(2);
ezButton buttonDecreasePin(15);
ezButton buttonOKPin(4);
// Constants for pins
//const int buttonIncreasePin = 2;
//const int buttonDecreasePin = 15;
//const int buttonOKPin = 4;
const int redLEDPinRelay = 18;
const int infraredLEDPinRelay = 19;
const int battery = 13;
// Variables for time
int setMinutes = 0;
int remainingMinutes = 0;
bool LEDsOn = false;
// OLED display setup
Adafruit_SSD1306 display(128, 64, &Wire, -1);
void setup() {
// Initialize buttons
Serial.begin(9600);
buttonIncreasePin.setDebounceTime(DEBOUNCE_TIME); // set debounce time to 50 milliseconds
buttonDecreasePin.setDebounceTime(DEBOUNCE_TIME); // set debounce time to 50 milliseconds
buttonOKPin.setDebounceTime(DEBOUNCE_TIME); // set debounce time to 50 milliseconds
//pinMode(buttonIncreasePin, INPUT_PULLUP);
//pinMode(buttonDecreasePin, INPUT_PULLUP);
//pinMode(buttonOKPin, INPUT_PULLUP);
// Initialize LEDs
pinMode(redLEDPinRelay, OUTPUT);
pinMode(infraredLEDPinRelay, OUTPUT);
// Battery voltage read percentage
pinMode(battery,INPUT);
int voltage = analogRead(battery);
// Initialize display
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.display();
delay(2000); // Pause for 2 seconds
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(32, 0);
display.print("Produced by:");
display.setTextSize(1);
display.setCursor(30, 27);
display.print("Khooshebast");
display.setCursor(42, 37);
display.print("Holding");
display.setCursor(29, 57);
display.print("Fahime Noori");
display.display();
delay(5000);
display.clearDisplay();
display.setCursor(0, 30);
display.print("Set Time: ");
display.display();
}
void loop() {
buttonIncreasePin.loop(); // MUST call the loop() function first
buttonDecreasePin.loop(); // MUST call the loop() function first
buttonOKPin.loop(); // MUST call the loop() function first
// Handle button presses
//if (digitalRead(buttonIncreasePin) == LOW)
if (buttonIncreasePin.isPressed()){
// Increase minutes
setMinutes++;
if (setMinutes > 60) {
setMinutes = 60;
}
remainingMinutes = setMinutes;
updateDisplay();
delay(250); // Debounce delay
}
//if (digitalRead(buttonDecreasePin) == LOW
if (buttonDecreasePin.isPressed()) {
// Decrease minutes
setMinutes--;
if (setMinutes < 0) {
setMinutes = 0;
}
remainingMinutes = setMinutes;
updateDisplay();
delay(250); // Debounce delay
}
//if (digitalRead(buttonOKPin) == LOW)
if (buttonOKPin.isPressed()) {
// User confirmed set time
// Turn on LEDs
// Normally closed configuration, HIGH signal
digitalWrite(redLEDPinRelay, HIGH);
digitalWrite(infraredLEDPinRelay, HIGH);
display.setTextSize(1);
display.setCursor(20,40);
display.print("ON");
display.display();
//delay(5000);
LEDsOn = true;
}
// Check if LEDs should be on based on the set time
if (LEDsOn) {
if (remainingMinutes > 0) {
unsigned long currentMillis = millis();
unsigned long elapsedMinutes = (currentMillis / (1000UL * 60)) + 1; // Calculate elapsed minutes
if (elapsedMinutes >= remainingMinutes) {
// Turn off LEDs
digitalWrite(redLEDPinRelay, LOW);
digitalWrite(infraredLEDPinRelay, LOW);
display.clearDisplay();
display.setTextSize(1);
display.setCursor(20,40);
display.print("OFF");
display.setTextSize(1);
display.setCursor(0,25);
display.print("set new time");
display.display();
LEDsOn = false;
} else {
display.clearDisplay();
display.setCursor(0, 25);
display.print("Remaining: ");
if (remainingMinutes < 10) {
display.print("0");
}
display.print(remainingMinutes - elapsedMinutes);
display.print(" minutes");
delay(2000);
display.display();
}
}
}
// Name
display.setTextSize(1);
display.setCursor(0,0);
display.print("acuPressure");
display.display();
display.setTextSize(0.5);
display.setCursor(0,8);
display.print("points stimulator");
display.display();
//voltage display
int voltage = analogRead(battery);
display.setTextSize(1);
display.setCursor(0,50);
float percent = voltage * 100 / 4096 ;
display.print("% battery:");
display.setTextSize(1);
display.setCursor(90,50);
display.print(percent);
display.display();
}
void updateDisplay() {
display.clearDisplay();
display.setCursor(0, 30);
display.print("Set Time: ");
if (setMinutes < 10) {
display.print("0");
}
display.print(setMinutes);
display.print(" minutes");
display.display();
}