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:
#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:
/*==============================================================================
;
; 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.