Autor Tema: duda con ADC en dos pines  (Leído 2013 veces)

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

Desconectado zokter

  • PIC10
  • *
  • Mensajes: 12
duda con ADC en dos pines
« en: 28 de Noviembre de 2015, 13:29:02 »
Buen dia, tengo una duda amigos, tengo hecho un código para un proyecto escolar de sistema de riego de una maceta, me pidieron anexarle al circuito una fotorresistencia para que solo riegue en condiciones de obscuridad y no de dia, me he descargado el codigo que he visto en youtube de circuito que mide la iluminacion con una fotorresistencia, lo hace con ADC, yo en mi proyecto tambien tengo ADC para medir la humedad, mi pregunta es, ¿como puedo poner ADC en los dos pines?, el sensor de humedad lo tengo en el pin A0, la fotoresistencia la quiero conectar en A1.

Este es mi codigo:
Código: [Seleccionar]
#include <18f4550.h> //incluir la libreria del pic 18f4550
#device adc=10   //Configuracion del convertidor a/d de 10 bits
#use delay(clock=4M)  //velocidad del reloj interno a 4MHz
#fuses XT,NOWDT    //Activacion de fuses

#define D0  enable   ///////////////////////////////////////////////////
#define D1  rs       //
#define D2  rw       //         Declararacion de los pines
#define D4  D4       //         que se usaran para controlar   
#define D5  D5       //         la LCD
#define D6  D6       //
#define D7  D7       ///////////////////////////////////////////////////
#include <lcd4202.c> //   LLamado a la libreria que controla las funciones del LCD
#include <KBD1.c>    //   LLamado a la libreria que controla al teclado 4x4

#use standard_io(c)  //   Configurando el puerto C
void main()          //
{

int16 q;     // variable de 16bits que almacena el valor del ADC del higrometro
float T;     // variable de tipo flotante que guarda el valor de una operacion de "q"
int humedad; // variable que guarda el valor de humedad del 0% al 100%
char k;      // variable de tipo cadena utilizada para saber que tecla se oprimio en el teclado
int hmin;    // Variable de humedad minima
int hmax;    // variable de humedad maxima

setup_adc_ports(AN0);            //condigura el pin de entrada del ADC en este caso el pin A0
setup_adc(ADC_CLOCK_INTERNAL);   //configura el reloj interno del ADC
lcd_init();                      //inicializa la LCD
kbd_init();                      //inicializa el teclado
port_b_pullups(TRUE);            //activa las resistencias internas del puerto b
menu:                            //etiqueta de nombre menu que servira para regresar con la instruccion goto a este punto
printf(lcd_putc,"\f Tipo de planta:");   //imprime en la LCD la oracion "tipo de planta"
k=0;                                     //valor de k a cero
while(K==0)     //bucle que se repite siempre que k sea igual a cero
               {
               k=kbd_getc(); // k sera igual a la tecla introducida en el teclado
               switch (k)    // sentencia switch que depende del valor de k
                           {
                           case '1': ////////////////////////////////////
                           hmin=60;  //
                           hmax=80;  //                                               
                           break;    //
                           case '2': //      Casos dependiendo de la
                           hmin=45;  //      tecla que se introduzca en
                           hmax=80;  //      el teclado
                           break;    //      Se definen los valores de
                           case '3': //      humedad minima y maxima
                           hmin=20;  //
                           hmax=30;  //
                           break;    ////////////////////////////////////
                           
                           }
             
               }

principal:                 //Etiqueta de nombre 'principal'
while(true)                //Bucle infinito
      {
  k=kbd_getc();            //k sera igual al valor tecleado
      set_adc_channel(0);  //lectura del canal cero
      delay_us(20);        // retardo
      q=read_adc();        //de le asigna el valor a q de lo leido en el canal cero del ADC
     q=1023-q;    // seinvierte el valor de q

   T=(5.0*q)/1024;  //Operacion matematica que le asigna el valor a T
   humedad=(100*T)/5; //conversion a porcentaje
   humedad=1.43*humedad; //correccion del valor de porcentaje de la humedad

     
      lcd_gotoxy(1,1);                                       // se posiciona en la linea uno y columna uno de la LCD
      printf(lcd_putc, "Humedad =  %3d%%  ", humedad);       // Da salida a la oracion y al valor de la variable humedad en forma de porciento
      lcd_gotoxy(1,3);                                       // se posiciona en la linea 1 y columna tres de la LCD
      printf(lcd_putc,"H.Min:%2d%%H.Max:%2d%%",hmin,hmax );  // Da salida a la oracion y al valor de las variables de humedad minima y maxima seleccionada en un principio
k=kbd_getc();           //k sera igual al valor tecleado

if (k=='A'){       //sentecia condicional de comparacion del valor de k
    goto menu;     //si k es igual a la letra 'A' se posiciona en la etiqueta 'menu'
      }
if(humedad <= hmin)                   ////////////////////////////////////////////
{                                     //    Si el valor de humedad es menor o igual al
lcd_gotoxy(1,2);                      //    valor de hmin entonces da salida en la fila tres
printf(lcd_putc,"bomba on   ");       //    la oracion bomba on, que significa que se prendera la bomba
output_high(pin_c0);                  //    y manda la señal al pinC0 de ponerse en nivel alto
}                                     ////////////////////////////////////////////
else if(humedad >= hmax  )                             //////////////////////////////////////////
         {                                             //    Si el valor de humedad es mayor o igual al maximo
         lcd_gotoxy(1,2);                              //    entonces se imprimira 'bomba off' en la lcd
         printf (lcd_putc,"bomba off  ");              //    y el pinc0 quedara en nivel bajo, por lo que se
         output_low(pin_c0);                           //    apagara la bomba
         }                                             //////////////////////////////////////////
      }
}      //fin del programa

Este es el codigo que descargue de youtube:

Código: [Seleccionar]
/*==============================================================================

;  PROGRAMA       : Sensor de luz LDR + USART

;  DESARROLADO POR: Manuel Rodríguez (merg18@msn.com)
;
;  DESCRIPCIÓN    : El programa hace la conversión analógica a digital (C/AD)
;                   de la tensión que "cae" en la LDR. A continuación se hace la
;                   Comunicación entre el PIC y PC a través del módulo de comu-
;                   nicación serie USART.
;                   Se Dispone tambien del valor máximo y mínimo del resultado
;                   de la conversión AD (Para su fácil calibrado en el entorno
;                   donde opere finalmente).

;  VARIABLES      : - binSensor = Contiene el resultado de la C/AD
;                   - volt      = Tensión en la LDR
;                   - min       = Mínimo valor de binSensor
;                   - max       = Máximo valor de binSensor
;
;  CONSTANTES     : - Espera  = Tiempo aproximado entre cada escritura en el PC.
;                   - pinLED  = Salida digital a un LED, bombilla, relé, etc.
;                   - CONTROL = Constante para calibrar(ajustar) la activación
;                               de la salida (LED...)
;                   
;  HARDWARE       : - PIC16F877A
;                   - Conversor Serie-USB
;                   - LDR
;                   - Resistencia 1k
;                   - PICKIT 3 Programmer
;                   - 1 Protoboard
;                   - Cables
;                                 1k     Vout    LDR
;                       (5V)<---\/\/\/--(AN0)--/\/\/\/---|||GND
;
;  SOFTWARE       : - CCS C Compiler v4.084
;                   - PICKIT 3
;                   - Proteus (para simulación)
;
;  VERSIÓN        : V 1.0
;
;  NOTAS          : - Rldr(luz) = 4ohmios        Rldr(oscuridad)=24k
;                      Vout = 0.4v                    vout = 4.8v
;                   - Un método mas facil para calibrar la activación de la sa-
;                     lida es usando un potenciometro en lugar de la resistencia
;                     de 1k.
;
;  FECHA          : 26/10/2012
==============================================================================*/

