Направи си сам – Ардуино система за следене на почвената влага

2
57

В тази статия ще се спрем на една от любимите теми в информационните технологии напоследък – темата за Интернет на нещата или Internet of Things (IoT). Както може би ви е известно, концепцията на IoT накратко е следната – домашни уреди и инсталации (от четки за зъби до климатични системи) да бъдат свързани с глобалната мрежа. Целта е вие (или Големия брат – ако сте по-конспиративни)  да достъпвате информация за вашите устройства в Интернет и да ги контролирате пак оттам. Свършили сте сиренето? Няма проблем – „умният“ ви хладилник е сигнализирал своевременно и може би дори е купил онлайн. Искате, като се приберете от работа, вечерята да е гототова? Просто включете вашата фурна, заредена с любимата ви мусака, дистанционно от телефона си.

Засега много от възможните приложения на IoT са все още твърде футуристични и дизайнерски, но истината е, че тази технология бавно и уверено си проправя път в съвременния ни бит. Истинският проблем обаче е, че към днешна дата подобни технологични решения са необосновано скъпи за поставените цели. Защо ми е да инвестирам стотици лева в „умна“ система за контрол на електрическия ми радиатор вкъщи, когато мога да управлявам същия и с програмируем превключвател от Практикер за 10 лева? Защо изобщо ми е да контролирам осветлението в градината през Мрежата, когато за това може да се погрижи напълно автономно и обикновен фотодиод, струващ стотинки?

Оставяме настрана тези философски размишления и стигаме до същината, която сме заложили в този материал. А тя е, че с малко повече труд и никак не много пари, Интернет на нещата може да дойде и във вашия дом. С любезното съдейествие на Ардуино, разбира се.

Целта

Идеята е да демонстрираме как работи популярният безжичен контролер ESP8266, който е вероятно най-евтиното нещо на пазара със собствен мрежов адрес. Ще покажем как да го свържете към Ардуино модул от една страна и към Интернет – от друга. Ще използваме Ардуино модула за измерване на данни от околната среда (типично негово приложение), които ще се визуализират в html страница на браузера на домашният ви PC или директно на телефона. Проектът, който ще ви представим, е супер базов, но това е и нашата цел – да покажем най-важното и да създадем основата, която впоследствие вие с малко усилия ще можете да надградите според нуждите си.

Проектът

По-конкретно нашият проект представлява сиситема за следене на почвената валага, чийто измервания се предават директно на страницата на хост в частна локална мрежа, генерирана от ESP8266.

Необходимите материали са:

  • 1 бр. микроконтролер ESP8266 (цена – 2-3 $);
  • 1 бр. микроконтролер Arduino Nano (цена – 2-3$);
  • 1 бр.регулатор на напрежение LM317T;
  • 1 бр. резистор 220 Ω;
  • 1 бр. резистор 360 Ω;
  • 1 бр. резистор 10 kΩ ;
  • 1 бр. резистор 1 kΩ ;
  • 1 бр. резистор 2 kΩ;
  • 1 бр. печатна платка, едностранно фолирана и непробита – 100х80 mm;
  • 1 бр. универсална печатна платка или макетна платка тип Breadboard;
  • 10 бр. джъмпер кабели, мъжко-женски, 10 cm;
  • 1 бр. външна батерия за телефон.

Ориентировъчната цена на дребните компоненти и платки е окололо 5 лева, така че цялата стойност на проекта е около 10 – 15 лева. Правим важното уточнение, че посочените цени на микроконтролерите се отнасят за евтините китайски клонинги на въпросните продукти, които можете да поръчате от ebay.com. Оригиналите са десетократно по-скъпи. Хубаво е да знаете, че разлика между оригинал и клонинг функционално няма, тя е в качеството на вложените материали и изработката. За непретенциозни цели смело взимайте клонинги, но не се изненадвайте, когато скоро контролерът ви мистеризно изгори или се разбие micro USB-то им. Просто си вземете повече бройки – за всеки случай.

Необходими умения:

Добре е да имате базови познания за програмиране на Ардуино микроконтролери и да можете да запоявате, ако не използвате breadboard платка.

Как да подкараме ESP8266

За размерите и цената си ESP8266 притежава повече от чудесна функционалност, но мъничкият контролер си има и недостатък – никак не е „юзър френдли“. За да го накараме да свърши нещо полезно, трябва доста предварителна подготовка. Но преди да ви запознаем с нея, нека видим какво представлява ESP 8266.

