Monitoramento e automação de jardins com ATmega16

Monitoramento e automação de jardins com ATmega16

Jardinar é um dos hobbies comuns. Isso mantém você perto da natureza. Isso é mais saudável hobby que qualquer um pode ter. Porém, plantas e árvores são como animais de estimação. Eles precisam de cuidados contínuos sem quebrar. É preciso estar com todos eles tempo. Isto nem sempre é possível. Pode ser necessário sair de férias ou viagens de negócios ou viajar por outros motivos. Nessas alturas, o jardim pode permanecer sem vigilância durante algum tempo ou mesmo pode ficar sem vigilância durante um longo período de tempo. Este projeto visa cuidar do jardim sozinho com a ajuda da eletrônica. Isso eliminará obrigações desnecessárias e também facilitará a jardinagem.

Este projeto é um sistema de monitoramento e automação de jardins. Ele é construído usando Microcontrolador AVR e um monte de sensores eletrônicos. O AVR controlador usado no circuito é ATmega16. O ATmega16 monitora continuamente a umidade do solo com a ajuda de Sensor de umidade do solo e controla uma bomba de água (aqui Motor DC para fins de demonstração) à medida que o solo seca. O controlador também rastreia a temperatura ambiente com a ajuda de Sensor de temperatura LM35 e liga a bomba de água à medida que a temperatura aumenta. O ATmega16 também consegue controlar a iluminação do jardim. Ele rastreia se é dia ou noite com a ajuda de um Luz Dependente Resistor. Se for noite, monitora se alguém entra no jardim com a ajuda de Sensores infravermelhos. Ele rastreia número de visitantes que utilizam sensores IR e acendem luzes LED de acordo com o número de ocupantes no jardim. O controlador também tem interface com um LCD de 16X2 caracteres onde exibe atual temperatura e porcentagem de umidade do solo do LM35 e do Sensor de Umidade do Solo, respectivamente.

O controlador é programado usando C incorporado. Estúdio AVR 4 é usado para escrever, editar e compilar código para ATmega16. Este projeto torna um jardim totalmente automatizado e autocuidado. Também economiza eletricidade ao controlar a bomba apenas quando há necessidade de água no jardim.

Componente necessário –

Microcontrolador ATmega16 – 1

Visor LCD 16×2 – 1

Módulo infravermelho – 2

LM32-1

Sensor de umidade do solo – 1

LDR – 1

16MHz oscilador de cristal – 1

LIDERADO – 4

5v Retransmissão – 1

2N2222 – 1

1K resistente – 3

10 mil resistente – 1

22pf capacitor – 2

10 mil potenciômetro – 1

Programador AVR – 1

PCB/placa de ensaio – 1

7805 – 1

Fonte de alimentação – 1

Fio de conexão – conforme necessário

Diagrama de bloco:-

Diagrama de blocos do sistema de monitoramento e automação de jardins baseado em AVR ATmega16

Fig. 1: Diagrama de blocos do sistema de monitoramento e automação de jardins baseado em AVR ATmega16

Diagrama de circuito –

Diagrama de circuito do sistema de monitoramento e automação de jardim baseado em AVR ATmega16

Fig. 2: Diagrama de circuito do sistema de monitoramento e automação de jardim baseado em AVR ATmega16

Habilidades pré-requisitos –

Antes de tentar este projeto, o desenvolvedor deve ter os seguintes pré-requisitos:

1) O desenvolvedor deve ter conhecimentos básicos de Microcontroladores AVR.

2) O desenvolvedor deve estar familiarizado com programação em Estúdio AVR 4.

3) O desenvolvedor deve saber como LCD 16X2 tem interface com AVR controlador e o texto é exibido nele.

4) O desenvolvedor deve saber como ao controle CC motor usando microcontrolador AVR.

5) O desenvolvedor deve ter entendimento de trabalhando com ADC interno do controlador AVR.

Conexões de Circuito –

