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: