Hola
Quisiera pedir su ayuda.
Intento escribir el programa, que funcione de esta manera:
Si presiono el botón 1, el programa espera, hasta que será presionado el botón 2. Si es así, se enciende LED y se queda encendido.
Para apagarlo, hay que presionar el botón 2, el programa espera, hasta que será presionado el botón 1. Si es así, se apaga LED.
const int buttonPin1 = 2;
const int ledPin = 13;
const int buttonPin2 = 4;
int i = 0;
void setup()
{
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop()
{
int pin1State = digitalRead(buttonPin1);
int pin2State = digitalRead(buttonPin2);
if (pin1State == LOW)
{
i = i + 1;
}
if (pin2State == LOW)
{
i = i + 1;
}
if (i == 2)
{
digitalWrite(ledPin, HIGH);
}
delay(500);
i = 0;
}
Es la primera parte del programa, pero no funciona.
¿Podréis indicarme dónde hice error, por favor?
Saludos
El mayor problema es que enciende si pulsas 1 y 2, 2 y 1, 1 y 1, 2 y 2.
Una posible solución:
const int buttonPin1 = 2;
const int ledPin = 13;
const int buttonPin2 = 4;
int i = 0;
void setup()
{
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop()
{
int pin1State = digitalRead(buttonPin1);
int pin2State = digitalRead(buttonPin2);
if (i == 0) {
if (pin1State == LOW)
{
i = 1;
}
}
if (i == 1) {
if (pin2State == LOW)
{
i = 2;
}
}
if (i == 2)
{
digitalWrite(ledPin, HIGH);
i = 0;
}
delay(500);
}
const int buttonPin1 = 2;
const int ledPin = 13;
const int buttonPin2 = 4;
int i = 0;
void setup()
{
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop()
{
int pin1State = digitalRead(buttonPin1);
int pin2State = digitalRead(buttonPin2);
if (i == 0) {
if (pin1State == LOW)
{
i = 1;
}
}
if (i == 1) {
if (pin2State == LOW)
{
i = 2;
}
}
if (i == 2)
{
digitalWrite(ledPin, HIGH);
i = 0;
}
if (i == 0) {
if (pin2State == LOW)
{
i = 1;
}
}
if (i == 1) {
if (pin1State == LOW)
{
i = 2;
}
}
if (i == 2)
{
delay(500);
digitalWrite(ledPin, LOW);
i = 0;
}
}
const int buttonPin1 = 2;
const int ledPin = 13;
const int buttonPin2 = 4;
int i = 0;
void setup()
{
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop()
{
int pin1State = digitalRead(buttonPin1);
int pin2State = digitalRead(buttonPin2);
if (i == 0) {
if (pin1State == LOW)
{
i = 1;
}
}
if (i == 1) {
if (pin2State == LOW)
{
i = 2;
}
}
if (i == 2)
{
digitalWrite(ledPin, HIGH);
i = 3;
}
if (i == 3) {
if (pin2State == LOW)
{
i = 4;
}
}
if (i == 4) {
if (pin1State == LOW)
{
i = 5;
}
}
if (i == 5)
{
delay(500);
digitalWrite(ledPin, LOW);
i = 0;
}
}
Porque sino cuando i es 0 no se sabe si hay que apagar o encender.
De cualquier modo prueba tu código porque puedo estar equivocado y estar bien como lo has hecho.
Con un poco de cosmética lo que esta haciendo es un máquina de estado, pero le falta mas forma.
Es claro que se trata de un programa propuesto como tarea escolar, así que las opciones para resolverlas deberían ser bien recibidas y según su entusiasmo y motivación aprender lo que mejor le sirva.
Usar máquina de estados es la mejor opción siempre, pero preparar tu cerebro para de aquí en mas hacerlo siempre de ese modo lleva tiempo.
Sabes gatul, lo hice como Tú lo hiciste, pero mientras tanto me surgió necesario, que necesito "algo", que funcione desde la mitad del programa, y aumenté un botón más.
Hice la prueba y todo funciona muy bien
Ahí viene el programa:
const int buttonPin1 = 2;
const int ledPin = 13;
const int buttonPin2 = 4;
const int buttonPin3 = 7;
int i = 0;
int delayTime = 3000;
void setup()
{
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
pinMode(buttonPin3, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop()
{
int pin1State = digitalRead(buttonPin1);
int pin2State = digitalRead(buttonPin2);
int pin3State = digitalRead(buttonPin3);
if (i == 0) {
if (pin1State == LOW)
{
i = 1;
}
}
if (i == 1) {
if (pin2State == LOW)
{
i = 2;
}
}
if (i == 2)
{
digitalWrite(ledPin, HIGH);
i = 3;
}
if (i == 3) {
if (pin2State == LOW)
{
i = 4;
}
}
if (i == 4) {
if (pin1State == LOW)
{
i = 5;
}
}
if (i == 5)
{
delay(delayTime);
digitalWrite(ledPin, LOW);
i = 0;
}
if (i == 0) {
if (pin3State == LOW)
{
i = 6;
}
}
if (i == 6) {
if (pin2State == LOW)
{
i = 7;
}
}
if (i == 7)
{
digitalWrite(ledPin, HIGH);
i = 8;
}
if (i == 8) {
if (pin1State == LOW)
{
i = 9;
}
}
if (i == 9)
{
delay(delayTime);
digitalWrite(ledPin, LOW);
i = 0;
}
}
Quisiera agradecer también a todos que hicieron cualquier comentario.
¡Sois los mejores!
Saludos
Si me permites, te aconsejo que trates de evitar delays tan largos, piensa que durante 3 segundos pierdes el control (porque el programa literalmente se frena) y si pulsas un botón durante el delay el programa ni se entera. Lee el tema "Entender millis..." en la sección Documentación que te va a venir muy bien para evitar del abuso de los delays.
J-M-L, lo que hiciste, es un obra de arte, o mejor dicho: alto nivel
Tal vez algún día llegaré a éste nivel
Te agradezco muchísimo por tu aporte
Saludos