Buenos días Arduineros, soy nuevo por aquí y novato trasteando arduino. Les comento un problema que tengo con el código ante un pequeño proyecto que estoy realizando. He estado buscando por el foro e internet pero no encuentro la solución a mi problema, espero que me puedan ayudar.
El código en si debe activar dos pistones neumáticos durante un tiempo de forma alterna, estos pistones en principio los estoy simulando encendiendo y apagando dos leds. Lo que deben hacer es lo siguiente.
Cuando comienza el código debe encender el primer led durante 0.5 segundos y permancer apagado 4 segundos, momento en el cual el segundo se encide 0.5 segundos y permanece apagado 4 segundos. Adicionalmente le he añadido un contador para que esto lo realice durate X repeticiones, esto me lo muestra en pantalla 20x4. El código lo tendría que realizar sin delay. En principio esto lo he conseguido con el siguiente código:
#include <Wire.h>
#include <LiquidCrystal_I2C_AvrI2C.h>
LiquidCrystal_I2C_AvrI2C lcd(0x27, 20, 4);
const int piston1 = 12;
const int piston2 = 11;
int estado_piston1 = LOW;
int estado_piston2 = LOW;
long previousMillis1 = 0;
long previousMillis2 = 0;
long contador = 20;
long intervalOn = 7500;
long intervalOff = 500;
long intervalOn2 = 500;
long intervalOff2 = 7500;
long desfase = 4000;
void setup()
{
Serial.begin(9600);
lcd.begin();
lcd.backlight();
pinMode(piston1, OUTPUT);
pinMode(piston2, OUTPUT);
}
void loop()
{
while (contador > 0 ) {
lcd.setCursor(0, 1); lcd.print("Num CAMBIOS");
lcd.setCursor(12, 1); lcd.print(contador);
unsigned long currentMillis1 = millis();
unsigned long currentMillis2 = currentMillis1 + desfase;
if ((estado_piston1 == LOW) && (currentMillis1 - previousMillis1 >= intervalOn))
{
estado_piston1 = HIGH;
previousMillis1 = currentMillis1;
digitalWrite(piston1, estado_piston1);
}
else if ((estado_piston1 == HIGH) && (currentMillis1 - previousMillis1 >= intervalOff))
{
estado_piston1 = LOW;
previousMillis1 = currentMillis1;
digitalWrite(piston1, estado_piston1);
contador--;
}
if ((estado_piston2 == HIGH) && (currentMillis2 - previousMillis2 >= intervalOn2))
{
estado_piston2 = LOW;
previousMillis2 = currentMillis2;
digitalWrite(piston2, estado_piston2);
}
else if ((estado_piston2 == LOW) && (currentMillis2 - previousMillis2 >= intervalOff2))
{
estado_piston2 = HIGH;
previousMillis2 = currentMillis2;
digitalWrite(piston2, estado_piston2);
contador-- ;
}
}
}
En principio esto lo realiza perfectamente, el problema surge cuando quiero añadir un boton de parada y otro para continuar por donde iba. Lo he hecho de la siguiente forma:
#include <Wire.h>
#include <LiquidCrystal_I2C_AvrI2C.h>
LiquidCrystal_I2C_AvrI2C lcd(0x27, 20, 4);
const int piston1 = 12;
const int piston2 = 11;
int boton1 = 3;
int boton4 = 10;
int estado_piston1 = LOW;
int estado_piston2 = LOW;
long previousMillis1 = 0;
long previousMillis2 = 0;
long contador = 20;
long intervalOn = 7500;
long intervalOff = 500;
long intervalOn2 = 500;
long intervalOff2 = 7500;
long desfase = 4000;
int estado = 1;
void setup()
{
Serial.begin(9600);
lcd.begin();
lcd.backlight();
pinMode(boton1, INPUT);
pinMode(boton4, INPUT);
pinMode(piston1, OUTPUT);
pinMode(piston2, OUTPUT);
}
void loop()
{
if (digitalRead(boton1) == HIGH) {
estado = 1;
}
while (contador > 0 && estado == 1) {
if (digitalRead(boton4) == HIGH) {
estado = 0;
}
lcd.setCursor(0, 1); lcd.print("Num CAMBIOS");
lcd.setCursor(12, 1); lcd.print(contador);
unsigned long currentMillis1 = millis();
unsigned long currentMillis2 = currentMillis1 + desfase;
if ((estado_piston1 == LOW) && (currentMillis1 - previousMillis1 >= intervalOn))
{
estado_piston1 = HIGH;
previousMillis1 = currentMillis1;
digitalWrite(piston1, estado_piston1);
}
else if ((estado_piston1 == HIGH) && (currentMillis1 - previousMillis1 >= intervalOff))
{
estado_piston1 = LOW;
previousMillis1 = currentMillis1;
digitalWrite(piston1, estado_piston1);
contador--;
}
if ((estado_piston2 == HIGH) && (currentMillis2 - previousMillis2 >= intervalOn2))
{
estado_piston2 = LOW;
previousMillis2 = currentMillis2;
digitalWrite(piston2, estado_piston2);
}
else if ((estado_piston2 == LOW) && (currentMillis2 - previousMillis2 >= intervalOff2))
{
estado_piston2 = HIGH;
previousMillis2 = currentMillis2;
digitalWrite(piston2, estado_piston2);
contador-- ;
}
}
}
El paro y continue lo hace correctamente pero cuando vuelve a iniciar el bucle el encendido de leds no lo hace correctamente, comienzan a encenderse los dos a la vez o con otro ritmo al anterior y nose como puedo solucionar este problema.
Gracias y un saludo!