Hola a todos,
soy novato en esto de programar en Arduino y espero me puedan ayudar.
El proyecto consta de un LED y dos pulsadores en PULL_UP (creo que es lógica negativa). El funcionamiento debería ser el siguiente:
1=>Pulsador 1 pulsado=> Led encendido y parpadeo de lento a rápido hasta quedar encendido.
2=>Pulsador 2 pulsado=> Encender Led.
3=>Pulsador 2 pulsado=> Apagar Led.
4=>Si se activa el "parpadeo" del Led y se pulsa el Pulsador 2 debería apagar el Led.
Espero que me haya explicado con claridad pero dejo el código y el esquema de montaje por si alguien me puede ayudar con el código del sketch (creo que el problema está en como interrumpir el bucle for con la pulsación del Pulsador buttonBpin...).
int ledPin = 5;
int buttonApin = 9;
int buttonBpin = 8;
void setup()
{
pinMode(ledPin, OUTPUT);
pinMode(buttonApin, INPUT_PULLUP);
pinMode(buttonBpin, INPUT_PULLUP);
}
void loop()
{
if (digitalRead(buttonApin) == LOW){
digitalWrite(ledPin, HIGH);
for (int i = 1; i < 10000; i++){
digitalWrite(ledPin, HIGH);
delay(1000 / i);
digitalWrite(ledPin, LOW);
delay(1000 / i);
}
}
if (digitalRead(buttonBpin) == LOW){
digitalWrite(ledPin, HIGH);
}
if (digitalRead(buttonBpin) == HIGH) {
digitalWrite(ledPin, LOW);
}
}
No es el mejor código, pero cumple con todo lo solicitado, ademas tiene unos cuantos detalles para hacerlo mas cómodo...
int ledPin = 5;
int buttonApin = 9;
int buttonBpin = 8;
boolean flag = false; //Esto sirve como bandera
int num;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonApin, INPUT_PULLUP);
pinMode(buttonBpin, INPUT_PULLUP);
}
void loop() {
if ((digitalRead(buttonApin) == LOW) && (!flag)) { //Con estas dos condiciones harás que solo se
//pueda leer una ves el boton, y solo sera valido otra
flag = true; //ves hasta que termine el "for" o presiones el pinB.
digitalWrite(ledPin, HIGH);
for (int i = 1; i < 30; i++) {
if (digitalRead(buttonBpin) == LOW) {
digitalWrite(ledPin, LOW);
break;
};
digitalWrite(ledPin, HIGH);
delay(1000 / i);
digitalWrite(ledPin, LOW);
delay(1000 / i);
};
digitalWrite(ledPin, HIGH);
flag = false;
}
if ((digitalRead(buttonBpin) == LOW) && (!flag)) {
digitalWrite(ledPin, num ^= 1); //"num ^= 1" significa que... por ejemplo... si el led esta
while (digitalRead(buttonBpin) == LOW){} //encendido, entones se apagara, y aleves.
}
}
Moderador
Por favor edita tu post usando etiquetas de código. Códigos menores a 9k deben verse en el post tal como te han respondido.
Además, la imagen debe hacerse visible. Sigue la guía que esta al final de las normas.
Normas del foro
Muchas gracias Hiperdoo, el código funciona en la placa correctamente. Lo único es que no he encontrado información del comando "num^=1;" en la red.
Si puedes recomendarme alguna página o tutorial del que pueda aprender este tipo de comandos de programación te lo agradecería mucho. Tampoco conocía la línea del while con condición pero sin ejecución de ninguna orden o acción.
Gracias por su tiempo, un saludo 
Hola:
Imagen:
El código que hicieron.
int ledPin = 5;
int buttonApin = 9;
int buttonBpin = 8;
boolean flag = false; //Esto sirve como bandera
int num;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(buttonApin, INPUT_PULLUP);
pinMode(buttonBpin, INPUT_PULLUP);
}
void loop() {
if ((digitalRead(buttonApin) == LOW) && (!flag)) { //Con estas dos condiciones harás que solo se
//pueda leer una ves el boton, y solo sera valido otra
flag = true; //ves hasta que termine el "for" o presiones el pinB.
digitalWrite(ledPin, HIGH);
for (int i = 1; i < 30; i++) {
if (digitalRead(buttonBpin) == LOW) {
digitalWrite(ledPin, LOW);
break;
};
digitalWrite(ledPin, HIGH);
delay(1000 / i);
digitalWrite(ledPin, LOW);
delay(1000 / i);
};
digitalWrite(ledPin, HIGH);
flag = false;
}
if ((digitalRead(buttonBpin) == LOW) && (!flag)) {
digitalWrite(ledPin, num ^= 1); //"num ^= 1" significa que... por ejemplo... si el led esta
while (digitalRead(buttonBpin) == LOW){} //encendido, entones se apagara, y aleves.
}
}
En vez de usar ese tronco delay que deja el pobre AVR durante un tiempo en esclavo. ¿Por qué nousar millis()?
Entender millis y no morir en el intento.
Saludos.