O circuito deste projeto é baseado no AVR ATmega16. Todos os outros componentes fazem interface com o controlador. O circuito é projetado montando os seguintes componentes –

1) AVR ATmega16 – Atmega16 é um 8 bits Microcontrolador AVR com 32 pinos de E/S. Ele faz interface com sensores e LCD de caracteres para projetar o circuito deste projeto. ATmega16 tem o seguinte diagrama de pinos –

Diagrama de pinos do microcontrolador AVR ATmega16

Figura 3: Diagrama de pinos do microcontrolador AVR ATmega16

2) LCD de caracteres 16X2 – Um LCD de caracteres é conectado ao controlador para exibir a temperatura ambiente e o nível de umidade do solo. O pino VSS do LCD de caracteres está conectado ao terra e o pino VDD está conectado a 5V DC. O RS, RW e Os pinos E do LCD são conectados aos bits 0, 1 e 2 da Porta C do ATmega16 respectivamente. O LCD faz interface no modo de 4 bits com o controlador AVR. Os pinos de dados D4, D5, D6 e D7 do LCD são conectados aos bits 4, 5, 6 e 7 da Porta C do ATmega16 respectivamente.

3) Sensor de temperatura LM35 – LM35 é um sensor de temperatura popular. O sensor possui três terminais – VCC, Saída e Chão. Os terminais VCC e Terra são conectados a 5 Vcc e terra comum, respectivamente. O terminal de saída está conectado ao bit 2 da Porta A do ATmega16.

4) Sensor de Umidade do Solo – O sensor de umidade mede o conteúdo volumétrico de água do solo com a ajuda de uma sonda sensora que deve ser colocada no solo. O módulo sensor opera entre tensões de 3,3 V a 5V. Tem um LM393 comparador a bordo. O módulo possui quatro terminais – VCC, Terra, Saída de dados e Saída analógica. Os pinos VCC e Terra são conectados ao VCC e Terra comuns, respectivamente. O pino de saída analógica do sensor está conectado ao bit 1 da Porta A do AVR.

5) Sensor LDR – O sensor LDR é usado para detectar dia ou noite neste circuito. O sensor LDR é dois terminais resistor sensível à luz. Ele está conectado como uma rede divisora ​​de tensão no bit 0 da Porta A do ATmega16.

6) Sensores IR – Existem dois módulos de sensores IR usados ​​no projeto. Os dois módulos são usados ​​para detectar Entrada e saída de um visitante. Cada módulo de sensor é construído a partir de um par de transmissor IR e receptor IR. O emissor é simplesmente um LED IR e o detector é simplesmente um fotodiodo IR que é sensível à luz IR do mesmo comprimento de onda emitida pelo LED IR. O módulo sensor possui uma saída digital. O módulo do sensor deve gerar lógica HIGH ou lógica LOW para que possa ser detectado no pino GPIO do microcontrolador. A saída analógica do fotodiodo pode ser convertida em dados digitais usando Conversores Analógico para Digital (ADC). Um amplificador operacional é usado para converter a saída analógica do fotodiodo em lógica digital de BAIXO ou ALTO. Os módulos de sensor IR têm o seguinte diagrama de circuito –

Diagrama de circuito do módulo sensor IR

Fig. 4: Diagrama de Circuito do Módulo Sensor IR

Para a confecção do módulo sensor, os transmissores IR são conectados em série com resistores pull-up de 470 ohm entre VCC e aterramento avançar configuração de polarização. Os receptores IR são conectados em série com resistores variáveis ​​entre VCC e terra em configuração de polarização reversa formando um circuito divisor de tensão. A saída dos receptores IR (fotodiodos) é extraída da junção dos terminais catódicos do receptor IR e dos resistores variáveis. Esse par de receptor e transmissor IR é conectado entre o VCC e o terra para formar o módulo do sensor IR. A saída dos receptores IR é conectada aos bits 3 e 4 da Porta A do ATmega16 via comparador OPAM. LM358M pode ser usado como comparador OPAMP.

7) LEDs – Existem 4 LEDs interligados nos bits 0, 1, 2 e 3 da Porta B do ATmega16. Esses LEDs são para fins de demonstração para mostrar o controle da iluminação no jardim. Numa versão prática do circuito, poderiam existir luzes LED controladas através de relés pelo controlador.

8) Motor DC – Um motor DC é interligado no bit 5 da Porta D do AVR. Este motor é para fins de demonstração para mostrar o controle de água bomba pelo controlador. Em uma versão prática deste circuito, poderia haver uma bomba d'água real que pode ser conectada ao controlador com a ajuda de um relé de 6V.

9) Fonte de alimentação – O circuito pode ser alimentado por uma bateria e um regulador IC de 5 V como 7805. Ele também pode ser alimentado pela rede elétrica CA usando um demitir-se Circuito transformador e retificador com 7805 regulador de voltagem.

Primeiro de tudo, é necessário carregar o código hexadecimal no ATmega16 usando o programador AVR. Em seguida, o circuito pode ser montado em uma placa de ensaio ou soldado em uma placa de circuito impresso. Será melhor testar primeiro em uma placa de ensaio.

Como funciona o circuito –

Quando o microcontrolador é alimentado por uma fonte de 5V DC, primeiro ele pisca algumas mensagens iniciais na tela LCD como “Engineers Garage” e “BEM-VINDO AO GARDEN MONITORING”. Depois que essas mensagens piscam na tela LCD uma vez, o controlador lê as tensões analógicas do Sensor de Umidade do Solo e do LM35 Sensor de temperatura. Ele converte as tensões analógicas em valores digitais usando canais ADC integrados de 10 bits. As leituras digitalizadas são convertidas pelo código em medições em grandezas físicas reais, ou seja, percentagem de umidade em solo e ambiente temperatura, e então exibido no LCD de caracteres.

Se o nível de umidade detectado pelo sensor de umidade cair abaixo de um nível limite, o controlador liga o motor para bombear água no jardim. A água é fornecida a diferentes partes do jardim com a ajuda de um kit gotejador. Da mesma forma, se a temperatura ambiente subir acima de um nível limite, o controlador liga novamente o motor para bombear água no jardim. Então que, a temperatura do jardim, pode ser arrefecida.

Este sistema de monitoramento de jardim também controla a iluminação do jardim. Ele rastreia o dia ou a luz com a ajuda de LDR sensor. Se for noite, ele detecta Entrada e saída de qualquer visitante com a ajuda de dois módulos sensores IR. Se uma pessoa entra no jardim em noite, ele acende um LED. Se outra pessoa entrar, acende mais um LED. Da mesma forma, outros LEDs são acesos. Da mesma forma, se número de ocupantes no jardim é reduzido em saída de um ou mais ocupantes, os LEDs são desligados de forma semelhante de acordo com o número de ocupantes atuais no jardim.

O ATmega16 detecta a tensão analógica de umidade sensor e o sensor de temperatura e convertê-los em leituras digitais usando canais ADC integrados. ATmega16 possui resolução ADC de 10 bits, portanto, pode converter leituras de tensão para um valor entre 0 e 1023.

2n -1 = 210 -1 = 1023

Possui 8 canais ADC que possuem entrada nos pinos 0 a 7 da Porta A. O funcionamento deste circuito é baseado no recurso ADC do microcontrolador. Atmega16 possui os seguintes registros internos associados ao recurso ADC integrado –

1) ADMUX (registro de seleção de multiplexador ADC)

2) ADCSRA (Registro de Controle e Status ADC)

3) ADCL e ADCH (registros de dados ADC)

4) SFIOR (registro de função especial IO)

O funcionamento dos canais ADC é controlado pelo registro ADMUX no Atmega16. O registro ADMUX possui os seguintes valores de bits –

Valores de bits do registro ADMUX do AVR ATmega16

Fig. 5: Valores de bits do registro ADMUX do AVR ATmega16

Os bits REFS1 e REFS0 são usados ​​para selecionar a referência de tensão. A referência de tensão é selecionada de acordo com os seguintes valores de bit de REFS1 e REFS0 –

Aqui, AVCC com capacitor externo no modo de pino AREF é selecionado, para o qual REFS0 é definido como 1 e REFS1 é definido como 0. Como REFS1 é zero por padrão, apenas REFS1 precisa ser modificado como segue –

ADMUX = (1<

O bit ADLAR afeta a apresentação do resultado da conversão ADC no Registro de Dados ADC. Ao escrever 1 em ADLAR, o resultado da conversão fica ajustado. Caso contrário, o resultado será ajustado corretamente.

Mudança de bits dos registros de dados ADC de acordo com o status do bit ADLAR no registro ADMUX

Fig. 6: Mudança de bits dos registros de dados ADC de acordo com o status do bit ADLAR no registro ADMUX

Os bits MUX4 a MUX0 são utilizados para selecionar canal analógico, tipo de entrada e ganho. O canal de entrada e a seleção de ganho são feitos da seguinte forma –

Aqui o Canal ADC 3 é selecionado definindo MUX0 como 1 e MUX1 como 1 como segue –

ADMUX = (1<

O ADCSRA tem os seguintes valores de bits –

Valores de bits do registro ADCSRA do AVR ATmega16

Figura 7: Valores de bits do registro ADCSRA do AVR ATmega16

O bit ADEN é usado para o habilitar ADC. Os bits ADPS2, ADPS1, ADPS0 são utilizados para determinar o fator de divisão entre a frequência XTAL e o clock de entrada do ADC. O bit ADSC é usado para iniciar cada conversão no modo de conversão única e iniciar a primeira conversão no modo de execução livre. A parte UM ENCONTRO é usado para ativar o disparo automático. O bit ADIF é definido quando uma conversão ADC é concluída e os registros de dados são atualizados. O bit ADIE é usado para ativar a interrupção quando conversação está completo. Aqui, o registro de controle ADC é definido da seguinte forma –

ADCSRA = (1<

O registro SFIOR é usado para disparo automático. Este registro não é utilizado na programação deste projeto.

Guia de programação –

Este sistema é baseado no AVR ATmega16. Ele é programado em C embarcado usando AVR Studio 4. Outras ferramentas de programação como Atmel Studio ou Notepad++ também podem ser usadas para escrever e compilar o código. Primeiro de tudo, do utilizador precisa adicionar LCD biblioteca fornecida abaixo em arquivo zip, copie e cole o código no AVR Studio 4 para gerar o arquivo hexadecimal.

Aqui, ATmega16 é usado para detectar a condição de jardim e tomar as medidas apropriadas para controlar a jardinagem equipamentos como motor e luzes. O LCD tem interface com o atmega16 para monitorar o valor da temperatura ambiente e da umidade do solo por meio de sensores.

Constantes usadas no código: –

#define F_CPU 16000000UL:– Constante usada para definir a frequência do clock do MCU

#define IR1 0b00001000:– O sensor IR 1 está conectado ao pino 4 do PORTA

#define IR2 0b00010000:– O sensor IR 2 está conectado ao pino 5 do PORTA

Variável usada no código: –

int num_LDR; :– Para obter o valor ADC do LDR

int num_Moist; :– Para obter o valor ADC de solo sensor de umidade

int num_temp; : – Para obter a temperatura v

int pessoa=0; :– Para Contar o número de pessoa entrou ou saiu

int úmido_per; :– Para calcular a umidade em porcentagem

int temp_c; :- Para calcular a temperatura em Celsius

caractere LDR(5); :– Para imprimir o valor LDR no LCD

char Úmido(5); :– Para imprimir a porcentagem de umidade do solo no LCD

temperatura do caractere (5); :– Para imprimir o valor LM35 em Celsius no LCD

Arquivo de cabeçalho e bibliotecas usadas no código: –

#include : – Cabeçalho AVR padrão para entrada/saída

#include : – Cabeçalho AVR padrão para fornecer atrasos de tempo

#include :- Biblioteca externa para operações de LCD

Funções usadas no código: –

adc_init:– Para inicializar o ADC no ATmega16

adc_read:– Para ler o valor ADC no canal selecionado

ir_count :– Para contar a pessoa que entrou/saiu para controlar o LED

LCDinit :– Para inicializar o LCD

LCDclr:– Para limpar o LCD

Cursor LCD DESLIGADO:– Para desligar o cursor

LCDGotoXY:– Para mapear o cursor

LCDstring :– Para imprimir a String no LCD

corrida :– Armazenar valor como personagem imprimir em LCD

Algoritmo:-

O código deste sistema de monitoramento e automação de jardins funciona de acordo com o seguinte algoritmo –

1) Quando o circuito é ligado, primeiramente as Portas são inicializadas como entrada e saída. A Porta A é definida como entrada por definindo DDRA para 0x00. A Porta B e a Porta D são definidas como saída por definindo DDRB e DDRD respectivamente para 0xff. Inicialmente, todas as portas são definidas como BAIXO passando 0x00 para Porta A, Porta B e Porto D.

DDRA = 0x00;

          DDRB = 0xff;

          PORTA = 0x00;

          PORTB = 0x00;

          DDRD = 0xff;

          PORTD = 0x00;

2) Depois disso, o ADC é inicializado pela função adc_init para ativar a operação do ADC nos pinos do ADC. A função LCDinit é usada para inicializar o LCD para operações de LCD. Quando o LCD está ligado, ele pode ter um valor lixo, então, a função LCDclr é usada para limpar o LCD e o cursor é desligado usando a função LCDcursoroFF .

adc_init ;

          LCDinit ;

          LCDclr ;

          LCDcursorOFF ;

3) Aqui, o cursor LCD é mapeado em (3,0), o que significa primeira linha e 3terceiro coluna. É usado para imprimir “ENGINEERS” então o cursor LCD é mapeado em (4,1) que é 2e linha e 4º coluna e “GARAGEM” é impresso. Demora algum tempo após o qual o LCD é limpo usando a função LCDclr .

