[ Foro de C ]
"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:
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
}
}
}
}
hola ari jair
decirte que las mayúsculas en un foro significa
gritar y no me parece de buen gusto
también que hacer copia y pega ayuda pero hay
que fijarse y no colarse como es el caso y pedir
ayuda en este foro y agradeces la ayuda a otra
comunidad :-(
bueno al código:
ten en cuenta que solo he programado alguna vez arduino
pero creo que tu problema es más con delay() y los for
decirte que no has dejado todo el código ya que
faltan las librerías definición de variables como
DutyCycle etc
- 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 ?
- quiero entender que quieres controlar el motor y
que el programa siga comprobando la temperatura
y no se quede atascado en bucles y esperas
el problema que le veo al menos en arduino, que ya
se que no es un pic tal cual, pero en la programación
de arduino delay es una función que deja el programa
parado hasta que pasa el tiempo fijado, y es un
problema porque como dices no se hace nada más
una solución es capturar el tiempo del sistema y
comprobar en cada ciclo del while si se ha superado
el tiempo que pretendo que espere
si buscas por la red encontrás varias soluciones yo
te paso una al delay y a los for que creo no hacen falta
código:
https://www.online-ide.com/S6LencO1Dp
suerte ;-)
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)