Autor Tema: Programa activación bomba de agua  (Leído 2703 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Dave

  • PIC10
  • *
  • Mensajes: 4
Programa activación bomba de agua
« en: 11 de Octubre de 2015, 20:41:33 »
Hola buenas tardes,
 Bueno  pues quiero  hacer un programa  en el cual  se active  una bomba  de agua  durante  5 minutos  cada hora,    pero soy extremadamente  nuevo  en este tema de microcontroladores y programación,  como que instrucciones necesito  para poder realizar lo esperespuestas,  de antemano gracias.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Programa activación bomba de agua
« Respuesta #1 en: 11 de Octubre de 2015, 21:23:32 »
Lo mas simple:

Deberias ver lo que es un timer, como configurarlo,etc. Estan todos los registros en el datasheet.
CCP seria util tambien. Si es que lo posee tu PIC, ya que no dijiste que PIC tenes

usar un PIC con un cristal externo de 32768Hz si lo que te interesa es un poco mas de precisión.
Y finalmente tu programa incluso en ASM seria muy chiquito. Asi que por instrucciones va a depender de que lenguaje lo hagas, si en C ( aca depende el compilador ), basic, etc.

Aunque esta en el foro de C, no se que compilador tengas. Y luego en C seria muy facil tambien.

Burdamente (para que se entienda), con 2 botones, etc, quedaria algo asi:

Código: C++
  1. int contador;
  2. bool Bomba_encendida;
  3.  
  4.  
  5. void main(){
  6.  
  7.         //Aca configuracion
  8.  
  9.         while(1){
  10.                 if(timer_flag_activo && Bomba_encendida && Timer_Activado)
  11.                 {
  12.                         desactivo_flag();
  13.                         cargo_timer();
  14.                         contador++;
  15.                         if ( contador == 500 ) // Pasaron 55min?
  16.                         {
  17.                                 Enciendo_bomba();
  18.                                 Contador=0;
  19.                                 Bomba_encendida=1;
  20.                         }
  21.                 }
  22.                 if(timer_flag_activo && !Bomba_encendida && Timer_Activado)
  23.                 {
  24.                         desactivo_flag();
  25.                         cargo_timer();
  26.                         contador++;
  27.                         if ( contador == 10 )   //5 minutos?
  28.                         {
  29.                                 Enciendo_bomba();
  30.                                 Contador=0;
  31.                                 Bomba_encendida=0;
  32.                         }
  33.                 if(Boton_1)             // Apago el temporizador
  34.                 {
  35.                         while(Boton_1);
  36.                         Timer_Activado=0;
  37.                 }
  38.                 if(Boton_2)             // Enciendo el temporizador
  39.                 {
  40.                         while(Boton_1);
  41.                         Timer_Activado=1;
  42.                 }
  43.  
  44.         }
  45.  
  46. }

Se podria achicar muchisimo mas. solo que me parece que seria mas complicado de entender. Pero bueno, de ahi en adelante depende de vos y de que compilador uses.

Desconectado Dave

  • PIC10
  • *
  • Mensajes: 4
Re:Programa activación bomba de agua
« Respuesta #2 en: 01 de Diciembre de 2015, 13:20:31 »
hola KillerJC

Hice este programa Pero, so se como activar por un tiempo en minutos,
tengo 4 switch  el primero es fresa, lechuga, tomate y manual.
entonces quiero que se active la fresa= Tiempo Riego 5 minutos y tiempo Descanso 45 minutos asi durante todo un ciclo, por que asi cuando se quede enclavado el switch. y asi con los demás con lechuga y tomate.
adjunto el programa hecho en Pic C Complier Utilizo el PIC18f4550.
espero sus respuestas.
gracias.

#include <HIDROPONIATIMER.h>
#include <lcd.c>

#define LCD_ENABLE_PIN  PIN_D0
#define LCD_RS_PIN      PIN_D1
#define LCD_RW_PIN      PIN_D2
#define LCD_DATA4       PIN_D4
#define LCD_DATA5       PIN_D5
#define LCD_DATA6       PIN_D6
#define LCD_DATA7       PIN_D7


#use standard_io(A)
#use standard_io(B)
#use standard_io(C)
#use standard_io(D)

void main(){
           
            port_B_pullups(TRUE);
           
            long TAF,TBF,TAL,TBL,TAT,TBT,TMR,TMD,Min;      //variable largas (long) tiempo de minutos.
               
           
            lcd_init();                                //inicializador de lcd.
            lcd_gotoxy(1,1);                           //cordenadas donde aparecera el mensaje.
            printf(lcd_putc,"     SISTEMA    ");          //impresion en la pantalla LCD (aparece msj)
            lcd_gotoxy(1,2);                               //cordenadas donde aparecera el mensaje.
            printf(lcd_putc,"   HIDROPONICO   ");
            delay_ms(2000);
           
            Min=60000;        // Vaiable qe minutos
            TMR=5;            //Tiempo Manual  ON
            TMD=5;            //Tiempo Manual  OFF         //variables designandole tiempo
            TAF=1;            //Tiempo Fresa   ON
            TBF=2;           //Tiempo Fresa   OFF
            TAL=2;           //Tiempo Lechuga ON
            TBL=4;           //Tiempo Lechuga OFF
            TAT=3;            //Tiempo Tomate  ON
            TBT=5;           //Tiempo Tomate  OFF

     
 while(TRUE){
               
                  lcd_gotoxy(1,1);                     // Posicionar UN mesaje por coordenadas  //***
                  Printf(lcd_putc,"   Bienvenido   ");   // Imprime mensaje                     //***
                  lcd_gotoxy(1,2);                                                              //***estas igual
                  printf(lcd_putc, "      MENU      ");                                          //***
                  delay_ms(200);     
                 
          while((input(PIN_B0)==0)&&(input(PIN_B1)==1)&&(input(PIN_B2)==1)){                  //Modo fresa

                                 lcd_gotoxy(1,1);
                                 printf(lcd_putc,"     Fresa     ");
                                 lcd_gotoxy(1,2);
                                 printf(lcd_putc,"   Riego=%lu Min      ",TAF);
                                 delay_ms(10);
                                 output_high(PIN_C0);
                                 delay_ms(TAF*Min);                                        //valor de la variable
                                 output_low(PIN_C0);
                                 delay_ms(TBF*Min);
          }

         While((input(PIN_B0)==1)&&(input(PIN_B1)==0)&&(input(PIN_B2)==1)){                  //Modo Lechuga
                 
                                 lcd_gotoxy(1,1);
                                 printf(lcd_putc,"     Lechuga    ");
                                 lcd_gotoxy(1,2);
                                 printf(lcd_putc,"   Riego=%lu Min    ",TAL);
                                 output_high(PIN_C0);
                                 delay_ms(TAL*Min);
                                 output_low(PIN_C0);
                                 delay_ms(TBL*Min);

         }
         While((input(PIN_B0)==1)&&(input(PIN_B1)==1)&&(input(PIN_B2)==0)){                     //Modo Tomate

                                 lcd_gotoxy(1,1);
                                 printf(lcd_putc,"     Tomate    ");
                                 lcd_gotoxy(1,2);
                                 printf(lcd_putc,"   Riego=%lu Min    ",TAT);   // %lu    muestra el valor de la variable dada.
                                 output_high(PIN_C0);
                                 delay_ms(TAT*Min);
                                 output_low(PIN_C0);
                                 delay_ms(TBT*Min);
         }
         while((input(PIN_B0)==1)&&(input(PIN_B1)==1)&&(input(PIN_B2)==1)&&(input(PIN_B3)==0)){        //Modo Manual
                             
                                 
                                 lcd_gotoxy(1,1);
                                 printf(lcd_putc,"Riego=%lu Min ",TMR);
                                 lcd_gotoxy(1,2);
                                 printf(lcd_putc,"Descanso=%lu Min ",TMD);
                                 
         
               while(input(PIN_B4)==0){                                           // lineas para los botones Incrementar  Riego
               
                                    TMR=TMR+5;
                                    lcd_gotoxy(1,1);
                                    printf(lcd_putc,"Riego=%lu Min  ",TMR);
                                     delay_ms(200);
         }
         while(input(PIN_B5)==0){                                                // lineas para los botones decrementar  Riego
         
                                    TMR=TMR-5;
                                    lcd_gotoxy(1,1);
                                    printf(lcd_putc,"Riego=%lu Min  ",TMR);
                                    delay_ms(200);
         
         }
         while(input(PIN_B6)==0){                                                // lineas para los botones Incrementar  descanso
         
                                    TMD=TMD+5;
                                    lcd_gotoxy(1,2);
                                    printf(lcd_putc,"Descanso=%lu Min ",TMD);
                                    delay_ms(200);
         }
         while(input(PIN_B7)==0){                                                // lineas para los botones decremetar  descanso
         
                                    TMD=TMD-5;
                                    lcd_gotoxy(1,2);
                                    printf(lcd_putc,"Descanso=%lu Min ",TMD);
                                    delay_ms(200);
         }
         
         while((input(PIN_B0)==1)&&(input(PIN_B1)==1)&&(input(PIN_B2)==1)&&(input(PIN_B3)==1)){                     
                                    output_high(PIN_C0);
                                    delay_ms(TMR*Min);
                                    output_low(PIN_C0);
                                    delay_ms(TMD*Min);
         }
     
   }
}
}

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Programa activación bomba de agua
« Respuesta #3 en: 01 de Diciembre de 2015, 20:22:21 »
Tenes que crear una base de tiempo. Con algun timer, Si te interesa un tiempo EXACTO de 5 y 45 min, entonces deberias recurrir a cirstales de 32768Hz y conectarlos al Timer1.
Antes no recurri a un timer por que el programa era muy "simple", ahora que va creciendo debo hacerlo.

Sino podrias usar el mismo oscilador para tratar de tener una interrupcion decente.
Supongamos lo siguiente.
Tenes puesto un cristal de 8Mhz, El timer1 lo cargas con 3036, y configuras con preescaler 1:8
Eso te produce una interrupcion cada 0.25s, cada 4 interrupciones pasan 1s,
En 240 interrupciones 1 minuto. Asi que contas 240 y sabes que paso un minuto.. Luego es comprobar.

Supongamos que comenzamos todos en ON.

Código: C
  1. int8 fresa= 5;
  2. int8 lechuga = 7; // 7 min ON
  3. int8 tomate = 12;
  4. int1 fresa_on = 1;     // bits - flags que permiten saber si los minutos a contar son mientras esta conectado o no la salida
  5. int1 lechuga_on = 1;
  6. int1 tomate_on = 1;
  7.  
  8. int_TMR1(){
  9.    set_timer1(3036); //Recargo el timer
  10.   contador++;
  11.   if (contador == 240 ) { PasoMinuto(); contador=0; }
  12. }
  13.  
  14. PasoMinuto(){
  15.   if ( --fresa == 0 ) {  // Descuento 1 minuto, si llego a 0 se cumplieron todos los minutos
  16.        if(tomate_on) {  // Estaba encendido? entonces debo apagarlo y cargar el tiempo de apagado
  17.              output_low(SALIDA_TOMATE);  //Como estaba activo lo apago
  18.              fresa = MINUTOS_APAGADOS;  // en este caso 45min
  19.        } else {  // Estaba apagado? Enciendo la salida y cargo el tiempo de encendido
  20.              output_high(SALIDA_TOMATE);
  21.              fresa = MINUTOS_ENCENDIDO;  // en este caso 5min
  22.        }
  23.        tomate_on^=1; // Cambio el 0 por un 1, o un 1 por un 0.
  24.   }
  25.  
  26.   // Aca lo mismo pero para los demas verduras/frutas,etc
  27.  
  28. }

Esto estaria SIEMPRE funcionando para todos si deseas agregar una "habilitacion" a cada cultivo simplemente cambias:

Código: C
  1. if ( --fresa == 0 ) {

por

Código: C
  1. if ( fresa_habilitado && --fresa == 0 ) {

Correctamente en ese orden, primero la habilitacion. de esa forma si esta en 1, decrementa. Si esta en 0 no decrementa y se saltea todo. Con un int1 xxx_habilitado

Si necesitas mas precision deberias usa el modulo CCP, lo cual te ayudaria a quitar lo del set_timer1(), ya que se recargaria solo.
Ya a partir de aca queda totalmente en tus manos.
Solo decirte que no pongas nada en la interrupcion que maneje el LCD o un while o lo que sea. Tiene que ser rapido y listo.
« Última modificación: 01 de Diciembre de 2015, 21:03:51 por KILLERJC »

Desconectado Dave

  • PIC10
  • *
  • Mensajes: 4
Re:Programa activación bomba de agua
« Respuesta #4 en: 04 de Diciembre de 2015, 20:38:17 »
estoy utilizando un cristal de 20 MHz. ah y el código que escribiste en que parte va del programa .
el programa que te adjunte se espera que haga lo siguiente, perdón por no saberme explicar.
Utilizo
-- Cristal  20 MHz
-- PIC18F4550
-- Pic C Compiler

Es un sistema Hidropónico tiene 4 Modos  que es:
Fresa
Lechuga
Tomate
Manual
 
consta de 4 switch
cada switch es un modo, entonces cuando se presiona el switch de fresa este se debe activar la bomba por 5 minutos y estar desactivado 45 minutos.
y asi con los demás switch se presiona Lechuga este activa la bomba por 7 minutos y estar desactivado 35 minutos 
cuando se presiona tomate  este activa la bomba por 5 minutos y estar desactivado 30 minutos 
 y en modo munual lo mismo.
no se si me explico.

te adjunto el Diagrama esquematico


Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Programa activación bomba de agua
« Respuesta #5 en: 05 de Diciembre de 2015, 00:05:25 »
Citar
estoy utilizando un cristal de 20 MHz. ah y el código que escribiste en que parte va del programa .

El codigo que escribi es casi todo el programa. Pero asumi que tenias 4 salidas, una para cada hortalizas/frutas. Pero veo que es todo el codigo.

Lo que te di yo es una idea de como podes realizarlo. No es algo que vas a copiar y pegar y va a funcionar. Vos estas usando delays. Los delays SON MALOS, especialmente en gran cantidad de tiempo. cuando son muy pequeños tales que ocupen 20/30 ciclos maximo del micro hay menos problema.

Debido al LCD + delay para este, si o si vas a tener que usar interrupciones. Darte mas del programa seria hacerlo yo.

Desconectado stk500

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4919
Re:Programa activación bomba de agua
« Respuesta #6 en: 05 de Diciembre de 2015, 03:44:35 »
ante de ponerte hacer un projecto sin saber lenguaje de programacion , te aconsejaria que estudie y haga practica con el uso del Timer, en las REDES hay un monton de codigos ejemplo como usarlo, yo empezarias encendiendo un Led controlado con un Timer o un Reloj.
el amigo Killer ya te puso una base para que tenga un ideas, cosas que yo no haria para nadie sin saber algun lenguaje de programacion para PIC, porque no espere que otro te haga el programa.  ;-)



 

anything