#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <EEPROM.h>
#define OLED_SDA 21
#define OLED_SCL 22
#define OLED_RST 16
#define BUTTON_PIN1 9
#define BUTTON_PIN2 8
#define BUTTON_PIN3 7
#define PULSE_SENSOR_PIN 2
#define OUTPUT_PIN A1
Adafruit_SSD1306 display(128, 64, &Wire, OLED_RST);
int threshold = 500; // initial threshold value
bool outputState = false; // initial output state
volatile int pulseCount = 0; // pulse count variable
unsigned long lastPulseTime = 0; // last pulse time variable
void handlePulse() {
unsigned long now = millis();
if (now - lastPulseTime > 10) {
pulseCount++;
lastPulseTime = now;
}
}
void setup() {
Serial.begin(9600);
pinMode(OUTPUT_PIN, OUTPUT);
digitalWrite(OUTPUT_PIN, outputState);
pinMode(PULSE_SENSOR_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(PULSE_SENSOR_PIN), handlePulse, RISING);
pinMode(BUTTON_PIN1, INPUT_PULLUP);
pinMode(BUTTON_PIN2, INPUT_PULLUP);
pinMode(BUTTON_PIN3, INPUT_PULLUP);
threshold = readInt(0);
Wire.begin(OLED_SDA, OLED_SCL);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Press button 1 to");
display.println("activate/deactivate");
display.println("output pin.");
display.display();
}
void loop() {
if (digitalRead(BUTTON_PIN1) == LOW) {
while((digitalRead(BUTTON_PIN1) == LOW)){}
outputState = !outputState;
digitalWrite(OUTPUT_PIN, outputState);
pulseCount = 0;
display.clearDisplay();
display.setCursor(0, 0);
display.print("Output state: ");
display.println(outputState ? "ON" : "OFF");
display.display();
}
if (digitalRead(BUTTON_PIN2) == LOW) {
unsigned long startMillis = millis();
while (digitalRead(BUTTON_PIN2) == LOW) {
if (millis() - startMillis > 2000) {
display.clearDisplay();
display.setCursor(0,0);
display.print("Release button");
display.display();
while (digitalRead(BUTTON_PIN2) == LOW){}
while((digitalRead(BUTTON_PIN1) == HIGH))
{
if(digitalRead(BUTTON_PIN2) == LOW)
{
delay(50);
threshold += 10;
}
if(digitalRead(BUTTON_PIN3) == LOW)
{
delay(50);
threshold -= 10;
}
display.clearDisplay();
display.setCursor(0, 0);
display.println("Set Value:");
display.print(threshold);
display.display();
}
writeInt(0,threshold);
display.clearDisplay();
display.setCursor(0,0);
display.print("Release button");
display.display();
while((digitalRead(BUTTON_PIN1) == LOW)){}
display.clearDisplay();
display.setCursor(0,0);
display.print("Press Start");
display.display();
}
}
}
if (outputState) {
display.clearDisplay();
display.setCursor(0, 0);
display.println("Pulse Count");
display.println(pulseCount);
display.display();
if (pulseCount >= threshold) {
outputState = false;
digitalWrite(OUTPUT_PIN, outputState);
pulseCount = 0;
display.clearDisplay();
display.setCursor(0, 0);
display.println("Threshold reached.");
display.println("Press Start");
display.display();
}
}
}
void writeInt(int address, int number) {
EEPROM.write(address, number >> 8);
EEPROM.write(address + 1, number & 0xFF);
}
int readInt(int address) {
byte byte1 = EEPROM.read(address);
byte byte2 = EEPROM.read(address + 1);
int16_t number = (byte1 << 8) + byte2;
return number;
}