// Servo Sweep example for the ESP32
// https://wokwi.com/arduino/projects/323706614646309460
#include <ESP32Servo.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
unsigned long previousMillis;
const unsigned long interval = 60000; // 10 or 20 milliseconds are common values
const int maxround = 10;
const int servoPin = 32;
const int swactpin = 19;
const int swuppin = 16;
const int swdownpin = 4;
const int swmodepin = 2;
Servo servo;
int step = 0;
int pos = 0;
int numround = 0;
int curround;
int mode;
int swone;
int swup;
int swdown;
void setup() {
Serial.begin(9600);
pinMode(swactpin, INPUT_PULLUP);
pinMode(swmodepin, INPUT_PULLUP);
pinMode(swuppin, INPUT_PULLUP);
pinMode(swdownpin, INPUT_PULLUP);
servo.attach(servoPin, 500, 2400);
lcd.init();
lcd.backlight();
//servo.write(pos);
curround = 5;
/*mode = 0;
swup = 0;
swdown = 0;*/
}
void loop() {
mode = digitalRead(swmodepin);
Serial.print("Mode : ");
Serial.println(mode);
if (mode == 0) {
lcd.setCursor(0, 0);
lcd.print("Manual: ");
lcd.print(curround);
lcd.print(" ");
lcd.print("Round ");
swone = digitalRead(swactpin);
if ( swone == LOW) {
numround = 1;
}
else {
swone = HIGH;
numround = 0;
}
//
//
}
//swup
swup = digitalRead(swuppin);
if ((swup == 0) and (curround < maxround)) {
curround++;
lcd.setCursor(8, 0);
lcd.print(curround);
lcd.print(" ");
lcd.print("Round ");
Serial.print("swup ");
Serial.print(swup);
Serial.print("curround ");
Serial.println(curround);
}
//swdown
swdown = digitalRead(swdownpin);
if ((swdown == 0) and (curround > 1)) {
curround--;
lcd.setCursor(8, 0);
lcd.print(curround);
lcd.print(" ");
lcd.print("Round ");
lcd.print(" ");
Serial.print("swdown ");
Serial.print(swdown);
Serial.print("curround ");
Serial.println(curround);
}
if (mode == 0 and numround == 1) {//manual
//lcd.setCursor(3, 1);
//lcd.print("Servo Move");
numround = numround + 1;
servomove();
lcd.setCursor(3, 1);
lcd.print(" ");
}
else if (mode == 1) {//auto
lcd.setCursor(0, 0);
lcd.print("Auto : ");
lcd.print(curround);
lcd.print(" ");
lcd.print("Round ");
if (interval < 60000) {
//lcd.setCursor(3, 1);
// lcd.print("Servo Move");
}
else {
lcd.setCursor(3, 1);
int nummin = interval / 60000;
if (nummin < 10) {
lcd.print("Wait ");
lcd.print(nummin);
lcd.print(" ");
}
else {
lcd.print("Wait ");
lcd.print(nummin);
}
lcd.print("min ");
}
automode();
numround = 0;
lcd.setCursor(3, 1);
lcd.print(" ");
}
} //end loop
void displayFTen(int col, int row, int inputnum, int count) {
lcd.setCursor(col, row);
for (int i = 0; i < count; i++) {
if (inputnum < 10) {
lcd.print(" ");
lcd.print(inputnum);
}
else if ((inputnum > 10) || (inputnum < 100)) {
lcd.print(inputnum);
}
}
}
void servomove() {
for (int nmove = curround ; nmove >= 1; nmove--) { //number for move
lcd.setCursor(3, 1);
lcd.print("Servo Move ");
lcd.print(nmove);
Serial.print("nmove ");
Serial.println(nmove);
for (pos = 0; pos <= 180; pos += 1) {
servo.write(pos);
delay(15);
}
for (pos = 180; pos >= 0; pos -= 1) {
servo.write(pos);
delay(15);
}
}
}
void automode() {
unsigned long currentMillis = millis();
if ( currentMillis - previousMillis >= interval)
{
previousMillis = currentMillis;
if (mode == 1) {//auto
servomove();
numround = 0;
}
}
}