#include <WiFi.h>
#include <WiFiClient.h>
#include <PubSubClient.h>
#define RLED 23
#define OLED 22
#define YLED 21
#define LGLED 19
#define DGLED 18
#define LBLED 5
#define DBLED 4
#define LPLED 2
#define DPLED 13
#define POTPIN 12
// Define servo pins
#define alkalinePin 26 // Pin for alkaline servo (adjust as needed)
#define neutralPin 25 // Pin for neutral servo (adjust as needed)
#define acidicPin 27 // Pin for acidic servo (adjust as needed)
// Define servo positions
int servoMin = 1000; // Minimum pulse width (microseconds)
int servoMax = 2000; // Maximum pulse width (microseconds)
int servoCenter = (servoMin + servoMax) / 2; // Center pulse width (microseconds)
void setup() {
pinMode(RLED, OUTPUT);
pinMode(OLED, OUTPUT);
pinMode(YLED, OUTPUT);
pinMode(LGLED, OUTPUT);
pinMode(DGLED, OUTPUT);
pinMode(LBLED, OUTPUT);
pinMode(DBLED, OUTPUT);
pinMode(LPLED, OUTPUT);
pinMode(DPLED, OUTPUT);
pinMode(POTPIN, INPUT);
pinMode(alkalinePin, OUTPUT);
pinMode(neutralPin, OUTPUT);
pinMode(acidicPin, OUTPUT);
Serial.begin(9600); // Initialize serial communication
}
void loop() {
float pHValue = map(analogRead(POTPIN), 0, 4095, 0.0, 14.0); // Map analog reading to pH range 0-14
Serial.print("pH Value: ");
Serial.println(pHValue, 2); // Print pH value with 2 decimal places
digitalWrite(RLED, pHValue == 0);
digitalWrite(OLED, pHValue >= 1.0 && pHValue <= 2.0);
digitalWrite(YLED, pHValue >= 3.0 && pHValue <= 4.0);
digitalWrite(LGLED, pHValue >= 5.0 && pHValue <= 6.0);
digitalWrite(DGLED, pHValue == 7.0);
digitalWrite(LBLED, pHValue >= 8.0 && pHValue <= 9.0);
digitalWrite(DBLED, pHValue >= 10.0 && pHValue <= 11.0);
digitalWrite(LPLED, pHValue >= 12.0 && pHValue <= 13.0);
digitalWrite(DPLED, pHValue == 14.0);
// Map pH value to servo positions
int alkalinePosition = map(pHValue, 1.0, 3.0, servoMin, servoMax);
int neutralPosition = map(pHValue, 4.0, 5.2, servoMin, servoMax);
int acidicPosition = map(pHValue, 6.5, 14.0, servoMin, servoMax);
// Control the servos using PWM signals
if (pHValue >= 1.0 && pHValue <= 3.0) {
generatePWM(alkalinePin, alkalinePosition);
} else {
generatePWM(alkalinePin, servoCenter);
}
if (pHValue >= 4.0 && pHValue <= 5.2) {
generatePWM(neutralPin, neutralPosition);
} else {
generatePWM(neutralPin, servoCenter);
}
if (pHValue >= 6.5 && pHValue <= 14.0) {
generatePWM(acidicPin, acidicPosition);
} else {
generatePWM(acidicPin, servoCenter);
}
delay(1000);
}
void generatePWM(int pin, int pulseWidth) {
digitalWrite(pin, HIGH);
delayMicroseconds(pulseWidth);
digitalWrite(pin, LOW);
delayMicroseconds(20000 - pulseWidth); // 20ms period
}