Advertisement
Macrovision

CONTROL AUTOMATICO PARA LUCES HYDROPONICO

Jun 27th, 2022 (edited)
1,079
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.44 KB | Software | 0 0
  1. //|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||//
  2. //            CONTROL AUTOMATICO  LUCES PARA HYDROPONICO         //                                                                              
  3. //                         Version 2.0.3                         //                                                              
  4. //                     CopyRight "EL GUAJIRIGALLO"               //
  5. //       CURRENT UPDATE WILL ALLOW CONTROLLER RECOVER AFTER      //
  6. //       BEEN THREE TIMES TRIGGERED DUE THE TEMPERATURE ISSUE    //    
  7. //       IF TEMPERATURE SENSOR IS TRIGGERED  THREE TIMES AND     //
  8. //       PROCESS STILL UNSTEADY CONTROLLER WILL BE  SHUT-DOWN    //
  9. //|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||//
  10.  
  11. #include <16f628A.h>
  12. #fuses NOWDT
  13. #fuses MCLR
  14. #fuses NOBROWNOUT
  15. #fuses NOLVP
  16. #USE DELAY(INTERNAL=4000000)
  17. #USE FAST_IO (A)
  18. #USE FAST_IO (B)
  19. //-"direccionamiento de ports-//
  20. #byte port_A = 0x05  
  21. #byte port_B = 0x06
  22. #byte PCON = 0x8e
  23. #define data_pin PIN_B5
  24. //#define clock_pin PIN_B6
  25. //#define latch_pin PIN_B7
  26. #define latch_pin PIN_B6
  27. #define clock_PIN PIN_B7
  28.  
  29. int contador=0;
  30.  
  31. # int_ext
  32.  void ext_isr()
  33. {
  34.       clear_interrupt(int_ext);
  35.       if( contador ==3 ){
  36.       output_low(pin_b1);
  37.       output_low(pin_b3);
  38.       output_low(pin_b4);
  39.       output_low(pin_a1);
  40.       output_low(pin_a6);
  41.       output_low(pin_b2);//shut douwn the whole prossesor
  42.   do{
  43.            for(int i=0;i<=1;i++){
  44.            for(int j=0;j<=3;J++){
  45.            output_toggle(PIN_A7);
  46.            delay_ms(75);
  47.            //output_low(pin_b2);//FAN ROOM A
  48.            //output_low(pin_a6);//FAN ROOM B
  49.          
  50.            
  51.            }
  52.            delay_ms(150);
  53.            }
  54.   }while(1);      //si cae aqui ya no sale mas.
  55.  }
  56.      
  57.      contador++;
  58. switch (read_eeprom(0x1A)){
  59.    case 0XFF:  
  60.       do{
  61.           output_low(pin_b4);
  62.           output_low(pin_a1);
  63.           output_low(pin_a6);
  64.           output_low(pin_b1);
  65.           output_low(pin_b2);
  66.           output_low(pin_b3);        
  67.         }while(!input(PIN_b0));
  68.         for(int j=0;j<=60;j++){
  69.            Delay_ms(1000);
  70.          }
  71.            output_High(pin_b1);
  72.            for(int j=0;j<=60;j++){
  73.            Delay_ms(1000);
  74.          }
  75.            output_high(pin_b2);
  76.            for(int j=0;j<=60;j++){
  77.            Delay_ms(1000);
  78.          }
  79.           output_high(pin_b3);
  80.   break;
  81.   case 0X00:
  82.          
  83.       do{
  84.           output_low(pin_b4);
  85.           output_low(pin_a1);
  86.           output_low(pin_a6);
  87.           output_low(pin_b1);
  88.           output_low(pin_b2);
  89.           output_low(pin_b3);
  90.         }while(!input(PIN_b0));
  91.         for(int j=0;j<=60;j++){
  92.            Delay_ms(1000);
  93.          }
  94.           output_high(pin_b4);
  95.           for(int j=0;j<=60;j++){
  96.           Delay_ms(1000);
  97.         }
  98.           output_high(pin_a6);
  99.           for(int j=0;j<=60;j++){
  100.           Delay_ms(1000);
  101.         }
  102.          output_high(pin_a1);
  103.     break;
  104.   }
  105. }
  106.  
  107.  
  108.  
  109.  
  110.       /*-"Declaracion de funciones"-*/
  111.  
  112.        unsigned int seg(int num);
  113.        void write_data(unsigned int number);
  114.        void start(void);    
  115.        void Led_display1(void);  // funsion para escribir una H half Zona
  116.        void Led_display2(void); // funsion para escribr una F full Zona        
  117.        void RetarDo(void); // funsion para el retardo de apagado (30 seg)  .
  118.        void Retardo_M3(); //funsion para el
  119.        void lumina_zona_a(void);   //funsion que enciende la zona A
  120.        void apaga_zona_a(void);   //funsion que apaga la zona A
  121.        void lumina_zona_b(void); //funsion que enciende la zona B
  122.        void apaga_zona_b(void); //funsion que apaga la zona B
  123.        void Waiting(void);   //funsion para cuando se prenda la caja con la sonda de temperatura caliente
  124.        
  125.  /*-"Declaracion de VARIABLES Globales"-*/
  126.  
  127.       int const digitos[]={0x6f,0x7f,0x07,0x7d,0x6d,0x66,0x4f,0x5b,0x06,0x3f}; //digitos a mostrar en el Display 7 segmentos
  128.       short s;                          
  129.       unsigned int j, digit;
  130.       unsigned int  z = 1;
  131.       int number=0X00;
  132.        
  133.     VOID MAIN()  
  134. {
  135.         enable_interrupts(INT_EXT);
  136.         ext_int_edge(H_TO_L);        
  137.         enable_interrupts(GLOBAL);
  138.              
  139.         SET_TRIS_A(0x3d);  
  140.         SET_TRIS_b(0x01);
  141.         output_low(pin_A1); //apago todos los pines de salida
  142.         output_low(pin_A6);                      
  143.         output_low(pin_A7);
  144.         output_b(0);
  145.            
  146.        //-"Rutina de comprovacion para Hard Reset o power off"-//
  147.          
  148.          if(!bit_test(PCON,1)){
  149.            BIT_SET(PCON,1);
  150.            RetarDo();
  151.            goto ROOM_A;
  152.          }else if(bit_test(PCON,1)){                      
  153.            
  154.    ////\\\///\\\////\\\\--"SELECT--"///\\\///\\\///\\\///\\\
  155.  
  156.  while(true)
  157.  {
  158.     WHILE(1)
  159.     {
  160.             if(input(PIN_A4))
  161.                s = 1;                             // LAS TRES PRIMERAS INSTRUCTIONES DE ESTE WHLE LO QUE HACE ES VERIFICAR QUE LA TECLA NO ESTE PRECIONADA
  162.                                                     // si S==1 se procede con lo demas si S=0  se salta todo para comenzar de nuevo
  163.                if(s ==1) {                               //
  164.                if(input(PIN_A4) == 0){                   //AQUI PRIMERO BORRO FLAG(S=0);INCRMENTO (I) Y ESCRIBO SU VALOR EN ADDREES 0X07
  165.                s = 0;                
  166.                z++;            
  167.                //write_eeprom(0x07,z);                      //
  168.                 if(z >= 5)                           //SI A2 NO ESTA PRCIONADA COMPRUEVO QUE I NO ES MAYOR QUE NUEVE , SI LO ES LE DOY VALOR DE 1
  169.                z = 1;              
  170.                write_eeprom(0x07,z);
  171.               }
  172.              // write_eeprom(0x07,z);
  173.             }
  174.            if(input(PIN_A3) == 0) {GOTO SELECT;}
  175.            digit = seg(read_eeprom(0x07));          //Paso el valor a la fucion seg() y guardo el resultado en la variable digit      
  176.            write_data(digit);// escribo el caracter
  177.            delay_ms(1);
  178.         }
  179.    
  180. ////////////////////////////////////////////////////////////
  181.     SELECT:          
  182.                Led_display1();             //escribe una H means Half              
  183.                            
  184.                
  185.              
  186.                
  187.              
  188.                delay_ms(500);
  189.    do{
  190.                if(!input(pin_a2)){          //Pin !a2=Start/SW
  191.                start();
  192.                 //delay_ms(50);
  193.                   goto ROOM_A;
  194.               }
  195.                
  196.      }while(input(pin_a3));
  197.                Led_display2();            //escribe una F means Full            
  198.                WRITE_EEPROM(0x03,0xff);
  199.                WRITE_EEPROM(0x06,0xff);   // Flag para leer al principio del programa para saber a que parte ir despues de un blackout
  200.               // write_eeprom(0x00,0xff);    // Flag paara arrancar con las todas las  salidas activadas despues de un Reset
  201.                
  202.                delay_ms(500);
  203.   do{
  204.           if(!input(pin_a2)){              //Pin !a2=Start /SW  
  205.            start();
  206.              //delay_ms(50);
  207.             goto ROOM_A;
  208.          }
  209.                
  210.      }while(input(pin_a3));
  211.       }
  212.        } //End of Select
  213.    
  214.            
  215.  ROOM_A:
  216.        
  217.    if(!input(pin_b0)){Waiting();}  
  218.    
  219.    
  220.      
  221.    
  222.          if(!input(pin_a0)){
  223.             WRITE_EEPROM(0x1A,0xff);
  224.          lumina_zona_a();
  225.  while(true){
  226.   do{
  227.          
  228.           if(input(pin_a0)){
  229.              WRITE_EEPROM(0x1A,0x00);
  230.              apaga_zona_a();
  231.              goto ROOM_B;
  232.          }
  233.              delay_ms(250);
  234.    }while(input(pin_a2));    
  235.        output_toggle(PIN_A6);      
  236. }
  237.     }else
  238.           ROOM_B:
  239.           if(input(pin_a0)){
  240.             WRITE_EEPROM(0x1A,0x00);
  241.             lumina_zona_b();                                
  242.          }
  243.    while(1){          
  244.            
  245.    do{                  
  246.            if(!input(pin_a0)){
  247.            WRITE_EEPROM(0x1A,0xff);
  248.            apaga_zona_b();
  249.            goto ROOM_A;
  250.         }
  251.            delay_ms(250);  
  252.    }while(input(pin_a2));
  253.      output_toggle(PIN_b2);
  254.            
  255.    }  
  256.          
  257. } //End MAin
  258.  
  259.     /*********Funciones*********/
  260.  
  261.       unsigned int seg(int num) {    //DIGITOS PARA  MOSTRAR
  262.       switch (num) {
  263.       case 1 : return 0x06;
  264.       case 2 : return 0x5b;
  265.       case 3 : return 0x4f;
  266.       case 4 : return 0x66;
  267.       case 5 : return 0x6d;
  268.       case 6 : return 0x7d;
  269.       case 7 : return 0x07;
  270.       case 8 : return 0x7f;
  271.       case 9 : return 0x6f;
  272.     //case 0 : return 0x3f;
  273.     }
  274.    
  275. }
  276.  
  277.    //FUNCION PARA ESCRBOR LOS  DIGITOS EN EL DISPLAY
  278.        void write_data(unsigned int number){      
  279.        for(j = 0x80; j > 0; j = j >> 1) {
  280.        if(number & j)                             //and ligico entre j y number para detectar bit a bit 0 o 1 de number
  281.        output_high(data_pin);      
  282.        else
  283.        output_low(data_pin);
  284.        output_high(clock_pin);
  285.        output_low(clock_pin);
  286.     }
  287.        output_high(latch_pin);
  288.        output_low(latch_pin);
  289.  } //End
  290.  
  291.  void start()
  292.    
  293.  {
  294.  
  295.     int const AniMation[]={0x20,0x01,0x02,0x04,0x08,0x10,0x20};
  296.     //int *p=0;
  297.     //int w=0;
  298.     int n=0;
  299.     //int k=0;
  300.     //w= AniMation[k];
  301.     //p=&w;
  302.     for(int x=1;x<=5;x++)
  303.     {
  304.     for(int j=0;j<=6;j++)
  305.     {
  306.     //k= (w+n);
  307.     write_data(AniMation[n]);
  308.     n++;
  309.     Delay_ms(50);
  310.     if(n>=7){n=0;}
  311.     }
  312.     //delay_ms(5);
  313.     }
  314.  }
  315.  
  316.  //Funsion que se encarga de mostrar que el sensor de temperatura esta mas alla del set point
  317.    void Waiting(){
  318.        output_low(pin_b1);
  319.        output_low(pin_b2);
  320.        output_low(pin_b3);
  321.        output_low(pin_b4);
  322.        output_low(pin_A1);
  323.        output_low(pin_A7);
  324.            
  325.    do{
  326.        //output_bit(pin_A6,1);
  327.        output_low(pin_A7);
  328.        delay_ms(750);
  329.        //output_low(pin_A6);
  330.        output_high(pin_A7);
  331.        delay_ms(750);
  332.     }while(!input(pin_b0));
  333. } //End
  334.  
  335.  
  336. void Led_display1(){
  337.  
  338. for(int i=0;i<=1;i++){
  339.  output_toggle(PIN_A7);
  340.  delay_ms(250);
  341.  
  342. }
  343. write_data(0x76);
  344. }
  345.  
  346. void Led_display2(){
  347. for(int i=0;i<=1;i++){
  348.  output_toggle(PIN_A7);
  349.  delay_ms(250);
  350.   }
  351.    write_data(0x71);
  352.   }
  353.  
  354.  
  355.  
  356.  void  RetarDo(){
  357.  
  358.     for(int i=0;i<=9;i++){      
  359.     write_data(digitos[i]);
  360.     delay_ms(3000);
  361.    
  362.     }
  363.  }
  364.    
  365.  
  366.  
  367.  // Funcion que define el tiempo de Retardo entre las salidas-1,2,3,4,5,6
  368.  
  369.     void Retardo_M3(){
  370.     int n=0;
  371.     for(int x=1;x<=(read_eeprom(0x07));x++){
  372.     for(int j=0;j<=60;j++){
  373.     write_data(digitos[n]);
  374.     n++;
  375.     Delay_ms(1000);
  376.     if(n>=10){n=0;}
  377.    }
  378.  }
  379.    
  380. }
  381.  
  382.  
  383.   void lumina_zona_a()
  384.  {
  385.                        
  386.      output_bit(pin_b1,1);
  387.      //Delay_ms(1000);
  388.      Retardo_M3();    
  389.      output_bit(pin_b2,1);
  390.      //Delay_ms(1000);
  391.      Retardo_M3();
  392.      output_bit(pin_b3,1);
  393.      write_data(seg(read_eeprom(0x07)));
  394.  }
  395.  
  396.   void lumina_zona_b()
  397.  {
  398.    
  399.  
  400.        output_bit(pin_b4,1);  
  401.        Retardo_M3();
  402.     //Delay_ms(1000);
  403.       output_bit(pin_a6,1);
  404.       Retardo_M3();
  405.      //Delay_ms(1000);
  406.       output_bit(pin_a1,1);
  407.      write_data(seg(read_eeprom(0x07)));
  408.  }
  409.  
  410.   void apaga_zona_a()
  411.  {
  412.     output_bit(pin_b1,0);    
  413.     RetarDo();
  414.     output_bit(pin_b2,0);
  415.     RetarDo();
  416.     output_bit(pin_b3,0);
  417.  }
  418.   void apaga_zona_b()
  419.  {
  420.     output_bit(pin_b4,0);    
  421.     RetarDo();
  422.     output_bit(pin_a6,0);
  423.     RetarDo();
  424.     output_bit(pin_a1,0);
  425.  }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement