Rezumatul lucrării [307949]

[anonimizat]. [anonimizat]. The need for food pushed humans to search for optimal conditions which would guarantee high yields with as little manual labor as possible.

[anonimizat]. [anonimizat]: [anonimizat], [anonimizat], [anonimizat].

Figure . Stages in the development of agriculture

The last stage in Figure 1 is modern agriculture. It’s [anonimizat]. It’s worth mentioning the fact that the number of disciplines with utility in food production is steeply increasing: biology, chemistry, physics and engineering are only a [anonimizat].

[anonimizat], has immesurable value. One can ignore the exterior environment by building an artificial microenvironment. This may well be the solution to hungar worldwide or providing food in space.

The purpose of this work is to design and build a small size enclosure providing fine measuring and control of the environment inside. There are several systems providing similar functionalities already on the market. The following models operate using different approaches for reaching slightly the same result. They are representative for three separate technologies popular in automated plant cultivation and also for positioning the work in the worldwide state of the art.

FarmBot (Figure 2) is a public resource project using the CNC technology (Computer Numerical Control) which involves the cartesian robotization of the cultivating process. A cartesian robot is a robot that has 3 liniar axis and its movements are realized in straight lines. It can cover a cultivation surface of 2.9m x 1.4m. The plants hights must not exceed 0.5m.

SmartTerra is a Terrarium which allows the user to customize the envinronment parameters of an enclosed microenvironment. The LED illuminating system controls the light levels. [anonimizat]. [anonimizat]. The users can control the settings via a mobile application if they choose to.

AvaByte is an example of minimal input system. The technology it encompasses is however fairly modern. AvaByte makes use of the hydroponic technology which enables growing crops without a gram of soil. The nutrients are fed to the plants directly in their water in an innovative manner. The water level is adjusted according to the needs of the plants (Figure 2).

Figure . FarmBot, SmartTerra and AvaByte

The aim of this project is to build an artificial microsystem for harbouring a fine tunable microenvironment which would provide special conditions needed by certain plants to flourish. The system needs to be bapable of monitoring and modifying the following environment parameters: [anonimizat]ients level in the soil, the air humidity and the temperature and light for all the enclosement.

For reaching the expected result there’s the need to combine hardware resources and software resources with materials science and infrastructure design and constructuion. There will be a list of all these fields and possible and adopted solutions accompanied by their details and reasons for adoption.

The end product is made of the following subsystems:

Infrastructure (this component offers structure and support for the electronics)

The action power switch module

The power supply

The development board

Software resources

The temperature control system

The air humidity control system

The soil humidity control system

The soil nutrients supply system

The lighting system

The 3D physical model of the system.

Figure . Project in 3D

Certain components need a dedicated power supply and higher voltages and currents than the development board can supply. Thus, there’s the need for special elements to link the command signal from the board to these control components and their dedicated power supply. A DC motor needs a voltage of 12V which will be provided by an external source. However, switching the motor on and off will sill need to be commanded by the development board.

A component which can provide power to the actuators at a certain command is the relay. A relay is an electronic component which under the influence of a command signal will switch the current on a load OFF or ON. There are several kinds of relays. For this application we will consider two main relay types: the electromagnetic relay and the solid-state relay. Ultimately we will use electromagnetic ones because of their large availability on the market and their considerably lower price.

The most confortable way to satisfy the greater power needs is to use a PC power supply. Largely available and very versatile, it supplies various voltages that fit the needs of this project exactly. It can provide 3.3V, 5V and 12V DC voltages and this at currents much higher than the application will ever need. Table 1 holds the values of the voltages we would need, mapped to the colors of the wires of a standard ATX PC power supply.

Table . ATX Power supply voltages

The development board:

Arduino Mega is very similar to Arduino Uno, it follows the same pattern and principles but offers better resources. Most importantly, it has more memory and a far larger number of input/output pins.

The very reason we will use Arduino Mega 2560 over the Uno is the high quantity of pins. This offers the possibility to connect different modules and electronic devices in a tidier manner. Topping that, there is the possibility to extend the functionalities of the project further down the line without constraints from the board. The board connects to the PC via the serial port.

The greenhouse will work under instant manual control, using a desktop application front end written with C#, as well as in automatic mode. The automatic script will allow changing the parameters in the enclosure at certain predefined values at certain predefined moments in time. The development board will need to store the script and run it. For data persistency between supposed board restarts and for versatility and scalability reasons a MicroSD card will be used.

The communication interface between a MicroSD card module and the Arduino board is based on SPI (Serial Periferal Interface). The communication is synchronous and the device that sends the clock signal will be the master device. The other device will be the slave.

The figure above exemplifies the SPI protocol. When the master sends data to the slave, it does it using MOSI, then when the slave sends a response it will send it using a previously established clock cycles from MISO. There is also a chip select signal which warns the slave that a data transmission is to take place in the near future. During the data transmission the CS signal is low and it will go back to high when the transmission is over.

The programming of the chosen development board(Arduino Mega 2560) as well as building a user interface capable of controlling the system’s actions requires software resources. For the PC application we will use the C# programming language together with the Visual Stusion IDE. For developing the Arduino code, we will use the dedicated integrated development envirionment, Arduino IDE.

The sensors used for data acquisition are DHT11 for air umidity and air temperature, NTC of 1 K with analog output and resistive sensor with two probes for soil humidity.

The actuators used to change the environment parameters are as follows: water pumps, RGB LED ribbon, the heating resistor, air fans and a humidifier.

The water pumps are powered at 3.3V from the ATX PC power supply and they are controlled using a spciale module based on electromagnetic relays. The heating resistor and the fans follow the same rules with the exception that they use a 12V supply voltage.

The most innovative and interesting actuator, with a special emphasis on its working principle, is the humidifier. It produces ultrasounds that generate water vapors. At it’s core lays a piezoelectric disc. The piezoelectric disc is able to convert electric energy in high frequency mechanical vibrations of a metallic diaphragm. If the vibration frequency is high enough, the water will change state to vapors.

The lighting system:

According to an article published by Linda Herridge from the NASA space center, based on experiments on red salad, the fllowing effect regarding blue and red LED lighting has been observed: the salad grown with this kind of lighting had a darker red color and a higher anociannine concentration, a strong antioxidant which can significantly reduce the negative effects of space radiation on humans. In the same article there is evidence that pure red light has another effect on wheat: it grows abnormally tall and colorless.

Table . Color influence at plants

Real time synchronization will be achived using a RTC(real time clock) module. Each time the module is supplied power from an exernanl source, it can be read by the development board. When the external power is missing, the clock will continue to count time using its internal energy souce, a CR2032 3V battery. The time is read from the module using I2C communication.

Mounting the water level sensor:

A Pull-up resistance configuration will be used to supply a HIGH signal when the switch is open. When the switch will turn off, the board will read a LOW signal and the LED designed to light up upon water reservoir refill needed will do so.

The DHT data acquisition circuit is similar, so that it also uses a pull-up resistance. The board reads a digital pin and the communication is done through the sensor’s own protocol.

Further improvements:

HD camera for monitoring the plant growth and development

Implementing a smart Hidroponic system similar to the one used in AvaByte

Water recycling system and access to the water network

The software development required for the project falls in the following categories:

Figure . Software Diagram

The following figures resamble the graphical user interface and at the same time they represent the experimental results thorugh the actions they embed.

The data script exported by the application to a file and the data script from microSD card are presented below.

Figure . TXT Files

The temperature increases as a result of turning on the heating resistance and it decreases through ventilation.

Figure .Temperature decreasing

Planificarea activității

Stadiul actual

Scurt istoric

Hrana, aerul și apa sunt condiții certe ale supraviețuirii, iar omul oriunde s-a stabilit a căutat să își subordoneze natura și să o facă să producă pentru el. Cu precădere în procurarea hranei, încă din cele mai vechi timpuri, omul a căutat să își creeze condiții optime și cât mai promițătoare. Cea mai la îndemână metodă a fost la început vânătoarea. Unelete special create pentru această îndeletnicire au ușurat eforturile umane. Pe urmă, a fost descoperită posibilitatea cultivării diferitelor plante cu scopul alimentației. Putem considera acest moment începutul agriculturii. De acum se poate discuta de un scop bine definit în a modela uneltele pentru muncile de agricultură. O reprezentare pentru îmbunătățirea tehnicii de exploatare a naturii se poate observa în Figura 1.

Figura . Evoluția tehnologiei

Similar cu ce se întâmplă în zilele noastre, cu cât este mai avansată tehnologia cu atât efortul uman necesar este mai redus. Dacă ar fi să împărțim evoluția acestui domeniu, cele mai potrivite etape ar fi: Unelte de piatră, Unelte de lemn, Folosirea animalelor, Unelte de metal, Motorul cu Aburi, Motorul cu combustibili fosili, Agricultura modernă.

Figura . Etapele tehnologiei în Agricultură

Putem lua ca și simbol al acestei evoluții primitivele pietre. Cu forme avantajos alese, folosite în urmă cu 2.6 milioane de ani, au fost reinventate și au devenit utile în construirea de unelte mai complexe: ciocane, topoare, sulițe de vânătoare, etc . Ele sunt stră-stră-stră…-bunicile tehnlogiei moderne.

Cu toate că în perioada actuală animalele sunt în multe cazuri folosite pe post de companie, este esențial să trecem în revistă utilitatea lor în alte scopuri. Unele sunt folosite la muncă(pentru tracțiune) așa cum altele pot fi folosite la vânătoare(câini), orientare(câini pentru nevăzători), alimentație(vite) sau în scop recreațional(călărie). Acestea au jucat un rol crucial atunci când nu exista o motorizare a muncii. Împreună cu un jug și un plug de lemn, un animal de tracțiune putea să inducă senzația omului că a ajuns la vârful tehnologiei. Totuși posbilitatea modelării fierului și a altor metale a deschis noi orizonturi. Tot ce era prea fragil a devenit mai durabil prin confecționarea din metal.

Următorul pas important a fost descoperirea motorului cu abur care a permis industrializarea agriculturii. Apare posibilitatea de cultivare în cantități mult mai mari, pe lângă cea a eliminării factorului uman din diverse procese extenuante. Aburul aducea diverse facilități, inestimabile pentru tehnologia de până atunci, însă avea și neajunsuri. Astfel, în anul 1892 a fost construit primul tractor cu combustibil fosil de către John Froelich în Statele Unite ale Americii.

Agricultura modernă

Ultima etapă din Figura 2, Agricultura Modernă, este dinamică și în continuă îmbunătățire, cuprinzând mai multe aspecte ale cultivării plantelor. Aici putem menționa faptul că tot mai multe domenii își găsesc utilitatea în facilitarea producției hranei: biologie, chimie, fizică și inginerie sunt doar niște titluri abstracte, însă fiecare dintre ele sunt implicate la nivel de detalii.

Există plante modificate genetic. Deși sunt privite de unii cu o oarecare reținere aceastea pot fi îmbunătățite să facă față mai bine unor anumite situații(ex.: secetă, umiditate extremă), să reziste la anumiți dăunători sau pur și simplu să ofere o producție mai bună. India a folosit în anul 2002 bumbac modificat genetic care conținea gene dintr-o anumită bacterie care ajută planta să reziste la omida de bumbac.

Putem face față crizelor de secetă sau putem furniza plantelor oricâtă apa au nevoie prin implementarea sistemelor de irigații. Statul Israel este un exemplu demn de menționat în acest aspect. Cu un teritoriu deșertic dar cu nevoia de aplicare a unei soluții, prin consecvență și mai ales prin tehnologie au reușit să aibă producții uimitoare în domeniul agriculturii. O tehnologie tot mai populară printre agricultori este irigarea prin picurare. Este o soluție aplicată de către Israel pentru culturile sale și dacă excludem sistemul de pompare discutăm despre o cale de transmitere a apei(bandă sau furtun) cu orificii aplicate la distanțe egale. Este important ca zonele unde apa picură să fie în mod evident amplasate în apropierea plantei. Această metodă (de folosire a conductelor cu orificii pentru implementarea picurării cu apă) a fost dezvoltată de către Simicha Blass și fiul său(primul experiment a avut loc în anul 1959).

Figura . Sistem de irigare prin picurare

Multe plante au nevoie de condiții speciale, condiții pentru care tehnologia poate asigura un control din ce în ce mai detaliat și precis. Dacă privim simplist putem considera serele un mod de a crea climatul și mediul specific anumitor plante. Totuși acestea pot fi îmbunătățite. Ingineria și-a adus contribuția în nenumărate domenii prin creșterea cantității, calității și aplicabilității informațiilor deținute. Acceste însușiri pot fi întrebuințate și în cazul serelor. Ingineria Electronică și Tehnologia Informației au o implicare tot mai vizibilă și indispensabilă în creșterea plantelor. Capacitatea unui sistem electronic inteligent de a funcționa după reguli iscusit implementate, la standarde și performanțe de funcționare mult mai exigente decât decât posibilitățile muncii exclusiv umane conferă acestei ramuri a ingineriei un statut privilegiat. Combinând biologia cultivării cu ingineria putem ajunge la un rezultat foarte satisfăcător, sisteme inteligente de creștere și întreținere a plantelor. Acestea pot fi de exemplu “grădini” verticale echipate cu tehnologie de ultimă generație, dispozitive deschise în care se cultivă sau sere, medii închise, de dimensiuni mai mari sau mai mici care înglobează diferite funcționalități care ajută la supraviețuirea plantelor în condiții optime. Potențialul de a crea un mediu artificial, propice plantelor este de o valoare impresionantă. Putem face abstracție de condițiile de mediu exterioare dacă realizăm un mediu artificial. Această abordare poate fi soluția pentru eradicarea foamentei sau asigurarea hranei în Spațiul Cosmic.

Tema acestei lucrări se concentrează pe realizarea unui spațiu închis, de dimensiuni mici, cu pobilitatea măsurării și controlului inteligent al condițiilor interioare de mediu. Următorul capitol studiază diferite sisteme care folosesc principii asemănătoare sau care sunt relevante în poziționarea lucrării în contextul de specialitate actual.

Sisteme inteligente de cultivare la nivel Micro

FarmBot

FarmBot(Figura 4) este un proiect cu resurse publice în tehnologie CNC (Computer Numerical Control) în care este vorba despre robotizarea carteziană a procesului de cultivare. Un robot cartezian este acela care are cele 3 axe liniare, mișcările lui realizându-se în linie dreaptă. Este capabil să planteze semințe de diferite plante pe o suprafață de 2.9 m x 1.4 m cu o înălțime maximă a plantelor de 0.5 metri fie în interior, fie în exterior.

Ca și funcționalități, FarmBot poate acoperi toate acțiunile precedente recoltării, afanarea solului, controlul mecanic al plantelor nedorite și irigarea. Brațul robotic are câte un capăt care se poate conecta automat pentru fiecare din funcționalitățile necesare.

La nivel de software, robotul este conectat la o aplicație web care funcționează sub licența Massachusetts Institute of Technology de unde utilizatorul poate seta diferiți parametrii: apă, fertilizator, pesticide, spațierea între semințe și calități ale mediului în funcție de măsurătorile senzorilor și timp.

Figura . FarmBot

SmartTerra

Un Terrarium este un container închis, de sticlă sau plastic care este special construit pentru creșterea și întreținerea plantelor.

SmartTerra este un Terrarium cu mediu personalizabil. Acesta poate crea un ecosistem după reguli prestabilite. Pentru un mediu există următoarele caracteristici: sistem LED de iluminare, simulare de ploaie și furtună, simulare de răsărit și de apus al soarelui, senzori pentru temperatură, umididatea aerului și a solului, difuzoare incorporate, conexiune Bluetooth și aplicație pentru telefonul mobil.

Sistemul de iluminare conferă condițiile necesare plantelor pentru a se dezvolta în funcție de intensitatea și culoarea luminii. De asemena contribuie la sistemul de simulare al furtunii și al ploii.

Răsăritul și Apusul împreună cu sunetele naturale transmise prin difuzoare întăresc ideea de mediu autentic.

În funcție de măsuratorile senzorilor capacitivi, irigarea și modificarea calităților aerului sunt realizate automat folosind apa din rezervorul alimentat manual. Aerul este circulat de sus în jos pentru a evita condensul.

Figura . Irigare și Ventilare

În Figura 5 sunt explicate prin desen modurile prin care se fac împrospătarea aerului și umidificarea solului.

AvaByte

AvaByte este un exemplu de dispozitiv simplu dacă vorbim de responsabilitățile revenite utilizatorului. Totuși tehnologia care stă la baza construcției este una modernă.

Scopul construcției acestui produs este crearea unei grădini în miniatură, de interior, iar cuvintele cheie menționate de producător sunt inteligență, simplă și sustenabilă. Are un număr de cinci recipiente care conțin deja semințele într-un material inovator, încărcat cu nutrienți, care înlocuiește solul. Este folosit Sistemul Hidroponic de cultivare a plantelor. Nu se folosește sol, doar apa, nivelul apei se modifică în funcție de nevoile plantei(Figura 6).

Figura 6. Poziționarea recipientelor de cultivare(stânga) și sistemul Hidroponic(dreapta)

Cu ajutorul LED-urilor RGB este stimulată creșterea plantelor prin furnizarea de lumină colorată și cu intensitate variabilă. Prin intermediul camerei HD se poate monitoriza evoluția plantelor și sănătatea lor. Senzorii prezenți în procesul de cultivare sunt:de umiditate,de nivel al apei ion rezervor, de lumină și de temperatură.

Capacitatea rezervoului de apă este de 3.2 litri, alimentarea se face la 12V(tensiune la care funcționează pompa de apă) și conexiunea se poate face prin Wifi la dispozitive cu sisteme de operare IOS, cel puțin IOS7, sau Android, cel puțin 5.1. Soft-urile de casă inteligente Amazon Alexa, Google Home și Apple HomeKit sunt compatibile cu AvaByte.

Toate aceste caracteristici fac dispozitivul potrivit pentru cultivarea de: tomate, ierburi, ardei, ciuperci, flori comestibile sau fructe de pădure. Singurul inconvenient este faptul că înaintea achizitonarii trebuie transmise producătorului semințele dorite.

Lucrurile care unesc aceste exemple de sisteme inteligente sunt capabilitățile acestora de a măsura diferiți parametrii și de a modifica mediul în care sunt plantele. Un astfel de sistem poate lua diferite forme: braț robotic ca FarmRobot, terrarium precum SmartTerra sau mini grădină deschisă asemănătoare cu AvaByte. În cele din urmă este mai puțin importantă forma sub care se prezintă, este mai important scopul. Ne propunem în acest proiect să dezvoltăm o incintă care poate fi folosită și pe post de terrarium, pentru crearea unui spațiu exotic dar și pe post de grădină închisă, sub formă de seră, pentru cultivarea legumelor. Decizia asupra tipului aplicației este lăsată la latitudinea utilizatorului, tocmai de aceea mediul este controlabil și dinamic.

Fundamentare teoretică

Acest capitol tratează soluțiile posibile pentru implementarea temei proiectului, le explică și concluzionează cu varianta potrivită pentru fiecare necesitate. În acest sens, primul pas este o descriere generală a ceea ce va însemna produsul final și capacitățile sale.

Expunerea succintă a temei

Ideea centrală a proiectului este de a realiza un microsistem artificial pentru întreținerea unui mediu propice plantelor. Acesta va fi capabil să monitorizeze dar să și modifice caracteristicile de mediu următoare: umiditatea solului, nutrienții solului, umiditatea aerului, temperatura și lumina în interiorul incintei.

Pentru a ajunge la rezultatul final este nevoie de combinarea resurselor hardware și software din ingineria electronică precum și de utilizarea anumitor materiale pentru construcția infrastructurii. Pentru toate acestea se vor prezenta în continuare soluțiile posibile și cele adoptate însoțite de explicații și motivare.

Ansamblele componente ale proiectului

Produsul finit este compus din urmatoarele principale sisteme:

Infrastructura(componenta suport pentru sistemele electronice)

Modulul de acționare

Sursa de alimentare

Placa de dezvoltare

Resurse software

Sistem de control al temperaturii

Sistem de control al umidității aerului

Sistem de control al umidității solului

Sistem de administrare a nutrienților

Sistem de iluminare

Infrastructura

Figura . Modelul 3D al proiectului

După cum se poate observa din Figura 6, partea de infrastructură este compusă din incinta propriu-zisă, postament și element de fixare al rezervoarelor pentru lichid. Celelalte două componente au rol în funcționarea electrică deci nu intră sub incidența infrastructurii.

Pentru postament și elementul de fixare existau variantele de metal, plastic sau lemn. Metalul ar fi adăugat o greutate considerabilă la produsul finit, însă ar fi adus și mai multă stabilitate și predictibilitate, totuși fixarea diferitelor elemente pe el necesită o abordare mai complexa. Daca s-ar fi folosit un postament fabricat din masa plastica am fi satisfacut atat rezistentă în timp cât și ușurința amplasării componentelor pe el însă am ales lemnul deoarece este mult mai ușor de modelat și are un preț mai avantajos pentru prototip.

Rezervoarele pentru lichid trebuie să poată stoca doi litri de lichid. Forma rezervoarelor nu este un detaliu important, însă poziționarea da, ele trebuie să fie amplasate într-un capăt al containerului cu plante pentru a nu obstrucționa vizibilitatea către plante, atât din față cât și din spatele machetei. Folosirea unor PET-uri ar fi fost foarte la îndemână doar că ar fi dat o notă de improvizație asupra lucrării. Rezervoarele de sticlă aduceau dezavantajul greutății și fragilității, mai mult, deoarece ne dorim să construim un sistem inteligent, există o mare probabilitate să fie nevoie de fixarea anumitor elemente în pereți, caz în care sticla ne defavoriza. În consecință au fost utilizate pentru construcția rezervoarelor tuburi de PVC închise etanș la capătul inferior cu garnitură de cauciuc și capac, iar la capătul superior cu un capac detașabil.

Modulul de acționare

Unele componente ale proiectului au nevoie de alimentare exclusivă și de valori mai mari decât poate furniza o placă de dezvoltare. În acest caz este nevoie de circuite speciale de comandare a acestor componente. De exemplu un motor DC ce are nevoie de alimentare de 12 V va folosi o sursă externă de tensiune. Totuși alimentarea externă trebuie să fie comandată de un impuls generat intenționat de la placă. Avem în această situație posibilitatea utilizării optocuploarelor sau a releelor. Drept urmare, pentru fiecare dispozitiv care cere o alimentare externă se va realiza un circuit special în acest scop.

Optocuplorul este o componentă electronică prin intermediul căreia se poate face transfer de semnal între două circuite izolate folosind lumina. Cele mai comune tipuri de optocupoare includ într-o singură capsulă o sursă de lumină (LED care transformă semnalul electric în lumină) și un fototranzistor care detectează lumina și generează energie electrică sau modulează curent electric provenit de la o sursă externă.

Un releu este o componentă electronică care sub influența unui semnal de comandă va comuta în stare OFF sau ON. Există mai multe tipuri, însă pentru această aplicație vom compara doar 2, cel electromagnetic și cel solid-state.

Principiile de funcționare sunt următoarele:

Releu electromagnetic

Construcția și funcționarea pot fi deduse din Figura 7. Componența principală a unui releu electromagnetic este bobina. Poziția “normal inchis” este menținută de arc. Când bobina este străbătută de current electric, aceasta atrage tija cu ajutorul câmpului electromagnetic format și în consecință se schimbă contactul pe NO.

Figura . Componentele interne ale unui releu electromagnetic

Avantajul folosirii releelor electromagnetice constă în prezența lor pe piață într-o mare diversitate și prețul scăzut.

Releu solid-state

Acest tip de relee comută între ON și OFF dar nu conține nici un element mecanic în interior. Construcția interioară se bazează pe semiconductoare de putere cum ar fi tiristoarele sau tranzistorii.

Un releu solid-state comparat cu cel clasic este de mai mici dimensiuni, nu face zgomot la comutație și s-ar putea folosi pentru a controla un motor prin PWM(semnal modulat în durată).

Datorită prețului ridicat al unui releu solid-state, în realizarea circuitelor de comandă vom folosi relee electromagnetice.

Sursa de alimentare

Există numeroase componente în această lucrare care necesită alimentare de la o tensiune continuă. Valorile dorite sunt cuprinse între 3.3 V și 12 V. O parte din aceste cerințe pot fi asigurate de către placa folosită pentru coordonarea ansamblului însă tensiunile mai mari de 5 V sau curent mare, nu. O posibilitate este să construim de la zero tot ce presupune o sursă. În cazul proiectului nostru, după cum am menționat și mai devreme nu este nevoie doar de o valoare de tensiune, astfel că discutăm de o alimentare destul de complexă. Acest subiect ar putea face tema unei alte lucrări, drept consecință nu o să alegem această cale. Totuși, putem trece în revistă schema unei surse simple de tensiune care la ieșire va furniza 5V.

Figura . Sursă de tensiune cu ieșire de 5 V

Funcționare: tensiunea alternativă de la rețea este transformată prin etajul transformatorului la valoarea dorită, mai apoi semnalul alternativ este transformat într-unul continuu prin puntea de redresare. Etajul următor stabilizeaza tensiunea cu ajutorul circuitului integrat IC 7805 rezultând la ieșire 5V DC.

Cea mai la îndemână cale de a satiface cerințele de alimentare a circuitelor este folosirea unei surse de PC. Una dintre acestea se încadrează perfect în nevoile proiectului, poate furniza 3.3V, 5V, 12V și destul de important, suportă indiscutabil curenți mai mari decât o placa de dezvoltare. Tebelul 1 conține valorile tensiunilor de interes pentru noi, furnizate de către o sursă de PC în funcție de culorile pe care le au firele. Se poate folosi și o baterie externă dacă sunt dispozitive care cer conectarea maselor Arduino și alimentare. Sursa de Tensiune ATX ar rămâne doar pentru consumatorii comandați prin releu.

Tabel . Codul culorilor la o sursa PC

Placa de dezvoltare

Rolurile pe care va trebui să le îndeplinească placa de dezvoltare sunt următoarele: preluarea informațiilor de la senzori, acționarea actuatorilor, comunicarea serială cu PC-ul în vederea realizării controlului manual de către utilizator, capacitatea manipulării fișierelor utile în stocarea datelor pentru funcționarea serei în modul automat.

Exemple de plăci de dezvoltare studiate:

Raspberry Pi 3 Model B :

Procesor Quad Core

1GB RAM

1.2 GHz frecvență de ceas

40 de pini de uz general pentru intrari/ ieșiri

4 porturi USB

Port HDMI

Slot pentru card Micro SD

Ethernet 10/100

Limbaj de dezvoltare: Python

Este o placă de mici dimensiuni care poate fi considerată un micro-PC datorită dotărilor sale. Din aceeași cauză am putea spune că îndeplinește condițiile dorite doar că ar fi supracalificată pentru proiect. Deoarece dorim să găsim un echilibru între preț și performanțele de care avem nevoie, nu vom alege această variantă.

Arduino Uno :

Microcontroller: Atmega328p

Chip USB: CH340G

Tensiune de operare: 5V

14 pini de intrări/ieșiri cu 4 care suportă și semnal modulat în durată(PWM)

6 pini analogici de intrare

Curent DC per pini de intrare/ieșire: 40mA

Frecvența de ceas: 16MHz

EEPROOM: 1 KB

Folosirea plăcii Arduino Uno tehnic este potrivită, realizează ceea ce ne dorim și nu este mult prea avanasata să o folosim la atribuțiile pe care le va avea. Există oarecum posibilitatea ca numărul pinilor să nu fie îndeajuns pentru numărul total de intrări și ieșiri finale. Un alt lucru de menționat este necesitatea instalării driverului pentru chipul de USB în cazul în care folosim o clonă a plăcuței originale.

Arduino Mega 2560 :

Microcontroller: Atmega2560

Chip USB: CH340G

Tensiune de operare: 5V

54 pini de intrări/ieșiri cu 15 care suportă și semnal modulat în durată(PWM)

16 pini analogici de intrare

Curent DC per pini de intrare/ ieșire: 40mA

Frecvența de ceas: 16MHz

EEPROOM: 4 KB

Arduino Mega se aseamănă foarte mult cu Uno, urmează cumva același cadru dar are resurse mai bune. Două dintre ele sunt memoria și numărul de pini,

Motivul pentru care vom realiza proiectul folosind Arduino Mega 2560 și nu Uno este numărul ridicat de pini, vom putea conecta diferitele dispozitive electronice într-un mod mai aerisit, în plus există posibilitatea extinderii funcționalităților serei fără constrângeri din partea aceasta. Conexiunea cu PC-ul se va realiza prin portul serial.

Sera va trebui să funcționeze atât în control manual, din aplicația C#, cât și automat, după parametrii transmiși de la aplicație, temperatură, umiditate aer, umiditate sol. Placa de dezvoltare Arduino Mega 2560 va trebui să stocheze aceste date primite de la PC. Una dintre zonele de stocare posibile este memoria EEPROM de 4KB pe care o deține. Aceasta are o proprietate foarte utilă, nu se șterg datele odată ce alimentarea cu tensiune a plăcii este deconectată. Astfel, pot fi accesate la repornirea ei așa cum erau înainte.

Pentru a putea manipula memoria EEPROM există o librărie cu același nume care se poate folosi. Includerea ei într-un program nou de Arduino se face după următoarea sintaxa:

#include<EEPROM.h>

O parte din funcțiile pe care le conține această librărie sunt prezentate în tabelul 2.

Tabelul . Funcții EEPROM Arduino

Folosirea memoriei EEPROM implică scrierea la anumite adrese a datelor. Dacă informațiile sunt multe, ținerea evidenței adreselor și a conținutului începe să fie mai puțin satisfăcătoare. Varianta opusă beneficierii de EEPROM poate fi în acest caz utilizarea unui card microSD. Odată conectat la placa de dezvoltare prin modulul special construit, prin folosirea librăriei pentru carduri SD, se pot crea, șterge și scrie fișiere text pe el. Fișierele text sunt mult mai ușor de utilizat și în plus pot fi evaluate și separat prin conectarea la un PC, lucru binevenit într-o situație de depanare.

Interfața de comunicare a unui modul de card micro SD cu placă este SPI(Interfața serială Periferică). În acest caz comunicarea este sincronă, iar dispozitivul care transmite semnalul de ceas este “Master”, iar celălalt “Slave”.

Figura . Interfață SPI

În figura de mai sus este exemplificată funcționarea SPI, când “Master” trimite date către “Slave” o face prin MOSI, când “Slave” dorește să trimită un răspuns, va trimite într-un număr prestabilit de cicluri de ceas pe MISO. Mai există și semnalul Chip select, care atenționează subordonatul că urmează să recepționeze sau să transmită date. Semnalul CS este în low în acest timp, revine în HIGH când comnuicarea se termină.

Resurse software

Atât partea de programare a plăcuței de dezvoltare alese(Arduino Mega2560) cât și realizarea unei interfețe cu utilizatorul capabilă să controleze acțiunile sistemului, necesită resurse software.

