Hola que tal? A ver si alguien me pudiese tirar un cable con el siguiente codigo, al no tener demasiados conocimientos de programación, he decidido usa el programa mBlock para generar mediante bloques uno "sencillo", el cual me genérela de forma automática el código en C y es el que me llevo( copia-pega) al software de arduino.
Estoy usando un Arudino UNo conjuntamente con un Rele+Interruptor tactil ( OJO es un interruptor, NO Pulsador ),la idea es que cuando toco el tactil, el interruptor me pasa a ON ( llevo 5v al pin 2 y mediante una resistencia de 10k llevo el GND al pin2 ) el programa me detecte un flanco de subida o bajada y me realiza la secuencia 1, cuando vuelvo a tocar el tactil, el interruptor me pasa a OFF y me realiza la secuencia 2, si volviese a tocar volver a repetir la secuencia 1 despues la secuencia2....Los que necesito que haga está bien y el codigo funciona, pero veo que no ha tenido en cuenta el programa mBlock el rebote del interruptor con lo que me da lecturas falsas, en ocasiones me detecta varios flancos al mismo tiempo. ( he intentado poner unas "pausas" con los bloques de mBlock, pero no realizan su funcion ( NO hacen ninguna pausa de ninugn tipo ) Puedo a servir que en el puerto Serie, me hace miles de lecturas cuando pulso y el rele entra, necesitaria subanar esas señales, espero aguien se le ocurra algo, gracias!
Por dejarlo más claro esta sería la secuencia que voy buscando:
-Arduino en reposo
-Pulso el interruptor
-El código me detecta el cambio de flanco ( High o Low)
-Realiza secuencia 1 ( solo una vez)
-Arduino en reposo
-Pulso el interruptor
-El código me detecta el cambio de flanco ( High o Low )
-Realiza secuencia 2 ( solo una vez )
-Arduino en reposo
-Pulso el interruptor
-El código me detecta el cambio de flanco ( High o Low)
-Realiza secuencia 1 ( solo una vez)
-…….. asi todo el rato.
En principio, no puedes usar Serial.print() ni sus variaciones dentro de una ISR.
Tampoco delay() ni millis().
Declaras dos rutinas sirviendo a la misma interrupción sin ninguna prioridad, no tiene sentido (al menos en la forma que se ha hecho).
Las ISR deben ser cortas y sobre todo rápidas, úsala para setear/resetear alguna variable que te indique la acción a ejecutar luego en el loop().
Para evitar el rebote, en la misma ISR has el dettach como primera sentencia, luego setea las variables.
Desde la parte del código que ejecuta la acción vuelves a hacer el attach de la interrupción.
Ahora si podrías tener 2 ISR que se van a alternar.
El Serial.print , lo puse por visualizar bien que estaba pasando con los flancos.
Cuando todo esté en orden los retiro ya que que no me cumplen ninguna función.
Gracias por aportación. En poder lo pruebo a ver qué resultado me da.
if(abrir == true){
abriendo(); // función que ejecuta la apertura
abrir = false;
attachInterrupt(digitalPinToInterrupt(2), ISR2,CHANGE);
}
Pero me he dado cuenta que me basé en tu código generado en mBlock y, sinceramente, no me gusta mucho.
¿Por qué detectar la pulsación con una interrupción?¿El micro va a entrar en modo sleep?
Si no es así, lo manejas tranquilamente sin necesidad de liarte con las interrupciones, como a cualquier pulsador.
Mira
Y si va a entrar en sleep tienes otras cosas más por las que preocuparte y sin conocimientos se va a hacer cuesta arriba.
que es esto?
Es realmente un sin sentido de mBlock?
Si no quieres usar el IDE de arduino te entiendo pero este código aunque esta bien tiene cosas que no se explican
Si quieres entonces programa sin nada de esto usando C standard sin setup ni loop
int main() {
// inicializar cosas
while(1) {
// código que se repite o sea loop()
}
}
Mejor comienzas de nuevo porque usar estas cosas realmente generan códigos donde se escapan muchas cosas como las que @anon90500195 te ha observado.
Tu problema o ejercicio cae en el debate que hemos tenido de usar interrupciones para cosas tan simples como pulsaciones o hacerlo todo en el loop.
En principio usa Bounce2.h como librería antirebotes pero olvida mBlock.
Mi consejo.
Si, eso es cosa de mBlock.
Yo hice de la manera más lógica la construcción de los bloques y el software hizo el resto.
Pensaba que era un buen programa para los que tenemos pocos conocimientos de programacion, pero por los comentarios que veo….. nose bien que pensar. Yo tambien creo ver cosas raras, por ejemplo hay funciones que me ha generado mBlock llamadas _delay , yo pensaba de toda la vida que se escribía delay ( sin poner el _ ) al igual que _loop , nose si es correcto o que pasa.
No es que sea incorrecto, es la forma en que mBlock genera el código.
El que nos has mostrado es el primero que veo y ya le encontré errores pero supongo que al ser un soft con fines educativos, pensado para usar en el aula durante un corto tiempo, no se han preocupado por algunos detalles. Mientras funcione...
Seriamente te aconsejo que te olvides de mBlock, descarga alguno de los libros gratuitos que hay en la sección Documentación y empieza dando pasos, vas a llegar a tu meta mejor que dando saltos.