SISTEMA DE RIEGO AUTOMÁTICO CON MÚSICA

El objetivo era hacer un programa que pueda activar una bomba de agua en la noche, y que por las mañanas reproduzca música para las plantas. El depósito de agua debe tener un flotador eléctrico que mande señal de que no hay agua. Los mensajes deben verse en el LCD. Además, implementar una aplicación sencilla de labview.
Para más detalles puede consultar: https://www.dropbox.com/s/hjyeaymroexqjgf/Proyecto%20de%20Microcontroladores.zip?dl=0
  • Código:
#include <sistemaderiego.h>
#define LCD_ENABLE_PIN PIN_D3
#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
int i,flag, cont,dato[8],leds[8],tt=0,lola=1;
int music[8]={00,0b01111,0b01001,0b01001,0b11011,0b11011,00};
float valor,valorn;
#include <lcd.c>

#define nDO     0    // DO
#define nDO_    1    // DO#
#define nRE     2    // RE
#define nRE_    3    // RE#
#define nMI     4    // MI
#define nFA     5    // FA
#define nFA_    6    // FA#
#define nSOL    7    // SOL
#define nSOL_   8    // SOL#
#define nLA     9    // LA
#define nLA_    10   // LA#
#define nSI     11   // SI
#define Speaker   PIN_B2      // Altavoz conectado a RB2
#define valvula   PIN_C0     //activo bomba

int16 FreqNota[12]={// retardos entre estado alto y bajo para generar las notas                        
15289, // DO
14430, // DO#
13620, // RE
12856, // RE#
12134, // MI
11453, // FA
10810, // FA#
10204, // SOL
9631,  // SOL#
9090,  // LA
8580,  // LA#
8099   // SI
};

//-------------------------------------------------Función de audio
void Play(int nota, int octava, int16 duracion){
 int16 fn;

 int16 mS_Transcurridos=0;  // Contadores necesarios
                            // para controlar la duración
 int16 CiclosL=0;           // Contandor de uS

 fn=FreqNota[nota];         // Define los retardos para generar
                            // la frecuencia de cada nota
 fn>>=(octava);             // Adapta la frecuencia a la octava actual
                            // haciendo una rotación
                            // a la derecha por octava
do{

    output_high(Speaker);   // Genera la frecuencia
    delay_us(fn);           // con los retardos mientras
    CiclosL+=(fn);          // aumenta el contador de
                            // ciclos transcurridos
    output_low(Speaker);    // en dos partes para repartir el
    delay_us(fn);           // trabajo entre estado alto y bajo.
    CiclosL+=(fn);          //
    CiclosL+=25;            // Compensador.

    while(CiclosL>999){     // Se queda en el bucle mientras CiclosL
                            // sea menor a 1000 (1 mS)
       CiclosL-=1000;       // Le resta 1000 a CiclosL
       mS_Transcurridos++;  // y le suma 1 a mS_Transcurridos.
       CiclosL+=25;         // Compensador.
    }
 }while (duracion>mS_Transcurridos); // Repite el bucle hasta que haya
                                     // pasado el tiempo indicado.
}

void playcancion(){  //city of stars
        for(i=0;i<2;i++){
        play (nSOL   ,4,250);
        play (nLA   ,4,250);
        play (nSI   ,4,250);
        play (nRE   ,5,1250);
        delay_ms(125);
        play (nRE   ,5,125);
        play (nMI   ,5,250);
        play (nFA   ,5,250);
        play (nRE   ,5,250);
        play (nMI   ,5,250);
        play (nDO   ,5,250);
        play (nRE   ,5,250);
        play (nLA   ,4,1300);
        delay_ms(250);}
        delay_ms(250);
        play (nLA   ,4,500);
        play (nSI   ,4,1000);
        delay_ms(250);
        play (nRE   ,5,125);
        play (nDO   ,5,250);
        play (nRE   ,5,250);
        play (nDO   ,5,250);
        play (nRE   ,5,250);
        play (nDO   ,5,250);
        play (nRE   ,5,250);
        play (nLA   ,4,750);
        play (nLA   ,4,125);
        play (nLA   ,4,125);
        play (nLA   ,4,500);
        play (nLA   ,4,750);
        delay_ms(250);
        play (nSOL   ,5,500);
        play (nSOL   ,5,1000);
        play (nRE   ,5,1000);
        play (nMI   ,5,1300);
        delay_ms(250);
        play (nDO   ,5,125);
        play (nRE   ,5,250);
        play (nSOL   ,5,250);
        play (nFA   ,5,500);
        play (nMI   ,5,500);
        play (nRE   ,5,1000);}

void playcancion2(){  //yesterday
        play (nSOL   ,4,250);
        play (nFA   ,4,250);
        play (nFA   ,4,1200);
        delay_ms(250);
        play (nLA   ,4,250);
        play (nSI   ,4,250);
        play (nDO_   ,4,250);
        play (nRE   ,5,250);
        play (nMI   ,5,250);
        play (nFA   ,5,250);
        play (nMI   ,5,500);
        play (nRE   ,5,250);
        play (nRE   ,5,1200);
        delay_ms(250);
        for(i=1;i<2;i++){
        play (nRE   ,5,250);
        play (nRE   ,5,250);
        play (nDO   ,5,250);
        play (nSI   ,4,250);
        play (nLA   ,4,250);
        play (nSOL   ,4,250);
        play (nLA   ,4,500);
        play (nLA   ,4,250);
        play (nLA   ,4,250);
        play (nLA   ,4,750);
        play (nSOL   ,4,500);
        play (nFA   ,4,500);
        play (nLA   ,4,250);
        play (nSOL   ,4,750);
        delay_ms(250);
        play (nRE   ,4,125);
        play (nFA   ,4,500);
        play (nLA   ,4,250);
        play (nLA   ,4,250);
        play (nLA   ,4,750);
        delay_ms(250);
        play (nSOL   ,4,250);
        play (nFA   ,4,1400);
        delay_ms(250);
        play (nLA   ,4,250);
        play (nSI   ,4,250);
        play (nDO_   ,5,250);
        play (nRE   ,5,250);
        play (nMI   ,5,250);
        play (nFA   ,5,250);
        play (nMI   ,5,500);
        play (nRE   ,5,250);
        play (nRE   ,5,1250);
        delay_ms(250);}
        play (nLA   ,4,1000);
        play (nLA   ,4,1000);
        play (nRE   ,5,1000);
        play (nMI   ,5,1000);
        play (nFA   ,5,1000);
        play (nMI   ,5,250);
        play (nRE   ,5,250);
        play (nMI   ,5,1400);
        play (nRE   ,5,125);
        play (nDO   ,5,500);
        play (nRE   ,5,1000);
        play (nLA   ,4,1400);
        delay_ms(250);
        play (nLA   ,4,1000);
        play (nLA   ,4,1000);
        play (nRE   ,5,500);
        play (nMI   ,5,500);
        play (nFA   ,5,500);
        play (nMI   ,5,250);
        play (nRE   ,5,250);
        play (nMI   ,5,750);
        play (nRE   ,5,125);
        play (nDO   ,5,500);
        play (nRE   ,5,500);
        play (nLA   ,4,1400);
        play (nLA   ,4,250);
        play (nSI   ,4,250);
        play (nDO   ,5,250);
        play (nRE   ,5,250);
        play (nMI   ,5,250);
        play (nFA   ,5,250);
        play (nMI   ,5,200);
        play (nRE   ,5,250);
        play (nRE   ,5,750);
        play (nRE   ,5,750);
        delay_ms(250);
        play (nRE   ,5,250);
        play (nRE   ,5,250);
        play (nDO   ,5,250);
        play (nSI   ,4,250);
        play (nLA   ,4,250);
        play (nSOL   ,4,250);
        play (nSI   ,4,500);
        play (nLA   ,4,250);
        play (nLA   ,4,700);
        play (nSOL   ,4,500);
        play (nFA   ,4,500);
        play (nLA   ,4,250);
        play (nSOL   ,4,800);
        play (nRE   ,4,500);
        play (nFA   ,4,500);
        play (nLA   ,4,250);
        play (nLA   ,4,700);
        delay_ms(250);
        play (nFA   ,4,500);
        play (nLA   ,4,500);
        play (nSOL   ,4,500);
        play (nRE   ,4,500);
        play (nFA   ,4,500);
        play (nLA   ,4,500);
        play (nLA   ,4,1400);}

void playcancion3(){ //Himno de la alegria
   play (nSI   ,5,500);
   play (nDO_   ,6,250);
   play (nRE_   ,6,250);
   play (nRE_   ,6,250);
   play (nDO_   ,6,250);
   play (nSI   ,5,250);
   play (nLA_   ,5,250);
   play (nSOL_   ,5,250);
   play (nSOL_   ,5,250);
   play (nLA_   ,5,250);
   play (nSI   ,5,250);
   play (nSI   ,5,400);
   play (nLA_   ,5,125);
   play (nLA_   ,5,500);
   play (nSI   ,5,500);
   play (nDO_   ,6,250);
   play (nRE_   ,6,250);
   play (nRE_   ,6,250);
   play (nDO_   ,6,250);
   play (nSI   ,5,250);
   play (nLA_   ,5,250);
   play (nSOL_   ,5,250);
   play (nSOL_   ,5,250);
   play (nLA_   ,5,250);
   play (nSI   ,5,250);
   play (nLA_   ,5,400);
   play (nSOL_   ,5,125);
   play (nSOL_   ,5,500);
   play (nLA_   ,5,500);
   play (nSI   ,5,250);
   play (nSOL_   ,5,250); 
   play (nLA_   ,5,250);
   play (nSI   ,5,125);
   play (nDO_   ,6,125);
   play (nSI   ,5,125);
   play (nSOL_   ,5,250);
   play (nLA_   ,5,250);
   play (nSI   ,5,125);
   play (nDO_   ,6,125);
   play (nSI   ,5,125);
   play (nLA_   ,5,250);
   play (nSOL_   ,5,250);
   play (nLA_   ,5,250);
   play (nRE_   ,5,500);
   play (nSI   ,5,500);
   play (nDO_   ,6,250);
   play (nRE_   ,6,250);
   play (nRE_   ,6,250);
   play (nDO_   ,6,250);
   play (nSI   ,5,250);
   play (nLA_   ,5,250);
   play (nSOL_   ,5,250);
   play (nSOL_   ,5,250);
   play (nLA_   ,5,250);
   play (nSI   ,5,250);
   play (nLA_   ,5,400);
   play (nSOL_   ,5,125);
   play (nSOL_   ,5,250);
}

