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

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

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Bucle de espera a soltar pulsador.
« en: 03 de Septiembre de 2021, 04:09:47 »
Código: C
  1. while(digitalRead(A1) == 0);

Normalmente lo hago así en C en compiladores para pic y cero problema.

  En Arduino no va.

También he intentado lo siguiente:

Código: C
  1. while(digitalRead(A1) == 0) {}

Código: C
  1. while(!digitalRead(A1)) {}

Código: C
  1. while(digitalRead(A1) == 0) {;}


Código: C
  1. while(digitalRead(A1) == 0) {delay(1);}



  Nada.  Aunque el pulsador (que es pullup) esté pulsado, ese while pasa de largo.  No es cosa de pulsador, por que antes de eso tiene otro bucle que espera a que se pulse, y ese sin embargo si que funciona. 

  ¿Alguna sugerencia?.  Yo es que de Arduino, pelado. Pero me he visto obligado a hacer un programa muy simple, pero claro...  Habrá que ver ahora como hace arduino para leer el puerto y devolver el estado del mismo y demás.

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 577
Re:Bucle de espera a soltar pulsador.
« Respuesta #1 en: 03 de Septiembre de 2021, 07:34:42 »
Hola, lo que intentas decir con "pulsador a pull-up" es que cuándo lo pulsas generas un uno en la entrega del controlador?
Pues monitorea que ocurre con los estados de Digitalread (A1) en el monitor serial.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Bucle de espera a soltar pulsador.
« Respuesta #2 en: 03 de Septiembre de 2021, 08:42:56 »
Hola, lo que intentas decir con "pulsador a pull-up" es que cuándo lo pulsas generas un uno en la entrega del controlador?
Pues monitorea que ocurre con los estados de Digitalread (A1) en el monitor serial.

  Hola.

  Pulsador a Pullup me refiero a que está conectado a vdd con una resistencia de 4k7. Cuando pulso, el puerto debe ver un cero.


Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:Bucle de espera a soltar pulsador.
« Respuesta #3 en: 03 de Septiembre de 2021, 08:57:39 »
¿Has verificado si al presionar el pulsador, realmente se va 0 voltios, o sea una posible falla del pulsante?

¿Es posible que sea una entrada especial que debe ser configurada como entrada y por defecto es entrada analógica, o está configurada como salida, etc.?
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Bucle de espera a soltar pulsador.
« Respuesta #4 en: 03 de Septiembre de 2021, 11:38:16 »
¿Has verificado si al presionar el pulsador, realmente se va 0 voltios, o sea una posible falla del pulsante?

¿Es posible que sea una entrada especial que debe ser configurada como entrada y por defecto es entrada analógica, o está configurada como salida, etc.?

Gracias por las respuestas. 

  Lo he solucionado.

  La solución ha sido dejando de usar digitalWrite() y digitalRead() y pasar a leer y activar los puertos a bajo nivel.

Configurar los puertos:

Código: C
  1. DDRC = 0b000001;   // Puerto C0 como salida, y los demás como entrada.  (En los PIC es al revés, 1 =Entrada, 0= Salida).



    Para poner por ejemplo el puerto C0 a nivel alto, he hecho:

Código: C
  1. PORTC = (1<<PC0); // Pone el puerto C0 a nivel alto.


Para poner a nivel bajo el mismo puerto:
Código: C
  1. PORTC = (0<<PC0); // Pone el puerto C0 a nivel bajo.


  Y para leer el pulsador, que está conectado al puerto C1.

Código: C
  1. if ((PINC & (1<<PC1)) == 0) {    // Si se ha pulsado el pulsador ejecuta el código entre llaves
  2.  
  3.  }


Código: C
  1. while((PINC & (1<<PC1)) == 0);  // Queda en bucle infinito hasta que se suelte el pulsador.


   Lo que venia haciendo con los demás compiladores, CCS, XC, etc.  No usar librerías y menos si no se sabe como funcionan.

 

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Bucle de espera a soltar pulsador.
« Respuesta #5 en: 03 de Septiembre de 2021, 16:13:55 »
Estás usando una entrada analógica como entrada digital. Eso se puede hacer, pero hay que declarar primero la entrada como digital.

Código: C
  1. void setup() {
  2.   pinMode(A1, INPUT_PULLUP);
  3.   pinMode(13, OUTPUT);
  4. }
  5.  
  6. void loop() {
  7.   digitalWrite(13, LOW);
  8.   while(digitalRead(A1) == 0);
  9.  
  10.   digitalWrite(13, HIGH);
  11.   while(digitalRead(A1) == 1);
  12. }
« Última modificación: 03 de Septiembre de 2021, 16:18:21 por Picuino »

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Bucle de espera a soltar pulsador.
« Respuesta #6 en: 03 de Septiembre de 2021, 18:36:55 »
Estás usando una entrada analógica como entrada digital. Eso se puede hacer, pero hay que declarar primero la entrada como digital.

Código: C
  1. void setup() {
  2.   pinMode(A1, INPUT_PULLUP);
  3.   pinMode(13, OUTPUT);
  4. }
  5.  
  6. void loop() {
  7.   digitalWrite(13, LOW);
  8.   while(digitalRead(A1) == 0);
  9.  
  10.   digitalWrite(13, HIGH);
  11.   while(digitalRead(A1) == 1);
  12. }

 Gracias Picuino.

   Así es. El void setup lo tenia ya hecho así.  Pero tampoco iba.

  En verdad sí que iba, pero muy mal.  Había que insistirle al pulsador para que hiciese caso.  Como si fuese lento el barrido por el bucle while.

   Haciéndolo como he explicado evitando usar las funciones citadas me va al vuelo perfectamente.

  Gracias.

  El arruinó en mi caso es nano.

Desconectado humberto 02

  • PIC16
  • ***
  • Mensajes: 190
Re:Bucle de espera a soltar pulsador.
« Respuesta #7 en: 03 de Septiembre de 2021, 18:49:57 »
Hola gente linda. Emm perdón que me meta; pero si no comprendí mal el problema, recuerdo que alguna vez me ha pasado. Entoces lo resolví de este modo.

void setup(){
       ta, ta, ta, todo lo que sabemos...
       PinMode(A0,INPUT);
}

void loop() {
       int Estado=analogRead(A1);
       while (Estado==0){}
}

No podemos preguntar como en programación. debemos pasar el valor a una variable y preguntarle a la variable.
Ah; por ahí me pareció ver "digitalRead(A1)". No; si pregunto por el puerto analógico debe ser analogRead(A1);

Estas dos cosas recuerdo que en algún momento me complicaron la tarde hasta darme cuenta de las diferencias. Cordial Saludo.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Bucle de espera a soltar pulsador.
« Respuesta #8 en: 04 de Septiembre de 2021, 09:08:38 »
Hola gente linda. Emm perdón que me meta; pero si no comprendí mal el problema, recuerdo que alguna vez me ha pasado. Entoces lo resolví de este modo.

void setup(){
       ta, ta, ta, todo lo que sabemos...
       PinMode(A0,INPUT);
}

void loop() {
       int Estado=analogRead(A1);
       while (Estado==0){}
}

No podemos preguntar como en programación. debemos pasar el valor a una variable y preguntarle a la variable.
Ah; por ahí me pareció ver "digitalRead(A1)". No; si pregunto por el puerto analógico debe ser analogRead(A1);

Estas dos cosas recuerdo que en algún momento me complicaron la tarde hasta darme cuenta de las diferencias. Cordial Saludo.



Pero veo un problema ahí.

  Primero preguntas y metes en una variable el estado del pin. Luego te metes en un while que va a quedar infinito por que no va a volver a preguntar por el estado del pin.

  ¿Me equivoco?.

  Como el que debería quedar así:
 
Código: C
  1. void loop() {
  2.        int Estado=0;
  3.        while (Estado==0){
  4.          Estado=analogRead(A1);
  5.        }
  6. }

  Y aún así debería funcionar como lo planteé al principio. Pero claro, esto es arduino..  :D
« Última modificación: 04 de Septiembre de 2021, 09:11:27 por remi04 »

Desconectado humberto 02

  • PIC16
  • ***
  • Mensajes: 190
Re:Bucle de espera a soltar pulsador.
« Respuesta #9 en: 04 de Septiembre de 2021, 09:27:39 »
Ahí TA!... lo hiciste relindo... eso es. mi error fue que quise escribirte una ETIQUETA, pero la estaba complicando (aunque deberías escribir una ETIQUETA) para rebotarlo hasta que se cumpla la condición.

Ahora bien (por ahí) leí o escuche que el puerto analógico puede operar como puerto digital también... en algún momento lo intenté ver así y me di la cabeza contra la pared al escribirle "digitalRead(A0)" obligándome a preguntar por analogRead(A0).

Bueno espero que logres resolver y continuar con tu trabajo. Ah! si es Arduino. Y yo doy gracias a Dios haberme topado con él. Un cordial saludo.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Bucle de espera a soltar pulsador.
« Respuesta #10 en: 04 de Septiembre de 2021, 13:26:02 »

   Así es. El void setup lo tenia ya hecho así.  Pero tampoco iba.

Entonces debes tener algún otro error en el programa, porque la orden digitalRead(A1) no tiene por qué darte ningún problema.
Si puedes adjuntar el programa anterior, puedo ayudarte a debugearlo.


Esto es lo que hay dentro de la función digitalRead(). Es un poco lento, pero equivalente a la lectura directa de un puerto (wiring_digital.c):
Código: C
  1. int digitalRead(uint8_t pin)
  2. {
  3.         uint8_t timer = digitalPinToTimer(pin);
  4.         uint8_t bit = digitalPinToBitMask(pin);
  5.         uint8_t port = digitalPinToPort(pin);
  6.  
  7.         if (port == NOT_A_PIN) return LOW;
  8.  
  9.         // If the pin that support PWM output, we need to turn it off
  10.         // before getting a digital reading.
  11.         if (timer != NOT_ON_TIMER) turnOffPWM(timer);
  12.  
  13.         if (*portInputRegister(port) & bit) return HIGH;
  14.         return LOW;
  15. }

Saludos.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Bucle de espera a soltar pulsador.
« Respuesta #11 en: 04 de Septiembre de 2021, 15:24:35 »
Pongo el Sketch completo, este funciona perfectamente, pero le tuve que poner unos delay() entre los bucles de espera, por que si no, es como si no le diese tiempo a leer un puerto tras actuar sobre otro.

  Me explico,:

- Pongo a nivel bajo un puerto, e inmediatamente quiero leer otro y no lo lee bien.  Es como si necesitase un tiempo desde que actuas sobre un pin antes de leer otro.   

   

Código: C
  1. // Control iluminación temporizada.
  2.  
  3. /* Necesidad:
  4. // Un interruptor crepuscular ya existente en la instalación activará una serie de lamparas de jardín tras el ocaso, las cuales serán desconectadas al alba por el interruptor crepuscular.
  5.  
  6. - Pero se desea que varias de esas lámparas se apaguen tras cumplirse un tiempo definido en macro de 4 horas y 30 minutos, en adelante "Periodo 1".
  7.  
  8. - Habrá un pulsador accesible de tipo timbre que tendrá las siguientes funciones:
  9.       - Si se pulsa durante el periodo 1, se apagarán las luces conectadas al circuito, no afectando al tiempo de las 4 horas y 30 minutos. Las luces entonces permanecen apagadas indefinidamente.  (Función apagado voluntario).
  10.  
  11.       - Si se vuelve a pulsar se volverán a encender esas luces. No afectando al tiempo contado de las 4 horas y 30 minutos, que tras cumplirse, las luces se apagarán automáticamente.  (Función re-encendido tras apagado voluntario).
  12.  
  13. - Una vez que se han cumplido las 4 horas y media, las luces son apagadas automáticamente y el pulsador entonces pasa tener las siguientes funciones:
  14.  
  15.    - Si se pulsa, las luces se volverán a encender, pero esta vez, el periodo pasa a ser de 1 hora, definido en otra macro, en adelante "Periodo 2". volviéndose a apagar automáticamente tras cumplirse el tiempo. Una vez apagadas, si volvemos a pulsar, volveríamos a encender durante otra hora.
  16.  
  17.    - Si se vuelve a pulsar, después de un encendido voluntario, las luces se volverían a apagar.
  18.  
  19. Resumen: Como un temporizador de luces de escaleras pero tenemos dos periodos. Uno inicial de 4 horas y media tras el cual, todo se apagará si o si. Pero que durante el mismo podemos encender y apagar las veces que queramos a nuestro antojo.
  20.  
  21.   Y tras el apagado, pasa lo mismo. Que podemos encender y apagar a nuestro antojo, pero el encendido nunca será superior a una hora.
  22.  
  23.  
  24.  
  25.  
  26.   Funcionamiento del circuito:
  27.  
  28.    Se reciben 220V procedentes del crepuscular. Mediante una pequeña fuente de alimentación a 5V, el circuito es alimentado.
  29.    - Al quedar alimentado el circuito, lo primero que hará será activarse el relé que controla las lámparas que queremos controlar/temporizar.
  30.    - El relé quedará activado durante el periodo indicado en la macro "retardo_off_horas, y minutos"
  31.    - Transcurrido el tiempo, el relé se desconectará.
  32.  
  33.     - Un pulsador permitirá como se ha indicado arriba, volver a activar el relé voluntariamente. En este caso, el tiempo que permanece el relé es diferente y está definido en la macro "press_retardo_off_horas y minutos".
  34.  
  35.     - Como se ha indicado, durante el primer periodo, el pulsador permite encender y apagar a nuestro antojo sin que esos encendidos y apagados afecten al tiempo establecido.
  36.     - Tras cumplirse el primer periodo, el relé se desactiva y el pulsador permite volver a activarlo pero esta vez durante el segundo periodo.  
  37. */
  38.  
  39.  
  40.  
  41.  
  42.  
  43.  
  44.  
  45. // CONFIGURACION
  46. #define retardo_off_horas 4            // Tiempo en horas desde que se inicia la iluminación hasta que se apagará automáticamente.
  47. #define retardo_off_minutos 30          // Minutos para lo mismo.
  48.  
  49. #define press_retardo_off_horas 1            // Tiempo en horas desde que se inicia la iluminación por pulsación despues del apagado inicial hasta apagarla (Función de re-encendido voluntario).
  50. #define press_retardo_off_minutos 0          // Minutos para lo mismo.
  51.  
  52.  
  53.  
  54.  
  55. // PIN del ATMEGA USADOS: (Placa Arduino Nano)
  56.  
  57. //   PIN_A1 de la placa arduino ------ Como entrada, lectura pulsador en Pull up a vdd. --  PIN C1 en ATMEGA: Puerto C1
  58. //   PIN_A0 de la placa arduino--------  Como salida, excita el relé.   --- PIN C0 en ATMEGA: Puerto C0
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65. unsigned long _end = 0;                    // Cálculo de timeout deseado.
  66.  
  67.  
  68.  
  69. void setup() {
  70.   DDRC = 0b000001;   // Puerto C0 como salida, y C1 como entrada.
  71.  
  72. }
  73.  
  74.  
  75.  
  76.  
  77. void loop() {
  78.   _end = millis() + (retardo_off_horas * 3600000) + (retardo_off_minutos * 60000);   // Determinamos el tiempo en ms que debe permanecer el relé activado inicialmente.    
  79.   PORTC = (1<<PC0); // RELÉ ENCENDIDO El pin de PORTC tiene ahora un valor lógico 1.
  80.    
  81.  
  82.   while(millis() <= _end) {               // Mantendremos encendido y monitorizaremos el tiempo esperando a que se cumpla.
  83.  
  84.      if ((PINC & (1<<PC1)) == 0) {          // Si pulsamos durante el tiempo de encendido                                      
  85.         if ((PINC & (1<<PC0)) == 1) PORTC = (0<<PC0); // Apagamos relé si estaba encendido.
  86.         else  PORTC = (1<<PC0);                       // O encendemos relé si estaba apagado.                      
  87.         delay(1);
  88.         while((PINC & (1<<PC1)) == 0); // Esperando a soltar el pulsador.
  89.         delay(1);                  
  90.      }    
  91.   }
  92.  
  93.  
  94. // Una vez concluido el primer tiempo:
  95.  
  96.  
  97.   PORTC = (0<<PC0); // Apagamos relé.
  98.  
  99.  
  100.     while(1) {                // Monitoreamos el pulsador, por si alguien quiere realizar un re-encendido voluntario.
  101.       if ((PINC & (1<<PC1)) == 0) pulsa();     // Si se ha pulsado el pulsador vamos a la funcion pulsa(); desde la cual re-encenderemos y temporizaremos este re-encendido.
  102.     }
  103. }
  104.  
  105.  
  106.  
  107.  
  108.  
  109.  
  110.  
  111.  
  112. void pulsa() {         // Si se quiere realizar un re-encendido voluntario....
  113.  
  114.   PORTC = (1<<PC0);    // Activamos relé.  
  115.  
  116.   delay(1);
  117.   while((PINC & (1<<PC1)) == 0); // Esperando a que se suelte el pulsador.
  118.   delay(1);
  119.    
  120.   _end = millis() + (press_retardo_off_horas * 3600000) + (press_retardo_off_minutos * 60000);   // Determinamos el tiempo en ms que debe permanecer el relé activado tras el re-encendido voluntario.
  121.  
  122.  
  123.  while(millis() <= _end) {                   // funcion apagado voluntario tras un reencendido también voluntario.  
  124.     if ((PINC & (1<<PC1)) == 0)  break;              
  125.  }
  126.  
  127.  
  128.  PORTC = (0<<PC0);    // Bien sea por que se ha cumplido el tiempo, o por que se haya vuelto a pulsar el pulsador, apagamos el relé
  129.   delay(1);
  130.   while((PINC & (1<<PC1)) == 0);           // Esperando a soltar.
  131.   delay(1);
  132.  
  133.   // Y regresamos al bucle infinito de función principal loop(). Ello permitirá volver a encender y apagar tantas veces como se pulse el pulsador.
  134. }
« Última modificación: 04 de Septiembre de 2021, 15:41:10 por remi04 »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Bucle de espera a soltar pulsador.
« Respuesta #12 en: 05 de Septiembre de 2021, 14:27:45 »
Este tipo de programas es mejor diseñarlos con una máquina de estados.

Por ejemplo en este caso hay varios estados distintos para el día:
   1 - DIA
   2 - NOCHE_TEMPRANA (que dura 4h y media)
   3 - NOCHE_TARDIA      (tras la noche temprana y antes de que se haga de día)

Luego yo definiría otros dos estados distintos para las luces:
   1 - LUCES_APAGADAS
   2 - LUCES_ENCENDIDAS

No has definido bien qué es lo que pasa durante el día o si quieres que las luces se apaguen al hacerse de día aunque estuvieran encendidas de forma manual.

Yo lo programaría con estados así:
Código: C
  1. #define ESTADO_DIA             1
  2. #define ESTADO_NOCHE_TEMPRANA  2
  3. #define ESTADO_NOCHE_TARDIA    3
  4.  
  5. #define ESTADO_APAGADO         1
  6. #define ESTADO_ENCENDIDO       2
  7.  
  8. #define SENSOR_LUZ_DIA         0
  9. #define SENSOR_LUZ_NOCHE       1
  10.  
  11. #define PULSADOR_PULSADO       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.  
  16. const int PIN_LUCES = 13;
  17. const int PIN_SENSOR_LUZ = A1;
  18. const int PIN_PULSADOR = A2;
  19.  
  20. int estado_1, estado_2;
  21. long unsigned int temporizador_1, temporizador_2;
  22.  
  23.  
  24. void setup() {
  25.   pinMode(PIN_PULSADOR, INPUT_PULLUP);
  26.   pinMode(PIN_SENSOR_LUZ, INPUT_PULLUP);
  27.   pinMode(PIN_LUCES, OUTPUT);
  28.  
  29.   estado_1 = ESTADO_DIA;
  30.   estado_2 = ESTADO_APAGADO;
  31. }
  32.  
  33.  
  34. void loop() {
  35.  
  36.   //
  37.   // Evolucion de los estados
  38.   //
  39.  
  40.   if (estado_1 == ESTADO_DIA) {
  41.     if (digitalRead(PIN_SENSOR_LUZ) == SENSOR_LUZ_NOCHE) {
  42.       estado_1 = ESTADO_NOCHE_TEMPRANA;
  43.       estado_2 = ESTADO_ENCENDIDO;
  44.       temporizador_1 = millis() + TIEMPO_NOCHE_TEMPRANA;
  45.     }
  46.   }
  47.  
  48.  
  49.   if (estado_1 == ESTADO_NOCHE_TEMPRANA) {
  50.     if (temporizador_1 - millis() > 4000000000L) {
  51.       estado_1 = ESTADO_NOCHE_TARDIA;
  52.       estado_2 = ESTADO_APAGADO;
  53.     }
  54.   }
  55.  
  56.  
  57.   if (estado_1 == ESTADO_NOCHE_TARDIA) {
  58.     if (digitalRead(PIN_SENSOR_LUZ) == SENSOR_LUZ_DIA) {
  59.       estado_1 = ESTADO_DIA;
  60.       estado_2 = ESTADO_APAGADO;
  61.     }
  62.   }
  63.  
  64.  
  65.   if (estado_2 == ESTADO_APAGADO) {
  66.     if (flanco_pulsador()) {
  67.       estado_2 = ESTADO_ENCENDIDO;
  68.       temporizador_2 = millis() + TIEMPO_ENCENDIDO_MANUAL;
  69.     }
  70.   }
  71.  
  72.   if (estado_2 == ESTADO_ENCENDIDO) {
  73.     if (flanco_pulsador()) {
  74.       estado_2 = ESTADO_APAGADO;
  75.     }
  76.  
  77.     if ((estado_1 != ESTADO_NOCHE_TEMPRANA) && (temporizador_2 - millis() > 4000000000L)) {
  78.       estado_2 = ESTADO_APAGADO;
  79.     }
  80.   }
  81.  
  82.  
  83.   //
  84.   // Salidas digitales según los estados
  85.   //
  86.  
  87.   if (estado_2 == ESTADO_ENCENDIDO) {
  88.     digitalWrite(PIN_LUCES, 1);
  89.   }
  90.   if (estado_2 == ESTADO_APAGADO) {
  91.     digitalWrite(PIN_LUCES, 0);
  92.   }
  93.  
  94. }
  95.  
  96.  
  97. int flanco_pulsador(void) {
  98.   static int pulsador_anterior;
  99.   int pulsador_actual;
  100.  
  101.   pulsador_actual = digitalRead(PIN_PULSADOR);
  102.  
  103.   if ((pulsador_anterior != PULSADOR_PULSADO) && (pulsador_actual == PULSADOR_PULSADO)) {
  104.     pulsador_anterior = PULSADOR_PULSADO;
  105.     return 1;
  106.   }
  107.   pulsador_anterior = pulsador_actual;
  108.   return 0;
  109. }