În cazul plăcii de dezvoltare vom folosi mediul de dezvoltare dedicat pentru Arduino numit foarte previzibil, Arduino IDE. Acesta conține un editor de text pentru scrierea codului, o zonă de mesaje, o consolă text și o bară de instrumente cu butoane pentru diferite funcții și meniuri. Rolul său este de a se conecta la plăcuțe Arduino pentru a le programa și pentru a comunica cu ele. Interfața mediului de programare cu utilizatorul este una foarte simplă și abordabilă așa cum arată figura 10.

Figura . IDE Arduino

Pentru scrierea unui program(Sketch) în IDE Arduino se va ține cont de următoarele reguli: declarațiile variabilelor globale se face înaintea blocului setup(), setarea pinilor sau codul care se dorește să se execute o singură dată se scrie în blocul setup(), codul destinat repetării infinite se trece în blocul loop(). Limbajul folosit pentru programare este C/C++.

Soluții studiate pentru crearea interfeței cu utilizatorul(limbaje):

Java

Este un limbaj de programare general, care a apărut pentru prima dată în anul 1995, cu accent pe programarea cu clase și orientată pe obiect. Funcționează după ideea “scri odată, funcționează oriunde”, care se referă la faptul că un cod Java compilat va putea fi rulat pe orice platformă care suportă Java fără a mai fi recompilat.

Au existat cinci principii în crearea limbajului:

Să fie simplu, orientat pe obiect și familiar.

Să fie robust și securizat

Să fie portabil și neutru din punct de vedere arhitectural

Să execute cu o performanță ridicată

Să fie interpretat, cu fire de execuție, dinamic

Limbajul este folosit în diferite aplicații pentru Descktop, Mobile și Server.

Exemplu de program “Hello World” în limbaj Java:

class HelloWorldApp {

public static void main(String[] args) {

System.out.println("Hello World!"); // Printează mesajul în consolă.

}

}

C#

C sharp este un limbaj asemănător cu Java, ambele derivate din C++. Vorbim și în acest caz de programare orientată pe obiect bazată pe patru caracteristici: polimorfism, încapsulare, moștenire și abstractizarea datelor. Anul dezvlotării lui a fost anul 2000 împreună cu inițiativa .NET și a fost creat de echipa condusă de Anders Hejlsberg.

O parte din scopurile limbajului sunt:

Limbaj simplu, modern, orientat pe obiect, de uz general

Limbajul și implementarea lui să asigure suport pentru principii cum ar fi: determinarea limitelor tablourilor, detecția încercării utilizării de variabile nedeclarate etc.

Capabilitatea de a scrie aplicații atât găzduite cât și embedded

Portabilitatea

Utilizarea economa a memoriei

Exemplu de program “Hello world in C#:

using System;

class Program

{

static void Main()

{

Console.WriteLine("Hello, world!");// Printează în consolă mesajul

}//endMain

}//endProgram

Mediul de dezvoltare folosit pentru C# este Visual Studio, iar împreună cu posibilitatea elaborării programelor sub formă de “Windows Forms” putem dezvolta interfețe cu utilizatorul într-un mod destul de intuitiv.

Ambele limbaje de programare suportă dezvoltarea unei aplicații care să fie legate prin portul serial cu proiectul dorit însă datorită cunoștințelor mai aprofundate în ultimul menționat vom alege să implementăm codul aplicației de interfață cu utilizatorul în C# folosind mediul Visual Studio Community 2017.

În Figura 11 se poate observa un model de interfață cu utilizatorul realizată prin Windows Forms care conține trei butoane de tip PushButton, un CheckBox și un câmp pentru text.

Figura . Exemplu de Windows Forms

Sistemul de control al temperaturii

Această parte se referă la măsurarea și modificarea temperaturii în incintă. Evident discutăm aici de mai multe etape, așa cum vor fi descrise și în Figura 12: implementarea senzorilor de măsurare a temperaturii, captarea informațiilor de la senzori, modelarea informațiilor primite de la senzori în vederea valorificării lor și acționarea actuatorilor pentru a crește sau a scădea temperatura.

Figura . Ciclul controlului temperaturii

Cinci dintre cele mai utilizate tipuri de senzori pentru temperatură sunt:

Termocuplurile

Termorezistențele

Termistorii – rezistența scade cu creșterea temperaturii

Senzorii cu infraroșu

Senzorii cu semiconductori

Termocupla se folosește în situația când se poate face contact fizic cu obiectul pentru care se măsoară temperatura, senzorii cu infraroșu măsoară temperatura unei suprafețe iar termorezistențele au o acuratețe foarte bună dar o măsurare mai complexă. Senzorii care vor fi folosiți sunt cei cu semiconductori și termistorii NTC. Ambele tipuri au posibilitatea măsurării spectrului de temperaturi întâlnite în proiectul de față(aprox. 20-50 grade Celsius).

Vom alege să implementăm senzorul DHT11 însoțit de un termistor NTC de 1K. Acestea sunt soluțiile cele mai potrivite luând în considerare atât prețul cât și performanțele. Motivul pentru care am dublat dispozitivul de măsurare a temperaturii este pentru a avea o valoare cât mai apropiată de realitate.

Detalii ale senzorilor aleși:

DHT11

alimentare intre 3 si 5 V

acuratețe de două grade Celsius pentru valori între 0 și 50

4 pini

raportare a rezultatelor măsurării o dată la o secundă în ieșire digitală

Figura .Pinii senzorului DTH11 și circuitul de funcționare

Pini senzorului sunt după cum prezintă Figura 13: Vcc, pin de date și pin de masă. Al treilea pin nu se folosește. Circuitul de funcționare din aceeași figură evidențiază și o rezistență de pull up de 4.7k recomandată de producător.

În cazul termistorului NTC se realizează un divizor de tensiune cu senzorul și o rezistență de aceeași valaore. Din acest divizor se va prelua semnalul analogic, iar mai apoi se va prelucra conform ecuației lui Steinhart Hart.

(1)

T este temperatura în grade Kelvin, R rezistența termistorului la temperatura măsurată, iar A,B și C sunt coeficienți care se calculează conform următoarelor ecuații:

(2)

(3)

(4)

Unde, T1,T2,T3 sunt trei temperaturi diferite din intervalul de măsurare al termistorului, R1,R2,R3 sunt rezistențele la temperaturile mai devreme menționate, aceste valori se găsesc în foaia de catalog a termistorului.

Pentru a putea crește și scădea temperatura au fost studiate mai multe variante: Modul Peltier, Rezistența de încălzire și Coolere.

Un modul Peltier este o componentă electronică, care folosind effectul Peltier poate produce atât încălzire cât și răcire. Componenta are două fețe, iar când este traversată de un curent DC încălzește una din fețe și o răcește pe cealaltă.

Soluția implementată pentru a crește temperatura este totuși o rezistență de încălzire. Există multe tipuri pe piață și variate modele. Am ales o rezistență thick film pe suport ceramic pentru raportul extraordinar între dimensiune și putere. O astfel de rezistență se poate conecta prin lipirea terminalelor existente și poate produce până la 350 de grade Celsius la o putere de 40W. Pentru a facilita difuzarea căldurii, rezistența se fixează cu un suport și pastă termică pe un radiator de aluminiu. În plus un cooler va fi atașat la radiator care are direcția către sursă căldurii astfel încât să o transmită în restul incintei.

În cazul unei temperaturi mai mari decât valoarea dorită, două ventilatoare poziționate la capete opuse vor realiza aerisirea containerului de plexiglass, unul introduce aer proaspăt iar celălalt scoate aerul în exterior.

Sistemul de control al umidității aerului

Asemănător cu abordarea precedentă avem nevoie și aici de senzori și actuatori. Figura 12 cu înlocuirea ultimului bloc în vederea modificării umidității aerului descrie funcționarea sistremului.

Pentru măsurarea umidității, în ideea reducerii componentelor de echipare a incintei, vom folosi același senzor ca și la temperatură, DHT11, care are inclusă și această capabilitate de a transmite date privitoare la cantitatea de vapori de apă conținută într-un volum de aer. Intervalul de măsurare este între 20% și 80% cu o acuratețe de 5%, informații care pot fi achiziționate la fiecare 2 secunde.

În cazul în care vrem să scădem umiditatea vom porni sistemul de ventilație menționat și în situația temperaturii. Astfel, plecând de la premisa că aerul din exteriorul incintei are o umiditate mai scăzută, va descrește cantitateea de apă și din aerul de la interior.

Pentru a crește umiditatea am studiat următoarele soluții:

Încălzirea apei dintr-un rezervor

Figura . Rezervor cu încălzirea apei

Elementul de încălzire din Figura 14 are ca principiu de funcționare efectul Joule care afirmă faptul că trecerea unui curent printr-un conductor are ca rezultat degajarea de căldură. Conform primei legi a lui Joule, cunoscută și ca legea Joule-Lenz, puterea căldurii degajate de un conductor parcurs de curent este proporțională cu produsul dintre pătratul curentului și valaorea rezistenței conductorului.

(5)

Dacă implementăm acest mod de a crea vapori de apă, aceștia vor fi vapori fierbinți, lucru care ar putea dăuna plantelor, în consecință renunțăm la aceast tip de implementare.

Pulverizarea apei

O altă metodă de asigurare a umidității crescute este instalarea unui set de pulverizatoare care să “arunce” în incintă particule destul de mici încât să modifice caracteristica dorită a aerului. Folosirea pulverizatoarelor implică conducerea apei spre ele cu o presiune destul de mare. Pentru o pompă de mici dimensiuni există posibilitatea ca această presiune să îi scurteze viața de funcționare la parametrii normali. În plus, rețeaua de conducte care duc spre pulverizatoare trebuie să reziste la presiunea care se va forma în ele.

Deoarece proiectul își propune o investiție financiară medie, evităm să folosim tehnologii foarte scumpe, drept urmare renunțăm și la această implementare.

Disc Piezoelectric

Dacă o cantitate de apă este supusă acțiunii unui semnal sonor vom putea observa oscilații pe suprafața apei. Când frecvența sunetului este destul de mare (ultrasunete) particule mici de apă se vor desprinde și vor pluti în aer. Figura 15 a) explică vizual cum are loc acest proces. Duza cu proprietate de vibrație la frecvența de ultrasunete este poziționată în capătul unei conducte cu lichid. Atunci când se vor produce ultrasunetele lichidul este trecut prin orificiile mici ale diafragmei duzei și transformat în vapori.

Pentru producerea de ultrasunete se folosește un disc piezoelectric(Figura 15 b)). Principiul care stă la baza funcționării lui este transformarea energiei electrice în vibrații mecanice foarte rapide ale unei diafragme metalice. Răspunsul unui material solid anume (cristale, unele ceramice sau substanțe biologice cum ar fi osul , ADN-ul și unele proteine) la stres mecanic prin acumulare de sarcină electrică poartă numele de Piezoelectricitate. Ceea ce ne dă posibilitatea folosirii discului menționat mai sus este reciprocitatea, adică dacă acționăm cu energie electrică asupra discului acesta va vibra.

Figura

a)Procesul de vaporizare cu ultrasunete b) disc piezoelectric

În practică, în folosirea discului este nevoie și de alte componente electronice care să regleze vibrațiile și să îl aducă la funcționarea dorită. Există pe piață modele de acest fel ceea ce ne face să alegem folosirea acestei metode în Sistemul de Control al umidității. Beneficiile aduse sunt vaporii reci, dimensiuni reduse și tehnologie inovativă.

Sistemul de control al umidității solului

Sistemul este compus din senzorul de măsurare a umidității solului și din actuatori care fac posibilă transportarea apei până la plante. Dispozitivul care măsoară cantitatea de apă din sol se numește Higrometru. Există higrometre rezistive sau capacitive. La cele rezistive, rezistența variază cu umiditatea, cu cât umiditatea este mai mare, solul conduce mai bine electricitatea drept urmare rezistența este mai mică. În cazul opus rezistența crește. Dezavantajul acestora este efectul coroziv pe care îl are funcționarea îndelungată. Un senzor capacitiv se bazează pe folosirea solului pe post de dielectric. Dacă se modifică umiditatea se modifică și constanta dielectrica a capacității deci senzorul va transmite valori diferite în funcție de situație.

Senzorul rezistiv va fi implementat datorită prețului scăzut. Celălalt are un preț de 10 ori mai mare, însă acuratețea poate să lase de dorit în ambele cazuri.

Odată măsurată valoarea umidității, trebuie acționat în consecință. Pentru a transporta lichidul necesar irigării au fost studiate două posibilități:

Fără pompă

În eventualitatea construirii unei rețele de irigare fără pompă, trebuie luat în seamă un aspect foarte important, cel al transportului de lichid în condiții optime, deși nu se pot atinge performanțele pompării artificiale. Va fi nevoie de poziționarea unui rezervor în proximitatea serei, în partea superioară, în ideea folosirii forței gravitaționale cu acțiune asupra lichidului în loc de pompă. Ținând cond de îngroparea conductei în sol, fapt care obstrucționează oarecum evacuarea prin orificiile conductei, înălțimea de poziționare a rezervorului trebuie să fie îndeajuns de mare încât să existe un debit satisfăcător de apa în retetaua de irigare.

Pentru a controla timpul de irigare se poate utiliza un robinet acționat de un servomotor sau o electrovalvă. Această abordare, deși pare simplă ajunge în final tot la implementarea unui control electronic. O soluție mai directă este prezentată la punctul 2.

Cu pompă

Rezervorul de apă va fi poziționat lângă seră dar cu pomparea apei realizată de o pompă în miniatură comandată de la placa de dezvoltare. Astfel putem obține atât un design plăcut cât și presiune mai ridicată în instalația de apă. Va fi asigurat debitul necesar fără alte măsuri în construcția containerului.

Varianta a 2-a este cea pe care o vom realiza în proiect, iar traseul lichidului va fi realizat de o conductă ondulată pe suprafața inferiaora a serei, sub pământ, de diametrul interior egal cu diametrul exterior al duzei pompei folosite.

Figura 16 ilustrează simplist cum va fi realizată rețeaua de transport a lichidelor către solul în care sunt plantate plantele.

Figura Rețeaua de irigație

Sistem de administrare a nutrienților

Plantele au nevoie periodic de nutrienți, adică de substanțe fără de care nu pot să își completeze un ciclu normal de viață sau substanțe care sunt parte constitutivă ale plantei. Există 17 astfel de substanțe:

Macronutrienți: azot, fosfor, potasiu, calciu, sulf, magneziu, carbon, oxigen și hidrogen

Micronutrienți: fier, bor, clor, mangan, zinc, cupru, molibden și nichel

În funcție de necesitățile fiecărei plante, există pe piață sub formă lichidă sau solidă substanțele care trebuie administrate. Se va suplimenta rezervorul de apă curată cu un rezervor și o pompă pentru apă cu nutrienți, unde se vor introduce manual substanțele dorite. Drept infrastructură va servi cea dezvoltată deja în irigarea normală, adică se va folosi aceeași rețea de conducte, cu un rezervor și o pompă dedicate.

În sensul protejării pompelor de lichid de uzură, pentru ambele cazuri(irigare simplă sau cu nutrienți) este nevoie să ne asigurăm că nivelul lichidului nu scade într-atât de tare încât să lase pompa să funcționeze în gol. Măsurarea nivelului se poate face fie cu un senzor analogic, care transmite nivelul lichidului oricât ar fi el (implementare mai complexă, necesită senzor pe toată lungimea rezervoarelor), fie cu un senzor cu polutitor(soluția aleasă), asemănător unui întrerupător, atunci când apa scade sub nivelul la care este poziționat plutitorul, întrerupătorul se închide și transmite un semnal în acest sens către placa de dezvoltare care va opri pompa rezervorului aproape gol.

Sistemul de iluminare

În primă fază putem discuta despre un sistem de iluminare al serei pentru o aparență mai plăcută sau implementarea unei simulări a zilei și nopții pentru a realiza fotosinteza, proces vital al plantelor. Probabil ar fi de ajuns pentru o asemenea abordare un bec alimentat la 220 de V și comandat printr-un etaj exclusiv în modulul de acționare menționat la 4.2.2. Totuși este interesant de studiat efectul luminii de diferite culori asupra plantelor. NASA cercetează acest lucru în vederea construirii unor “gradini” pentru cultivarea de plante destinate alimentației astronauților. Ei au nevoie atât de simularea condițiilor naturale cât și de stimularea plantelor să se dezvolte într-un anumit mod, totul într-un mediu mai restrâns.

Conform unui articol publicat de Linda Herridge de la centrul spațial al NASA, pe baza unor experimente realizate pe salată roșie a fost observat următorul efect al luminii LED albastre și roșii: salata crescută cu acest tip de lumină avea o nuanță de roșu închis și o concentrație mai mare de antocianină, un antioxidant puternic cu ajutorul căruia se pot combate unele efecte ale radiației cosmice. În același articol se vorbește despre efectul luminii roșu pur asupra grâului, care a crescut anormal de înalt și decolorat.

Următorul tabel cuprinde informații despre cum se crede că pot influența anumite culori etapele din viața unei plante.

Tabel . Influența culorii luminii

Utilizarea iluminării prin LED este foarte eficientă și din mai multe puncte de vedere: spațiul pe care îl ocupă, pot cuprinde întreg spectrul de culoare, nu emană căldură, puțină energie consumată în raport cu lumina furnizată. Vom folosi deci pentru iluminare LED în așa fel încât să putem supune plantele la culorile pe care le cunoaștem că influențează dezvoltarea lor.

Există pe piață atât LED cu o culoare stabilită din fabricație cât și leduri RGB cu ajutorul cărora, prin combinarea celor trei culori, roșu, verde și albastru, putem obține orice culoare din spectru. Această caracteristică este foarte economă deoarece nu va fi nevoie să folosim LED diferit pentru fiecare culoare pe care o vrem.

LED-urile pe care le vom folosi în acest proiect sunt înșiruite pe o bandă și sunt adresabile, ceea ce înseamnă că fiecare LED se poate seta individual la o culaore anume. În funcție de valorile date pentru roșu, verde și albastru (incluse pe același chip care formează un LED RGB) putem obține diferite nuanțe de culori. Chipul care realizează această variație a culorilor este inclus în aceeași capsulă și așteaptă comenzile de la o placă de dezvoltare .

În figura 17 este ilustrat un exemplu de capsulă al unui LED RGB fabricat de NEOPIXEL. Tabelul 4 explicitează pinii capsulei din figură.

Figura . Capsula unui LED RGB

Tabelul . Pinii capsulei LED RGB

Pentru conectarea la o placă de dezvoltare a benzii de LED RGB se vor conecta cei trei pini după cum urmează: pinul +5V la pinul de 5V al plăcii de dezvoltare sau la o sursă externă, pinul GND la masa sursei exterioare (conectată și ea la pinul de GND al plăcii) dacă este cazul sau la pinul GND al plăcii în sens contrar, iar pinul DIN se va conecta la un pin digital. Conform recomandărilor producătorului, o rezistență de 470 de Ohmi va fi adăugată între pinul de intrare al datelor în placa de dezvoltare și pinul de date al benzii LED.

Sincronizarea cu timpul real

Sincronizarea cu timpul real se poate face în două moduri. Primul prin folosirea unei librării speciale și actualizarea ceasului prin port serial(portul 0-USB). Portul este însă folosit pentru comunicarea comenzilor de la PC la placă, în consecință nu se poate aplica. Al doilea mod este folosirea unui ceas extern (RTC) care să comunice prin interfață I2C cu microcontrolerul, astfel comunicarea PC-microcontroler nu este periclitată. O dată setat ceasul, acesta va continua să contorizeze timpul fără a fi necesare alte influențe.

I2C este o interfață serială multi-master, multi-slave. Este folosită pentru comunicare cu periferice care lucrează la viteze reduse. Masterul este cel care preia inițiativa unui transfer de date, el furnizând și semnalul de ceas pentru sincronizare prin SCL. Transferul de date se poate realiza doar între master și slave nu și slave-slave.

Modurile de operare ale I2C sunt:

Masterul transmite date către slave

Masterul recepționează date de la slave

Slave trasnime către master

Salve recepționează de la master

Alte îmbunătățiri posibile dar neimplementate

Există unele tehnologii neimplementate în proiect fie datorită complexității fie datorită prețului prea ridicat, dar care pot fi discutate ca și îmbunătățiri viitoare în funcție de nevoile plantelor. Acestea sunt:

Camera HD de monitorizare a creșterii și dezvoltării plantelor

Implementarea unui sistem inteligent Hidroponic ca în exemplul din Capitolul 3, AvaByte

Sistem de recirculare al apei în seră & Alimentare automată de la rețea

Implementare

În acest capitol vom expune dezvoltarea proiectului în toate detaliile sale folosind soluțiile alese și prezentate anterior. Primul pas este împărțirea lui în două ramuri, cea privitoare la construcția fizică și cea privitoare la electronică și tehnologia informației pe care o să o numim scurt, tehnologizarea machetei.

Construcția fizică

Figura 18. Model machetă

Conform figurii 18, în componența machetei intră următoarele:

Incinta

Materialul de realizare al incintei este Plexiglass cu grosimea de 0.4 cm. Forma incintei este de paralelipiped dreptunghic și are dimensiunile: lungime 61 cm, lățime 35 cm, și înălțime 31 de cm.

În ambele capete ale containerului s-a efectuat câte o tăietură circulară pentru a putea fi montate ventilatoarele. De asemena, incinta este prevăzută cu un capac din același material, detașabil la dorința utilizatorului.

Postamentul

Componentele fizice sunt așezate și fixate pe un postament dreptunghiular din material lemnos. Prinderea lor cu șuruburi este astfel mult mai ușoară. Dimensiunile lui sunt: lungime 80 cm și lățime 43 cm.

Elementul de fixare

Acest element, fixat de postament cu 3 șuruburi, este modelat din lemn și are scopul de a imobiliza rezervoarele de lichid astfel încât să nu se răstoarne. Are practicate două găuri, fiecare

Figura 19. Element de fixare

cu diametre diferite pentru a presa zona de dimensiune mai mare a rezervorului spre postament. Fiecare din diametre este până la jumătatea elementului de fixare. Diametrul superior, mai mic, este de 12.8 cm, iar cel inferior de 14.8 cm.

Rezervoarele de lichid

Pentru stocarea lichidelor se folosesc două tuburi de PVC cu diamentrul de 12 cm în partea superioară și 14 cm în partea bazala. Capacul inferior, detașabil doar când rezervorul este gol și elementul de fixare demontat, împreună cu garnitura cauciucată, au scopul de a construi din tub rezervorul propriu-zis prin inchidera etanșă a capătului în care sunt montate. În schimb, capacul superior este detașabil oricând la dispoziția utilizatorului.

Rezervoarelor le-au fost realizate câte o pereche de tăieturi circulare pentru a extrage conductele pentru instalația de irigare și firele dispozitivelor electronice plasate în interiorul lor.

Poziționarea s-a realizat în unul din capetele containerului de Plexiglass (Figura 18).

Rețeaua de irigație

În solul din incinta proiectului este plasată o rețea pentru irigarea plantelor. Aceasta este realizată dintr-o conductă flexibilă cu diametrul interor de 7 mm, necesar pentru potrivirea cu duza pompelor de lichid. Forma în care este realizată rețeaua este prezentată în Figura 16, de la subcapitolul 4.2.8, șerpuita, de la un capăt al incintei până la celălat, unde sunt poziționate pompele(în rezervoare). Ambele pompe sunt racordate la această rețea prin intermediul unei bifurcații situate la ieșirea din rezervoare.

Tehnologizarea machetei

Numim tehnologizarea machetei totalitatea sistemelor electronice și de control cu care este echipat proiectul. Există astfel două părți, hardware, care se ocupă de componentele propriu-zise și sofware, care urmărește introducerea funcționalităților prin codul de funcționare.

Hardware

Componentele hardware ale proiectului sunt:

Sursa de tensiune

Sursa de tensiune furnizează tensiunile de interes menționate în Tabelul 1 din capitolul 4.2.3. În plus față de informațiile tabelului se cunosc curenții maximi pentru fiecare culoare (tensiune) a firelor : portocaliu (3.3 V)-20 A, roșu( 5 V)-25 A, galben (12V)-13 A. Sursa se conectează la rețeaua națională de 230 V și 50 Hz printr-un cablu de alimentare cu conector Schuko “tată” la priză și conector IEC 320 C13 “mamă” la ea.

Există un număr de componente care au nevoie de alimentarea exterioară, conform informațiilor foilor de catalog, tensiunile și curenții de care au nevoie sunt:

Pompele de apă (două) -> 5 V si 0.10 -0.15 A

Ventilatoarele (trei) -> 12 V si 0.15 A

Rezistentă de încălzire -> 12 V si 3,33 A

Bandă de LED -> 5V si 2.04 A

Alimentarea componentelor este realizată individual pe fire diferite, astfel că putem compara curenții maximi necesari cu cei maximi admiși de sursă în funcție de culoarea firului: 2 A<25 A (fir roșu, 5V), 3.33 A<13A (fir galben, 12V).

Se folosește sursa Enlight HPC-300-202 în acest proiect datorită puterii mari suportate de aceasta, caracteristică importantă în folosirea consumatorilor la performanțele dorite, dar și a ușurinței conectării individuale a fiecărui dispozitiv în parte. Este posibilă din punct de vedere al alimentării cu tensiune atât implementarea proiectului propus cât și a eventualelor îmbunătățiri și funcționalități noi.

Placa de dezvoltare Arduino Mega 2560

În capitolul 4.2.4 au fost prezentate specificații generale ale plăcii de dezvoltare folosite. În continuare vor fi expune caracteristicile care sunt exploatate.

Pinii analogici sunt utilizați pentru achiziția de date de la senzori analogici, în acest caz senzorul de temperatură sau cel de umiditate a solului. Aceștia achiziționează valori între 0 și 1023, pe 10 biți, echivalentul intervalului de tensiune 0 – 5V. Accesarea datelor de intrare de la pin cât și prelucrarea lor vor fi detaliate în ramura software a documentației.

Pinii digitali sunt folosiți în mai multe situații:

Pinii 0(TX – transmisie) și 1(RX-recepție) pentru comunicarea serială cu PC-ul (comunicarea se realizează prin USB dar portul Serial 0 este conectat la el)

Pinii 2 și 3 pentru întreruperi externe în cazul senzorilor de nivel

Pinii SPI, adică 50(MISO- Master În Slave Out), 51 (MOSI – Master Out Slave In), 51(SCK), 53 (SS – Slave Select), pentru comunicarea prin Interfață Periferică Serială a modulului de card SD cu placa de dezvoltare

Pinii 20(SDA – Serial Data Line) și 21(SCL – Serial Clock Line) pentru comunicare I2C între modulul de furnizare a timpului actual și placă cu ajutorul librăriei Wire.

Pentru comandarea de dizpozitive: umidificatorul, banda de LED RGB, alimentării senzorului de umiditate a solului pentru a preveni efectul de uzură al electrolizei, releele care la rândul lor comandă ventilatoarele, pompele de lichid și rezistența de încălzire; pentru achiziția de date de la senzorul de umiditate/temperatură DHT11

Alimentarea plăcii și comunicarea serială cu PC-ul sunt realizate printr-un cablu USB cu conector “tată” tip A la PC și “tată” tip B la placă.

Modulul de acționare

Cu ajutorul acestui modul se pot acționa actuatori care au nevoie de alimentare exterioară. În acest sens, principalele componente sunt 5 relee(pentru 2 pompe, rezistență de încălzire cu ventilatorul ei și încă 2 ventilatoare). Circuitul complet va avea deci 5 subcircuite de comandă ca

Figura 20. Circuitul de comandă al unui releu

cel reprezentat în Figura 20. Conform acesteia au fost folosite patru componente: releu, diodă de fugă pentru a asigura o cale energiei rămase în bobină la blocare, tranzistor cu rol de întrerupător și rezistență pentru polarizarea bazei tranzistorului. Cerințele și valorile calculate ale curenților care ajută la alegerea modelelor de componente sunt prezentate mai jos.

Releul

Releul trebuie să poată fi comandat de tensiunea de 5 V a plăcii de dezvoltare și trebuie să comande tensiunea și curentul maxim care sunt folosite în proiect, 12V și 3.33 A. Nu în ultimul rând trebuie să fie cu montare THT(Through Hole Technology) pentru a putea fi montat pe placa de prototipare și cu configurație a pinilor SPDT(Un pol și 2 contacte, NO și NC, normal deschis, normal închis).

Tabel 5. Relee miniaturale

Primul și ultimul Model indeplindesc condițiile menționate și au caracteristici asemănătoare. O să se folosească mai departe RAYEX LT – 05G.

Tranzistorul

Tranzistorul este folosit pentru a nu suprasolicita placa de dezvoltare cu cei 0.89 A care circulă de la bobina releului și are rol de întrerupător.

Curentul maxim suportat de colectorul tranzistorului trebuie să fie mai mare decât cel care îl tranzitează în realitate. Conform datelor de catalog, curentul bobinei este 89.2 mA. Experimental, pentru determinarea lui se procedează în felul următor:

Se măsoară rezistența bobinei, în cazul de față 61 de Ohmi

(6)

Conform legii lui Ohm (6) curentul este

= 0.081 A = 81mA (7)

Tabel 6.Tranzistori

Tranzistorul 3 nu poate fi folosit pentru că este PNP, toate celelalte îndeplinind condițiile necesare.Ținând cont de câștigul în curent continuu (), util în alegerea rezistenți de polarizare, se va alege primul model, FairChild KSP222ATA.

Rezistența de polarizare

Pentru a afla rezistența trebuie mai întâi să se calculeze curentul din bază

(8)

Ținând cont de ecuația de mai sus (8), curentul în bază va fi:

(9)

Conform cu legea lui Ohm din ecuația (6) :

(10)

Dioda de fugă

Dioda trebuie să facă față curentului care vine de la bobina releului și tensiunii care se descarcă de pe ea. Se va folosi Dioda redresoare 1N4007 de la DC Components care suportă 1A și poate bloca 1000 V(valoare foarte mare, la care nu se va ajunge).

Cele 4 circuite aferente releelor sunt montate pe o placă de prototipare cu orificii de 1 mm la distanța de 2.54 mm, grosime a stratului de placare cu cupru de 35 um, lungime 160 mm și lățime 100 mm.

Conectarea dispozitivelor electronice comandate se realizează cu ajutorul unui conector cu trei șuruburi (unul pentru NC unul pentru NO și unul pentru COM) prins pe placa PCB.

Senzori

Senzorul de temperatură NTC de 1k

Figura 21. Circuit de achiziție pentru NTC

Senzorul folosit este produs de EPCOS și are numele modelului K164NK001. Ieșirea acestuia este analogică, doar că placa de dezvoltare nu îl poate măsura direct, pe un pin analogic se măsoară tensiune. Pentru a măsura tensiune, s-a realizat un divizor cu o rezistență cunoscută, de aceeași valoare cu senzorul (Figura 21).

(11)

Alimentarea se face de la pinul de 5 V al Arduino Mega 2560 iar masa la cel de GND.

