#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const int potentiometerPin = A0; // Potekas
const int relayPin = 2; // Relee
const int startButtonPin = 3; // Start
const int modeSwitchPin = 4; // Mode
bool currentMode = false;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;
int frequency = 0; // Sagedus(hz)
float rpm = 0; // Pöörded(rpm)
const int dutyCycle = 5; // Dutycycle(nt95%)
void setup() {
pinMode(relayPin, OUTPUT);
pinMode(startButtonPin, INPUT_PULLUP);
pinMode(modeSwitchPin, INPUT_PULLUP);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay();
display.display();
digitalWrite(relayPin, LOW);
}
void loop() {
currentMode = !digitalRead(modeSwitchPin);
displayModeInfo(currentMode);
if (!currentMode) {
frequency = map(analogRead(potentiometerPin), 0, 1023, 1, 40); // Map potentiometer to 1-40 Hz
rpm = frequency * 60.0; // Convert frequency (Hz) to RPM
displayFrequencyAndRPM(frequency, rpm, dutyCycle); // Show frequency and RPM on screen
}
// Check for start button press and handle the two modes
if (isButtonPressed(startButtonPin)) {
if (currentMode) {
// Mode 2: Relay stays ON for 10 seconds
activateRelayForDuration(10000);
} else {
// Mode 1: Relay operates at the set frequency and fixed duty cycle for 10 seconds
runRelayWithFixedDutyCycle(frequency);
}
}
}
void activateRelayForDuration(unsigned long duration) {
digitalWrite(relayPin, HIGH);
delay(duration);
digitalWrite(relayPin, LOW);
}
void runRelayWithFixedDutyCycle(int frequency) {
unsigned long startTime = millis();
unsigned long cycleTime = 1000 / frequency; // Total cycle time for the frequency (in milliseconds)
unsigned long onTime = cycleTime * dutyCycle / 100; // Calculate ON time based on fixed duty cycle
unsigned long offTime = cycleTime - onTime; // Calculate OFF time
while (millis() - startTime < 10000) { // Run for 10 seconds
// Turn relay ON
digitalWrite(relayPin, HIGH);
displayRunningFrequency(frequency, dutyCycle); // Display frequency and duty cycle while relay is active
delay(onTime);
// Turn relay OFF
digitalWrite(relayPin, LOW);
displayRunningFrequency(frequency, dutyCycle); // Display frequency and duty cycle while relay is off
delay(offTime);
}
}
bool isButtonPressed(int pin) {
int reading = digitalRead(pin);
if (reading == LOW) {
unsigned long currentTime = millis();
if ((currentTime - lastDebounceTime) > debounceDelay) {
lastDebounceTime = currentTime;
return true;
}
}
return false;
}
void displayModeInfo(bool mode) {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
// Display Mode Info
if (mode) {
display.println("Mode 2: Relee 10s");
} else {
display.println("Mode 1: Lulitus");
}
display.display();
}
void displayFrequencyAndRPM(int frequency, float rpm, int dutyCycle) {
display.setCursor(0, 10);
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// Display frequency, RPM, and fixed duty cycle
display.print("Set Freq: ");
display.print(frequency);
display.println(" Hz");
display.print("RPM: ");
display.print(rpm);
display.println();
display.print("Duty Cycle: ");
display.print(dutyCycle);
display.println(" %");
display.display();
}
void displayRunningFrequency(int frequency, int dutyCycle) {
display.setCursor(0, 10);
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
// Display running frequency and fixed duty cycle during relay operation
display.print("Freq: ");
display.print(frequency);
display.print(" Hz, ");
display.print("Duty: ");
display.print(dutyCycle);
display.println(" %");
display.display();
}