На снимката е показана базовата референция на ESP8266, която ще използваме в този проект. Продуктът има и други версии с по-разширена функционалност, но дори и в този си вид върши достатъчно добра работа. ESP8266 разполага с WI-FI антена и възможност за работа като мрежова точка за достъп. Освен това контролерът има два пина за серийна комуникация (RX/TX), които се използват за програмирането му и за обмен на информация с друго устройство, както и два входно-изходни пина с „общо предназначение“ (GPIO0 и GPIO2) – те могат да послужат за контрол на допълнителни устройства, подобно на аналоговите пинове на Ардуино модулите.

Контролерът е с вградена 1MiB флаш памет (поне моят е такъв!) и вие можете да го конфигурирате с фърмуеъри по свой вкус, най-популярен от които е NodeMCU. Това обаче не е лека задача, особено за новаци без опит в програмирането на микроконтролери. Добрата новина е, че разработчиците на Ардуино са интегрирали ESP8266 в своя софтуерен продукт Arduino IDE, използван за програмирането на Ардуино неща. Така че поне на първо време ще се разминете с флашване на фърмуеър.

За да запознаете Arduino IDE с ESP8266, следвайте следните стъпки:

  1.  Инсталирайте си Arduino IDE (беазплатно сваляне на http://www.arduino.cc/en/Main/Software) или се уверете, че използвате версия над 1.6.5 – по-старите версии не поддържат ESP8266;
  2.  Отидете в менюто File -> Preferences и в полето „Additional Board Manager URLs“ копирайте следния линк: http://arduino.esp8266.com/stable/package_esp8266com_index.json и натиснете OK;
  3.  След това отидете в Tools -> Boards -> Boards Manager. Потърсете в списъка пакета на ESP8266 и цъкнете “Install”.

Честито. Пакетът, който инсталирахте, позволява да създавате и ъплодвате на ESP8266 sketches програми, все едно това е Ардуино контролер. В добавка имате и богата библиотека с базови проекти за ESP8266, на които е хубаво да им хвърлите по едно око. Остава само да укажете на Arduino IDE, че ще работите с ESP8266. Изберете “Generic ESP8266 Module” от менюто Tools > Boards.

До тук добре! (казал падащият от 10-тия етаж, докато минавал покрай 5-ия…) Остава да пробваме да запишем някоя програмка на нашето си ESP8266. Както може би сте забелязали, то си няма micro USB, a пък нашето PC с Arduino IDE друго освен USB портове няма. И тъй, изправни сме пред дилема. Вариант 1 е да свържем RX/TX пиновете на ESP8266 към два от цифровите пинове на Arduino Nano, което ви казах да си купите, и да запишете на ардуиното програмка, указваща серийната комуникация от USB порта, към който сте закачили Arduino Nano, да ходи към пиновете на Arduino Nano, на които сте закачили ESP8266. Един вид ще използвате Arduino Nano като преобразувател USB към Serial. Вариант 2 е да си купим един чистокръвен USB/Serial преобразувател и това е по-разумният и удобен избор! Ако все пак ви се свидят 2-3 $ за такъв преобразувател, то можете да се ръководите от тук, само че за моите опити съм използвал USB/Serial преходник и не гарантирам, че този метод работи на сто процента.

Следващият проблем, с който се сблъскваме, е обстоятелството, че ESP8266 се захранва с 3,3V, a ардуино контролерите и по-разпространените USB/Serial преобразуватели работят на 5V. Така че не можем да свържем директно ESP8266 към Arduino Nano или към преходника. И по-точно – не, че не можем, но е силно нежелателно. Някои твърдят, че ESP8266 издържа и на 5V, но аз не ви препоръчвам да подлагате на такова изпитание крехката му китайска електроника. Тук е редно да кажем, че има един пин, даващ 3,3V, с който са оборудвани всички (май) ардуино контролери, но отново не e много добра идея да го използвате за захранването на ESP8266, защото:

  1.  Пиковата консумация на ESP8266 може да надхвърли 150 mA, които въпросният 3,3V пин няма как да даде;
  2.  Все пак трябва да конвертирате и високите логически нива на RX сигнала, постъпващ в ESP8266 от 5V на 3,3V.

Тогава какво да правим? Отново може да си купите преходник, но този път по-добрият вариант е да спасите положението с една елементарна схемка, базирана на популярния преобразувател на напрежение LM317T, за който сме говорили и преди.

Малко разяснения по схемата. Резисторите R3 и R4 са така подбрани, че да може LM317T да изработи 3,3V на изхода си при входни 5V по формулата: 1,25V*(1 + R3/R4). Резисторите R6 и R7 служат за делител на напрежение, така че постъпващите логически единици в ESP8266 да са с амплитуда 3,3V, а резисторът R5 е нужен, защото пинът CH_PD на ESP8266 трябва да бъде high, докато работи контролерът. На схемата е показан и един кондензатор, но за него ще говорим след малко – той не е нужен за работата на ESP8266.

И така, свързали сме вече всичко и най-сетне стигахме до момента, в който да заредим програмка на ESP8266 през Arduino IDE. Нещо много важно – когато ъплоудвате програми или фърмуеър на ESP8266 пинът GPIO0, трябва да бъде свързан към GND! Копирайте ето този сорс код:

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
const char *ssid = „ESP8266“;
const char *password = „“;
ESP8266WebServer server(80);
String currentValue = „“;
String readBuffer = „“;

void handleRoot() {
String s = R“=====(
<HTML>
<BODY>
<meta http-equiv=“refresh“ content=“5″>
<p><B>Soil Moisture Monitoring</B></p>
</BODY>
</HTML>
)=====“;
server.send(200, „text/html“, s + currentValue);
}
void setup() {
delay(1000);
Serial.begin(115200);
Serial.println();
Serial.print(„Configuring access point…“);
WiFi.softAP(ssid, password);
IPAddress myIP = WiFi.softAPIP();
Serial.print(„AP IP address: „);
Serial.println(myIP);
server.on(„/“, handleRoot);
server.begin();
Serial.println(„HTTP server started“);
}
void loop() {
server.handleClient();
if (Serial.available() > 0) {
char inChar = (char)Serial.read();
readBuffer += inChar;
if (inChar == ‘\n’) {
currentValue = readBuffer;
readBuffer = „“;
}
}
}

Изберете от менюто Tools COM порта, на който сте закачили ESP8266, цъкнете „Upload”и изчакайте няклолко минутки, докато програмата се запише в паметта на ESP8266 (процесът е по-бавен, отколкото записването на програми на ардуино контролер.) Ако всичко е успешно, ще излезе съобщение за успешен ъплоуд, когато барчето за прогреса стигне до край.

Ето какво прави кодът, който записахме току-що. Първо, създава се безжична мрежа със свободен достъп, наречена “ESP8266” и се инициализира HTTP сървър. Ако желаете, можете да запишете парола в реда const char *password = „“. Второ, генерира се html страница на адрес 192.168.4.1 (адресът по подразбиране на ESP8266), която се обновява на всеки пет секунди. На тази страница се показват данни, постъпващи по серийния порт за комуникация RX на ESP8266.

Проверете дали можете да се вържете към мрежата на ESP8266 (не забравяйте да откачите преди това GPIO0 от GND) и заредете в браузер 192.168.4.1. На този етап би трябвало да виждате съобщението „Soil Moisture Monitoring“.

На лов за данни

Половината работа е свършена. Нашето ESP8266 е готово да приема каквито си искате данни по серийния си порт и да ги бълва в html страницата, като те се обновяват автоматично през пет секунди. Данните ще се получават от сензор, закачен на ардуино контролера. Всъщност вие спокойно можете избегнете изобщо ардуино контролера, закачайки сензора на един от двата входно-изходни пина GPIO0 или GPIO2 и по този начин ESP8266 ще свърши цялата работа по добиване на данните и предаването им към потребителя. Но все пак Arduino Nano и по-големите му събратия разполагат с несравнимо повече входно-изходни пинове, които могат да четат данни от цял куп сензори и това именно е причината да ви покажем една такава реализация, използваща едновременно ардуино контролер и ESP8266 контролер.

Какви данни ще логваме? На пазара се продават всякаки сензори, предназначени за Ардуино, но понякога е възможно и сами да си спретнте такива „сензори“ с подръчни средства. Пример за подобен сензор е кондензаторът, използван за измерване влажността на почвата, който ще ви опиша сега. Двата електрода на кондензатора са с размери 100x40mm и съм ги изрязал от едностранно фолиран текстолит за платки, на които съм запоил жички за включване към Arduino Nano. Просто ми се намираше под ръка такъв текстолит и това е причината да се спра на този материал. По принцип ще ни свършат работа всякакви ламаринки с посочените размери. Важното в случая е да ги боядисаме, така че да са добре изолирани електрически – ще забием електродите в почвата, която е достатъчно проводима и не искаме никакви разрядни токове да протичат между двата елкетрода. В този ред на мисли имайте предвид, че спрейовете не хващат добре – по-добре използвайте лак или най-добре обвийте електродите с подходящ термосвиваем шлаух, ако имате. На картинката долу можете да видите изработения от нас сензор, като вляво от него е показан комерсиалния еквивалент, предлаган на пазара.


Както споменах, трябва да зарием електродите на нашия кондензатор в почвата, от чиято влажност се интересуваме. Нашият проект е твърде семпъл за работа на открито, така че на този етап ще се ограничим с някоя саксия. Електродите трябва да са разположени на 1 cm един от друг и около 2 cm оставете незарити. Хубаво утъпчете пръстта между и около електродите.

Идеята е следната. Разглеждаме почвата като диелектрик между електродите на кондензатора ни и в зависимост от нейната влажност ще се променя се променя и капацитетът на кондензатора. Просто трябва да измерваме този капацитет и това ще ни покаже колко влажна е почвата. Остава да измислим как да мерим капацитет посредством Ардуино контролер. С един такъв контролер лесно можем да мерим напрежения и това ни върши чудесна работа в случая. Ето каква логика ще следваме. Трябва да свържем двата електрода на кондензатора към два от аналоговите пинове на Arduino Nano (например А0 и А2). Получаваме следната еквивалентна електрическа схема, където CT е кондензаторът, чийто капацитет трябва да бъде измерен, а С1 е паразитният капацитет на микроконтролера спрямо земя (около 30 pF за Ардуино Нано и 24,48 pF за Ардуино Уно).

Ако при първоначално разреден кондезатор СТ на аналоговия пин А2 подадем напрежение 5V, в първоначалния момент през електродите на кондезатора ще протече заряден ток. В края на преходния процес напрежението на електрода на СТ, свързан към А0, спрямо земя ще се опредя от съотношението на двата капацитета (на кондезатора СТ и паразитния капацитет С1) по следната зависимост:

VA0 = VA2 x CT / C1 + CT,

откъдето неизвестнят капацитет СТ може да се изрази като:

CT = VA0 * C1 / VA2 – VA0.

При условие че са предварително известни и VA0, и С1, то търсеният капацитет ще бъде функция единствено от измереното на А0 напрежение. Ето и кода, който реализира така зададената логика на измерване, предава получените данни към ESP8266 и предупреждава за суха почва:

const int OUT_PIN = A2;
const int IN_PIN = A0;
const float IN_CAP_TO_GND = 30;
const int MAX_ADC_VALUE = 1023;

void setup()
{
pinMode(OUT_PIN, OUTPUT);
pinMode(IN_PIN, OUTPUT);
Serial.begin(115200);
}

void loop()
{
pinMode(IN_PIN, INPUT);
digitalWrite(OUT_PIN, HIGH);
int val = analogRead(IN_PIN);
digitalWrite(OUT_PIN, LOW);
pinMode(IN_PIN, OUTPUT);
float capacitance = (float)val * IN_CAP_TO_GND / (float)(MAX_ADC_VALUE – val);
Serial.print(F(„Capacitance Value = „));
Serial.print(capacitance, 3);
Serial.print(F(“ pF „));
Serial.println();

if (capacitance < 80) {
Serial.print(F(„Your plants need watering!“));
Serial.println();
} else {
Serial.print(F(„Your plants are OK!“));
Serial.println();
}
while (millis() % 2000 != 0);
}

Заредете тази програмка на Ардуино Нано и вече разполагате с всичко необходимо за една автономна система за следене на почвената влага. Свържете Ардуино Нано към ESP8266 по схемата по-горе, като захранвате всичко от външна мобилна батерия, и би трябвало, като се вържете към мрежата на ESP8266 и отворите в браузера си 192.168.4.1, да виждате текущите показания за капацитета на заровения в почвата кондензатор. Налейте вода и наблюдавайте как капацитетът се увеличава. По принцип трябва да регистрирате стойности от няколко десетки пикофарада при суха почва до стотици пикофаради при влажна почва. Ако измерваният капацитет е от порядъка на микрофаради, то най-вероятно имате утечка между електродите. Тук трябва да проявите и малко експериментализъм, защото няма точно определена граница между „суха“ и „влажна“ почва. Може би сте разположили електродите по-раздалечени от моите, може би почвата, която измервате има повече разтворени соли от моята – тогава например границата между сухо и влажно няма да е 80pF, a 220pF или 40 pF. Проверете сами!

Изобщо подобни експериментални системки са ценни не толкова с целесъобразността или цената си, а с това, че позволяват да разберете как функционират, да бърникате в тях и хардуерно, и софтуерно и да ги настройвате според желанията си. Така например този максимално опростен проект би могъл да послужи като чудесна основа за една автономна поливна градинска ситема, в която ESP модулът и Ардуино контролерът да се захранват от соларен панел и Ардуино контролерът да управлява соленоиден клапан на поливен маркуч според получените данни или желанието на потребителя.

 

0 0 votes
Article Rating
Subscribe
Notify of
guest

2 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Марин Сивов
Марин Сивов
5 years ago

Здравейте! Туй като съм начинаещ в електрониката и програмирането имам няколко въпроса.
За какво служат ТХ и RX пиновете на ардуиното?
Ще мога ли да използвам всички дигитални изходи на Arduino uno, на няколко места чета, че не евъзможно D0(RX) и D1(TX) да работят едновременно?