Din ecuația (11) rezultă:

(12)

(13)

Pentru determinarea temperaturii măsurate(în grade Kelvin) se folosește ecuația (1) din capitolul 4.2.6. cu coeficienții Steinhart – Hart înlocuiți de valorile determinate prin folosirea algoritmului de calcul implementat într-un calculator, la 3 temperaturi diferite(valori coeficienți: 1.523484975e-3, 2.594481033e-4 respectiv 2.019202697e-7). Mai departe prelucrarea datelor se concretizează în implementarea software.

Senzorul de temperatură și umiditate DHT11

DHT11 împreună cu senzorul analogic NTC de 1 k au fost montați pe aceeași placă de prototipare care ulterior a fost izolată cu silicon pentru a rezista la umiditatea din interiorul incintei. Rezultatul este un modul cu 4 fire, +5 V, GND, ieșire digitală DHT11 și ieșire analogică NTC.

Figura 22. Modulul DHT11 & NTC

Motivul folosirii a doi senzori pentru temperatură (Figura 22) este pentru a minimiza erorile cât mai mult prin medierea aritmetică a rezultatelor lor.

Figura 23. Conectarea DHT11

Deoarece senzorul comunică cu placa de dezvoltare pe un pin digital, deci cu valori de HIGH și LOW, este nevoie de o rezistență de pull-up pentru a putea defini bine nivelele logice. Acest montaj va ține semnalul HIGH când nici un dispozitiv nu va fi activ(Figura 23).

Pentru măsurarea umidității aerului senzorul folosește o componentă sensibilă la umiditate care este compusă din 2 electrozi cu un strat care menține umiditatea între ei. Când umiditatea se modifică, se modifică și conductivitatea stratului dintre electrozi prin urmare și rezistența dintre ei. Această modificare a rezistenței este măsurată de circuitul integrat al senzorului, procesată și transmisă către un microcontroler care o poate citi. În cazul temperaturii este folosit un termistor sau un NTC înglobat în capsulă.

DHT11 are propriul protocol de transmitere a datelor cu ajutorul sincronizării. Această abordare ține de software, librăria care tratează funcționarea senzorului va fi prezentată în capitolul aferent.

Senzorul de umiditate a solului YL-69 cu YL-38

Cu scopul măsurării umidității din sol se folosesc senzorul și modulul de măsurare menționate în titlu și reprezentate în figura 24 a). Poziționarea componentelor în figură reflectă că pinii senzorului se leagă la cei doi pini din partea superioară a plăcuței, cei patru pini din zona inferioară sunt în ordine de la stânga la dreapta: Vcc, GND, D0(ieșire digitală), A0(ieșire analogică).

Figura 24.

a)YL-69 si YL-38 b) circuit de comparare YL-38

Senzorul este compus din două probe care se introduc în sol. Când umiditatea este mare tensiunea transmisă scade, iar când umiditatea scade, tensiunea crește. În partea b) a figurii 24 este reprezentat circuitul de comparare al plăcii de achiziție. Acesta este util în cazul ieșirii digitale. O tensiune de prag este setată prin potențiometrul R2, iar când aceasta este depășită( caz determinat de comparator) un semnal este transmis pe pinul digital care va rezulta în aprinderea LED 1. Când tensiunea va scădea sub prag, se va aprinde LED 2.

Principiul de funcționare al senzorului este măsurarea conductivității solului. Când solul este umed aceasta crește. Altfel spus, probele trec un curent prin sol și cu cât solul este mai uscat rezistența este mai mare.

În proiect se va utiliza ieșirea analogică a plăcii de achiziție. După cum a fost menționat și în prezentarea pinilor, se pot accepta valori între 0 și 1023.

Senzor de nivel lichid pentru rezervoare

Pentru a asigura funcționarea pompelor de lichid doar în cazul în care lichidul depășește nivelul duzei pompelor, se folosește un senzor de nivel cu plutitor(Figura 25 a)). Acesta se comportă ca un întrerupător. Când plutitorul este sus(închis) va transmite un semnal LOW și când plutitorul este jos, HIGH(deschis) datorită configurației cu rezistor de Pull-Up (Figura 25 b))de 10k. Tensiunea maximă de comutare este de 110 V, mai mult decât necesar, iar curentul 0.5A.

.

Figura 25. a)Senzor de nivel b) Circuit senzor nivel

Actuatori

Actuatorii din proiect sunt dispozitivele care fac să se modifice anumite caracteristici ale mediului: temperatura, umiditate aer, umiditate sol și lumina.

Pompele de lichid

Cele două pompe submersibile în miniatură(Figura 26) sunt alimentate prin modulul de acționare la 3.3 V al sursei de alimentare, comandate de către placa de dezvoltare. Cantitatea de apă pompată este de aproximativ 1.7 litri pe minut. Funcționarea continuă ajunge la 500 de ore.

Conectarea la alimentare se face în felul următor: firul + al pompei se leagă la terminalul NO al releului, +3.3V de la sursă se leagă la terminalul COM al releului, iar firul – de la pompă cu GND de la sursă. Când se va da comanda de HIGH pe pinul de comandă, releul cuplează și închide circuitul, astfel pompa începe să funcționeze.

Figura 26. Pompă miniaturală submersibilă

Rezistența de încălzire

Așa cum a fost prezentat în capitolul 4.2.6 pentru încălzirea aerului o rezistență de încălzire thick film, TELPOD GBR-666/12/2, este montată printr-o placă metalică pătrată în 4 șuruburi pe un radiator cu aripioare de dimensiune 5 cm x 5cm dotat cu ventilator. Pentru un mai bun contact termic a fost aplicată pastă termică între suportul ceramic al rezistenței și radiator. Atât rezistența cât și ventilatorul sunt alimentate la 12 V prin același releu, deci sub aceeași comandă.

Valoarea rezistenței este de 3.6 Ohmi, are o putere de 40 W și se poate încălzi până la 350 de grade(valoare la care nu se ajunge niciodată datorită schimbului eficient de căldură dintre ea și mediu).

Dimensiuni rezistență: înălțime 1mm, lățime 25 mm și lungime 38 mm.

(14)

Curentul care străbate rezistența se încadrează în caracteristicile sursei.

Conectarea la releu se face identic cu metoda prezentată la pompele de lichid doar cu alimentare la 12 V.

Ansamblul(Figura 27) este montat printr-un suport metalic în partea superioară a incintei, pe capac.

Figura 27. Ansamblul de încălzire

Umidificatorul

Pentru creșterea umidității se folosește modulul Grove Water Atomization V1.0 de la Seeed (Figura 28 a))care cuprinde o plăcută driver și un traductor ultrasonic.

Figura 28.

a)Modul Water Atomization b)Rezervorul de apă

Interfața Grove cuprinde 4 pini: GND, VCC, EN și NC. Pentru că este singura componentă din proiect cu această interfață, se vor lega fără conector special fire la toți pinii în afară de NC (No Connection). Pinul responsabil de comanda este EN, acesta se conectează la un pin digital al MEGA 2560, iar când se setaza HIGH traductorul va produce vapori, când va fi setat LOW, se va opri. Traductrul este plasat pe un “fitil” îmbibat în apă din rezervorul în care este situat. Deoarece puterea maximă este 2 W adică un curent de 0.4 A, alimentarea se realizează de o sursă externă.

Banda LED RGB

Banda de LED RGB Neopixel WS2812B este poziționată în centrul capacului incintei. La unul din capete se lipesc 3 fire aferente pinilor, VCC, GND și DIN. Pentru o funcționare la standardele dorite VCC se leagă la +5 V de la o sursă externă, iar GND la GND al sursei și al plăcii. Pinul DIN este pinul de comandă prin care sunt controlate LED RGB adresabile și se conectează la o ieșire digitală printr-o rezistență de 470 Ohmi pentru a limita curentul.

Chiar dacă se conectează doar banda ca și consumator de tensiune de 5 V, la intensitatea maximă a luminii albe (R= 255,G = 255, B = 255) durata de funcționare la standardele dorite este mică, LED-urile încep să licărească, își schimbă culoarea spre galben și funcționarea plăcii este blocată. Motivul este curentul necesar, conform producătorului la o bandă de 30 de LED-uri puterea este de 9 W și curentul aproximativ 1.9A. Banda folosită conține 34 de bucăți, deci curentul este mult peste posibilitățile unui pin al plăcii însă facil pentru sursa de alimentare.

Principiul de funcționare al benzii[43]: Capsula înglobează Led-ul, un latch cu port de date inteligent, un circuit de amplificare pentru reconstrucție de semnal, un oscilator de precizie și o componentă de control cu curent constant care asigură constanța și strălucirea culorii. Protocolul

de transfer al datelor folosește modul singular NRZ(Non return to zero). După resetarea pinului de ON al pixelului, datele sunt primite prin DIN de la microcontroler. Primul pixel stochează primii 24 biți de date și îi trimite către latch-ul intern, restul datelor sunt transmise către circuitul de refacere al semnalului și mai apoi prin D0 către următorii Pixeli cascadați(Figura 29). După ce datele au ajuns la fiecare pixel, semnalul de 24 de biți intră în tehnlologia de transmitere prin autorefacere a semnalului, în consecință nu contează numărul de pixeli cascadați ci viteza de transmisie.

Alte Module

Adaptor MicroSd Catalex

Acesta este un modul folosit pentru citirea, scrierea sau crearea de fișiere prin placa de dezvoltare. Configurația pinilor este prezentată în Figura 30. (CS = Chip Select, MOSI = Master

out Slave In, MISO = Master in Slave Out).

Comunicarea dintre modul și Arduino se realizează prin interfața SPI(Interfață serială periferică), iar pinii sunt conectați în felul următor: MOSI – 51, MISO – 50, SCK – 52, CS – 53. Tensiune de alimentare este de 5V și se preia de la placă.

Ceas în timp real de precizie DS3231

Ceasul de precizie este partea din proiect creată cu scopul de a furniza tot timpul ora exactă. Cunoașterea acesteia ajută la implementarea programului automat setat în aplicația PC.Indiferent

dacă ceasul este alimentat sau nu de la placa de dezvoltare, odată setat la o dată de început, acesta măsoară timpul și nu își pierde datele datorită bateriei CR2032 de 3V cu care este echipat.

Plăcuța și configurația pinilor sunt prezentate în figura 31. Pentru proiect se folosesesc ultimii 4 de sus în jos și se conectează după cum urmează: SCL(serial clock line) – 21, SDA(serial data line) – 20, VCC – +5 Arduino, GND – GND Arduino. Interfața folosită pentru comunicare este I2C.

Pentru accesarea informațiilor de la modul se folosește o librărie dedicată.

Modul de semnalizare

Pentru a semnaliza situația în care lichidul din rezervoare este la nivel critic, nivel la care pompa se oprește, a fost construit un modul care conține două LED-uri de 5mm roșii, unul pentru fiecare rezervor. Când Senzorul de nivel transmite semnal HIGH în pinul digital, LED-ul aferent se va aprinde.

(15)

Software

Sectorul Software al proiectului se împarte în mai multe ramuri(Figura 33): Interfața cu utilizatorul(GUI), Codul de funcționare al GUI și programul Embedded care va rula pe placa de dezvoltare(măsurări, acționari, comunicare cu alte dispozitive, inclusiv PC).

Figura 33. Ramurile Software

Interfața grafică cu utilizatorul

Utilizatorul intră în contact doar cu partea vizuală a aplicației. Aceasta este compusă din fereastra principală “Main” și trei ferestre de control : “Acasăctrl”, “Controlctrl” și “Setărictrl”.

Figura 34 Meniul principal și fereastra de control Acasăctrl

Așa cum arată figura 34, meniul principal este format din două ”panel-uri” unul cu setarea DOCK Left, iar celălalt DOCK Up care conține lista de butoane prin care se selectează ferestrele de control(stânga) și respectiv bara cu butoanele de minimizare și ieșire(sus). Un panel suplimentar este poziționat în stânga butoanelor pentru a indica selecția.

Prima fereastră de “User Control” este prezentată în aceeași figură, în ea se situează un pictureBox cu modelul 3D al machetei și etichete cu detalii cu privire la proiect.

Toate butoanele au stilul Flat activat și poza reprezentativă cu aliniere la stânga-mijloc.

În figura 35 este selectată fereastra pentru setări. În ea sunt cuprinse următoarele:

Etichete care semnalează zona de setare a caracteristicilor(Temperatură, Umidiatate)

Etichete pentru unitatea de măsură

Casetă RichText pentru afișare date

Buton pentru transmiterea datelor din fișier prin portul serial, către placa de dezvoltare

Buton pentru ștergerea informațiilor afișate în caseta RichTextBox

Buton pentru scrierea unui fișier cu datele care sunt afișate în casetă

Buton pentru desenarea graficelor ținând cont de informațiile citite din fișier

Grafic pentru temperatură(bar graph cu orele pe abscisă și valorile caracteristicii mediului pe ordonată). Acesta afișează valorile temperaturii citite din fișier. Dacă nu există date noi pentru o anumită oră se desenează valoarea prestabilită. Toate graficele urmează aceleași reguli.

Grafic pentru umiditatea solului

Grafic pentru umiditatea aerului

ComboBox pentru selectarea orei la care să se facă modificarea, cu 5 variante: 08, 12, 16, 20, 00

ComboBox pentru selectarea temperaturii cu opțiunile: 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 50

ComboBox pentru selectarea umidității aerului cu opțiunile: 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60

ComboBox pentru selectarea umidității solului cu următoarele valori predefinite: 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70

Trei butoane situate în dreapta fiecărei specificații pentru a printa selecția în RichTextBox

Următoarea reprezentare (Fig.36) cuprinde elementele pentru controlul manual al machetei:

Etichete indicatoare

6 butoane de tip PushButon pentru acționarea actuatorilor, stare de ON – culoare verde text OFF, stare de OFF – culoare roșie text ON

4 CheckBox-uri pentru alegerea luminii. Se poate bifa unul singur și se va transmite culoarea selectată sau niciunul și se va transmite comanda OFF pentru banda de LED

Trei TextBox-uri cu setare ReadOnly pentru afișarea datelor achiziționate de la senzori

Un buton pentru preluarea informațiilor prin portul serial de la microcontroler și afișarea lor în cele trei TextBox-uri (Umiditate, Temperatură)

Codul aplicației C#

Fereastra Main

La lansarea în execuție a ferestrei, primul cod care se execută este constructorul. În interorul acestuia este apelată metoda InitializeComponent() care inițializează fereastra și o pregătește pentru afișare.

public Controlctrl()

{

InitializeComponent();

}

IndicatorPanel.Height = btnacasa.Height;

IndicatorPanel.Top = btnacasa.Top;

acasactrl1.BringToFront();

La apăsarea butonului se va ieși din aplicație:

private void btnclose_Click(object sender, EventArgs e)

{

this.Close();

}

Minimizarea se face asemănător doar că pe evenimentul de click pe butonul dedicat:

this.WindowState = FormWindowState.Minimized;// fereastra va fi minimizata in bara

Atunci când se mută fereastra, se exectua codul care determină poziția ultimului click:

lastClick = new Point(e.X, e.Y);

Dacă se ține click apăsat pe bara de sus în ideea de a muta fereastra, codul următor mută fereastra în noua poziție prin calcul matematic între vechile coordonate și ultima poziție a clickului apăsat:

private void panel4_MouseMove(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Left) //doar cand este apasat click

{

//muta fereastra cu cat este mutat click-ul

this.Left += e.X – lastClick.X;

this.Top += e.Y – lastClick.Y;

}

}

Când se va selecta un buton din meniu, după modelul codului de mai jos pentru deschiderea ferestrei de control Acasactrl, se va redimensiona Panel-ul indicator și se va aduce în prim plan fereastra dorită.

private void btnacasa_Click(object sender, EventArgs e)

{

IndicatorPanel.Height = btnacasa.Height;//panel indicator

IndicatorPanel.Top = btnacasa.Top;//panel indicator

acasactrl1.BringToFront();//aducere in prim plan

}

Fereastra Setări

Această fereastră, pentru a putea lucra cu portul serial are nevoie de biblioteca System.IO.Ports. Un port, împreună cu setările sale se declară în următorul fel(nume port, rată de transfer, paritate, număr de biți de date, numărul biților de stop):

public SerialPort myport = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);//declarare port nou

Pentru trimiterea informațiilor către placa de dezvoltare a fost creață o metodă dedicată care deschide portul, transmite datele și îl închide la loc:

public void SendToArduino(string data)

{

myport.Open();//deschidere port

myport.Write(data);// scriere date la portul deschis

myport.Close();//inchidere port

}

Toate cele trei butoane care au ca scop preluarea informațiilor indicate de utilizator și afișarea lor în zona casetei de text funcționează după modelul:

private void btnsendtemp_Click(object sender, EventArgs e)

{

//preluare date de la widget-uri si printare in RichText

valuescollection.Text = valuescollection.Text + "t" + comboora.Text + combotempvaloare.Text + " La ora " + comboora.Text + " setam temperatura " + combotempvaloare.Text + "#" + "\r\n";

}

În ideea facilitării interpretării datelor a fost creat un cod de structurare a datelor importante intr-un cuvânt cât mai mic(tip mărime,oră,valoare mărime). Exemplu:

t0830 – conține datele: la oră 8 (08)se setează temperatura (t) 30 de grade

Vectorii care conțin informațiile au lungimea 5, pentru 5 valori diferite ale orelor și sunt inițializați cu valori implicite, dacă nu se setează noi valori, acestea o să fie desenate pe grafic.

int[] temperaturi = new int[5] { 24, 24, 24, 24, 24 };

int[] umidsol = new int[5] { 40, 40, 40, 40, 40 };

int[] umidaer = new int[5] { 40, 40, 40, 40, 40 };

int[] ore = new int[5] { 0, 8, 12, 16, 20 };

Când butonul de scriere a fișierului este apăsat, un eveniment dedicat scrie datele din RichTextBox în el. Dacă fișierul nu există, va fi creat automat.

private void btnwrite_Click(object sender, EventArgs e)

{

string path = Environment.CurrentDirectory + "/" + "data.txt";//calea catre fisier

if (!File.Exists(path))//daca nu exista fisierul

{

File.CreateText(path);//se creaza fisierul

MessageBox.Show("Fisier creat cu succes!");

}

using (StreamWriter sw = new StreamWriter(path)) //solosirea fluxului pentru scriere

{

for (int i = 0; i < valuescollection.Lines.Length; i++)

{

sw.WriteLine(valuescollection.Lines[i]); // scriere in fisier linie cu linie ce este in richText

}

}}

Pentru fiecare desenare a graficelor, acestea trebuie curățate de vechile date, acest procedeu este implemenat în sintaxa:

foreach (var series in charttemp.Series)

{

series.Points.Clear();

}

La actualizarea vectorilor de date prezentați anterior se parcurge codul de 5 caractere extras din linie și se evaluează fiecare element al lui în parte. Dacă de exemplu tipul este t, se parcurg vectorii de la 1 la 5, se compară ora achiziționată cu ora vectorului și la poziția identică din vectorul mărimii, se introduce noua valoare.

if (tip == "t")

{

//pentru ora si tipul determinate se introduce valoarea in pozitia corecta

for (int i = 0; i < 5; i++)

{

if (ora == ore[i])

{

temperaturi[i] = valoare;

}

}

}

Ținând cont că există cinci valori pe abscisa graficelor pentru ore, se va executa o buclă for de 5 ori și în funcție de valoarea citită din vector, va fi desenat graficul.

for (int i = 0; i < 5; i++)

{

charttemp.Series["Temp"].Points.AddXY(ore[i],temperaturi[i] );//graph temp

}

Fereastra Control

Are rolul de a transmite comenzi către Mega2560. Datele se transmit prin evenimente pe apăsarea click-ului la butoanele dedicate. În funcție de caracteristicile butonului la momentul respectiv, se transmite pe portul serial ON sau OFF către actuator. Imediat după ce se transmite starea actuală, aceasta se schimbă în opusa ei împreună cu culoarea.

private void btnfanout_Click(object sender, EventArgs e)

{

if (btnfanout.Text == "ON")

{

SendToArduino("ON1FAN");

}

else

{

SendToArduino("OFF1FAN");

}

btnfanout.Text = SetButton(btnfanout.Text);

btnfanout.BackColor = SetColor(btnfanout.Text);

}

La bifarea unei căsuțe pentru lumină, toate celelalte se debifeaza și se transmite culoarea care urmează să fie aprinsă în banda de LED, asemănător cu situația unui buton normal. Dacă nici o căsuță nu este bifata, mesajul transmis este de stingere.

La actualizarea datelor primite de la senzori, se trimite un mesaj de cerere către arduino după care se închide portul pentru a da posibilitatea trimiterii de către placă a răspunsului. Ulterior se deschide din nou portul și se citește stringul cu valori. Valorile sunt extrase din String cu funcția Substring, cunoscând poziția lor în șir.

String rec;

try

{

myport.Open();

myport.Write("GET");

myport.Close();

myport.Open();

rec = myport.ReadLine(); // preluare date din portul serial

// impartirea stringului in valorile de interes

textBoxTemp.Text = rec.Substring(0, 5);

textBoxHum.Text = rec.Substring(5, 6);

textBoxMoist.Text = rec.Substring(11, 3);

myport.Close();

}

Prima valoare este temperatura, a doua umiditatea aerului și ultima umiditatea solului.

Codul Embedded

Achiziționări

Sunt trei mărimi care se măsoară și patru senzori de la care se achiziționează date: DHT11(umiditate aer și temperatură), NTC(temperatură) și senzorul de umiditate a solului.

Pentru măsurarea DHT11 folosim librăria dedicată “dht.h”. Primul pas este transmiterea către senzor a intenției de achiziționare, pe urmă se pot prelua valorile de la senzor apelând metodele specifice definite de librărie:

chk = DHT.read11(DHT11_PIN);

temp_dht = DHT.temperature;

În cazul senzorului NTC, de pe intrarea analogică se citește tensiunea divizorului și se aplică formula lui Steinhart – Hart (1) de la 4.2.6.

Vo = analogRead(ThermistorPin);

Senzorul cu două probe, pentru sol, se citește tot prin pin analogic, după care valoarea este modificată prin funcția “map” pentru a schimba intervalul de valori de la 0-1023 la 0-100%. Primul parametru al funcției este limita inferioară a mulțimii posibile citite, al doilea limita superioară posibilă, iar ultimii doi definesc intervalul dorit. Doarece la umiditate mare măsurăm valoare mică, primul parametru este mai mare decât al doilea.

moisturevalue = map(moisturevalue, 680, 160, 0, 100);

Acționări

În rândul actionărilor pot intra actuatorii prezentați pană acum în proiect dar și modulele de ceas și de folosire a cardului. Pentru acționarea rezistenței de incălzire, a ventilatoarelor, a LED-urilor de semnalizare sau a pompelor se modifică funcționarea ținând cont de starea pinului lor. Punerea unui pin în LOW sau în HIGH se face după modelul:

digitalWrite(redledpin1, HIGH);

digitalWrite(redledpin1, LOW);

Actuatorii simpli nu au nevoie de librării, în schimb modulele împreună cu banda LED au propriul lor cod de funcționare.

Pentru funcționarea benzii de LED-uri trebuie inclusă în proiect librăria “Adafruit_NeoPixel.h” împreună cu “avr/power.h”. Următorul pas necesar este declararea unei variabile cu detaliile necesare. Se setează astfel numărul de LED-uri din bandă și pinul digital folosit.

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PINLED, NEO_GRB + NEO_KHZ800); //declarare banda LED

În blocul Setup se inițializează Banda prin comanda “pixels.begin()” după care pentru aprinderea pixelilor se urmează instrucțiunea care setează fiecare pixel în parte cu combinația de R,G,B dorită. Pentru punerea simultană a mai multor LED-uri pe ON, se introduce instrucțiunea într-o buclă "for", unde contorul “i” semnifică numărul de ordine. În final, pentru a funcționa banda, se apelează “pixels.show()”.

pixels.setPixelColor(i, pixels.Color(0, 150, 0));

pixels.setPixelColor(NUMPIXELS – i, pixels.Color(0, 150, 0));

Modulul pentru card microSD folosește librăriile “SPI.h” și “SD.h” care sunt utile în comunicarea prin interfață serială periferică și respectiv definirea funcțiilor de scriere și citire a fișierelor text pe card. La fel ca în cazul precedent, inițializarea din “Setup” se face cu SD.begin(53). De data această se menționează și numărul pinului pentru Chip Select. După declararea unei variabile de tip “File” pentru a deschide fișierul se face uz de funcția “SD.open” în care se menționează numele fișierului și scopul deschiderii. Această funcție deschide fișierul dacă există, în caz contrar îl creează. Dacă fișierul nu este NULL se scriu în el datele dorite și se închide cu apelarea metodei “close”.

myFile = SD.open("fis.txt", FILE_WRITE); //deschidere fisier

if (myFile)

{

myFile.write(serialInput[i]);

myFile.close();

}

Atâta timp cât nu este alimentat, modulul de ceas numără folosind resurse de la bateria proprie. Când este conectat la alimentarea exterioară și pinii de comunicare sunt legați la SCL și SDA, se pot prelua informații de la el folosind librăria “Wire.h” și “RTClib.h” care definesc funcționarea interfeței I2C respectiv a ceasului. Inițializarea se realizaeaza prin “rtc.begin()” urmând ca după declararea unei instanțe de tip “DateTime” să se poată accesa oricând timpul furnizat de ceas: ziua, ora, minutul și secunda.

DateTime now = rtc.now(); //declarare now ca instanta DateTime

int oraacum = now.hour();

Comunicarea cu PC-ul

Comunicarea cu computerul pe care este stocată aplicația de control este esentială. Cu ajutorul acestei comunicări se primesc comenzile de executat în programul manual sau datele de funcționare ale celui automat care sunt preluate, stocate pe cardul SD și folosite ulterior.

Tranzacțiile dintre PC și placa de dezvoltare se bazează pe portul serial utilizând librăria “SoftwareSerial.h”. Ambele părti trebuie să respecte aceleași reguli, astfel că rată de transfer este setată în program la 9600 prin inițializarea din “Setup”, Serial.begin(9600). Funcțiile de citire și scriere în portul serial sunt:

Serial.print(23); //scriere

Serial.write();//scriere

Serial.read(); //citire

Mențiuni

Pentru stocarea valorii primite prin serial care indică tipul de funcționare al proiectului(manual sau automat) a fost folosită memoria EEPROM la adresa 0 împreună cu librăria dedicată “EEPROM.h” . la fiecare repetare a programulu aceasta este citită și verificată. Scrierea și citerea se fac cu sintaxa:

EEPROM.write(0,22);//22 = valoarea de scris

EEPROM.read(0);

Modul de funcționare al proiectului din punct de vedere software este prezentat în diagrama de la Figura 37:

Figura . Diagramă proiect

Rezultate Experimentale

Macheta finală

Figura 38 ilustrează macheta realizată a proiectului. Se pot observa: postamentul, elementul de fixare al rezervoarelor, rezervoarele de lichid, incinta de Plexiglass, ventilatorul de intrare, banda LED și rezervorul din interiorul incintei, folosit pentru umidificator.

Figura . Macheta proiectului

Rezultate

Explicarea rezultatelor:

Figura 39

Este confirmată funcționarea semnalizării pentru nivelul apei, când acesta este prea mic LED-ul rezervorului gol se va aprinde și pompa se va opri.

Figura 40

Reprezentarea grafică din Serial Monitor al IDE-ului pentru Arduino a temperaturii măsurate cu senzorul DHT11. Pe axa verticală sunt reprezentate gradele, iar pe cea orizontală numărul de eșantioane desenate. Rezultatele au fost printate la fiecare 5 secunde.

Figura 41

Este exemplificată funcționarea sistemului de ventilare când temperatura a atins valoarea 33

Figura 42

Prezintă meniul prinipal (stânga) cu selecția ferestrei controlului manual. Arată că a fost setată starea pompei de alimentare cu apa în ON. Banda LED este luminată în culoarea bifata în checkBox, adică galbenă. În panoul de Măsurători a fost apăsat butonul de aducere a datelor și sunt afișate valorile umidității solului, aerului și a temperaturii.

Figura 43

Este surprins efectul bifării luminii galbene în aplicație: Banda LED luminează în culoarea transmisă pe portul serial(galbenă).

Figura 44

A fost deschisă fereastra pentru setările programului automat. În caseta de text se pot observa datele care au fost citite din fișier, date scrise la o folosire anterioară a aplicației. Deoarece cele trei setări citite setează valori egale cu cele implicite, graficele sunt constante.

Figura 45

Sunt introduse comenzi noi în caseta text și scrise în fișier prin apăsarea butonului de scriere. Graficele sunt redesenate la valorile actuale.

Prin evenimentul butonului de transmitere a fișierului, datele sunt trimise către placa de dezvoltare.

Figura 46

Verificarea manuală a datelor scrise în fișierul “data.txt” din directorul aplicației PC. Fiecare linie din caseta de text a aplicației echivalează cu o linie scrisă în fișier

Cardul din modulul microSD a fost introdus în PC și sunt verificate datele primite de la aplicație. Se pot observa cele 4 coduri ale comenzilor înșiruite pe aceeași linie. La prelucrarea lor în vederea extragerii datelor esențiale, o variablia string primește toate caracterele de pe linie. Mai apoi aceasta este divizată și sortată în informațiile de interes.

Aplicația de PC este făcută în așa fel încât să funcționeze cu portul COM4 al computerului pentru comunicarea cu Arduino. Dacă placa este deconectată sau este conectată la un port diferit, va apărea un mesaj de eroare, care înștiințează utilizatorul că nu există portul căutat.

Chiar dacă apare eroara menționată, aplicația se deschide și funcționează până în momentul în care trebuie să comunice prin serial. Eroarea va apărea de fiecare dată când se încearcă acest lucru. Inclusiv la închiderea aplicației se afișează mesajul de eroare, deoarece închiderea echivalează cu transmiterea comenzii către machetă pentru a funcționa în program autonom.

Figura . Creșterea temperaturii

Timpul de așteptare pentru creșterea temperaturii de la 22 de grade la 27 a fost de 20 de minute. Odată adusă temperatura la un nivel setat variațiile mici ale ei nu mai persistă mult timp.

Sistemul de ventilare este mult mai rapid, asa cum se poate observa in figura 41, in mai putin de 100 de esantioane temperatura a scazut de la 33 la 21 de grade.

Figura .Scăderea temperaturii prin ventilare

Lumina setată în panoul de Control va rămânea aprinsă și după închiderea aplicației. Nu se

transmite mesaj de stingere în această situație.

Figura 45.Transmiterea fișierului pe serial și redesenarea graficelor

Se printeaza în fișierul aplicației codul și propoziția, chiar dacă informatiiile utile transmise mai apoi din acest fișier către fișierul de pe card sunt doar codurile setărilor. Acest fapt ajută utilizatorul să înțeleagă mai bine setările făcute.

Figura 46. Fișierul scris în aplicație(primul) și cel scris pe card(al doilea)

La lansarea în execuție a aplicației s-a folosit fișierul executabil aflat în folderul bin/Debug. Fișierul text “data.txt”se află după cum arată Figura 48, în aceeași locație.

Pentru depanarea codului aplicației de PC acesta se deschide în mediul de dezvoltare Visual Studio. Depanarea poate fi făcută cu sau fără ajutorul uneltei de depanare, în primul caz, există posibilitatea depanării manuale sau automate.

Depanarea codului Embedded se poate face doar în mediul de programare dedicat urmărind comportamentul sistemului sau ținând cont de erorile indicate.

Concluzie

Scopul proiectului a fost după cum s-a prezentat și în primele părți, realizarea unui microsistem în care condițiile de mediu să fie variabile la inițiativa utilizatorului. Realizarea părții fizice este confirmată de Figura 39. Elementele ce țin de construcție au respectat planul prezentat în capitolele de detaliere ale proiectului. Pe de altă parte, funcționalitatea machetei este dovedită în imaginile de mai sus, care evidențiază o legătură strânsă între toate dispozitivele folosite.

Pentru realizarea proiectului au fost folosite următoarele unelte sau resurse:

Elemente nonelectronice care țin de construcția fizică

Mediul de dezvoltare Visual Studio

Mediul de dezvoltare Arduino

Componente electronice în rol de actuatori, senzori sau control

Capacitățile microsistemului sunt:

Măsurarea condițiilor de mediu

Crearea condițiilor de mediu dorite de utilizator

Comunicarea cu utilizatorul prin intermediul aplicației pentru PC

Intervalele care pot fi selectate in vederea configurarii sistemului sunt:

Temperatură: 24 – 50, cu pas de 2 grade

Umiditate sol: 40 – 70, cu pas de 2 procente

Umiditate aer: 40 – 60, cu pas de 2 procente

Ore: 8 – 00, cu pas de 4 ore

Introducerea de valori noi față de cele existente în listă se face doar prin editarea aplicației în mediul ei de dezvoltare. În cazul temperaturii, așa cum a fost exemplificat, poate dura o perioadă îndelungată de timp să se ajungă la valorile mari. În același timp, condițiile mediului exterior incintei pot influența negativ puterea rezistenței de încălzire în îndeplinirea rolului ei.

În concluzia implementării proiectului se poate spune că macheta poate asigura condiții de vegetație pentru plante asemănător produselor comerciale de pe piață prezentate în primul capitol. Sunt folosite principii noi ale utilizării electronicii în creșterea plantelor cum ar fi iluminarea LED colora sau albă(care poate influența dezvoltarea plantelor, infloririea sau fructificarea), sistemul de irigare prin conducte până la rădăcinile plantelor sau asigurarea temperaturii benefice.

Proiectul se dovedește un sistem ușor de folosit, dinamic și cu posibilitate de adăugare de funcționalități noi. Placa de dezvoltare suportă adăugarea de noi dispozitive cu diverse aplicabilități, iar interfața cu utilizatorul poate beneficia de adăugarea mai multor ferestre de lucru. Alimentarea sistemului de irigare de la rețeaua comună, monitorizarea dezvoltării plantelor prin cameră HD, dezvoltarea unei aplicații mobile sunt doar câteva posibile îmbunătățiri viitoare. Calitatea de bază a întregului sistem este adaptabilitatea la cerințele și nevoile deținătorului.

Anexe

Diagrama circuitului

Dioda

Tranzistorul

Releul

Arduino Mega 2560

Codul C#

Fereastra main

namespace MuresanBeniamin

{

public partial class Main : Form

{

Point lastClick; //memoreaza unde a fost apasat click

public Main()

{

InitializeComponent();

SendToArduino("11");

IndicatorPanel.Height = btnacasa.Height;

IndicatorPanel.Top = btnacasa.Top;

acasactrl3.BringToFront();

this.Icon = MuresanBeniamin.Properties.Resources.tera;

btnacasa.BackColor = Color.SeaGreen;

}

public SerialPort myport = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);

public void SendToArduino(string data)

{

try

{

myport.Open();

myport.Write(data);

myport.Close();

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);//eroare port

}

}

private void btnclose_Click(object sender, EventArgs e)

{

SendToArduino("22");

this.Close();

}

private void btnminimize_Click(object sender, EventArgs e)

{

this.WindowState = FormWindowState.Minimized;

}

private void btnacasa_Click(object sender, EventArgs e)

{

IndicatorPanel.Height = btnacasa.Height;//panel indicator

IndicatorPanel.Top = btnacasa.Top;//panel indicator

acasactrl3.BringToFront();//aducere in prim plan

btnsetari.BackColor = Color.MediumSeaGreen;

btnacasa.BackColor = Color.SeaGreen;

btncontrol.BackColor = Color.MediumSeaGreen;

}

private void btnsetari_Click(object sender, EventArgs e)

{

IndicatorPanel.Height = btnsetari.Height;

IndicatorPanel.Top = btnsetari.Top;

setarictrl2.BringToFront();

btnsetari.BackColor = Color.SeaGreen;

btnacasa.BackColor = Color.MediumSeaGreen;

btncontrol.BackColor = Color.MediumSeaGreen;

}

private void btncontrol_Click(object sender, EventArgs e)

{

IndicatorPanel.Height = btncontrol.Height;

IndicatorPanel.Top = btncontrol.Top;

controlctrl3.BringToFront();

btnsetari.BackColor = Color.MediumSeaGreen;

btnacasa.BackColor = Color.MediumSeaGreen;

btncontrol.BackColor = Color.SeaGreen;

}

private void panel4_MouseDown(object sender, MouseEventArgs e)

{

lastClick = new Point(e.X, e.Y); //necesar pentru mutarea ferestrei

}

private void panel4_MouseMove(object sender, MouseEventArgs e)

{

if (e.Button == MouseButtons.Left) //doar cand este apasat click

{

//muta fereastra cu cat este mutat click-ul

this.Left += e.X – lastClick.X;

this.Top += e.Y – lastClick.Y;

}

}

}

}

User control “Acasactrl”

namespace MuresanBeniamin

{

public partial class Acasactrl : UserControl

{

public Acasactrl()

{

InitializeComponent();

}

}

}

User control “Setarictrl”

namespace MuresanBeniamin

{

public partial class Setarictrl : UserControl

{

public Setarictrl()

{

InitializeComponent();

}

// tablouri pentru valorile marimilor

int[] temperaturi = new int[5] { 24, 24, 24, 24, 24 };

int[] umidsol = new int[5] { 40, 40, 40, 40, 40 };

int[] umidaer = new int[5] { 40, 40, 40, 40, 40 };

int[] ore = new int[5] { 0, 8, 12, 16, 20 };

public SerialPort myport = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);//declarare port nou

public void SendToArduino(string data)

{

myport.Open();//deschidere port

myport.Write(data);// scriere date la portul deschis

myport.Close();//inchidere port

}

private void btnsendtemp_Click(object sender, EventArgs e)

{

//preluare date de la widget-uri si printare in RichText

valuescollection.Text = valuescollection.Text + "t" + comboora.Text + combotempvaloare.Text + "#"+ " La ora " + comboora.Text + " setam temperatura " + combotempvaloare.Text + "\r\n";

}

private void btnsendhum_Click(object sender, EventArgs e)

{

valuescollection.Text = valuescollection.Text + "a" + comboora.Text + combohumvaloare.Text + "#" + " La ora " + comboora.Text + " setam umiditatea areului " + combohumvaloare.Text + "\r\n";

}

private void btnsendmoist_Click(object sender, EventArgs e)

{

valuescollection.Text = valuescollection.Text + "s" + comboora.Text + combomoistvalue.Text + "#" + " La ora " + comboora.Text + " setam umiditatea solului " + combomoistvalue.Text + "\r\n";

}

//scriere fisier

private void btnwrite_Click(object sender, EventArgs e)

{

btnarduino.Enabled = true;

string path = Environment.CurrentDirectory + "/" + "data.txt";//calea catre fisier

if (!File.Exists(path))//daca nu exista fisierul

{

File.CreateText(path);//se creaza fisierul

MessageBox.Show("Fisier creat cu succes!");

}

using (StreamWriter sw = new StreamWriter(path)) //solosirea fluxului pentru scriere

{

for (int i = 0; i < valuescollection.Lines.Length; i++)

{

sw.WriteLine(valuescollection.Lines[i]); // scriere in fisier linie cu linie ce este in richText

}

}

}

private void btnarduino_Click(object sender, EventArgs e)

{

string line;//declarare string nou pentru stocare date linie

string path = Environment.CurrentDirectory + "/" + "data.txt";//cale

System.IO.StreamReader file = new System.IO.StreamReader(path);//flux de citire a fisierului

while ((line = file.ReadLine()) != null)//cat timp exista linii scrise

{

if (line.Length > 0)//daca linia contine text

{

SendToArduino(line.Substring(0,5));// se transmite spre arduino codul informational de la fiecare linie

}

}

btnarduino.Enabled = false;

file.Close();

}

//citire date din fisier

private void btnread_Click(object sender, EventArgs e)

{

valuescollection.Text = "";//stercere caseta

string path = Environment.CurrentDirectory + "/" + "data.txt";

string[] lines = File.ReadAllLines(path);

foreach (string line in lines)// alta metoda de citire pe linii

{

valuescollection.Text += line + "\r\n"; // scriere in richText si trecere pe linie noua in richText

}

}

private void btnerase_Click(object sender, EventArgs e)

{

valuescollection.Text = ""; //stergere text caseta

}

//desenarea graficelor la eveniment de click pe buton

private void btndesen_Click(object sender, EventArgs e)

{

//setare grafice ca fiind vizibile

charttemp.Visible = true;

chartumidaer.Visible = true;

chartumidsol.Visible = true;

//setare pentru afisarea tuturor valorilor pe orizontala

chartumidsol.ChartAreas[0].AxisX.Interval = 2;

chartumidaer.ChartAreas[0].AxisX.Interval = 2;

charttemp.ChartAreas[0].AxisX.Interval = 2;

// curatare grafic inainte de o noua desenare

foreach (var series in charttemp.Series)

{

series.Points.Clear();

}

foreach (var series in chartumidaer.Series)

{

series.Points.Clear();

}

foreach (var series in chartumidsol.Series)

{

series.Points.Clear();

}

int valoare, ora; // valoarea marimii, citita din fisier, ora citita din fisier

string tip, line;// tip = tipul de date trasnmise, linie = linie din fisier

//citire fisier

string path = Environment.CurrentDirectory + "/" + "data.txt";

System.IO.StreamReader file = new System.IO.StreamReader(path);

while ((line = file.ReadLine()) != null)

{

if (line.Length > 0)

{

tip = line.Substring(0, 1);//scoaterea tipului din string

ora = Int32.Parse(line.Substring(1, 2));//scoaterea orei

valoare = Int32.Parse(line.Substring(3, 2));//scoaterea valorii marimii

//conditionare in functie de tip

if (tip == "t")

{

//pentru ora si tipul determinate se introduce valoarea in pozitia corecta

for (int i = 0; i < 5; i++)

{

if (ora == ore[i])

{

temperaturi[i] = valoare;

}

}

}

else if (tip == "a")

{

for (int i = 0; i < 5; i++)

{

if (ora == ore[i])

{

umidaer[i] = valoare;

}

}

}

else if (tip == "s")

{

for (int i = 0; i < 5; i++)

{

if (ora == ore[i])

{

umidsol[i] = valoare;

}

}

}

}

}

//desenare grafice

for (int i = 0; i < 5; i++)

{

charttemp.Series["Temp"].Points.AddXY(ore[i],temperaturi[i] );

}

for (int i = 0; i < 5; i++)

{

chartumidaer.Series["Um.aer"].Points.AddXY(ore[i], umidaer[i]);

}

for (int i = 0; i < 5; i++)

{

chartumidsol.Series["Um.sol"].Points.AddXY(ore[i], umidsol[i]);

}

file.Close();//inchide fisierul

}

}

}

User Control “Controlctrl”

namespace MuresanBeniamin

{

public partial class Controlctrl : UserControl

{

public Controlctrl()

{

InitializeComponent();

}

public SerialPort myport = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One);

private void LEDsOFF()

{

//daca nu este bifata nici o casuta, se transmite stingerea

if (!boxblue.Checked && !boxgreen.Checked && !boxred.Checked && !boxyellow.Checked)

{

SendToArduino("LEDSOFF");

}

}

public void SendToArduino(string data)

{

try

{

myport.Open();

myport.Write(data);

myport.Close();

}

catch ( Exception ex)

{

MessageBox.Show(ex.Message);//eroare port

}

}

private string SetButton(string state)//metoda de modificare a textului butonului la click

{

if (state == "ON")

{

return "OFF";

}

else return "ON";

}

private Color SetColor(string state)//metoda de modificare a culorii butonului la click corelata cu starea lui

{

if (state == "ON")

{

return Color.Crimson;

}

else return Color.MediumSeaGreen;

}

//in functie de caracteristicile butonului se transmite on sau off

private void btnfanout_Click(object sender, EventArgs e)

{

if (btnfanout.Text == "ON")

{

SendToArduino("ON1FAN");

}

else

{

SendToArduino("OFF1FAN");

}

btnfanout.Text = SetButton(btnfanout.Text);

btnfanout.BackColor = SetColor(btnfanout.Text);

}

private void btnfanin_Click(object sender, EventArgs e)

{

if (btnfanin.Text == "ON")

{

SendToArduino("ON2FAN");

}

else

{

SendToArduino("OFF2FAN");

}

btnfanin.Text = SetButton(btnfanin.Text);

btnfanin.BackColor = SetColor(btnfanin.Text);

}

private void btnwater_Click(object sender, EventArgs e)

{

if (btnwater.Text == "ON")

{

SendToArduino("ON1PUMP");

}

else

{

SendToArduino("OFF1PUMP");

}

btnwater.Text = SetButton(btnwater.Text);

btnwater.BackColor = SetColor(btnwater.Text);

}

private void btnnut_Click(object sender, EventArgs e)

{

if (btnnut.Text == "ON")

{

SendToArduino("ON2PUMP");

}

else

{

SendToArduino("OFF2PUMP");

}

btnnut.Text = SetButton(btnnut.Text);

btnnut.BackColor = SetColor(btnnut.Text);

}

private void btnheat_Click(object sender, EventArgs e)

{

if (btnheat.Text == "ON")

{

SendToArduino("ONHEAT");

}

else

{

SendToArduino("OFFHEAT");

}

btnheat.Text = SetButton(btnheat.Text);

btnheat.BackColor = SetColor(btnheat.Text);

}

private void btnvapo_Click(object sender, EventArgs e)

{

if (btnvapo.Text == "ON")

{

SendToArduino("ONATOM");

}

else

{

SendToArduino("OFFATOM");

}

btnvapo.Text = SetButton(btnvapo.Text);

btnvapo.BackColor = SetColor(btnvapo.Text);

}

private void boxyellow_CheckedChanged(object sender, EventArgs e)

{

LEDsOFF();

if (boxyellow.Checked == true)

{

SendToArduino("YELLOW");

boxred.Checked = false;

boxblue.Checked = false;

boxgreen.Checked = false;

}

}

private void boxred_CheckedChanged(object sender, EventArgs e)

{

LEDsOFF();

if (boxred.Checked == true)

{

SendToArduino("RED");

boxyellow.Checked = false;

boxblue.Checked = false;

boxgreen.Checked = false;

}

}

private void boxgreen_CheckedChanged(object sender, EventArgs e)

{

LEDsOFF();

if (boxgreen.Checked == true)

{

SendToArduino("GREEN");

boxred.Checked = false;

boxblue.Checked = false;

boxyellow.Checked = false;

}

}

private void boxblue_CheckedChanged(object sender, EventArgs e)

{

LEDsOFF();

if (boxblue.Checked == true)

{

SendToArduino("BLUE");

boxred.Checked = false;

boxyellow.Checked = false;

boxgreen.Checked = false;

}

}

private void btnupdate_Click(object sender, EventArgs e)

{

String rec;

try

{

myport.Open();

myport.Write("GET");

myport.Close();

myport.Open();

rec = myport.ReadLine(); // preluare date din portul serial

// impartirea stringului in valorile de interes

textBoxTemp.Text = rec.Substring(0, 5);

textBoxHum.Text = rec.Substring(5, 6);

textBoxMoist.Text = rec.Substring(11, 3);

myport.Close();

}

catch (Exception ex)

{

MessageBox.Show(ex.Message);//eroare port

}

}

}

}

Codul Arduino

#include <EEPROM.h>

#include <Wire.h> //librarie utila la RTC

#include "RTClib.h" //librarie RTC

#include <SPI.h> //librarie pentru interfata SPI utila la SD

#include <SD.h> //librarie modul SD

#include <dht.h> //librarie pentru DHT11

#include <SoftwareSerial.h> // librarie transfer serial

//declaratii pentru LED-uri

#include <Adafruit_NeoPixel.h> //librarie pentru LED

#ifdef __AVR__ //pentru LED

#include <avr/power.h> // pentru LED

#endif // pentru LED

// definire pini

const int ThermistorPin = A0; //pinul analogic al NTC

const int fan1 = 22; //pin cooler 1

const int fan2 = 25; //pin cooler 2

const int pump1 = 35; //pin pompa 1

const int pump2 = 26; //pin pompa 2

const int heatpin = 24; // pin incalzire

const int atompin = 36; //pin umidificator

const int moisturepin = A2; //pin senzor umiditate sol

const int DHT11_PIN = 31; // pin digital DHT11

const int PINLED = 8; // pin de comanda banda LED

const int NUMPIXELS = 35; //nr de LED din banda

const int Nivel1pin = 2; // pin senzor de nivel rezervor 1

const int Nivel2pin = 3; // pin senzor de nivel rezervor 2

const int redledpin1 = 47;//pin de semnalizare pentru rezervorul 1

const int redledpin2 = 49;//pin de semnalizare pentru rezervorul 2

//declaratii termistor NTC

int Vo; //tensiunea de iesire

float R1 = 1000; //rezistenta cunoscuta din divizor

float logR2, R2, T, temp_ntc; //R2 este rezistenta NTC, declaratii pentru usurare calcule

float c1 = 1.523484975e-03, c2 = 2.594481033e-04, c3 = 2.019202697e-07; // coeficientii Steinhart Hart

//declaratii DHT

int chk;

float temp_dht;// temperatura DHT

float hum_dht; //umiditate DHT

dht DHT; //declarare variabila de dip DHT

//altele

float temp = 15.00; //temperatura finala

int moisturevalue; // valoarea umiditatii solului

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PINLED, NEO_GRB + NEO_KHZ800); //declarare banda LED

RTC_DS3231 rtc; // declarare variabila de tip RTC_DS3231

String in;//string intrare seriala

int count = 0;

//pentru achizitionarea datelor de la DHT o data la doua secunde

unsigned long Millisinceput;

unsigned long Millisacum;

const unsigned long durata = 2000; // 2000 de milisecunde

//stare relee pentru temp

int relaysStatus = 0;

//vectori marimi

int temperaturi[5] = { 24, 24, 24, 24, 24 };

int umidsol[5] = { 40, 40, 40, 40, 40 };

int umidaer[5] = { 40, 40, 40, 40, 40 };

int ore[5] = { 0, 8, 12, 16, 20 };

//valori referinta marimi

int reftemp;

int refumida;

int refumids;

void setup() {

Millisacum = millis();

pixels.begin(); //initializare LED

rtc.begin(); //initializare Ceas

SD.begin(53); //initializare SD

Serial.begin(9600); // setare rata de trasnfer serial

// setarea directiei pinilor digitali

pinMode(fan1, OUTPUT);

pinMode(fan2, OUTPUT);

pinMode(pump1, OUTPUT);

pinMode(pump2, OUTPUT);

pinMode(heatpin, OUTPUT);

pinMode(atompin, OUTPUT);

pinMode(redledpin1, OUTPUT);

pinMode(redledpin2, OUTPUT);

pinMode(Nivel1pin, INPUT);

pinMode(Nivel2pin, INPUT);

Serial.setTimeout(250);//pentru readstring,citeste mai rapid

EEPROM.write(0,22);

}

void loop() {

//vectori valori program automat

DateTime now = rtc.now(); //declarare now ca instanta DateTime

int oraacum = now.hour();

//preluare umiditate sol

moisturevalue = analogRead(moisturepin);

moisturevalue = map(moisturevalue, 1019, 20, 0, 100); // folosim map pentru a avea 0-100%

//preluare date DHT

Millisacum = millis(); // preluare valori contor la momentul actual

if (Millisacum – Millisinceput >= durata) // verificam daca a trecut timpul setat (2000 millis)

{

chk = DHT.read11(DHT11_PIN);

temp_dht = DHT.temperature;

hum_dht = DHT.humidity;

Millisinceput = Millisacum;//reinitializare cu valoarea actuala

}

//preluare temperatura NTC

Vo = analogRead(ThermistorPin); //citire valoare senzor NTC

R2 = R1 * (1023.0 / (float)Vo – 1.0); // calculare R ntc

logR2 = log(R2);

T = (1.0 / (c1 + c2 * logR2 + c3 * logR2 * logR2 * logR2)); //calcul temperatura in kelvin

temp_ntc = T – 273.15; // calcul temperatura in Celsius

temp = (temp_ntc + temp_dht) / 2; //medierea valorilor NTC DHT11

temp = ((int)(temp * 100)) / 100; //rotunjire

//selectie program manual sau automat

if (Serial.available() > 0)

{

in = Serial.readString();

//11 inseamna control manual

//22 inseamna control automat

if (in == "11")

{

EEPROM.write(0, 11);

}//endif 11

else if (in == "22")

{

EEPROM.write(0, 22);

}//endelse 22

if (EEPROM.read(0) == 11)//daca e setat program manual

{

count++;

//se sting toti actuatorii cand se parcurge prima data aceasta bucla

if(count == 1)

{

digitalWrite(fan1, LOW);

digitalWrite(fan2, LOW);

digitalWrite(pump1, LOW);

digitalWrite(pump2, LOW);

digitalWrite(heatpin, LOW);

digitalWrite(atompin, LOW);

}

ManualControl(in);

}//endif program manual

}//endserialavailable

if (EEPROM.read(0) == 22) //daca e setat program auto

{

count = 0;

File myFile;

String instring = "";

myFile = SD.open("fis.txt");

if (myFile) {

Serial.println();

// read from the file until there's nothing else in it:

while (myFile.available()) {

char inchar = myFile.read();

if (inchar == '/n')

{

myFile.close();//citeste pana la capatul liniei si iasa

break;

}

else

{

instring += inchar;//daca nu e la capat de linie, formeaza stringul

}

}

myFile.close();//inchidere fisier citit

}//end if file

// actualizare date din vectori

for(int i = 0; i < instring.length(); i++)

{

if (instring[i] == 't') // daca tipul datelor este temperatura

{

for(int j = 0; j < 5; j++)//parcurgere pe lungimea vectorului temperatura

{

if ((instring.substring(i+1,i+3)).toInt() == ore[j])//citire ora din string

{

temperaturi[j] = (instring.substring(i+3,i+5)).toInt();//actualizare vector la ora citita

}// endif actualizare

}//end for, parcurgere

}//end if t

if (instring[i] == 's')// daca tipul datelor este umiditatea solului

{

for(int j = 0; j < 5; j++)

{

if ((instring.substring(i+1,i+3)).toInt() == ore[j])

{

umidsol[j] = (instring.substring(i+3,i+5)).toInt();

}//ednif

}//endfor

}//end if s

if (instring[i] == 'a') //daca tipul datelor este umiditatea aerului

{

for(int j = 0; j < 5; j++)

{

if ((instring.substring(i+1,i+3)).toInt() == ore[j])

{

umidaer[j] = (instring.substring(i+3,i+5)).toInt();

}//end if actualizare

}//endfor parcurgere

}//end if a

}//end parcurgere string citit din fisier

// for(int i = 0; i <5; i++){

// Serial.print(temperaturi[i]);

// }

settemp();

sethumaer();

sethumsol();

}//endif program auto

// semnalizare rezervoare goale

if(digitalRead(Nivel1pin) == HIGH)

{

digitalWrite(redledpin1, HIGH);

}

else

{

digitalWrite(redledpin1, LOW);

}

if(digitalRead(Nivel2pin) == HIGH)

{

digitalWrite(redledpin2, HIGH);

}

else

{

digitalWrite(redledpin2, LOW);

}

for (int k =0; k<5; k++)

{

if (oraacum >= ore[4] and oraacum <=ore[4] + 3) // daca ora este intre 20 si 23

{

reftemp = temperaturi[4];

refumida = umidaer[4];

refumids = umidsol[4];

}

else if(oraacum >= ore[k] and oraacum< ore[k+1])//pozitioneaza ora pe interval si setaza referintele

{

reftemp = temperaturi[k];

refumida = umidaer[k];

refumids = umidsol[k];

}

}

} // end loop

void ColorSett(String col) // functie de setare a culorii benzii

{

for (int i = NUMPIXELS / 2; i < NUMPIXELS; i++){ // se parcurg toate LED-urile si se

//seteaza culoarea in functie de valorile R,G,B

if (col == "RED")

{

pixels.setPixelColor(i, pixels.Color(150, 0, 0));

pixels.setPixelColor(NUMPIXELS – i, pixels.Color(150, 0, 0));

}

else if (col == "GREEN")

{

pixels.setPixelColor(i, pixels.Color(0, 150, 0));

pixels.setPixelColor(NUMPIXELS – i, pixels.Color(0, 150, 0));

}

else if (col == "BLUE")

{

pixels.setPixelColor(i, pixels.Color(0, 0, 150));

pixels.setPixelColor(NUMPIXELS – i, pixels.Color(0, 0, 150));

}

else if (col == "YELLOW")

{

pixels.setPixelColor(i, pixels.Color(150, 150, 50));

pixels.setPixelColor(NUMPIXELS – i, pixels.Color(150, 150, 50));

}

else if (col == "OFF")

{

pixels.setPixelColor(i, pixels.Color(0, 0, 0));

pixels.setPixelColor(NUMPIXELS – i, pixels.Color(0, 0, 0));

}

pixels.show();//actualizare pixel

delay(10);//delay pentru afisarea urmatorului LED

}

}

void ManualControl(String serialInput)

{

//comparatii

if (serialInput == "ON1FAN")

{

digitalWrite(fan1, HIGH);

}

else if (serialInput == "OFF1FAN")

{

digitalWrite(fan1, LOW);

}

else if (serialInput == "ON2FAN")

{

digitalWrite(fan2, HIGH);

}

else if (serialInput == "OFF2FAN")

{

digitalWrite(fan2, LOW);

}

else if (serialInput == "ON1PUMP")

{

digitalWrite(pump1, HIGH);

}

else if (serialInput == "OFF1PUMP")

{

digitalWrite(pump1, LOW);

}

else if (serialInput == "ON2PUMP")

{

digitalWrite(pump2, HIGH);

}

else if (serialInput == "OFF2PUMP")

{

digitalWrite(pump2, LOW);

}

else if (serialInput == "ONHEAT")

{

digitalWrite(heatpin, HIGH);

}

else if (serialInput == "OFFHEAT")

{

digitalWrite(heatpin, LOW);

}

else if (serialInput == "RED")

{

ColorSett("RED");

}

else if (serialInput == "GREEN")

{

ColorSett("GREEN");

}

else if (serialInput == "BLUE")

{

ColorSett("BLUE");

}

else if (serialInput == "YELLOW")

{

ColorSett("YELLOW");

}

else if (serialInput == "LEDSOFF")

{

ColorSett("OFF");

}

else if (serialInput == "ONATOM") //pornire umidificator

{

digitalWrite(atompin, HIGH);

}

else if (serialInput == "OFFATOM") //oprire umidificator

{

digitalWrite(atompin, LOW);

}

else if (serialInput == "GET") //transmitere date senzori catre aplicatie

{

//preluare date DHT

chk = DHT.read11(DHT11_PIN);// citirea DHT11

temp_dht = DHT.temperature; ///preluare valoare temperatura

hum_dht = DHT.humidity;///preluare valoare umiditate

//temperatura finala masurata prin DHT si NTC, mediata

temp = (temp_ntc + temp_dht) / 2; //medierea valorilor NTC DHT11

temp = ((int)(temp * 100)) / 100; //rotunjire

hum_dht = ((int)(hum_dht * 100)) / 100; //rotunjire

String serialstring = String(temp) + String(hum_dht) + '%' + String(moisturevalue) + '%'; // formarea sirului de caractere de transmis

Serial.println(serialstring); //transmitere

}

else if (serialInput != "11" && serialInput != "11" && "22")

{

if (SD.exists("fis.txt"))

{

SD.remove("fis.txt");

}

File myFile; //declarare fisier

myFile = SD.open("fis.txt", FILE_WRITE); //deschidere fisier

if (myFile)

{

for (int i=0; i<= serialInput.length(); i++) //printare in fisier ce se primeste pe serial

{

myFile.write(serialInput[i]);

}

ColorSett("GREEN"); // daca totul s-a desfasurat ok se aprinde si se stinge banda LED in verde

delay(10);

ColorSett("OFF");

myFile.close();

}

else

{

ColorSett("RED"); //altfel se aprinde rosu

delay(10);

ColorSett("OFF");

}

}//endelse

}//endManualControl

// functie pentru modificare automata a temperaturii

void settemp()

{

if (temp > reftemp) // fara histereza

{

digitalWrite(fan1, HIGH);//pornesc ventilator

digitalWrite(fan2, HIGH);//pornesc ventilator

digitalWrite(heatpin, LOW);//opresc incalzirea

}

else if(temp <= reftemp)

{

digitalWrite(fan1, LOW);

digitalWrite(fan2, LOW);

digitalWrite(heatpin, HIGH);

}

//if ( relaysStatus ==0 and temp>= reftemp -0.5) //cu histereza dar fara deschiderea aplicatiei!!!

// {

// digitalWrite(fan1, HIGH);//pornesc ventilator

// digitalWrite(fan2, HIGH);//pornesc ventilator

// digitalWrite(heatpin, LOW);//opresc incalzirea

// relaysStatus = 1;

//

// }

// if(relaysStatus == 1 and temp < reftemp +0.5 )

// {

// digitalWrite(fan1, LOW);

// digitalWrite(fan2, LOW);

// digitalWrite(heatpin, HIGH);

// relaysStatus = 0;

// }

//

}//endsettemp

//functie pt modificarea automata a umiditatii aerului

void sethumaer()

{

if (hum_dht > refumida)

{

digitalWrite(atompin, LOW);

}

else if(hum_dht <= refumida)

{

digitalWrite(atompin, HIGH);

}

}//endsethumaer

void sethumsol()

{

if (moisturevalue > refumids)

{

digitalWrite(pump1, LOW);

digitalWrite(pump2, LOW);

}

else if(moisturevalue <= refumids)

{

digitalWrite(pump1, HIGH);

digitalWrite(pump2, HIGH);

}

}//endsethumsol

CV Beniamin Muresan

Similar Posts