Buenos dias, estoy armando una maquina saca peluches.
el programa arranca cuando se inserta una moneda la cual acciona un limit switch (final de carrera) que al detectar el estado HIGH habilita movilizar el carro con el joystick. (esto lo inclui en el primer IF)
necesito que este primer IF sea interrumpido al presionar un boton, el cual ejecuta un segundo IF con una funcion "finalizar" (la funcion es una secuencia hace que el carro baje automaticamente la garra, la cierre, la suba, y vuelva a la posicion de inicio)
el problema es que el primer IF no se estaria ejecutando, sospecho que debe ser porque no estoy almacenando el valor HIGH del limit switch? entonces cuando la moneda pasa por el limit switch este cambia de LOW a HIGH y de nuevo a LOW? no se como se resuelve eso....
y por otro lado la secuencia de la funcion finalizar solo se ejecuta si mantengo presionado el boton, estoy con el mismo problema?
el segundo IF deberia estar anidado dentro del primer IF?
muchas gracias
//limit switch
int LS = 12;
int estadols;
//switch
int SW = 11;
int estadosw;
//pantalla
#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7);
//servomotor
#include <Servo.h>
Servo srv;
int SRV = 5;
int PULSOMIN = 1000;
int PULSOMAX = 2000;
//motor carro eje X
int IN1X = 6;
int IN2X = 7;
int ENAX = 5;
//motor carro eje Y
int IN1Y = 8;
int IN2Y = 9;
int ENAY = 10;
//motor de la garra
int IN3G = 2;
int IN4G = 3;
int ENBG = 3;
void setup(){
pinMode(LS,INPUT);
pinMode(SW,INPUT);
pinMode(SRV, OUTPUT);
srv.attach(SRV, PULSOMIN, PULSOMAX);
srv.write(90);
pinMode(IN1X, OUTPUT);
pinMode(IN2X, OUTPUT);
pinMode(ENAX, OUTPUT);
pinMode(IN1Y, OUTPUT);
pinMode(IN2Y, OUTPUT);
pinMode(ENAY, OUTPUT);
pinMode(IN3G, OUTPUT);
pinMode(IN4G, OUTPUT);
pinMode(ENBG, OUTPUT);
}
void loop(){
estadols = digitalRead(LS);
estadosw = digitalRead(SW);
lcd.begin(16, 2);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("++INSERT COIN++");
if (estadols == HIGH)
{
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Iniciando");
delay(1000);
lcd.setCursor(0, 1);
lcd.print("A JUGAR!!!");
int motorPWMSpeed0 = 0;
int joystickValue0 = analogRead(A0);
if (joystickValue0 >= 530)
{
avancemotorxA();
}
else if (joystickValue0 <= 490)
{
retrocesomotorxA();
}
else
{
stopmotorx();
}
int motorPWMSpeed1 = 0;
int joystickValue1 = analogRead(A1);
if (joystickValue1 >= 530)
{
avancemotoryA();
}
else if (joystickValue1 <= 490)
{
retrocesomotoryA();
}
else
{
stopmotory();
}
}
if (estadosw == HIGH)
{
finalizar();
}
}
void finalizar() {
lcd.clear();
lcd.print("LA GARRA!!!");
delay(2000);
avancemotorg(); //baja la garra
delay(3000);
srv.write(0); //cierra la garra
delay(2000);
retrocesomotorg(); //sube la garra
delay(2000);
avancemotorxD(); //vuelve a inicio el carro
avancemotoryD(); // vuelve a inicio la guia
delay(3000);
srv.write(180); //abre la garra
delay(2000);
lcd.clear();
lcd.print("GAME OVER!!!");
delay(3000);
}
void avancemotorxA() {
int motorPWMSpeed0 = 0;
int joystickValue0 = analogRead(A0);
motorPWMSpeed0 = map(joystickValue0, 530, 1023, 0, 255);
digitalWrite(IN1X, HIGH);
digitalWrite(IN2X, LOW);
analogWrite(ENAX, motorPWMSpeed0);
}
void avancemotorxD() {
digitalWrite(IN1X, HIGH);
digitalWrite(IN2X, LOW);
analogWrite(ENAX, HIGH);
}
void retrocesomotorxA() {
int motorPWMSpeed0 = 0;
int joystickValue0 = analogRead(A0);
motorPWMSpeed0 = map(joystickValue0, 490, 0, 0, 255);
digitalWrite(IN1X, LOW);
digitalWrite(IN2X, HIGH);
analogWrite(ENAX, motorPWMSpeed0);
}
void retrocesomotorxD() {
digitalWrite(IN1X, LOW);
digitalWrite(IN2X, HIGH);
analogWrite(ENAX, HIGH);
}
void stopmotorx(){
digitalWrite(IN1X, LOW);
digitalWrite(IN2X, LOW);
}
void avancemotoryA() {
int motorPWMSpeed1 = 0;
int joystickValue1 = analogRead(A1);
motorPWMSpeed1 = map(joystickValue1, 530, 1023, 0, 255);
digitalWrite(IN1Y, HIGH);
digitalWrite(IN2Y, LOW);
analogWrite(ENAY, motorPWMSpeed1);
}
void avancemotoryD() {
digitalWrite(IN1Y, HIGH);
digitalWrite(IN2Y, LOW);
analogWrite(ENAY, HIGH);
}
void retrocesomotoryA() {
int motorPWMSpeed1 = 0;
int joystickValue1 = analogRead(A1);
motorPWMSpeed1 = map(joystickValue1, 490, 0, 0, 255);
digitalWrite(IN1Y, LOW);
digitalWrite(IN2Y, HIGH);
analogWrite(ENAY, motorPWMSpeed1);
}
void retrocesomotoryD() {
digitalWrite(IN1Y, LOW);
digitalWrite(IN2Y, HIGH);
analogWrite(ENAY, HIGH);
}
void stopmotory(){
digitalWrite(IN1Y, LOW);
digitalWrite(IN2Y, LOW);
}
void avancemotorg(){
digitalWrite(ENBG, HIGH);
digitalWrite(IN3G, LOW);
digitalWrite(IN4G, HIGH);
}
void retrocesomotorg(){
digitalWrite(ENBG, HIGH);
digitalWrite(IN3G, HIGH);
digitalWrite(IN4G, LOW);
}