LCDGotoXY(3,0);

          LCDstring("ENGINEERS",9);

          LCDGotoXY(4,1);

          LCDstring("GARAGE",6);

          _delay_ms(1500);

            LCDclr ; 

4) Agora, o LCD está pronto para imprimir próximo mensagem. Portanto, o cursor LCD é colocado em (4,0) para imprimir “BEM-VINDO” e é novamente definido em (6,1) para imprimir “PARA”. Após alguns atraso está limpo e um novo massagem “JARDIM”, “AUTOMAÇÃO” são impressos de acordo com o mapeamento definido. A mensagem permanece na tela e após algum atraso, as mensagens finais “Umidade =”, “Temperatura =” são impressas no LCD com Saídas de Sensor.

LCDGotoXY(4,0);

          LCDstring("WELCOME",7);

          LCDGotoXY(6,1);

          LCDstring("TO",2);

          _delay_ms(1000);

          LCDclr ;

         

          LCDGotoXY(5,0);

          LCDstring("GARDEN",6);

          LCDGotoXY(3,1);

          LCDstring("MONITORING",10);

          _delay_ms(1500);

          LCDclr ;

         

          LCDGotoXY(0,0);

          LCDstring("Moisture =    %",15);

          LCDGotoXY(0,1);

          LCDstring("Temperature =",13);

5) Agora, os valores do sensor de ADC canal são inicializados nas variáveis ​​– num_LDR, num_Moist e num_temp. O valor de Umidade e Temperatura é de natureza análoga, portanto, são mapeados via fórmula. O wet_per é usado para calcular o valor de umidade em porcentagem e temp_c é usado para calcular o valor de temperatura em Celsius.

