Dev - C++ - bucle while y for (salir y entrar al mismo bucle)

 
Vista:
sin imagen de perfil

bucle while y for (salir y entrar al mismo bucle)

Publicado por anonymous (1 intervención) el 16/01/2021 04:02:43
"CODIGO EN PIC C"

ESPERO QUE PUEDAN AYUDARME, PUSE MUCHOS COMENTARIOS AL CODIGO PARA QUE SEPAN DE QUE HACE CADA COSA.

Que tal comunidad de SpartanGeek, necesito su ayuda con los bucles mencionados en el titulo.
Estoy haciendo un programa para tomar lectura de un sensor de temperatura y realice ciertas acciones. Al llegar a una temperatura mayor o igual a 36 °C aumentara la velocidad de un motor hasta llegar al máximo (1023) y cuando sea menor la temperatura, bajara la velocidad del motor de 1023 a 511 que es la velocidad media del motor.

Utilizo el bucle for para aumentar y disminuir la velocidad del motor.

La pregunta es ¿Cómo puedo hacer que el motor se quede girando al nivel máximo (temperatura>=36) y se quede a velocidad media (temperatura <36) y a la vez se pueda seguir ciclando infinitamente la lectura del sensor ?

¿Se puede salir y entrar a un ciclo cuantas veces quiera?

Les mostrare el código que tengo, en este código se sigue aumentando/disminuyendo la velocidad cada ves que se repite el bucle while.

Este es mi código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
void main()
{
   WHILE (true)
   {
      DHT11_read_data (&humedad,&temperatura);           //Toma lectura del sensor
      lcd_clear ();                                      //Limpia el LCD
      lcd_gotoxy (1, 1) ;                            // Posición de escritura LCD
      printf (lcd_putc, "Hum = %0.1f%%", humedad);        //Muestra la lectura de la humedad LCD
      lcd_gotoxy (1, 2) ;                         //Posición de escritura LCD
      printf (lcd_putc, "Tem = %0.1fC", temperatura);       //Muestra la lectura de la temperatura LCD
 
      printf ("Hum = %0.1f%%\r\n", humedad);              //Muestra la lectura de la humedad
      printf ("Tem = %0.1fC\r\n\r\n", temperatura);       //Muestra la lectura de la temperatura
      delay_ms (200);                                   //Toma la lectura del sensor cada 200 ms
 
      IF (temperatura >= 36)
      {
        // 511 -> velocidad media | 1023 -> velocidad maxima
         //Aumentar a la velocidad máxima el motor
         FOR (DutyCycle = 511; DutyCycle < 1023; DutyCycle++)
         {
            set_pwm1_duty (DutyCycle);                     //Manda la velocidad actual al motor
            delay_us (300);                             // incremento rápido de velocidad
         }
 
         IF (DutyCycle == 1023)                             // sí llego a la velocidad máxima
         {
            set_pwm1_duty (1023);                         // se mantendrá a esa velocidad el motor
         }
      }
     else                        // Mismo código que el de arriba, solo que para que disminuya la velocidad
      {
         //Regresa el motor a velocidad media
         for (DutyCycle = 1023; DutyCycle > 511; DutyCycle--)
         {
            set_pwm1_duty (DutyCycle) ;
            delay_us (300);
         }
 
         if (DutyCycle == 511)                   // sí llego a la velocidad máxima
         {
            set_pwm1_duty (511);                // se mantendrá a esa velocidad el motor
         }
      }
   }
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

bucle while y for (salir y entrar al mismo bucle)

Publicado por Rodrigo (539 intervenciones) el 16/01/2021 05:19:09
Podrias aprovechar el hecho que tienes un ciclo infinito y eliminar completamente los for que tienes dentro del while y solo tomar las mediciones y recordar que valor tiene DutyCycle para saber que hacer a continuacion.

Si la temperatura es mayor que 36 aumentas en 1 a DutyCycle (a menos que ya haya llegado al valor maximo), sino la disminuyes (si es que no ha llegado al valor menor) y luego llamas a set_pwm1_duty

Algo asi como:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DutyCycle = 511
while(true) {
  medir temperatura y humedad ..
  mostrar ..
 
  if(temperatura >= 36) {
     if(DutyCycle < 1023) {
        DutyCycle++;
     }
  } else if( DutyCycle > 512 ) {
       DutyCycle--;
  }
 
  set_pwm1_duty( DutyCycle );
  delay(...)
}

Parece que hay que considerar otros delays, aunque no se para que los tienes ahi?

Deberias considerar alguna condicion para salir de ese ciclo tambien, pero supongo que eso lo resolveras despues de recuperarte de la alegria de haber resuelto esto :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar