//El boton azul sirve para controlar en modo manual el servo
// y el boton amarillo controla el modo automatico haciendo un barrido
// de 180º en una direccion y en la otra (eso lo consideramos un barrido)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
#define PINSERVO 5
#define PIN_MANUAL 2
#define PIN_AUTO 3
LiquidCrystal_I2C lcd(0x27, 20, 4);
Servo servomotor;
float valor;
float angulo;
int barridos;
char dato;
int num_dato;
char num_barridos;
int cont = 0;
int contador = 0;
void setup() {
Serial.begin(9600);
Serial.println("-------------PROGRAMA PARA CONTROLAR EL BARRIDO DE UN SERVO-------------");
Serial.println("Modo automático ---> 'Boton amarillo' Modo manual ---> 'Boton azul'");
Serial.println("Pulse el boton correspondiente para elegir el modo en el que desea controlar el servo ");
lcd.init();
lcd.backlight();
lcd.setCursor (0,0) ;lcd.print(" MENU PRINCIPAL");
lcd.setCursor (0,2) ;lcd.print("Boton azul->Manual");
lcd.setCursor (0,3) ;lcd.print("Boton amarillo->Auto");
servomotor.attach(PINSERVO);
pinMode(PIN_MANUAL, INPUT);
pinMode(PIN_AUTO, INPUT);
attachInterrupt(digitalPinToInterrupt(PIN_MANUAL), Modo_manual, RISING);
attachInterrupt(digitalPinToInterrupt(PIN_AUTO), Modo_automatico, RISING);
}
void Menu_principal(){
Serial.println("-------------PROGRAMA PARA CONTROLAR EL BARRIDO DE UN SERVO-------------");
Serial.println("Modo automático ---> '0' Modo manual ---> '1'");
Serial.println("Pulse la tecla correspondiente para elegir el modo en el que desee controlar el servo ");
Serial.println("Puede ir variando el modo pulsando el boton correspondiente al modo que desee");
Serial.println(" ");
Serial.println(" ");
Serial.println(" ");
Serial.println(" ");
}
void Mover_servo(){
valor = analogRead(A0);
angulo = (valor/1023)*180;
servomotor.write(angulo);
}
void Hacer_barridos(){
num_barridos=Serial.read();
barridos = num_barridos -'0';
servomotor.write(0);
for(int i=0; i<barridos; i++){
for(int x=0; x<180;x++){
servomotor.write(x);
angulo = x;
delay(10);
if(angulo==179){
for(int j=angulo; j>=0; j--){
servomotor.write(j);
angulo = j;
delay(10);
}
}
}
}
}
void Letras_modo_manual(){
Serial.println("-------------------------------MODO MANUAL------------------------------------");
Serial.println("Controle el servo con el potenciómetro ");
Serial.println(" ");
Serial.println(" ");
Serial.println(" ");
Serial.println(" ");
}
void Letras_modo_automatico(){
Serial.println("-------------------------------MODO AUTOMÁTICO------------------------------");
Serial.println("En este modo un barrido se define como la rotación del servo hasta 180º y la vuelta hasta 0º ");
Serial.println("Elija cuantos barridos desea hacer (Máximo 9): ");
Serial.println(" ");
Serial.println(" ");
}
void lcd_modo_auto(){
lcd.clear();
lcd.setCursor (0,0) ;lcd.print(" MODO AUTOMATICO");
lcd.setCursor (0,1) ;lcd.print("Elija el numero de");
lcd.setCursor (0,2) ;lcd.print("barridos que desee");
lcd.setCursor (0,3) ;lcd.print(" RodrigoG");
}
void lcd_modo_manual(){
lcd.clear();
lcd.setCursor (0,0) ;lcd.print(" MODO MANUAL");
lcd.setCursor (0,1) ;lcd.print("Controle el servo");
lcd.setCursor (0,2) ;lcd.print("con el potenciometro");
lcd.setCursor (0,3) ;lcd.print(" RodrigoG");
}
void Modo_manual(){
cont = 1;
contador = 1;
Letras_modo_manual();
}
void Modo_automatico(){
cont = 2;
contador = 2;
Letras_modo_automatico();
}
void loop() {
while (cont == 1){
Mover_servo();
if (contador == 2){
lcd_modo_auto();
contador = 0;
}
if (contador == 1){
lcd_modo_manual();
contador = 0;
}
}
while (cont == 2){
Hacer_barridos();
if (contador == 2){
lcd_modo_auto();
contador = 0;
}
if (contador == 1){
lcd_modo_manual();
contador = 0;
}
}
}