La jardinería es uno de los pasatiempos habituales. Te mantiene cerca de la naturaleza. Este es el pasatiempo más saludable que cualquiera puede tener. Sin embargo, las plantas y los árboles son como mascotas. Necesitan cuidados continuos sin estropearse . Necesitas estar con ellos todo el tiempo . Esto no siempre es posible. Es posible que necesite irse de vacaciones o en viaje de negocios o viajar por otros motivos. En esos momentos, el jardín puede permanecer desatendido durante algún tiempo o incluso puede quedar desatendido durante un largo período de tiempo. Este proyecto pretende cuidar el jardín en solitario con la ayuda de la electrónica. Esto eliminará obligaciones innecesarias y también facilitará la jardinería.
Este proyecto es un sistema de monitorización y automatización de jardines. Está construido utilizando un microcontrolador AVR y un conjunto de sensores electrónicos. El controlador AVR utilizado en el circuito es ATmega16 . El ATmega16 monitorea continuamente la humedad del suelo con la ayuda del sensor de humedad del suelo y controla una bomba de agua (aquí un motor de CC para fines de demostración) a medida que el suelo se seca. El controlador también rastrea la temperatura ambiente con la ayuda del sensor de temperatura LM35 y enciende la bomba de agua a medida que aumenta la temperatura. El ATmega16 también puede controlar la iluminación del jardín. Realiza un seguimiento de si es de día o de noche con la ayuda de una resistencia dependiente de la luz . Si es de noche, controla si alguien entra al jardín con la ayuda de sensores de infrarrojos . Realiza un seguimiento del número de visitantes mediante sensores de infrarrojos y enciende luces LED según el número de ocupantes del jardín. El controlador también está interconectado con una pantalla LCD de 16X2 caracteres donde muestra la temperatura actual y el porcentaje de humedad del suelo del LM35 y el sensor de humedad del suelo, respectivamente.
El controlador se programa mediante C integrado. AVR Studio 4 se utiliza para escribir, editar y compilar código para ATmega16. Este proyecto hace que un jardín sea totalmente automatizado y de autocuidado . También ahorra electricidad al controlar la bomba solo cuando se necesita agua en el jardín.
Componente requerido –
Microcontrolador ATmega16 – 1
Pantalla LCD 16×2 – 1
Módulo de infrarrojos – 2
LM32-1
Sensor de humedad del suelo – 1
LDR – 1
Oscilador de cristal de 16 MHz – 1
PLOMO – 4
Relé 5v – 1
2N2222 – 1
Resistente 1K – 3
Resistente a 10 mil – 1
Condensador de 22 pf – 2
10 mil potenciómetro – 1
Programador AVR – 1
PCB / placa de pruebas – 1
7805 – 1
Fuente de alimentación – 1
Cable de conexión – según sea necesario
Diagrama de bloques:-

Fig. 1: Diagrama de bloques del sistema de automatización y monitoreo de jardines basado en AVR ATmega16
Diagrama de circuito -

Fig. 2: Diagrama de circuito del sistema de monitoreo y automatización de jardines basado en AVR ATmega16
Habilidades previas –
Antes de intentar este proyecto, el desarrollador debe tener los siguientes requisitos previos:
1) El desarrollador debe tener conocimientos básicos de Microcontroladores AVR .
2) El desarrollador debe estar familiarizado con la programación en AVR Studio 4 .
3) El desarrollador debe saber cómo se interconecta el LCD 16X2 con el controlador AVR y cómo se muestra el texto en él.
4) El desarrollador debe saber cómo controlar el motor de CC mediante el microcontrolador AVR .
5) El desarrollador debe tener conocimientos sobre cómo trabajar con el ADC interno del controlador AVR .
Conexiones de circuito –
El circuito de este proyecto está basado en el AVR ATmega16. Todos los demás componentes interactúan con el controlador. El circuito se diseña ensamblando los siguientes componentes:
1) AVR ATmega16: Atmega16 es un microcontrolador AVR de 8 bits con 32 pines de E/S. Interactúa con sensores y caracteres LCD para diseñar el circuito de este proyecto. ATmega16 tiene el siguiente diagrama de pines:

Figura 3: Diagrama de pines del microcontrolador AVR ATmega16
2) LCD de caracteres 16X2: se conecta un LCD de caracteres al controlador para mostrar la temperatura ambiente y el nivel de humedad del suelo. El pin VSS del LCD de caracteres está conectado a tierra y el pin VDD está conectado a 5 V CC. Los pines RS, RW y E del LCD están conectados a los bits 0, 1 y 2 del Puerto C del ATmega16 respectivamente. La pantalla LCD interactúa en modo de 4 bits con el controlador AVR. Los pines de datos D4, D5, D6 y D7 de la pantalla LCD están conectados a los bits 4, 5, 6 y 7 del puerto C del ATmega16 respectivamente.
3) Sensor de temperatura LM35: el LM35 es un sensor de temperatura popular. El sensor tiene tres terminales: VCC, Salida y Tierra. Los terminales VCC y Tierra están conectados a 5 VCC y tierra común, respectivamente. El terminal de salida está conectado al bit 2 del puerto A del ATmega16.
4) Sensor de humedad del suelo: el sensor de humedad mide el contenido volumétrico de agua del suelo con la ayuda de una sonda sensora que debe colocarse en el suelo. El módulo sensor funciona entre voltajes de 3,3 V a 5 V. Lleva a bordo un comparador LM393 . El módulo tiene cuatro terminales: VCC, Tierra, Salida de datos y Salida analógica. Los pines VCC y Tierra están conectados al VCC y Tierra comunes respectivamente. El pin de salida analógica del sensor está conectado al bit 1 del puerto A del AVR.
5) Sensor LDR: el sensor LDR se utiliza para detectar el día o la noche en este circuito. El sensor LDR es una resistencia sensible a la luz de dos terminales . Está conectado como una red divisora de voltaje en el bit 0 del Puerto A del ATmega16.
6) Sensores de infrarrojos: se utilizan dos módulos de sensores de infrarrojos en el proyecto. Los dos módulos se utilizan para detectar la entrada y salida de un visitante. Cada módulo de sensor está construido a partir de un par de transmisor de infrarrojos y receptor de infrarrojos. El emisor es simplemente un LED IR y el detector es simplemente un fotodiodo IR que es sensible a la luz IR de la misma longitud de onda emitida por el LED IR. El módulo sensor tiene una salida digital. El módulo del sensor debe generar lógica ALTA o lógica BAJA para que pueda detectarse en el pin GPIO del microcontrolador. La salida analógica del fotodiodo se puede convertir en datos digitales utilizando convertidores analógicos a digitales (ADC). Se utiliza un amplificador operacional para convertir la salida analógica del fotodiodo a lógica digital BAJA o ALTA. Los módulos de sensores IR tienen el siguiente diagrama de circuito:

Fig. 4: Diagrama de circuito del módulo del sensor de infrarrojos
Para crear el módulo del sensor, los transmisores de infrarrojos se conectan en serie con resistencias pull-up de 470 ohmios entre VCC y la configuración de polarización directa a tierra . Los receptores de infrarrojos están conectados en serie con resistencias variables entre VCC y tierra en una configuración de polarización inversa formando un circuito divisor de voltaje. La salida de los receptores de IR (fotodiodos) se toma de la unión de los terminales del cátodo del receptor de IR y las resistencias variables. Este par de receptor y transmisor de infrarrojos está conectado entre VCC y tierra para formar el módulo del sensor de infrarrojos. La salida de los receptores IR se conecta a los bits 3 y 4 del Puerto A del ATmega16 a través del comparador OPAM. LM358M se puede utilizar como comparador OPAMP.
7) LED: hay 4 LED interconectados en los bits 0, 1, 2 y 3 del puerto B del ATmega16. Estos LED tienen fines de demostración para mostrar el control de iluminación en el jardín. En una versión práctica del circuito, podría haber luces LED controladas mediante relés por el controlador.
8) Motor CC: un motor CC está conectado al bit 5 del puerto D del AVR. Este motor tiene fines de demostración para mostrar el control de la bomba de agua mediante el controlador. En una versión práctica de este circuito, podría haber una bomba de agua real que se puede conectar al controlador con la ayuda de un relé de 6V.
9) Fuente de alimentación: el circuito puede alimentarse con una batería y un regulador IC de 5 V como el 7805. También puede alimentarse con una red eléctrica de CA utilizando un transformador reductor y un circuito rectificador con un regulador de voltaje 7805 .
En primer lugar, debe cargar el código hexadecimal en el ATmega16 utilizando el programador AVR. Luego, el circuito se puede ensamblar en una placa de pruebas o soldar en una placa de circuito impreso. Lo mejor será probar primero en una placa.
Cómo funciona el circuito –
Cuando el microcontrolador recibe alimentación de una fuente de 5 V CC, primero muestra algunos mensajes iniciales en la pantalla LCD, como "Engineers Garage" y "BIENVENIDO AL MONITOREO DEL JARDÍN". Después de que estos mensajes parpadeen una vez en la pantalla LCD, el controlador lee los voltajes analógicos del sensor de humedad del suelo y del sensor de temperatura LM35 . Convierte voltajes analógicos en valores digitales utilizando canales ADC integrados de 10 bits. Las lecturas digitalizadas se convierten mediante el código en mediciones en cantidades físicas reales, es decir, porcentaje de humedad del suelo y temperatura ambiente, y luego se muestran en la pantalla LCD.
Si el nivel de humedad detectado por el sensor de humedad cae por debajo de un nivel umbral, el controlador enciende el motor para bombear agua al jardín. El agua se suministra a diferentes partes del jardín con la ayuda de un kit de goteo. Del mismo modo, si la temperatura ambiente supera un nivel umbral, el controlador vuelve a encender el motor para bombear agua al jardín. Entonces se puede bajar la temperatura del jardín .
Este sistema de vigilancia de jardines también controla la iluminación del jardín. Realiza un seguimiento del día o la luz con la ayuda del sensor LDR . Si es de noche, detecta la entrada y salida de cualquier visitante con la ayuda de dos módulos de sensores IR. Si una persona entra al jardín por la noche , se enciende un LED. Si entra otra persona, se enciende otro LED. Del mismo modo, se encienden otros LED. De manera similar, si el número de ocupantes en el jardín se reduce cuando uno o más ocupantes se van , los LED se apagan de manera similar según el número de ocupantes actuales en el jardín.
El ATmega16 detecta el voltaje analógico del sensor de humedad y del sensor de temperatura y los convierte en lecturas digitales utilizando canales ADC integrados. ATmega16 tiene una resolución ADC de 10 bits, por lo que puede convertir lecturas de voltaje a un valor entre 0 y 1023.
2norte -1 = 2 10 -1 = 1023
Tiene 8 canales ADC que tienen entrada en los pines 0 a 7 del Puerto A. El funcionamiento de este circuito se basa en la función ADC del microcontrolador. Atmega16 tiene los siguientes registros internos asociados con la función ADC integrada:
1) ADMUX (registro de selección de multiplexor ADC)
2) ADCSRA (Registro de control y estado de ADC)
3) ADCL y ADCH (registros de datos ADC)
4) SFIOR (registro de función especial IO)
El funcionamiento de los canales ADC está controlado por el registro ADMUX en el Atmega16. El registro ADMUX tiene los siguientes valores de bits:

Fig. 5: Valores de bits de registro AVR ATmega16 ADMUX
Los bits REFS1 y REFS0 se utilizan para seleccionar la referencia de voltaje. La referencia de voltaje se selecciona de acuerdo con los siguientes valores de bits de REFS1 y REFS0:

Aquí, se selecciona AVCC con condensador externo en modo pin AREF, para lo cual REFS0 se establece en 1 y REFS1 se establece en 0. Como REFS1 es cero de forma predeterminada, solo es necesario modificar REFS1 de la siguiente manera:
ADMUX = (1<
El bit ADLAR afecta la presentación del resultado de la conversión ADC en el registro de datos ADC. Al escribir 1 en ADLAR, se ajusta el resultado de la conversión. De lo contrario, el resultado se ajustará correctamente.

Fig. 6: Cambio de bits de los registros de datos ADC según el estado del bit ADLAR en el registro ADMUX
Los bits MUX4 a MUX0 se utilizan para seleccionar el canal analógico, el tipo de entrada y la ganancia. El canal de entrada y la selección de ganancia se realizan de la siguiente manera:

Aquí el canal 3 de ADC se selecciona configurando MUX0 en 1 y MUX1 en 1 de la siguiente manera:
ADMUX = (1<
ADCSRA tiene los siguientes valores de bits:

Figura 7: Valores de bits de registro AVR ATmega16 ADCSRA
El bit ADEN se utiliza para habilitar ADC . Los bits ADPS2, ADPS1, ADPS0 se utilizan para determinar el factor de división entre la frecuencia XTAL y el reloj de entrada del ADC. El bit ADSC se utiliza para iniciar cada conversión en modo de conversión única y para iniciar la primera conversión en modo de ejecución libre. La parte ONE ENCOUNTER se utiliza para activar el disparo automático. El bit ADIF se establece cuando se completa una conversión ADC y se actualizan los registros de datos. El bit ADIE se utiliza para permitir la interrupción cuando se completa la conversación . Aquí el registro de control ADC se define de la siguiente manera:
ADCSRA = (1<
El registro SFIOR se utiliza para la activación automática. Este registro no se utiliza en la programación de este proyecto.
Guía de programación –
Este sistema está basado en el AVR ATmega16. Está programado en C integrado utilizando AVR Studio 4. También se pueden utilizar otras herramientas de programación como Atmel Studio o Notepad++ para escribir y compilar el código. En primer lugar, el usuario debe agregar la biblioteca LCD que se proporciona a continuación en un archivo zip, copiar y pegar el código en AVR Studio 4 para generar un archivo hexadecimal.
Aquí, ATmega16 se utiliza para detectar el estado del jardín y tomar las medidas adecuadas para controlar equipos de jardinería como motores y luces. La pantalla LCD está interconectada con el atmega16 para monitorear el valor de la temperatura ambiente y la humedad del suelo a través de sensores.
Constantes utilizadas en el código: –
#define F_CPU 16000000UL: – Constante utilizada para definir la frecuencia de reloj de la MCU
#define IR1 0b00001000: – El sensor IR 1 está conectado al pin 4 de PORTA
#define IR2 0b00010000: – El sensor IR 2 está conectado al pin 5 de PORTA
Variable utilizada en el código: –
int núm_LDR ; : – Para obtener el valor ADC de LDR
int num_Húmedo ; : – Para obtener el valor ADC del sensor de humedad del suelo
int número_temp; : – Para obtener la temperatura v
int persona=0 ; : – Para contar el número de personas que entraron o salieron
int húmedo_per ; : – Para calcular la humedad en porcentaje.
inttemp_c; :- Para calcular la temperatura en grados Celsius.
carácter LDR(5) ; : – Para imprimir el valor LDR en la pantalla LCD
carbón mojado(5) ; : – Para imprimir el porcentaje de humedad del suelo en la pantalla LCD
temperatura del carácter (5) ; : – Para imprimir el valor LM35 en Celsius en la pantalla LCD
Archivo de encabezado y bibliotecas utilizadas en el código: –
#incluir
#incluir
#incluir
Funciones utilizadas en el código: –
adc_init: – Para inicializar ADC en ATmega16
adc_read: – Para leer el valor ADC en el canal seleccionado
ir_count: – Para contar la persona que entró/salió para controlar el LED
LCDinit : – Para inicializar la pantalla LCD
LCDclr: – Para limpiar la pantalla LCD.
Cursor LCD APAGADO: – Para apagar el cursor
LCDGotoXY: – Para mapear el cursor
LCDstring : – Para imprimir la cadena en la pantalla LCD
ejecutar: – Almacenar el valor como carácter impreso en la pantalla LCD
Algoritmo:-
El código de este sistema de automatización y seguimiento de jardines funciona según el siguiente algoritmo:
1) Cuando se enciende el circuito, primero se inicializan los puertos como entrada y salida. El puerto A se define como entrada configurando DDRA en 0x00. El puerto B y el puerto D se definen como salida configurando DDRB y DDRD respectivamente en 0xff. Inicialmente, todos los puertos están configurados en BAJO pasando 0x00 para el Puerto A, el Puerto B y el Puerto D.
DDRA = 0x00; DDRB = 0xff; PUERTO = 0x00; PUERTOB = 0x00; DDRD = 0xff; PUERTO = 0x00;
2) Después de eso, la función adc_init inicializa el ADC para activar la operación del ADC en los pines del ADC. La función LCDinit se utiliza para inicializar la pantalla LCD para operaciones LCD. Cuando la pantalla LCD está encendida, puede tener un valor basura, por lo que la función LCDclr se usa para borrar la pantalla LCD y el cursor se apaga usando la función LCDcursoroFF.
adc_init; inicio LCD; LCDclr; Cursor LCD APAGADO;
3) Aquí el cursor LCD está asignado a (3,0), lo que significa primera fila y tercera columna. Se utiliza para imprimir “INGENIEROS”, luego el cursor LCD se asigna a (4,1), que es la segunda fila y la cuarta columna , y se imprime “GARAJE”. Pasa algún tiempo después del cual la pantalla LCD se borra usando la función LCDclr.
LCDGotoXY(3,0); LCDstring("INGENIEROS",9); LCDGotoXY(4,1); LCDstring("GARAJE",6); _delay_ms(1500); LCDclr;
4) Ahora la pantalla LCD está lista para imprimir el siguiente mensaje. Por lo tanto, el cursor LCD se establece en (4,0) para imprimir "BIENVENIDO" y nuevamente se establece en (6,1) para imprimir "PARA". Después de algún retraso se borra y se imprime un nuevo masaje “JARDÍN”, “AUTOMATIZACIÓN” según el mapeo definido. El mensaje permanece en la pantalla y después de algún retraso, los mensajes finales “Humedad =”, “Temperatura =” se imprimen en la pantalla LCD con salidas de sensor.
LCDGotoXY(4,0); cadenaLCD("BIENVENIDO",7); LCDGotoXY(6,1); cadenaLCD("A",2); _delay_ms(1000); LCDclr; LCDGotoXY(5,0); Cadena LCD("JARDÍN",6); LCDGotoXY(3,1); cadenaLCD("MONITORING",10); _delay_ms(1500); LCDclr; LCDGotoXY(0,0); LCDstring("Humedad = %",15); LCDGotoXY(0,1); LCDstring("Temperatura =",13);
5) Ahora los valores del sensor ADC del canal se inicializan en variables: num_LDR, num_Moist y num_temp. Los valores de humedad y temperatura son de naturaleza análoga, por lo tanto, se asignan mediante una fórmula. wet_per se usa para calcular el valor de humedad en porcentaje y temp_c se usa para calcular el valor de temperatura en Celsius.
núm_LDR =adc_read(0); num_Moist =adc_read(1); num_temp =adc_read(2); húmedo_per=((float)num_Moist/1023*100); húmedo_por=100-moist_per; temp_c=((float)num_temp/1023*5*100);
6) Ahora el cursor LCD está asignado a (10,0) para imprimir el porcentaje de humedad. Después de eso, el cursor LCD se asigna a (13,1) para imprimir el valor de temperatura en Celsius.
LCDGotoXY(10,0); sprintf (húmedo,"%d",moist_per); LCDstring (húmedo, strlen (húmedo)); LCDGotoXY(13,1); sprintf (temperatura,"%dc",temp_c); cadena LCD (temperatura, strlen (temperatura));
7) Se agregan dos condiciones para el sensor de humedad: a) cuando el porcentaje es inferior a 30, el pin 5 del puerto D será donde se conecta el relé y se apagará cuando el valor de humedad supere el 70 por ciento. Después de eso, existe una condición para que LDR detecte luz u oscuridad. Si el valor LDR es inferior a 500 en términos de ADC, entonces está oscuro afuera, entonces se llamará a la función ir_count, que encenderá la luz de acuerdo con la cantidad de personas que entraron o salieron del jardín .
si (moist_per<30) { PORTD = (1<<PD5); } si(moist_per>70) { PUERTO &= ~(1<<PD5); } si(núm_LDR<500) ir_count; demás PUERTO &= ~0x0f;
Consulte el código completo y pruebe este proyecto ahora.
Código fuente del proyecto
###
//Programa para /* * jardín_monitoring.c * * Creado: 3/11/2019 10:45:12 a.m. *Autor: Administrador */ #definir F_CPU 16000000UL #incluir#incluir #incluir #definir IR1 0b00001000 #definir IR2 0b00010000 char LDR(5),Húmedo(5),temp(5); int num_LDR,num_Húmedo,num_temp; int persona=0; int húmedo_per,temp_c; uint16_t adc_read(uint8_t); anular adc_init; anular ir_count; int principal (vacío) { DDRA = 0x00; DDRB = 0xff; PUERTO = 0x00; PUERTOB = 0x00; DDRD = 0xff; PUERTO = 0x00; adc_init; inicio LCD; LCDclr; Cursor LCD APAGADO; LCDGotoXY(3,0); LCDstring("INGENIEROS",9); LCDGotoXY(4,1); LCDstring("GARAJE",6); _delay_ms(1500); LCDclr; LCDGotoXY(4,0); cadenaLCD("BIENVENIDO",7); LCDGotoXY(6,1); cadenaLCD("A",2); _delay_ms(1000); LCDclr; LCDGotoXY(5,0); Cadena LCD("JARDÍN",6); LCDGotoXY(3,1); cadenaLCD("MONITORING",10); _delay_ms(1500); LCDclr; LCDGotoXY(0,0); LCDstring("Humedad = %,15); LCDGotoXY(0,1); LCDstring("Temperatura =",13); mientras (1) { núm_LDR =adc_read(0); num_Moist =adc_read(1); num_temp =adc_read(2); húmedo_per=((float)num_Moist/1023*100); húmedo_por=100-moist_per; temp_c=((float)num_temp/1023*5*100); LCDGotoXY(10,0); sprintf(Húmedo,"%d ",moist_per); LCDstring(Húmedo,strlen(Húmedo)); LCDGotoXY(13,1); sprintf(temp,"%dc",temp_c); cadenaLCD(temperatura,strlen(temperatura)); si (moist_per<30) { PUERTO = (1< 70) { PUERTO &= ~(1< ###
Diagramas de circuito
| AVR-ATmega16-Diagrama-de-circuito-1 del sistema-de-monitoreo-de-jardín | ![]() |