num_LDR   =adc_read(0);

                   num_Moist =adc_read(1);

                   num_temp  =adc_read(2);

                  

                   moist_per=((float)num_Moist/1023*100);

                   moist_per=100-moist_per;

                   temp_c=((float)num_temp/1023*5*100);

6) Agora, o cursor do LCD está mapeado em (10,0) para imprimir a porcentagem de umidade. Depois disso, o cursor do LCD é mapeado em (13,1) para imprimir o valor da temperatura em Celsius.

LCDGotoXY(10,0);

                   sprintf(Moist,"%d ",moist_per);

                   LCDstring(Moist,strlen(Moist));

                   LCDGotoXY(13,1);

                   sprintf(temp,"%dc  ",temp_c);

                   LCDstring(temp,strlen(temp));

7) Existem duas condições adicionadas para o sensor de umidade – a) quando a porcentagem for inferior a 30, o pino 5 da porta D estará onde retransmissão está conectado e desligará quando o valor de umidade exceder 70 por cento. Depois disso, existe uma condição para o LDR detectar claro ou escuro. Se o valor LDR estiver abaixo de 500 em termos de ADC, então está escuro lá fora, então a função ir_count será chamada, que acenderá a luz de acordo com o número de pessoa entrou/saiu em jardim.

           if (moist_per<30)

                   {

                             PORTD  = (1<<PD5);

                   }

          if(moist_per>70)

                   {

                             PORTD &= ~(1<<PD5);

                   }

                  

          if(num_LDR<500)

                               ir_count ;        

                   else

                             PORTB &= ~0x0f;

Confira o código completo e experimente este projeto agora.

Código-fonte do projeto

###

//Program to
/*

 * Garden_monitoring.c

 *

 * Created: 3/11/2019 10:45:12 AM

 * Author : Administrator

 */ 


#define F_CPU 16000000UL


#include 

#include 

#include 


#define IR1   0b00001000

#define IR2   0b00010000


char LDR(5),Moist(5),temp(5);

int num_LDR,num_Moist,num_temp;

int person=0;

int moist_per,temp_c;


uint16_t adc_read(uint8_t );

void adc_init ;

void ir_count ;


int main(void)

{

DDRA = 0x00;

DDRB = 0xff;

PORTA = 0x00;

PORTB = 0x00;

DDRD = 0xff;

PORTD = 0x00;


adc_init ;

LCDinit ;

LCDclr ;

LCDcursorOFF ;


LCDGotoXY(3,0);

LCDstring("ENGINEERS",9);

LCDGotoXY(4,1);

LCDstring("GARAGE",6);

_delay_ms(1500);

    LCDclr ;


LCDGotoXY(4,0);

LCDstring("WELCOME",7);

LCDGotoXY(6,1);

LCDstring("TO",2);

_delay_ms(1000);

LCDclr ;


LCDGotoXY(5,0);

LCDstring("GARDEN",6);

LCDGotoXY(3,1);

LCDstring("MONITORING",10);

_delay_ms(1500);

LCDclr ;


LCDGotoXY(0,0);

LCDstring("Moisture =    %",15);

LCDGotoXY(0,1);

LCDstring("Temperature =",13);



while (1)

{

num_LDR   =adc_read(0);

num_Moist =adc_read(1);

num_temp  =adc_read(2);


moist_per=((float)num_Moist/1023*100);

moist_per=100-moist_per;

temp_c=((float)num_temp/1023*5*100);


LCDGotoXY(10,0);

sprintf(Moist,"%d ",moist_per);

LCDstring(Moist,strlen(Moist));

LCDGotoXY(13,1);

sprintf(temp,"%dc  ",temp_c);

LCDstring(temp,strlen(temp));


if (moist_per<30)

{

PORTD  = (1<70)

{

PORTD &= ~(1<

###

 

Diagramas de circuito

AVR-ATmega16-Garden-Monitoring-System-Circuit-Diagram-1

Vídeo do projeto

Zurück zum Blog

Hinterlasse einen Kommentar

Kommentare müssen vor der Veröffentlichung freigegeben werden.