here's the code:
#include <LiquidCrystal.h>
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
#define potentiometer A0 //10k Variable Resistor
#define buttonForward A1 // Forward Button
#define buttonStop A2 // Stop Button
#define buttonReverse A3 // Reverse Button
#define greenLEDPin A4 // Green LED pin
#define redLEDPin A5 // Red LED pin
#define blueLEDPin 0 // Blue LED pin
#define M1_Ena 11 // Enable1 L298 for PWM
#define M1_in1 10 // In1 L298 for Clockwise
#define M1_in2 9 // In2 L298 for Anticlockwise
int motorSpeed = 0; // Variable to store motor speed
const int motorSpeedPin = 4; // PWM pin for motor speed control (L293D Enable)
int read_ADC =0;
int duty_cycle;
int duty_cycle_lcd;
int set = 0; // Variable to store motor direction (0: Stop, 1: Forward, 2: Reverse)
unsigned long startTime = 0; // Variable to store the start time
unsigned long elapsedTime = 0; // Variable to store the elapsed time
unsigned long reverseStartTime = 0; // Variable to store the start time for reverse direction
unsigned long directionChangeTime = 0; // Variable to store the time when direction is changed
// Timer variables
unsigned long previousMillis[5] = {0, 0, 0, 0, 0}; // Array for different timers
// Timer constants
const long debounceTime = 10; // Debounce time for buttons (ms)
const long startDelay = 10000; // Delay before starting motor (ms)
const long runTime = 10000; // Time for motor to run (ms)
const long inactivityTimeout = 10000; // Time for inactivity before stopping (ms)
const long reverseInterval = 10000; // Time interval for automatic direction reversal (ms)
void setup(){
Serial.begin(9600);// initialize serial communication at 9600 bits per second:
pinMode(potentiometer, INPUT);
pinMode(buttonForward, INPUT_PULLUP);
pinMode(buttonStop, INPUT_PULLUP);
pinMode(buttonReverse, INPUT_PULLUP);
// Motor control pins as outputs
pinMode(M1_Ena, OUTPUT);
pinMode(M1_in1, OUTPUT);
pinMode(M1_in2, OUTPUT);
lcd.begin(20,4);
lcd.print("Motor Speed:"); // Display text on LCD
pinMode(motorSpeedPin, OUTPUT); // Set PWM pin as output
}
void loop(){
// Read potentiometer value and map it to motor speed (0-255)
read_ADC = analogRead(potentiometer);
duty_cycle = map(read_ADC, 0, 1023, 0, 255);
duty_cycle_lcd = map(read_ADC, 0, 1023, 0, 100);
motorSpeed = map(read_ADC, 0, 1023, 0, 255);
// Debounce button presses (using timer)
if (millis() - previousMillis[0] >= debounceTime) {
previousMillis[0] = millis();
int startButtonState = digitalRead(buttonForward);
int stopButtonState = digitalRead(buttonStop);
int reverseButtonState = digitalRead(buttonReverse);
if (startButtonState == LOW) {
set = 1;
previousMillis[1] = millis(); // Reset start delay timer
directionChangeTime = millis(); // Reset direction change timer
startTime = millis(); // Reset the start time when motor stops
} else if (stopButtonState == LOW) {
set = 0;
startTime = millis(); // Reset the start time when motor stops
}else if (reverseButtonState == LOW) {
set = 2;
directionChangeTime = millis(); // Reset direction change timer
startTime = millis(); // Reset the start time when motor stops
}
}
// Control motor speed using PWM
analogWrite(M1_Ena, duty_cycle);
analogWrite(motorSpeedPin, motorSpeed); // Control motor speed using PWM
// Update LCD with duty cycle
lcd.setCursor(0,0);
lcd.print("Duty Cycle: ");
lcd.print(duty_cycle_lcd);
lcd.print("% ");
lcd.setCursor(0,1);
lcd.print("Direction:");
if(set==0){
lcd.print("Stop ");
analogWrite(M1_Ena, 0);
digitalWrite(M1_in1, LOW);
digitalWrite(M1_in2, LOW);
digitalWrite(greenLEDPin, LOW); // Turn off green LED
digitalWrite(redLEDPin, HIGH); // Turn on red LED
digitalWrite(blueLEDPin, LOW); // Turn off blue LED
} else if(set==1){
lcd.print("Forward ");
analogWrite(M1_Ena, duty_cycle); // Set motor speed using PWM
digitalWrite(M1_in1, HIGH);
digitalWrite(M1_in2, LOW);
digitalWrite(greenLEDPin, HIGH); // Turn on green LED
digitalWrite(redLEDPin, LOW); // Turn off red LED
digitalWrite(blueLEDPin, LOW); // Turn off blue LED
} else if(set==2){
lcd.print("Reverse ");
analogWrite(M1_Ena, duty_cycle); // Set motor speed using PWM
digitalWrite(M1_in1, LOW);
digitalWrite(M1_in2, HIGH);
digitalWrite(greenLEDPin, LOW); // Turn off green LED
digitalWrite(redLEDPin, LOW); // Turn off red LED
digitalWrite(blueLEDPin, HIGH); // Turn on blue LED
}
// Timer for automatic direction reversal
if (set != 0 && millis() - directionChangeTime >= reverseInterval) {
if (set == 1) {
set = 2; // Change direction to reverse after the interval
startTime = millis(); // Reset the start time when motor stops
} else if (set == 2) {
set = 1; // Change direction back to forward after reverse interval
startTime = millis(); // Reset the start time when motor stops
}
directionChangeTime = millis(); // Reset the timer
}
elapsedTime = millis() - startTime; // Calculate the elapsed time
lcd.setCursor(0, 2);
lcd.print("Time: ");
lcd.print(elapsedTime / 1000); // Display elapsed time in seconds
lcd.print("s");
lcd.setCursor(0, 3); // Set cursor position on LCD
lcd.print("Speed:");
lcd.print(motorSpeed); // Display motor speed on LCD
delay(50);
}