Tiene la ventaja de que las reglas quedan más claras y que se puede ampliar todo lo que quieras para controlar muchas cosas más.
Saludos.
« Última modificación: 05 de Septiembre de 2021, 14:32:18 por Picuino »

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Bucle de espera a soltar pulsador.
« Respuesta #13 en: 05 de Septiembre de 2021, 14:40:17 »
Durante el dia el crepuscular corta la corriente y todo queda sin tensión. Incluido el arduino, todo.

  El circuito solo tiene vida de noche.   

 El crepuscular es un sistema ya presente e instalado y no puedo intervenir en el.

  Mi arduino con su fuente de alimentación, su circuiteria de control del relé y las conexiones con el pulsador externo está ensamblado en una caja de desarrollo para montaje en un armario con carril de normativa DIN.

  Ahí ya te digo, solo obtengo 220V de noche y los pierdo de día. Sin posibilidad de intervenir nada ahí. Mi circuito solo piede actuar de noche.
« Última modificación: 05 de Septiembre de 2021, 14:44:56 por remi04 »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Bucle de espera a soltar pulsador.
« Respuesta #14 en: 05 de Septiembre de 2021, 15:53:08 »
Entonces habría que hacer alguna modificación para quitar el estado de DIA y para iniciar directamente el estado de NOCHE_TEMPRANA. También habría que quitar el sensor de luz. Es sencillo.

Como puedes ver en mi programa, se pueden utilizar sin problemas comandos de Arduino y que todo funcione correctamente (el programa está probado).

Por otro lado te recomiendo que en este tipo de problemas utilices máquinas de estados. Va a ser mucho más fácil de modificar, más sencillo de explicar cómo funciona y más sencillo de depurar.

Un saludo.

PD: También habría que añadir un pequeño retardo al detector de flanco para evitar ruidos y otro retardo para evitar rebotes.
« Última modificación: 05 de Septiembre de 2021, 15:57:48 por Picuino »