#include "LDR_V1.h"
#USE fast_IO (B)

#define espera 300     // Constante para delay espera
#define pinLed PIN_B0  // Sirve para activar un LED, RELE....
#define CONTROL 800    // Constante para ajustar según la iluminación de la habitación
                       // con iluminación de la lampara Vout medido es de 4voltios (+/-)
                       // 4V corresponden con binSensor = 818
// Programa principal                       
void main()
{
   // Variables locales
   int16 binSensor;     // Valor de la conversión del ADC
   float volt;          // Tensión de entrada en AN0
   int16 min=1024;
   int16 max=0;
   setup_adc_ports(AN0);            //  Configuramos RA0 como pin Analógico
   setup_adc(ADC_CLOCK_INTERNAL);   // Reloj R-C
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
     
   SET_TRIS_B(0x00);           // PORTB como salida
   output_low(pinLed);        // LED, Lampara...en el instante de encendido o reset
                              // siempre apagado
   set_adc_channel(0);  // AN0
   delay_ms(150);       // Tras el encendido del sistema o Reset
   
   // Bucle infinito
   while(TRUE){
   
       // Leemos la conversión y obtenemos la tensión Vout
       delay_us(20);
       binSensor = read_adc();
       volt = (5.0/1023.0) *(binSensor);
       
       // Obtención de mín y max del ADC
       if ( binSensor < min){
           min = binSensor;
       }
       
       if (binSensor > max){
           max = binSensor;
       }
       
       // Encendemos "Lampara" cuando no hay luz
     
       if (binSensor > CONTROL){       // Si estamos en oscuridad entonces
           output_high(pinLed);        // enciende LED, Lampara...
           }
       else {
           output_low(pinLed);         // Sino manten apagado LED
       }
       
      // Escribimos la información en el TX
       printf("ADC:%4ld  max:%4lu  min:%4lu  Volt:%4.1f\n\r",binSensor,max,min,volt);
       delay_ms(espera);
   }
}

Yo solo requiero medir la iluminación en porcentaje, para que cuando mi humedad sea mínima y tenga iluminación menor del 50% se active la bomba, si la iluminación es mayor al 50% aunque tenga menos de la humedad mínima no se encienda la bomba...
Este es mi circuito:



De antemano agradezco su ayuda.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:duda con ADC en dos pines
« Respuesta #1 en: 28 de Noviembre de 2015, 20:00:31 »
Primero configura AN1 como analogico tambien.. Ademas de a AN0 (En una misma linea) creo que con:

Código: [Seleccionar]
setup_adc_ports( AN0_TO_AN1 );
Luego haces tal cual lees el AN0:

Código: [Seleccionar]
      set_adc_channel(1);
      delay_us(20);
      q=read_adc();

Y con eso ya leiste el pin AN1 de forma analogica, es decir "q" tiene el resultado del AN1
« Última modificación: 28 de Noviembre de 2015, 20:02:50 por KILLERJC »

Desconectado zokter

  • PIC10
  • *
  • Mensajes: 12
Re:duda con ADC en dos pines
« Respuesta #2 en: 29 de Noviembre de 2015, 21:09:14 »
Primero configura AN1 como analogico tambien.. Ademas de a AN0 (En una misma linea) creo que con:

Código: [Seleccionar]
setup_adc_ports( AN0_TO_AN1 );
Luego haces tal cual lees el AN0:

Código: [Seleccionar]
      set_adc_channel(1);
      delay_us(20);
      q=read_adc();

Y con eso ya leiste el pin AN1 de forma analogica, es decir "q" tiene el resultado del AN1

Gracias KILLERJC, he podido echar a andar ya el programa, solo me falta determinar la operacion que me muestre el resultado en valor del 1 al 100, en eso ando, saludos


 

anything