//----------------------------------------------FUNCION PRINCIPAL
void main()
{
   setup_adc_ports(AN0_TO_AN1);
   setup_adc(ADC_CLOCK_INTERNAL|ADC_TAD_MUL_0);
   lcd_init();
   lcd_set_cgram_char(1,music);
  
   //-----------------------------------------------------------------------------------CONTORL USB
   /*usb_init();
   usb_wait_for_enumeration();//espera a que la pc enumere al pic (asigna posicion */
  
   lcd_gotoxy(1,1);
   lcd_putc("Hola, se activo");
   lcd_gotoxy(1,2);
   lcd_putc("control nocturno");
   delay_ms(3000);
   lcd_putc("\f");
   flag=1;
   cont=10;
       
   //-----------------------CONTROL NOCTURNO verificando si es noche o dia
   while(TRUE)
   {      
    //--------------------------------------------PARA USAR USB LABVIEW
    /*usb_task();
         
   while(input(PIN_B4) && lola==1){
      lcd_putc("\f");
      lcd_gotoxy(5,1);
      lcd_putc("Labview");
      lcd_gotoxy(5,2);
      lcd_putc("activado");
      if (usb_kbhit(1))//siempre va a ser 1 por que es un solo pic el end point verifica el canal
       {
      usb_get_packet(1, dato,8);
      dato[0]=dato[0]-0x30;
      output_c(dato[0]);
      }

      leds[0]=read_adc();
      leds[1]=pin_C0;
      leds[2]=pin_B1;
      usb_put_packet(1, leds, 3, USB_DTS_TOGGLE);
      delay_ms(20);
     
      if(!input(PIN_B4))
         lola=0;
   }*/
  
      //-----------------------------------------------------------------PARTE DE PROYECTO NORMAL
      do{
   valor=read_adc();
   valorn=((5*valor)/1023);
      
   if(valorn>3.5)
        cont=10;
  
   while(valorn>3.5 && input(PIN_B1) && tt==0){  //PIN_B1 Flotador   
      lcd_putc("\f");
      lcd_gotoxy(7,1);
      lcd_putc("Riego");
      lcd_gotoxy(5,2);
      lcd_putc("activado");
      delay_ms(2000);
      output_HIGH(valvula);  //--------------------Encender bomba       
      delay_ms(20);
      lcd_putc("\f");
      lcd_gotoxy(5,1);
      lcd_putc("Bomba ON");
      delay_ms(16000);
      lcd_putc("\f");
      lcd_gotoxy(5,1);
      output_LOW(valvula);
      lcd_putc("Bomba OFF");
      delay_ms(5000);
      tt=1;
      }
   
    while(!input(PIN_B1)){ 
      lcd_putc("\f");
      lcd_gotoxy(7,1);
      lcd_putc("Agua");
      lcd_gotoxy(5,2);
      lcd_putc("insuficiente"); 
      delay_ms(3000);
      cont==0;
      if(input(PIN_B1)){
      lcd_putc("\f");
      lcd_gotoxy(7,1);
      lcd_putc("Agua");
      lcd_gotoxy(5,2);
      lcd_putc("suficiente");
      delay_ms(2000);
      break;}
     
    }
   
    if(valorn<3.5){ //---------de dia poner canciones
      delay_ms(10);
      lcd_putc("\f");
      lcd_gotoxy(7,1);
      lcd_putc("Riego");
      lcd_gotoxy(4,2);
      lcd_putc("Desactivado");
      delay_ms(3000);
      output_LOW(valvula);
      flag=0;
      lcd_putc("\f");
      lcd_gotoxy(1,1);//---------City of stars
      lcd_putc("Reproduciendo...");
      lcd_gotoxy(1,2);  lcd_putc(1);
      lcd_gotoxy(3,2);
      lcd_putc("City of stars");
      lcd_gotoxy(16,2); lcd_putc(1);
      playcancion();
      delay_ms(3000);
      lcd_putc("\f");//---------Yesterday
      lcd_gotoxy(1,1);
      lcd_putc("Reproduciendo...");
      lcd_gotoxy(1,2);  lcd_putc(1);
      lcd_gotoxy(3,2);
      lcd_putc("Yesterday");
      lcd_gotoxy(13,2); lcd_putc(1);
      playcancion2();
      delay_ms(3000);
      lcd_putc("\f");//---------Himno de la alegria
      lcd_gotoxy(1,1);
      lcd_putc("Reproduciendo...");
      lcd_gotoxy(1,2); lcd_putc(1);
      lcd_gotoxy(2,2);
      lcd_putc("Himno alegria");
      lcd_gotoxy(16,2); lcd_putc(1);
      playcancion3();
      delay_ms(3000);}

   }while(flag=1);
 
   }

}


  • Visualización en Labview:



  • Simulación en Proteus:


  • Armado en físico:


No hay comentarios:

Publicar un comentario

Ultima entrada ingresada

SISTEMA DE RIEGO AUTOMÁTICO CON MÚSICA

El objetivo era hacer un programa que pueda activar una bomba de agua en la noche, y que por las mañanas reproduzca música para las plantas....