#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2); // I2C address, 16x2 LCD
const int airValvePin = 8; // Digital output pin for air valve
const int airTransducerPin = A1; // Analog input pin for air transducer
const int modeTogglePin = 10; // Pin for manual/auto mode toggle switch
const int airTogglePin = 11; // Pin for air on/off toggle switch
const int encoderButtonPin = A0; // Pin for push button of rotary encoder
const int encoderDTpin = 7; // Encoder DT pin
const int encoderCLKpin = 8; // Encoder CLK pin
int mode = 0; // 0 for manual mode, 1 for auto mode
int airOn = 0; // 0 for air off, 1 for air on
int cycleCount = 0;
int pressureThreshold = 0;
int onTime = 0;
int offTime = 0;
void setup() {
pinMode(airValvePin, OUTPUT);
pinMode(modeTogglePin, INPUT);
pinMode(airTogglePin, INPUT);
lcd.init();
lcd.backlight();
}
void loop() {
if(digitalRead(modeTogglePin) == HIGH) {
if(mode == LOW) {
mode == HIGH;
setAutoModeParameters();
}
}else{
if(mode==HIGH){
mode == LOW;
lcd.setCursor(0,0);
lcd.print("Manual Mode");
lcd.setCursor(0,1);
if(digitalRead(airTogglePin)==HIGH){
lcd.print("Air: ON");
}else{
lcd.print("Air: OFF");
}
}
}
void setAutoModeParameters() {
lcd.clear();
int menuSelection = 0;
while(menuSelection != -1) {
switch(menuSelection) {
case 0:
lcd.setCursor(0,0);
lcd.print("Enter On Time:");
onTime = readEncoderValue();
break;
case 1:
lcd.setCursor(0,1);
lcd.print("Enter Off Time:");
offTime = readEncoderValue();
break;
case 2:
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Enter Pressure:");
pressureThreshold = readEncoderValue();
break;
case 3:
menuSelection = -1; // Exit menu
break;
}
delay(500); // Delay to avoid rapid scrolling
menuSelection++;
if(menuSelection > 3) {
menuSelection = 0;
}
delay(500); // Debounce delay
}
}
int readEncoderValue() {
int val=analogRead(encoderCLKpin);
if(val>512)
return val/4-128;
else
return -128+val/4;
}
void startAutoMode() {
int pressureReading = analogRead(airTransducerPin);
if(pressureReading < pressureThreshold && airOn == HIGH) {
digitalWrite(airValvePin, LOW); // Turn off the air
airOn = LOW;
cycleCount++;
displayAutoModeInfo("Air OFF", pressureReading);
delay(offTime * 1000); // Convert seconds to milliseconds
} else if(pressureReading >= pressureThreshold && airOn == LOW) {
digitalWrite(airValvePin, HIGH); // Turn on the air
airOn = HIGH;
cycleCount++;
displayAutoModeInfo("Air ON", pressureReading);
delay(onTime * 1000); // Convert seconds to milliseconds
}
}
void displayAutoModeInfo(String status, int pressureReading) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Auto Mode");
lcd.setCursor(0,1);
lcd.print(status + " Pressure: " + String(pressureReading));
}