Autor Tema: Bucle de espera a soltar pulsador.  (Leído 4045 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Bucle de espera a soltar pulsador.
« Respuesta #15 en: 05 de Septiembre de 2021, 17:35:56 »
Gracias Picuino.   

   Lo estudio

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Bucle de espera a soltar pulsador.
« Respuesta #16 en: 06 de Septiembre de 2021, 11:57:58 »
Este programa funciona.
Utiliza tres máquinas de estados, una para definir el tiempo de noche (temprana o tardía), otra para definir el estado de las luces (encendido/apagado) y otra para temporizar el pulsador y quitar rebotes.
Al utilizar máquinas de estados no se queda bloqueado en ninguna función y por lo tanto se puede ampliar indefinidamente y además así se evitan muchos problemas.
Como puedes ver, utiliza las funciones de Arduino.

Si tienes dudas puedes preguntarme.
Un saludo.

Código: C
  1. #define ESTADO_NOCHE_TEMPRANA  1
  2. #define ESTADO_NOCHE_TARDIA    2
  3.  
  4. #define ESTADO_APAGADO         1
  5. #define ESTADO_ENCENDIDO       2
  6.  
  7. #define ESTADO_NO_PULSADO      1
  8. #define ESTADO_ANTIRREBOTES    2
  9. #define ESTADO_PULSADO         3
  10.  
  11. #define PULSADOR_PRESIONADO    0
  12.  
  13. #define TIEMPO_NOCHE_TEMPRANA    (1000L * (4*3600 + 30*60 + 0))
  14. #define TIEMPO_ENCENDIDO_MANUAL  (1000L * (1*3600 + 0*60 + 0))
  15. #define TIEMPO_ANTIRREBOTES      (50)
  16.  
  17. const int PIN_LUCES = 13;
  18. const int PIN_PULSADOR = A1;
  19.  
  20. int estado_noche, estado_luces, estado_pulsador;
  21. int pulsador_pulsado;
  22. long unsigned int temporizador_1, temporizador_2, temporizador_3;
  23.  
  24.  
  25. void setup() {
  26.   pinMode(PIN_PULSADOR, INPUT_PULLUP);
  27.   pinMode(PIN_LUCES, OUTPUT);
  28.  
  29.   estado_noche = ESTADO_NOCHE_TEMPRANA;
  30.   estado_luces = ESTADO_ENCENDIDO;
  31.   estado_pulsador = ESTADO_NO_PULSADO;
  32.  
  33.   temporizador_1 = millis() + TIEMPO_NOCHE_TEMPRANA;
  34.   temporizador_2 = millis();
  35. }
  36.  
  37.  
  38. void loop() {
  39.  
  40.   //
  41.   // Evolucion de los estados
  42.   //
  43.  
  44.   if (estado_noche == ESTADO_NOCHE_TEMPRANA) {
  45.     if (millis() > temporizador_1) {
  46.       estado_noche = ESTADO_NOCHE_TARDIA;
  47.       estado_luces = ESTADO_APAGADO;
  48.     }
  49.   }
  50.  
  51.  
  52.   if (estado_luces == ESTADO_APAGADO) {
  53.     if (flanco_pulsador() == 1) {
  54.       estado_luces = ESTADO_ENCENDIDO;
  55.       temporizador_2 = millis() + TIEMPO_ENCENDIDO_MANUAL;
  56.     }
  57.   }
  58.  
  59.   if (estado_luces == ESTADO_ENCENDIDO) {
  60.     if (flanco_pulsador() == 1) {
  61.       estado_luces = ESTADO_APAGADO;
  62.     }
  63.  
  64.     if ((estado_noche != ESTADO_NOCHE_TEMPRANA) && (millis() > temporizador_2)) {
  65.       estado_luces = ESTADO_APAGADO;
  66.     }
  67.   }
  68.  
  69.  
  70.   if (estado_pulsador == ESTADO_NO_PULSADO) {
  71.     if (digitalRead(PIN_PULSADOR) == PULSADOR_PRESIONADO) {
  72.       estado_pulsador = ESTADO_ANTIRREBOTES;
  73.       temporizador_3 = millis() + TIEMPO_ANTIRREBOTES;
  74.     }
  75.   }
  76.  
  77.   if (estado_pulsador == ESTADO_ANTIRREBOTES) {
  78.     if (millis() > temporizador_3) {
  79.       estado_pulsador = ESTADO_PULSADO;
  80.       pulsador_pulsado = 1;
  81.     }
  82.   }
  83.  
  84.   if (digitalRead(PIN_PULSADOR) != PULSADOR_PRESIONADO) {
  85.     estado_pulsador = ESTADO_NO_PULSADO;
  86.   }
  87.  
  88.  
  89.   //
  90.   // Salidas digitales según los estados
  91.   //
  92.  
  93.   if (estado_luces == ESTADO_ENCENDIDO) {
  94.     digitalWrite(PIN_LUCES, HIGH);
  95.   }
  96.   if (estado_luces == ESTADO_APAGADO) {
  97.     digitalWrite(PIN_LUCES, LOW);
  98.   }
  99.  
  100. }
  101.  
  102.  
  103. int flanco_pulsador(void) {
  104.    if (pulsador_pulsado == 1) {
  105.       pulsador_pulsado = 0;
  106.       return 1;
  107.    }
  108.    return 0;
  109. }
« Última modificación: 06 de Septiembre de 2021, 12:13:39 por Picuino »