Table of Contents
مقدمه
رسیدگی و آبیاری به موقع از دغدغههای همه علاقهمندان به گل و گیاه است و زمانی که به سفر می روند همواره نگران چگونگی رسیدگی به گیاهان خود هستند. با پیشرفت فناوری و گسترش اینترنت اشیاء دیگر گلخانه شما (چه کوچک باشد و چه بزرگ) همواره در دسترس شماست و در هرجای دنیا که باشید می توانید از وضعیت آن آگاه شوید و رسیدگی های لازم را انجام دهید.
در این مقاله قصد داریم با استفاده از کیت های ProMake یک کنترل کننده گلخانه هوشمند بسازیم که اطلاعات حیاتی از شرایط محیطی گیاه را در اختیار صاحبش قرار می دهد و به وی امکان کنترل آبیاری، مه پاشی، بخاری، فن تهویه و … را می دهد.
اقلام مورد نیاز برای ساخت گلخانه هوشمند
برای شروع نیاز به کیت گلخانه هوشمند ProMake که از اجزای زیر تشکیل شده داریم:
- ماژول آردوینو نانو(Arduino Nano)+کابل مناسب برای پروگرام کردن آن
- کیت آردوینو نانو پرومیک(ProMake Arduino Nano Kit)
- ماژول ProMake WiFi ESP12(که از ESP8266 برای ارتباط با شبکه وای فای استفاده می کند)
- ماژول ProMake 2-ch Relay (برای کنترل پمپ آب، فن، هیتر، مه پاش یا هر مورد دیگر)
- ماژول ProMake Sensor Tag(برای اندازگیری دما، رطوبت نسبی و نور محیطی)
- حسگر رطوبت خاک خازنی(برای اندازگیری رطوبت خاک جهت تصمیم گیری برای آبیاری)
- پمپ آب + شلنگ و اتصالات آبیاری به میزان لازم
- نمایشگر OLED 0.91 Inch جهت مشاهده اطلاعات دریافتی از حسگرها
من در این پروژه به علت اینکه معمولا در فضای گلخانه های خانگی ارتباط با وای فای فراهم است از ماژول ارتباطی WiFi استفاده کردم. این پروژه را می توانید با ماژول های GSM نیز انجام دهید تا در مناطقی که دسترسی WiFi وجود ندارد اما امکان دسترسی به شبکه دیتا نسل دوم تلفن همراه فراهم است نیز از این کیت استفاده کنید.
برای آشنایی بیشتر با محصولات به کار رفته در این کیت برروی آنها کلیک کنید
WiFi ESP12
معروفترین ماژول برای ارتباط با شبکههای WiFi در اختیار شماست.
Sensor TAG
ماژولی کوچک با سنسورهای متنوع
Relay 2CH
ماژول رله دو کاناله
Arduino Nano Pro
کریری با ابعاد کوچک و قابليتهای متنوع
سرهم کردن کیت
ابتدا ماژول آردوینو نانو را برروی “ProMake Arduino Nano kit” قرار می دهیم. دقت کنید که ماژول را در جهت صحیح وارد کیت نمایید. سپس مطابق شکل رو به رو ماژول ها را در مکان های مشخص شده وارد نماید:
- ماژول ProMake WiFi ESP12 را در محل شماره 1
- ماژول ProMake Sensor Tag را در محل شماره 2
- حسگر رطوبت خاک را به کانکتور Grove روی ماژول ProMake Sensor Tag متصل کنید
- ماژول ProMake 2-CH Relay را در محل شماره 3
- نمایشگر OLED 0.91 inch در محل در نظر گرفته شده برای آن با توجه به مارکاژ پایهها وارد کنید.
توجه: حتماً هر ماژول را در محل تعیین شده وارد نمایید تا اتصالات مورد نیاز برای ارتباط با ماژول فراهم باشد.
حال کیت شما مطابق تصویر روبرو آماده بارگزاری برنامه می باشد.
برنامه نویسی و بارگزاری(Upload) روی برد
برای برنامه نویسی از محیط معروف و دوست داشتنی Arduino IDE استفاده میکنیم. پس اگر آن را برروی رایانه شخصیتون نصب ندارید، سریع نصبش کنید تا بریم سراغ مرحله بعد…
نصب کتابخانه WiFiEsp
برای اینکه بتونیم با ماژول ESP8266 ارتباط برقرار کنیم باید کتابخانه WiFiEsp را در Arduino IDE نصب نمایید.
برای اینکار کافی است از منو Sketch وارد زیر منو Include Library شوید و آیتم Manage Libraries را انتخاب نمایید و در پنجره ظاهر شده مطابق تصویر رو به رو عبارت WiFiEsp را جستجو نمایید. بعد از ظاهر شدن نتایج برروی دکمه Install کلیک نمایید تا کتابخانه نصب شود.
آیتم Manage Libraries از منو Tools نیز قابل دسترس است و البته با استفاده از کلید ترکیبی Ctrl+Shift+I نیز ظاهر می شود.
نصب کتابخانه DFRobot_SHT20
برای ارتباط با سنسور دما و رطوبت روی ماژول سنسور تگ، کتابخانه DFRobot_SHT20 را در Arduino IDE نصب نمایید.
برای اینکار کافی است از منو Sketch وارد زیر منو Include Library شوید و آیتم Manage Libraries را انتخاب نمایید و در پنجره ظاهر شده مطابق تصویر رو به رو عبارت FastLED را جستجو نمایید. بعد از ظاهر شدن نتایج برروی دکمه Install کلیک نمایید تا کتابخانه نصب شود.
نصب کتابخانه DFRobot_VEML7700
برای ارتباط با سنسور نور محیطی روی ماژول سنسور تگ، کتابخانه DFRobot_VEML7700 را در Arduino IDE نصب نمایید.
برای اینکار کافی است از منو Sketch وارد زیر منو Include Library شوید و آیتم Manage Libraries را انتخاب نمایید و در پنجره ظاهر شده مطابق تصویر رو به رو عبارت FastLED را جستجو نمایید. بعد از ظاهر شدن نتایج برروی دکمه Install کلیک نمایید تا کتابخانه نصب شود.
نصب کتابخانه SSD1306Ascii
برای ارتباط با نمایشگر OLED از طریق I2C ، کتابخانه SSD1306Ascii را در Arduino IDE نصب نمایید.
برای اینکار کافی است از منو Sketch وارد زیر منو Include Library شوید و آیتم Manage Libraries را انتخاب نمایید و در پنجره ظاهر شده مطابق تصویر رو به رو عبارت FastLED را جستجو نمایید. بعد از ظاهر شدن نتایج برروی دکمه Install کلیک نمایید تا کتابخانه نصب شود.
ایجاد حساب کاربری Ubidots
برای اینکه بتوانید اطلاعات دریافتی از حسگرها را به صورت داشبرد مشاهده کنید می بایست برروی یک سرویس دهند اینترنتی پلتفورم IoT یک حساب کاربری داشته باشید. در این پروژه ما سرویس ubidots را به عنوان یک نمونه که به صورت رایگان در اختیار همه قرار دارد انتخاب کردیم.
پس به سایت https://ubidots.com مراجعه نمایید و برای خود یک حساب کاربری رایگان ایجاد نمایید.
آشنایی با کد
حال که کتابخانه های پیش نیاز را نصب کردید و حساب کاربری ubidots را ساخته اید، آماده هستید تا وارد نوشتن برنامه اصلی شوید.
عجله نکنید!! ابتدا نیاز است تغییراتی در کد زیر بدهید و بعد از آن استفاده کنید، لذا لطفا گام به گام با من همراه شوید تا هم کد را برایتان شرح دهم و هم تغییرات را باهم اعمال کنیم
- در خطوط 1 تا 7 شیئ نمایشگر OLED را ایجاد کردیم و آدرس I2C آن را مشخص نمودیم.
- در خطوط 9 تا 14 شیئ های حسگرهای دما و رطوبت و نور محیطی را ایجاد کردیم.
- در خطوط 16 و 17 مقادیر اندازگیری شده توسط حسگر رطوبت خاک در هوا و آب را مشخص نمودیم.
- در خطوط 29 تا 36 پین های مربوط به ارتباط UART و RESET ماژول WiFi را با دقت از روی مارکاژهای کیت و ماژول استخراج و تعریف کردیم. سپس اشیاء مورد نیاز را ایجاد نمودیم.
- برای ارتباط با مودم وای فای شناسه شبکه(SSID) و کلمه عبور را در خطوط 30 و 31 اصلاح نمایید
- در خطوط 37 تا 42 آدرس و پورت سرور HTTP سایت Ubidots را تنظیم نمودیم و فاصله زمانی بین ارسال های پیاپی به Ubidots را تعیین کردیم.
- در خطور 45 و 46 پین های رله های روی ماژول ProMake 2-CH Relay را با دقت از روی مارکاژهای کیت و ماژول استخراج و براساس کاربرد هر رله تعریف کردیم.
- در تابع setup :
- ارتباط سریال Debug را راه اندازی کردیم
- نمایشگر OLED را راه اندازی می کنیم
- ماژول ESP8266 را ریست و با پارامترهای صحیح راه اندازی می کنیم
- سپس تلاش می کنیم تا به شبکه WiFi وصل شویم
- در نهایت سنسورها را راه اندازی می کنیم تا آماده ورود به تابع loop شویم.
- در تابع loop:
- ابتدا مقادیر حسگرها را می خوانیم و برروی صفحه نمایش چاپ می کنیم
- سپس با توجه به مقادیر خوانده شده رله ها را باز یا بسته می کنیم تا عملگرهای مدنظر(پمپ، هیتر، مه پاش، فن و …) فعال و غیر فعال شوند
- برای اینکه عملکرد دلخواه خود را بدست آورید شرط های داخل if ها را به فراخور نیاز خود تغییر دهید
- سپس در صورتی که بیش از 10 ثانیه از ارسال داده قبلی گذشته باشد، داده های جدید را به صورت یک رشته با فرمت JSON برای سرور ارسال می کنیم.
- در تابع http_post اقدام به ارسال رشته دریافت شده در آرگومان ورودی تابع با استفاده از HTTP میکنیم.
- برای اینکه دادههای حسگرها برای حساب کاربری شما ارسال شود میبایست Default token حساب خود را در بخشی از کد که عبارت REPLACE_YOUR_TOKEN نوشته شده جایگزین کنید. در ادامه در باره این که چگونه این توکن را از سایت دریافت کنید توضیح خواهم داد.
//Display ==========================================
#include "SSD1306Ascii.h"
#include "SSD1306AsciiWire.h"
#define OLED_I2C_ADDRESS 0x3C
SSD1306AsciiWire oled;
//Sensors ==========================================
#include "DFRobot_SHT20.h"
DFRobot_SHT20 sht20;
#include "DFRobot_VEML7700.h"
DFRobot_VEML7700 als;
const int AirValue = 830;
const int WaterValue = 600;
// WiFi UART Connection =================================
#include
#define ARD_RX_ESP_TX 4 // Arduino RX = ESP TX
#define ARD_TX_ESP_RX 7 // Arduino TX = ESP RX
SoftwareSerial EspSerial(ARD_RX_ESP_TX, ARD_TX_ESP_RX);
#define ESP_AT_BAUD 9600
#define ESP_RST_PIN 8
#include "WiFiEsp.h"
char ssid[] = "YOUR_SSID"; // your network SSID (name)
char pass[] = "YOUR_PASSWORD"; // your network password
// Initialize the Ethernet client object
WiFiEspClient client;
// IOT Platform ===================================
#define SERVER_NAME "169.55.61.243" //"industrial.api.ubidots.com"
#define SERVER_PORT (80)
unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds
//const unsigned long postingInterval = 10000L; // delay between updates, in milliseconds
const unsigned long postingInterval = 600000L; // delay between updates, in milliseconds
//Relays =================================
#define FAN_RLY_PIN 5
#define HEATER_RLY_PIN 14
void setup(void)
{
Serial.begin(9600);
while (!Serial);
pinMode(FAN_RLY_PIN,OUTPUT);
pinMode(HEATER_RLY_PIN,OUTPUT);
Wire.begin();
oled.begin(&Adafruit128x32, OLED_I2C_ADDRESS);
oled.setFont(Adafruit5x7);
oled.clear();
oled.print(F("Booting ESP ... "));
pinMode(ESP_RST_PIN, OUTPUT);
//ESP RESET
digitalWrite(ESP_RST_PIN, LOW);
delay(50);
digitalWrite(ESP_RST_PIN, HIGH);
delay(2000); // to boot
// initialize serial for ESP module
EspSerial.begin(ESP_AT_BAUD);
// initialize ESP module
WiFi.init(&EspSerial);
// check for the presence of the shield
if (WiFi.status() == WL_NO_SHIELD) {
Serial.println("WiFi module not present");
// don't continue
while (true);
}
oled.println(F("Done"));
oled.print(F("Connecting ... "));
// attempt to connect to WiFi network
int status = WL_IDLE_STATUS; // the Wifi radio's status
while ( status != WL_CONNECTED) {
Serial.print(F("Connecting to WPA SSID: "));
Serial.println(ssid);
// Connect to WPA/WPA2 network
status = WiFi.begin(ssid, pass);
}
oled.println(F("Done"));
oled.println(F("Initializing Sensors"));
als.begin(); // Init
sht20.initSHT20(); // Init SHT20 Sensor
delay(1000);
sht20.checkSHT20(); // Check SHT20 Sensor
}
void loop(void)
{
float humd = sht20.readHumidity(); // Read Humidity
float temp = sht20.readTemperature(); // Read Temperature
float lux;
als.getALSLux(lux); // Get the measured ambient light value
int soilMoistureValue = analogRead(A7); //put Sensor insert into soil
Serial.println(soilMoistureValue);
int soilmoisturepercent = map(soilMoistureValue, AirValue, WaterValue, 0, 100);
if(soilmoisturepercent >= 100)
{
soilmoisturepercent = 100;
}
else if(soilmoisturepercent <=0)
{
soilmoisturepercent = 0;
}
oled.clear(); // Clear screen
oled.print("L:");
oled.print(lux,2);
oled.print(", T:");
oled.print(temp,2);
oled.println("°C");
oled.print("H:");
oled.print(humd,2);
oled.print("%");
oled.print(", S:");
oled.print(soilmoisturepercent);
oled.println("%");
if(humd>60.0){
digitalWrite(FAN_RLY_PIN,HIGH);
}else{
digitalWrite(FAN_RLY_PIN,LOW);
}
if(temp<30.0){
digitalWrite(HEATER_RLY_PIN,HIGH);
}else{
digitalWrite(HEATER_RLY_PIN,LOW);
}
// if 10 seconds have passed since your last connection,
// then connect again and send data
if (millis() - lastConnectionTime > postingInterval) {
oled.print("Sending Data ...");
http_post(String(F("{\"Temp\":"))+ String(temp,6)+
String(F(",\"Humid\":")) + String(humd,6)+
String(F(",\"Lux\":")) + String(lux,6)+
String(F(",\"Soil\":")) + String(soilmoisturepercent)+
String("}"));
}
delay(1000);
}
void http_post( String postdata) {
// close any connection before send a new request
// this will free the socket on the WiFi module
client.stop();
if (client.connect(SERVER_NAME, SERVER_PORT))
{
// Sending the HTTP request
client.println(("POST /api/v1.6/devices/garden/ HTTP/1.1"));
client.println(F("Host: industrial.api.ubidots.com"));
client.println(F("User-Agent: ESP8266/1.0"));
client.println(F("X-Auth-Token: REPLACE_YOUR_TOKEN"));
client.println(F("Content-Type: application/json"));
client.print(F("Content-Length: "));
client.println(String(postdata.length()));
client.println(F("Connection: close"));
client.println();
client.println(postdata);
// note the time that the connection was made
lastConnectionTime = millis();
// if there are incoming bytes available
// from the server, read them and print them
while (client.connected());
while (client.available()) {
char c = client.read();
Serial.write(c); // note the time that the connection was made
}
lastConnectionTime = millis();
Serial.println();
Serial.println("Disconnecting from server...");
}
else
{
Serial.println(F("Connect failed"));
}
}
دریافت Default token از Ubidots
برای ارسال هر درخواست به ubidots نیاز مند TOKEN است. ساده ترین راه برای دریافت توکن ، انتخاب گزینه “API Credentials” از منو کاربر در گوشه راست بالای سایت است. برای این کار:
- وارد حساب کاربری خود در سایت Ubidots شوید.
- وارد منو کاربر در گوشه سمت راست بالا شوید و برروی گزینه “API Credentials” کلیک کنید.
- حال در فرمی کنه نمایش داده می شود از بخش Tokens مقدار Default token را با استفاده از دکمه مقابل آن کپی کنید. مراقب باشید که توکن را با API Key اشتباه نگیرید!!
بارگذاری کد برروی برد
حال در محیط Arduino IDE :
- یک Sketch جدید ایجاد نماید و برنامه فوق را داخل آن کپی نماید.
- عبارت YOUR_SSID را با شناسه شبکه(SSID) و عبارت YOUR_PASSWORD را با کلمه عبور مودم وای فای جایگزین نمایید.
- عبارت REPLACE_YOUR_TOKEN را با Default token دریافتی از سایت جایگزین نمایید.
- حال Sketch را با نامی دلخواه مثل green_house ذخیره نمایید.
- بررسی کنید که کلید S1 روی کیت در وضعیت PROG قرار داشته باشد.
- حال می توانید برنامه را برروی برد آردوینو نانو بارگذاری(Upload) نمایید.
تست اولیه
برای اینکه قبل از انجام تست میدانی از عملکرد درست مدار اطمینان حاصل کنید، برای تغذیه برد از دو روش می توانید استفاده کنید:
- با استفاده از پورت USB کامپیوتر یا یک شارژر موبایل یا پاور بانک و یک کابل USB مناسب و اتصال آنها به کانکتور USB ماژول آردوینو نانو؛ تغذیه کیت، ماژول ها و آردوینو را تامین کنید.
- با استفاده از پورت USB کامپیوتر یا یک شارژر موبایل یا پاور بانک و یک کابل USB Type-C و اتصال آنها به کانکتور USB Type-C روی کیت؛ تغذیه کیت، ماژول ها و آردوینو را تامین کنید.
با برقرار شدن تغذیه علایم زیر مشاهده می شود:
- برروی نمایشگر عبارت “Booting ESP … ” نمایش داده می شود که در صورت شناسایی این ماژول و راه اندازی موفق آن عبارت Done در جلو آن ظاهر می شود.
- سپس عبارت “Connecting … ” در خط بعد نمایش داده خواهد شد که در صورت موفقیت در ارتباط گیری با مودم WiFi عبارت Done در جلو آن ظاهر می شود.
- سپس عبارت “Initializing Sensors” در خط بعد نمایش داده می شود که در صورت شناسایی ماژول سنسور و سالم بودن سنسور ها مقادیر حسگرها برروی صفحه نمایش داده می شود
- سپس هر ده ثانیه یک بار عبارت “Sending Data …” برروی صفحه نمایش داده می شود که نشان دهنده ارسال داده ها برای سرور Ubidots است.(توصیه می شود این زمان را به 10 دقیقه افزایش دهید)
- در سایت Ubidots یک دستگاه به نام garden برای شما ثبت می شود که دارای چهار متغییر به نامهای Temp، Humid، Lux و Soil است که داده های حسگرها در آن قابل مشاهده است.
رفتار رله ها را نیز می توانید با مشاهده LED های نشانگر روی ماژول ProMake 2-CH Relay و یا با گوش دادن به صدا قطع و وصل شدن رله ها بررسی نمایید.
مشاهده اطلاعات حسگرها برروی داشبرد
حالا برای مشاهده داده های دریافتی از حسگرها کافی هست مراحل زیر را طی کنید:
- وارد حساب کاربری خود در سایت Ubidots بشوید.
- از منوی Data آیتم Dashboards را انتخاب کنید.
- یک داشبرد جدید با نام دلخواه ایجاد کنید.
- به این داشبرد یک ویجت از نوع Thermometer مطابق شکل رو برو اضافه نمایید.
- در بخش Settings این ویجت، فیلد Select Devices دستگاه garden را انتخاب نمایید.
- سپس متغییر Temp را انتخاب کنید و با زدن دکمه تایید دماسنج به داشبرد افزوده می شود
بهبودهای نرم افزاری
همان طور که شاید تاکنون متوجه شده باشید این برنامه تا تبدیل شدن به یک گلخانه هوشمند ایده آل فاصله زیادی دارد. در ادامه به برخی بهبود های نرم افزاری که می شود در این برنامه لحاظ نمود اشاره خواهیم داشت
- بهبود شرایط کنترلی: احتمالا شرط هایی که برای کنترل عمگرها در کد نوشته شده است از نظر شما نیز بسیار ساده تر از شروط کاربردی در یک گلخانه است، لذا باید بسته به شرایط گلخانه و نیازمندی های گیاهان موجود در آن شرط های کنترلی عملگرها را تغییر داد و شاید نیاز باشد از فرمول های پیچیده تری استفاده نمود.
- نمایش وضعیت ارتباط با شبکه WiFi: همان طور که شاید تا کنون متوجه شده باشید وضعیت ارتباط با Access Point به کاربر نمایش داده نمی شود و در صورتی که دستگاه دچار مشکل ارتباطی شود علامتی به کاربر داده نمی شود. برای اینکه با یک نگاه بتوان از برقرار بودن ارتباط WiFi دستگاه مطمئن شد می بایست از یکی از RGB LED ها به این منظور استفاده نمود
- بهبود ارتباط WiFi: شاید با کمی دقت متوجه شده باشید که اگر ارتباط وای فای به دلیلی مثل خاموش شدن مودم یا تضعیف سیگنال دچار قطعی شود، دیگر اقدامی برای ارتباط مجدد صورت نمی گیرد و تمام ارسال ها با شکست رو به رو می شود. برای حل این مشکل می بایست همواره وضعیت ارتباط با Access Point را بررسی نمود و در صورت بروز قطعی مجدد ارتباط را برقرار نمود.
بهبودهای سخت افزاری
این نمونه اولیه شاید برای یک گلخانه کوچک در پاسیو منزل مناسب باشد اما برای گلخانه های اندکی حرفه ای تر نیاز به گسترش در سخت افزار وجود دارد. معماری ماژولار محصولات ProMake شما را در مسیر توسعه تنها نمی گذارد. چند مورد از بهبودهای سخت افزاری گلخانه هوشمند را باهم مرور می کنیم:
- افزایش عملگرها: احتمالا وجود دو رله برای کنترل دو عملگر خیلی محدود کننده است، عملگرهای متعدد مثل: فن ها، چراغ ها، پمپ ها و هیترها و شیربرقی های متعدد نیاز کنترلی زیادی را می طلبد. برای توسعه این بخش میتواندبا اتصال ماژول ProMake Universal 8-CH Relay به کانکتور Grove روی کیت امکان کنترل 8 عملگر را داشته باشید. البته می توانید تا 8 عدد از این ماژول ها را به صورت آبشاری به هم متصل کنید و تا حداکثر 64 عملگر مختلف را کنترل نمایید.(البته برای گرفتن عملکرد صحیح نیاز است تغذیه مناسب را برای این ماژول ها فراهم کنید تا جریان کافی برای عملکرد رله ها فراهم باشد)
- پایش گازها: با حذف ماژول رله دو کاناله از روی برد امکان استفاده از یک ماژول سنسور گاز نیز فراهم می شود. پایش گازهای مختلف مثل CO2 در گلخانه های حرفه ای امری مهم تلقی می شود، لذا با افزودن ماژول ProMake Gas MQ به این کیت می تواند گازهای هدف خود را پایش کنید و بر اساس آن تصمیمات کنترلی بهتری بگیرید.
- افزایش سرعت و ظرفیت پردازش: همان طور که شاید تا کنون مشاهده کرده باشید ماژول های Arduino Nano استاندارد توان و ظرفیت پردازشی محدودی دارند و با بزرگ شدن برنامه شما به محدودیت های خود رسیده و امکان اجرای برنامه را ندارند و یا در اجرای برنامه با اشکالات غیر متعارف روبرو می شوند. برای حل این مشکل با استفاده از ماژول ProMake STM32 Nano می توانید از سرعت و ظرفیت بیشتر برای پردازش و تحلیل اطلاعات بهره ببرید.
GAS MQ
ماژول شناسایی وجود انواع گاز در محیط
Universal 8ch Relay
شیلد رله 8 کاناله
STM32 NANO
استفاده از قدرت STM32 در محیط Arduino IDE