مقدمه
یکی از دغدغه های افراد علاقه مند به نگه داری گل و گیاه، مراقبت از آن ها و آب دهی به موقع به آن ها است. با پیشرفت تکنولوژی و داغ شدن مباحثی چون اینترنت اشیا و خانه ی هوشمند، ایده هایی مثل هوشند کردن گلدان ها و گل و گیاه مطرح شد.
در این آموزش با نحوه ی هوشمند کردن گلدان با استفاده از سنسور رطوبت خاک و سنسور رطوبت و دمای محیط آشنا خواهید شد.
آنچه در این آموزش یاد می گیرید
- خواندن مقدار خروجی آنالوگ سنسورها با ADC آردوینو
- راه اندازی نمایشگر های OLED با آردوینو و نمایش عکس و نوشته روی آن
- یک گلدان هوشمند ساده و جذاب بسازید.
لوازمی که به آن احتیاج دارید
قطعات مورد نیاز
نرم افزارهای مورد نیاز
گلدان هوشمند: سیم بندی
برای تغذیه ی مدار می توانید از آداپتور یا باتری استفاده کنید.
نکته
پروتکل ارتباطی نمایشگر OLED ما SPI است. اگر از نمایشگر I2C استفاده می کنید، باید مدار خود را کمی تغییر دهید.
نکته
سنسور DHT11 قابلیت اندازه گیری دما و رطوبت را دارد. ما فقط دمای محیط را روی نمایشگر نشان می دهیم. اگر علاقه دارید که میزان رطوبت محیط را نیز نمایش دهید، باید چند دستور ساده به کد اضافه کنید.
گلدان هوشمند: سرهم بندی
اگر از یک گلدان کوچک استفاده می کنید و محدودیت جا دارید، می توانید پین هدر و بخش های اضافی سنسور ها را جدا کنید.
اگر می خواهید سیم های متصل به نمایشگر در داخل گلدان قرار بگیرند و قابل دید نباشند، می توانید با یک چاقوی تیز نمایشگر را از برد آن جدا کنید. دقت کنید که نمایشگر صدمه نبیند.
چون قرار است قطعات و برد ها در محیطی مرطوب قرار بگیرند، باید آن ها را در یک پوشش ضد آب قرار دهید. ما برای این کار از وارنیش های حرارتی و مقداری چسب حرارتی استفاده کردیم.
برد آردیونو و برد نمایشگر و سنسور ها را با پوشش ضد آب بپوشانید.
پس از اینکه مدار پروژه آماده شد، مقداری از خاک گلدان را خالی کرده و مدار را در جای مناسبی دفن کنید.
نکته
سنسور DHT11 باید خارج از خاک نصب شود. (مثلا روی بدنه ی گلدان)
بعد از انجام مراحل بالا، کد را روی آردوینو آپلود کنید.
گلدان هوشمند: کد
برای راه اندازی راحت نمایشگر و سنسور DHT11، می توانید از کتابخانه ی آماده ی آن ها استفاده کنید. پس از دانلود و نصب کتابخانه های مورد نیاز، کد زیر را روی آردوینو بریزید.
اگر اولین بار است که از آردوینو استفاده می کنید، نگران نباشید! فقط کافیست مراحل زیر را دنبال کنید:
- به آدرس www.arduino.cc/en/Main/Software رفته و نرم افزار IDE را متناسب با سیستم عامل خود دانلود و نصب کنید.
- نرم افزار Arduino IDE را اجرا کنید. تمام کد های پیش فرض را پاک کرده و کد زیر را به جای آن کپی کنید.
- برای نصب کتابخانه ها، از پنجره ی Sketch و بخش Include Library، گزینه ی Add .ZIP Library را انتخاب کنید و فایل های کتابخانه ای که دانلود کردید را انتخاب کنید.
- نوع آردوینو خود را از پنجره ی Tools و قسمت Board انتخاب کنید.
- پورتی که (COM) آردوینو به آن متصل است را در پنجره ی Tools انتخاب کنید.
- دکمه ی Upload (شکلی که شبیه فلش است) را بزنید تا کد شما روی آردوینو آپلود شود.
- شما با موفقیت کد خود را روی آردوینو ریختید.
کتابخانه های مورد نیاز:
SSD1306 Library
1 file(s) 7.48 KB
DHT Sensor Library Master
1 file(s) 14.06 KB
#include "ssd1306.h"
#include "DHT.h"
#define VCCSTATE SSD1306_SWITCHCAPVCC
#define WIDTH 128
#define HEIGHT 64
#define PAGES 8
#define OLED_RST 9
#define OLED_DC 8
#define OLED_CS 10
#define SPI_MOSI 11 /* connect to the DIN pin of OLED */
#define SPI_SCK 13 /* connect to the CLK pin of OLED */
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
float LIGHT;
float MOISTURE;
float TEMP;
float HUMID;
int counter = 0;
int scroll = 23;
uint8_t oled_buf[WIDTH * HEIGHT / 8];
const uint8_t percent [] PROGMEM = {
0x70, 0x20,
0xd8, 0x60,
0xcc, 0x40,
0x8c, 0xc0,
0xcd, 0x80,
0xd9, 0x00,
0x73, 0x38,
0x02, 0x6c,
0x06, 0xcc,
0x04, 0xc4,
0x08, 0xc4,
0x18, 0x4c,
0x10, 0x38,
0x00, 0x00
};
const uint8_t celsius [] PROGMEM = {
0x00, 0x00,
0x00, 0x00,
0x30, 0xf0,
0x59, 0xf8,
0x4b, 0x00,
0x72, 0x00,
0x06, 0x00,
0x06, 0x00,
0x02, 0x00,
0x03, 0x00,
0x01, 0x98,
0x00, 0xf0,
0x00, 0x00,
0x00, 0x00
};
const uint8_t LOGO [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
0x00, 0x00, 0x22, 0x10, 0x00, 0x00,
0x00, 0x00, 0x42, 0x28, 0x00, 0x00,
0x00, 0x00, 0x81, 0x24, 0x00, 0x00,
0x00, 0x00, 0x00, 0x84, 0x00, 0x00,
0x00, 0x01, 0x18, 0xc2, 0x00, 0x00,
0x00, 0x01, 0x18, 0x82, 0x00, 0x00,
0x00, 0x02, 0x24, 0xc1, 0x00, 0x00,
0x00, 0x02, 0x37, 0x21, 0x00, 0x00,
0x00, 0x04, 0x4b, 0x70, 0x80, 0x00,
0x00, 0x08, 0x51, 0x10, 0x40, 0x00,
0x00, 0x08, 0xae, 0xe8, 0x40, 0x00,
0x00, 0x10, 0xc1, 0x98, 0x20, 0x00,
0x00, 0x11, 0x3c, 0x4c, 0x00, 0x00,
0x00, 0x21, 0x83, 0xe4, 0x10, 0x00,
0x00, 0x42, 0x7c, 0x36, 0x10, 0x00,
0x00, 0x45, 0x22, 0xd2, 0x08, 0x00,
0x00, 0x86, 0xd9, 0x35, 0x04, 0x00,
0x00, 0x89, 0x66, 0x59, 0x84, 0x00,
0x01, 0x0c, 0x99, 0x8c, 0x82, 0x00,
0x01, 0x12, 0xc4, 0x77, 0x42, 0x00,
0x02, 0x2d, 0xb3, 0x08, 0xc1, 0x00,
0x04, 0x22, 0x4c, 0xd7, 0x20, 0x80,
0x04, 0x5b, 0x92, 0x24, 0xb0, 0x80,
0x08, 0x64, 0x65, 0x5b, 0x50, 0x40,
0x08, 0x8e, 0x9a, 0xa4, 0xa8, 0x00,
0x10, 0xb5, 0x41, 0x11, 0x14, 0x60,
0x23, 0xca, 0xbe, 0xee, 0xec, 0x00,
0x16, 0x39, 0x6b, 0x5b, 0xd0, 0x10,
0x02, 0x14, 0x94, 0xa4, 0x20, 0x10,
0x04, 0x2b, 0x49, 0x12, 0xd0, 0x08,
0x04, 0x3d, 0xbf, 0xff, 0x75, 0xb4,
0x08, 0x00, 0x00, 0x00, 0x08, 0x00,
0x10, 0x00, 0x00, 0x00, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x00,
0x3d, 0xdd, 0xfb, 0xbb, 0xda, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const uint8_t SAD [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x01, 0xff, 0xc0, 0x00,
0x00, 0x0f, 0xc1, 0xf8, 0x00,
0x00, 0x1c, 0x00, 0x1e, 0x00,
0x00, 0x70, 0x00, 0x07, 0x00,
0x00, 0xe0, 0x00, 0x01, 0x80,
0x01, 0x80, 0x00, 0x00, 0xc0,
0x03, 0x00, 0x00, 0x00, 0x60,
0x06, 0x00, 0x00, 0x00, 0x30,
0x06, 0x00, 0x00, 0x00, 0x18,
0x0c, 0x3f, 0x80, 0x7e, 0x18,
0x0c, 0x71, 0xc1, 0xc3, 0x8c,
0x18, 0x40, 0x41, 0x81, 0x8c,
0x18, 0x00, 0x00, 0x00, 0x04,
0x10, 0x00, 0x00, 0x00, 0x06,
0x30, 0x00, 0x00, 0x03, 0x86,
0x30, 0x00, 0x00, 0x03, 0xc2,
0x30, 0x00, 0x7f, 0x03, 0x62,
0x30, 0x01, 0xff, 0xc3, 0x22,
0x30, 0x03, 0x80, 0x63, 0x32,
0x33, 0x06, 0x00, 0x33, 0x32,
0x37, 0x06, 0x00, 0x1b, 0x32,
0x3f, 0x0c, 0x00, 0x19, 0xb6,
0x3b, 0x08, 0x00, 0x0c, 0xe6,
0x33, 0x18, 0x00, 0x0c, 0x06,
0x23, 0x1b, 0xff, 0xec, 0x04,
0x63, 0x1f, 0xff, 0xfc, 0x0c,
0x63, 0x00, 0x00, 0x00, 0x0c,
0x63, 0x00, 0x00, 0x00, 0x18,
0x66, 0x00, 0x00, 0x00, 0x30,
0x3f, 0x00, 0x00, 0x00, 0x30,
0x0b, 0x80, 0x00, 0x00, 0x60,
0x01, 0xc0, 0x00, 0x01, 0xc0,
0x00, 0xe0, 0x00, 0x03, 0x80,
0x00, 0x38, 0x00, 0x0f, 0x00,
0x00, 0x1e, 0x00, 0x3c, 0x00,
0x00, 0x07, 0xff, 0xf0, 0x00,
0x00, 0x00, 0xff, 0x80, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00
};
const uint8_t SMILE [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x03, 0xff, 0x00, 0x00,
0x00, 0x0f, 0xc7, 0xe0, 0x00,
0x00, 0x38, 0x00, 0x78, 0x00,
0x00, 0xe0, 0x00, 0x1c, 0x00,
0x01, 0xc0, 0x00, 0x07, 0x00,
0x03, 0x00, 0x00, 0x03, 0x80,
0x06, 0x00, 0x00, 0x01, 0xc0,
0x0c, 0x00, 0x00, 0x00, 0xc0,
0x0c, 0x00, 0x00, 0x00, 0x60,
0x18, 0x00, 0x00, 0x00, 0x30,
0x10, 0x00, 0x00, 0x00, 0x30,
0x30, 0x00, 0x00, 0x00, 0x18,
0x20, 0x00, 0x00, 0x00, 0x18,
0x60, 0x7e, 0x01, 0xfc, 0x08,
0x60, 0xe7, 0x83, 0x8e, 0x08,
0x61, 0x81, 0x83, 0x02, 0x0c,
0x60, 0x00, 0x00, 0x00, 0x0c,
0x40, 0x00, 0x00, 0x00, 0x0c,
0x40, 0x00, 0x00, 0x04, 0x0c,
0x40, 0xf0, 0x00, 0x3e, 0x0c,
0x60, 0xff, 0x83, 0xfc, 0x0c,
0x60, 0x67, 0xff, 0xcc, 0x0c,
0x60, 0x60, 0x10, 0x0c, 0x08,
0x20, 0x20, 0x00, 0x18, 0x18,
0x30, 0x30, 0x00, 0x18, 0x18,
0x30, 0x18, 0x00, 0x30, 0x10,
0x18, 0x0c, 0x00, 0x60, 0x30,
0x18, 0x0e, 0x00, 0xc0, 0x60,
0x0c, 0x03, 0x87, 0x80, 0x60,
0x06, 0x01, 0xff, 0x00, 0xc0,
0x07, 0x00, 0x30, 0x01, 0x80,
0x03, 0x80, 0x00, 0x03, 0x00,
0x01, 0xc0, 0x00, 0x0e, 0x00,
0x00, 0x70, 0x00, 0x1c, 0x00,
0x00, 0x3c, 0x00, 0xf0, 0x00,
0x00, 0x0f, 0xff, 0xc0, 0x00,
0x00, 0x00, 0xfe, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00
};
const uint8_t TEM [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0xc0, 0x00, 0x00,
0x00, 0x00, 0x07, 0xe0, 0x00, 0x00,
0x00, 0x00, 0x0c, 0x30, 0x00, 0x00,
0x00, 0x00, 0x18, 0x18, 0x00, 0x00,
0x00, 0x00, 0x10, 0x18, 0x00, 0x00,
0x00, 0x00, 0x1e, 0x08, 0x00, 0x00,
0x00, 0x00, 0x1f, 0x08, 0x00, 0x00,
0x00, 0x00, 0x18, 0x08, 0x00, 0x00,
0x00, 0x00, 0x10, 0x08, 0x00, 0x00,
0x00, 0x00, 0x1c, 0x08, 0x00, 0x00,
0x00, 0x00, 0x1c, 0x08, 0x00, 0x00,
0x00, 0x00, 0x10, 0x08, 0x00, 0x00,
0x00, 0x00, 0x1c, 0x08, 0x00, 0x00,
0x00, 0x00, 0x1c, 0x08, 0x00, 0x00,
0x00, 0x00, 0x18, 0x08, 0x00, 0x00,
0x00, 0x00, 0x10, 0x08, 0x00, 0x00,
0x00, 0x00, 0x1f, 0x08, 0x00, 0x00,
0x00, 0x00, 0x1f, 0x08, 0x00, 0x00,
0x00, 0x00, 0x10, 0x08, 0x00, 0x00,
0x00, 0x00, 0x1c, 0x08, 0x00, 0x00,
0x00, 0x00, 0x1c, 0x08, 0x00, 0x00,
0x00, 0x00, 0x18, 0x08, 0x00, 0x00,
0x00, 0x00, 0x10, 0x08, 0x00, 0x00,
0x00, 0x00, 0x11, 0x88, 0x00, 0x00,
0x00, 0x00, 0x11, 0x88, 0x00, 0x00,
0x00, 0x00, 0x11, 0x88, 0x00, 0x00,
0x00, 0x00, 0x11, 0x88, 0x00, 0x00,
0x00, 0x00, 0x11, 0x88, 0x00, 0x00,
0x00, 0x00, 0x31, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x71, 0x8e, 0x00, 0x00,
0x00, 0x00, 0xc1, 0x83, 0x00, 0x00,
0x00, 0x01, 0x81, 0x81, 0x80, 0x00,
0x00, 0x01, 0x83, 0xc1, 0x80, 0x00,
0x00, 0x03, 0x0f, 0xf0, 0xc0, 0x00,
0x00, 0x03, 0x0f, 0xf0, 0xc0, 0x00,
0x00, 0x03, 0x1f, 0xf8, 0xc0, 0x00,
0x00, 0x03, 0x1f, 0xf8, 0xc0, 0x00,
0x00, 0x03, 0x0f, 0xf0, 0xc0, 0x00,
0x00, 0x03, 0x0f, 0xf0, 0xc0, 0x00,
0x00, 0x01, 0x87, 0xe1, 0x80, 0x00,
0x00, 0x01, 0x80, 0x01, 0x80, 0x00,
0x00, 0x00, 0xc0, 0x03, 0x00, 0x00,
0x00, 0x00, 0x60, 0x06, 0x00, 0x00,
0x00, 0x00, 0x38, 0x1c, 0x00, 0x00,
0x00, 0x00, 0x1f, 0xf8, 0x00, 0x00,
0x00, 0x00, 0x07, 0xe0, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const uint8_t SAND [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0c, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1e, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3f, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3f, 0x00,
0x00, 0x00, 0x00, 0x00, 0x73, 0x80,
0x00, 0x00, 0x00, 0x00, 0xe1, 0xc0,
0x00, 0x00, 0x00, 0x00, 0xc0, 0xc0,
0x00, 0x00, 0x00, 0x01, 0xc0, 0xe0,
0x00, 0xe0, 0x00, 0x03, 0x80, 0x70,
0x01, 0xf0, 0x00, 0x03, 0x00, 0x30,
0x03, 0xf8, 0x00, 0x07, 0x00, 0x38,
0x07, 0xfc, 0x00, 0x06, 0x00, 0x18,
0x0f, 0x9e, 0x00, 0x0e, 0x00, 0x1c,
0x0f, 0x0f, 0x00, 0x0e, 0x00, 0x1c,
0x1e, 0x07, 0x80, 0x0c, 0x00, 0x0c,
0x1c, 0x07, 0x80, 0x0c, 0xc0, 0x0c,
0x3c, 0x03, 0xc0, 0x0c, 0xe0, 0x0c,
0x7c, 0x03, 0xc0, 0x0e, 0xf0, 0x1c,
0x78, 0x01, 0xc0, 0x06, 0x78, 0x18,
0x78, 0x01, 0xc0, 0x07, 0x18, 0x38,
0x78, 0x01, 0xc0, 0x03, 0x80, 0x70,
0x79, 0xe1, 0xc0, 0x01, 0xe1, 0xe0,
0x79, 0xe1, 0xe0, 0x00, 0xff, 0xc0,
0x79, 0xe1, 0xff, 0xf8, 0x3f, 0x00,
0x79, 0xc3, 0xff, 0xff, 0x00, 0x00,
0x79, 0xc3, 0xff, 0xff, 0xc0, 0x00,
0x3d, 0xef, 0xc0, 0x0f, 0xf0, 0x00,
0x1f, 0xff, 0x00, 0x01, 0xfc, 0x00,
0x1f, 0xfe, 0x00, 0x00, 0x7e, 0x00,
0x0f, 0xfc, 0x00, 0x00, 0x1f, 0x00,
0x07, 0xf8, 0x00, 0x00, 0x0f, 0x80,
0x07, 0xf0, 0x0f, 0xf8, 0x0f, 0x80,
0x01, 0xf0, 0x7f, 0xfc, 0x0f, 0x00,
0x00, 0xe1, 0xff, 0xf8, 0x1e, 0x00,
0x00, 0x63, 0xf8, 0x00, 0x3e, 0x00,
0x00, 0x07, 0xe0, 0x00, 0x7c, 0x00,
0x00, 0x1f, 0x80, 0x01, 0xf8, 0x00,
0x00, 0x1f, 0x80, 0x07, 0xe0, 0x00,
0x00, 0x3f, 0xc0, 0x1f, 0xc0, 0x00,
0x00, 0x7f, 0xff, 0xff, 0x80, 0x00,
0x00, 0xff, 0xff, 0xfe, 0x00, 0x00,
0x00, 0xe0, 0xff, 0xf0, 0x00, 0x00,
0x01, 0xe0, 0x00, 0x00, 0x00, 0x00,
0x03, 0xc0, 0x00, 0x00, 0x00, 0x00,
0x03, 0xc0, 0x00, 0x00, 0x00, 0x00,
0x01, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const uint8_t SUN [512] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x00, 0x80, 0x03, 0x00, 0x02, 0x00,
0x00, 0xc0, 0x03, 0x00, 0x06, 0x00,
0x00, 0xe0, 0x01, 0x00, 0x0e, 0x00,
0x00, 0x70, 0x00, 0x00, 0x1c, 0x00,
0x00, 0x38, 0x00, 0x00, 0x38, 0x00,
0x00, 0x1c, 0x00, 0x00, 0x70, 0x00,
0x00, 0x0c, 0x0f, 0xe0, 0x60, 0x00,
0x00, 0x00, 0x3f, 0xf8, 0x00, 0x00,
0x00, 0x00, 0xf0, 0x3c, 0x00, 0x00,
0x00, 0x01, 0xc0, 0x0e, 0x00, 0x00,
0x00, 0x01, 0x80, 0x07, 0x00, 0x00,
0x00, 0x03, 0x00, 0x03, 0x80, 0x00,
0x00, 0x03, 0x00, 0x01, 0x80, 0x00,
0x00, 0x06, 0x00, 0x01, 0x80, 0x00,
0x00, 0x06, 0x00, 0x01, 0xc0, 0x00,
0x3f, 0x86, 0x00, 0x00, 0xc3, 0xf8,
0x7f, 0xc6, 0x00, 0x00, 0xc7, 0xf8,
0x00, 0x06, 0x00, 0x00, 0xc0, 0x00,
0x00, 0x06, 0x00, 0x01, 0xc0, 0x00,
0x00, 0x07, 0x00, 0x01, 0x80, 0x00,
0x00, 0x03, 0x00, 0x01, 0x80, 0x00,
0x00, 0x03, 0x80, 0x03, 0x00, 0x00,
0x00, 0x01, 0xc0, 0x07, 0x00, 0x00,
0x00, 0x00, 0xe0, 0x0e, 0x00, 0x00,
0x00, 0x00, 0x7c, 0x7c, 0x00, 0x00,
0x00, 0x00, 0x3f, 0xf0, 0x00, 0x00,
0x00, 0x0c, 0x07, 0xc0, 0x60, 0x00,
0x00, 0x1c, 0x00, 0x00, 0x70, 0x00,
0x00, 0x38, 0x00, 0x00, 0x38, 0x00,
0x00, 0x70, 0x00, 0x00, 0x1c, 0x00,
0x00, 0xe0, 0x03, 0x00, 0x0e, 0x00,
0x00, 0xc0, 0x03, 0x00, 0x06, 0x00,
0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
void SADD(void) {
SSD1306_clear(oled_buf);
while (counter < 20) {
if ((counter % 2) == 0)
{
SSD1306_clear(oled_buf);
SSD1306_bitmap(40, 20, SAD, 40, 40, oled_buf);
SSD1306_display(oled_buf);
SSD1306_clear(oled_buf);
SSD1306_bitmap(40, 19, SAD, 40, 40, oled_buf);
SSD1306_display(oled_buf);
SSD1306_clear(oled_buf);
SSD1306_bitmap(40, 18, SAD, 40, 40, oled_buf);
SSD1306_display(oled_buf);
}
else
{
SSD1306_clear(oled_buf);
SSD1306_bitmap(40, 18, SAD, 40, 40, oled_buf);
SSD1306_display(oled_buf);
SSD1306_clear(oled_buf);
SSD1306_bitmap(40, 19, SAD, 40, 40, oled_buf);
SSD1306_display(oled_buf);
SSD1306_clear(oled_buf);
SSD1306_bitmap(40, 20, SAD, 40, 40, oled_buf);
SSD1306_display(oled_buf);
}
counter++;
}
counter = 0;
}
void HAPPY(void) {
SSD1306_clear(oled_buf);
while (counter < 20) {
if ((counter % 2) == 0)
{
SSD1306_clear(oled_buf);
SSD1306_bitmap(40, 23, SMILE, 40, 40, oled_buf);
SSD1306_display(oled_buf);
SSD1306_clear(oled_buf);
SSD1306_bitmap(40, 19, SMILE, 40, 40, oled_buf);
SSD1306_display(oled_buf);
SSD1306_clear(oled_buf);
SSD1306_bitmap(40, 16, SMILE, 40, 40, oled_buf);
SSD1306_display(oled_buf);
}
else
{
SSD1306_clear(oled_buf);
SSD1306_bitmap(40, 16, SMILE, 40, 40, oled_buf);
SSD1306_display(oled_buf);
SSD1306_clear(oled_buf);
SSD1306_bitmap(40, 19, SMILE, 40, 40, oled_buf);
SSD1306_display(oled_buf);
SSD1306_clear(oled_buf);
SSD1306_bitmap(40, 23, SMILE, 40, 40, oled_buf);
SSD1306_display(oled_buf);
}
counter++;
}
counter = 0;
}
void dsply(int input) {
int n1, n2;
if (input < 10) {
SSD1306_char3216(10, 25, '0', oled_buf);
switch (input) {
case 0 : SSD1306_char3216(26, 25, '0', oled_buf);
break;
case 1 :
SSD1306_char3216(26, 25, '1', oled_buf);
break;
case 2 :
SSD1306_char3216(26, 25, '2', oled_buf);
break;
case 3 :
SSD1306_char3216(26, 25, '3', oled_buf);
break;
case 4 :
SSD1306_char3216(26, 25, '4', oled_buf);
break;
case 5 :
SSD1306_char3216(26, 25, '5', oled_buf);
break;
case 6 :
SSD1306_char3216(26, 25, '6', oled_buf);
break;
case 7 :
SSD1306_char3216(26, 25, '7', oled_buf);
break;
case 8 :
SSD1306_char3216(26, 25, '8', oled_buf);
break;
case 9 :
SSD1306_char3216(26, 25, '9', oled_buf);
break;
}
}
else {
n1 = input / 10;
n2 = input % 10;
switch (n1) {
case 0 :
SSD1306_char3216(10, 25, '0', oled_buf);
break;
case 1 :
SSD1306_char3216(10, 25, '1', oled_buf);
break;
case 2 :
SSD1306_char3216(10, 25, '2', oled_buf);
break;
case 3 :
SSD1306_char3216(10, 25, '3', oled_buf);
break;
case 4 :
SSD1306_char3216(10, 25, '4', oled_buf);
break;
case 5 :
SSD1306_char3216(10, 25, '5', oled_buf);
break;
case 6 :
SSD1306_char3216(10, 25, '6', oled_buf);
break;
case 7 :
SSD1306_char3216(10, 25, '7', oled_buf);
break;
case 8 :
SSD1306_char3216(10, 25, '8', oled_buf);
break;
case 9 :
SSD1306_char3216(10, 25, '9', oled_buf);
break;
}
switch (n2) {
case 0 :
SSD1306_char3216(26, 25, '0', oled_buf);
break;
case 1 :
SSD1306_char3216(26, 25, '1', oled_buf);
break;
case 2 :
SSD1306_char3216(26, 25, '2', oled_buf);
break;
case 3 :
SSD1306_char3216(26, 25, '3', oled_buf);
break;
case 4 :
SSD1306_char3216(26, 25, '4', oled_buf);
break;
case 5 :
SSD1306_char3216(26, 25, '5', oled_buf);
break;
case 6 :
SSD1306_char3216(26, 25, '6', oled_buf);
break;
case 7 :
SSD1306_char3216(26, 25, '7', oled_buf);
break;
case 8 :
SSD1306_char3216(26, 25, '8', oled_buf);
break;
case 9 :
SSD1306_char3216(26, 25, '9', oled_buf);
break;
}
}
}
void setup() {
Serial.begin(9600);
dht.begin();
SSD1306_begin();
SSD1306_clear(oled_buf);
SSD1306_string(17, 0, "ELECTROPEAK", 16 , 1 , oled_buf);
SSD1306_bitmap(42, 16, LOGO, 48, 48, oled_buf);
SSD1306_display(oled_buf); delay(4000);
}
void loop() {
LIGHT = analogRead(A0);
LIGHT = (LIGHT / 1024) * 100;
Serial.print("LIGHT : ");
Serial.print(LIGHT);
Serial.println(" %");
SSD1306_clear(oled_buf);
SSD1306_string(30, 0, "LIGHTING", 16 , 1 , oled_buf);
SSD1306_bitmap(80, 16, SUN, 48, 48, oled_buf);
SSD1306_bitmap(45, 40, percent, 14, 14, oled_buf);
dsply(LIGHT);
SSD1306_display(oled_buf);
delay(4000);
MOISTURE = analogRead(A1);
MOISTURE = (MOISTURE / 1024) * 100;
MOISTURE = (MOISTURE - 100) * (-1);
Serial.print("MOISTURE : ");
Serial.print(MOISTURE);
Serial.println(" %");
SSD1306_clear(oled_buf);
SSD1306_string(22, 0, " MOISTURE", 16 , 1 , oled_buf);
SSD1306_bitmap(80, 16, SAND, 48, 48, oled_buf);
SSD1306_bitmap(45, 40, percent, 14, 14, oled_buf);
dsply(MOISTURE);
SSD1306_display(oled_buf);
delay(4000);
HUMID = dht.readHumidity();
TEMP = dht.readTemperature();
Serial.print("TEMPERATURE : ");
Serial.print(TEMP);
Serial.println(" C");
SSD1306_clear(oled_buf);
SSD1306_string(21, 0, "TEMPERATURE", 16 , 1 , oled_buf);
SSD1306_bitmap(80, 16, TEM, 48, 48, oled_buf);
SSD1306_bitmap(45, 40, celsius, 14, 14, oled_buf);
dsply(TEMP);
SSD1306_display(oled_buf);
delay(4000);
if (TEMP > 50 || TEMP < 5)
SADD();
if (MOISTURE < 50)
SADD();
if (TEMP < 50 && TEMP > 5) {
if (MOISTURE > 70) {
if (LIGHT > 80)
HAPPY();
}
}
}
یک گام جلوتر
گلدان هوشمند خود را ارتقا دهید. چند پیشنهاد:
- با استفاده از ماژول های RTC، شرایط گل خود را در ساعت های مختلف ذخیره کنید. با استفاده از اطلاعات ذخیره شده ی چند روز قبل پیش بینی کنید که گیاه شما چه زمان هایی به آب یا نور بیشتر نیاز دارد.
- با اضافه کردن یک بازر در شرایط نیاز (مثلا کمبود آب) هشدار های صوتی تولید کنید.
- ما دو اموجی لبخند و گریه برای نشان دادن شرایط گیاه طراحی کردیم. سعی کنید اموجی های بیشتری برای نمایش شرایط گیاه خود طراحی کنید.
Comments (27)
hi my name is jason i had an issue in the program.. can you help me? here is the problem:
Arduino: 1.8.9 (Windows 10), Board: “Arduino/Genuino Uno”
C:\Users\Jason\Desktop\sketch_apr15a\sketch_apr15a.ino: In function ‘void dsply(int)’:
sketch_apr15a:413:56: error: ‘SSD1306_char3216’ was not declared in this scope
if (input50 || TEMP<5)
Hi
1-Make sure you installed the SSD1306 library correctly
2-Make sure you added the SSD1306 library to the code -> #include”SSD1306″
ok thanks now my arduino nano doesnt upload the program… stk500 not responding.. maybe the drivers …
Yes, or maybe You have the wrong COM port selected (the IDE does not see your board), or you have connected a wire to pin0(Rx)
سلام ممنونم
میشه بگین بعد از ساخت چه خروجی هایی رو صفحه نمایش نشون میده؟ من رطوبت خاک و دمای هوا رو لازم دارم
و اینکه خرید لوازم تقریبا چقدر هزینه داره
خروجی ها دست خودتون هستکه چی نشون بده
لوازم رو می تونید با جستجو در سایت خودمون پیدا کنید، قیمتاش هم بروز هست.
به نظر من باید ابیاری خود کار هم می بود
قیمتشم نهایتا میشه 160
بله، فیچرهای مختلفی میشه به این پروژه اضافه کرد 🙂
سلام
توی لیست قطعات مقاومت نبود
ولی الان که لوازم رو سفارش دادم ، توی عکسا مقاومت استفاده کردین
اگه نذارم مشکلی داره؟
سنسور LDR نیازمند سری شدن با یک مقاومت 10k اهمی است.
نحوه اتصالات در عکس زیر کامل مشخص شده است.
https://hacksterio.s3.amazonaws.com/uploads/attachments/886872/working_with_ldr_iZfldcQDGN.JPG
این چجوریه که نه تابع ستاپ داره نه حلقه تکرار
سلام
کد تابع setup و loop داره، اما متاسفانه در موقع انتشار مقاله به درستی وارد نشده بوده. الان کد اصلاح شده.
ممنون از توجهتون
میتوانید بگویید برای اندازه گرفتن رطوبت باید چه کدی را اضافه کرد
و چطور باید ایموجین را درست کرد
اگر میخواهیم پمپ اب کار بزاریم باید چه تفاوتی ایجاد کنیم
جواب بدید ممنون میشم
سلام
برای اندازه گیری رطوبت میتونید از کد خود ماژول DHT11 که در آموزش اومده استفاده کنید. برای اینکه ببینید به طور دقیق چطور میشه اطلاعات رطوبت رو از ماژول DHT11 گرفت میتونید از آموزش زیر که به طور خاص برای این ماژول نوشته شده کمک بگیرید.
https://thecaferobot.com/learn/beginners-guide-use-dht11-dht22-sensors-arduino/
ساخت ایموجی ها هم صرفا به 0 و 1 کردن پیکسل های ماژول OLED ممکنه. برای این کار ماژول OLED رو میتونید نگاه کنید و تعیین کنید که دقیقا برای ایموجی مورد نظرتون کدام پیکسل ها لازمه که روشن و کدوم ها خاموش باشن. در نهایت یک ماتریس به ابعاد OLED مورد استفاده تعریف میکنید و آرایه های اون رو به طور صحیح 0 و یا 1 قرار میدید. در نهایت میتونید با استفاده از اون ماتریس، ایموجی مورد نظرتون رو روی نمایشگر نشون بدید.
برای کار گذاشتن پمپ آب هم کافیه فقط یکی از پایه های آردوینو رو اختصاص بدید. در ابتدا لازمه که متناسب با پمپ آبتون یک منبع تغذیه مناسب تهیه کنید. همچنین یک رله هم برای ارتباط بین آردوینو و پمپ آب نیاز دارید. موقعی که رله، پمپ آب و منبع تغذیه رو متصل کردید، کافیه پایه trigger رله رو به پایه آردوینو که براش اختصاص دادید متصل کنید. برای روشن و خاموش کردن پمپ آب کافیه که اون پایه آردوین رو HIGH و LOW کنید.
سلام خسته نباشید من اولد ۸ خروجی گیرم نیومد بجاش ۴ خروجی میتونم استفاده کنم؟؟
سلام. خیلی ممنون
بله هیچ مشکلی نداره. فقط کافیه نحوه سیمبندی و همچنین کد رو متناسب با اولدی که استفاده میکنید تغییر بدید. اولدی که مد نظرتون هست 4 تا پایه داره، 2 پایه اون مربوط به تغذیه ماژول یعنی vcc و gnd هست، و 2 پایه دیگه SCL و SDA مربوط به ارتباط به میکروکنترلرها با پروتکل I2Cئه، که اگر میخواید به آردوینو متصل کنید، باید اونهارو به ترتیب به پایههای 5 و 4 آردوینو متصل کنید.
در مورد نحوه کدزنی هم، کتابخونه SSD1306 رو از لینک “https://github.com/adafruit/Adafruit_SSD1306” دانلود کنید و بر روی arduino ide خودتون نصب کنید. در قسمت مثالهای این کتابخونه میتونید نحوه استفاده از تابعهاش رو یاد بگیرید و به سادگی ازشون استفاده کنید.
سلام خسته نباشید من دادم برنامه نویس برام وارد کنه ولی نتونست گفت کد اشتباه هست یا ممکنه فرق داشته باشه با اتصالی های من باید چکار کنم؟؟
سلام.
متاسفانه در انتشار مقاله روی سایت مشکلی به وجود اومده بوده و کد به درستی آپلود نشده بوده. الان کد اصلاح شده و میتونید ازش استفاده کنید.
In file included from C:\Users\hamed\Documents\Arduino\libraries\DHT-sensor-library-master\DHT_U.cpp:22:0:
C:\Users\hamed\Documents\Arduino\libraries\DHT-sensor-library-master\DHT_U.h:25:10: fatal error: Adafruit_Sensor.h: No such file or directory
#include
^~~~~~~~~~~~~~~~~~~
compilation terminated.
Compilation error: exit status 1}
سلام این خطا موقع اپلود میاد
سلام.
برای استفاده از دو کتابخونه ای که تو این آموزش گذاشته شده، شما نیاز به نصب یک کتابخونه کمکی دیگه به نام “adafruit unified sensor” هم نیاز دارید. برای نصب این کتابخونه وارد بخش Tools -> Manage Libraries بشید و عبارت “adafruit unified sensor” رو جستجو و نصب کنید.
میشه اموزش بدید چطوری آبیاری خودکار رو هم به این اضافه کنم خواهش میکنم جواب بدید
سلام.
برای این کار میتونید از کیت زیر که مخصوص آبیاری هوشمنده استفاده کنید.
https://thecaferobot.com/store/automatic-watering-pump
سلام ممنون از سایت خوبتون واقعا عالیه
من میخوام پرژه رو برای یک کار عملی تحویل مدرسه بدم
و دانش کد نویسی کمی دارم میشه لطف کنید مقاله رو اپدیت کنید و این که توضیحات هر بخش از کد رو بزارید
من پایتون بلدم ولی با این زبان اشنا نیستم اگه اینکار رو بکنید خیلی میتونه تو درک این کد ها به همه کمک کنه
و اینکه میشه کدی که برای اب یاری گل که پمپ رو راه بندازه به مقاله اضافه کنید
من قطعات رو خریداری کردم و تو این قسمت به مشکل خوردم
واقعا لطف میکنید
سلام
ممنون از توجهتون.
حتما بنده سعی میکنم که کدها رو دوباره ویرایش کنم و تا حد امکان توضیحات رو اضافه کنم
واقعا ازتون ممنونم که اهمیت
دادین خیلی خوشحال کننده بود
تا اون موقع لحظه شماری میکنم
سایتتون رو به تمام علاقه مندان معرفی میکنم تا اون ها هم بتونن از سایت عالی شما لذت ببرن
سلام
خواهش میکنم، انشالله بتونیم با کمک شما دوستان عزیز همیشه در مسیر رشد باشیم.
In file included from C:\Users\MOBIN\Documents\Arduino\libraries\DHT_sensor_library\DHT_U.cpp:15:0:
C:\Users\MOBIN\Documents\Arduino\libraries\DHT_sensor_library\DHT_U.h:36:10: fatal error: Adafruit_Sensor.h: No such file or directory
#include
^~~~~~~~~~~~~~~~~~~
compilation terminated.
این ارور برای چیه ؟