Proiectul meu consta in realizarea unui sistem de supraveghere a unei plante. Scopul este de a o ajuta sa creasca autonom, oferindu-i apa si lumina atunci cand are nevoie.
Am pornit de la ideea ca fiecare dintre noi avem acasa o planta pe care uitam sau nu avem timp sa o ingrijim. Ar fi util sa existe un sistem care sa se ocupe de aceasta.
Piese necesare pe langa componentele de baza:
| Piesa | Distribuitor | Cod | Cantitate | Pret (buc.) |
|---|---|---|---|---|
| Senzor umiditatea solului | Robofun | SEN-VRM-31 | 1 | 28 |
| Pompa de apa micro | Robofun | MCN-ALT-03 | 1 | 18 |
| Senzor de lumina cu fotorezistor | Optimus Digital | 0104110000000330 | 1 | 10 |
| Leduri | Optimus Digital | 0104110000006448 | 2 | 1 |
| Rezistente | Optimus Digital | 0104110000010070 | 2 | 0.5 |
| Breadboard | Optimus Digital | 0104110000000156 | 1 | 13 |
| Tranzistor de putere | Comet | IRLML2502 | 1 | 0.5 |
| Diode | Conex Electronic | 1N4007 | 4 | 1 |
| Fire conexiune tata-tata (20 buc) | Robofun | ACS-CAB-11 | 1 | 9 |
Am folosit ca mediu de dezvoltare Atmel Studio 7.0.
Senzorul de umiditate are output analogic. Am folost Convertorul Analogic-Digital pe portul A, canalul 0. Daca umiditatea devine critica, setez pinul aferent pompei pe 1.
Senzorul de lumina are output digital. Acesta este implementat cu o fotorezistenta, care permite curentul sa treaca sau nu. Daca senzorul nu detecteaza lumina, setez portul aferent sursei de lumina pe 1.
/*
* main.c
*
* Created: 21.05.2016 00:03:07
* Author : Adela*/
#ifndef F_CPU
#define F_CPU 16000000UL // 16 MHz clock speed
#endif
#include <avr/io.h>
#include <util/delay.h>
void InitADC()
{
ADMUX=(1<<REFS0); // For Aref = AVcc;
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); //Prescalar div factor = 128
}
uint16_t ReadADC(uint8_t ch)
{
//Select ADC Channel ch must be 0-7
ch=ch&0b00000111;
ADMUX|=ch;
//Start Single conversion
ADCSRA|=(1<<ADSC);
//Wait for conversion to complete
while(!(ADCSRA & (1<<ADIF)));
//Clear ADIF by writing one to it
//Note you may be wondering why we have write one to clear it
//This is standard way of clearing bits in io as said in datasheets.
//The code writes '1' but it result in setting bit to '0' !!!
ADCSRA|=(1<<ADIF);
return(ADC);
}
void Wait()
{
uint8_t i;
for(i=0;i<20;i++)
_delay_loop_2(0);
}
int main(void)
{
DDRD |= (1 << PD3); //Sets PD3 as Output
DDRD |= (1 << PD4); //Sets PD4 as Output
DDRD &= ~(1 << PD5); //Sets PD5 as Input
uint16_t adc_result;
//Initialize ADC
InitADC();
while(1) //infinite loop
{
adc_result=ReadADC(0); // get adc data
Wait();
if(adc_result > 500){
PORTD &= ~(1 << PD3); // off
_delay_ms(500);
} else {
PORTD |= (1 << PD3); // on
_delay_ms(500);
}
if(PIND & (1<<PD5)) {
PORTD |= (1 << PD4); // on
} else {
PORTD &= ~(1 << PD4); // off
}
}
}
Proiectul a fost simplu de realizat dar a rezultat un sistem practic pe care pot sa il folosesc in viitor.
Inbunatatiri care s-ar putea aduce: