با چند سنسور ساده و آردوینو گلدان خود را هوشمند کنید!

فهرست مطالب

مقدمه

یکی از دغدغه های افراد علاقه مند به نگه داری گل و گیاه، مراقبت از آن ها و آب دهی به موقع به آن ها است. با پیشرفت تکنولوژی و داغ شدن مباحثی چون اینترنت اشیا و خانه ی هوشمند، ایده هایی مثل هوشند کردن گلدان ها و گل و گیاه مطرح شد. در این آموزش با نحوه ی هوشمند کردن گلدان با استفاده از سنسور رطوبت خاک و سنسور رطوبت و دمای محیط آشنا خواهید شد.

آنچه در این آموزش یاد می گیرید

لوازمی که به آن احتیاج دارید

قطعات مورد نیاز

آردوینو نانو × 1
سنسور دما و رطوبت DHT11 × 1
نمایشگر OLED با رابط SPI × 1
سنسور رطوبت خاک × 1
سنسور نور LDR × 1
سیم × 1

نرم افزارهای مورد نیاز

Arduino IDE

گلدان هوشمند: سیم بندی

برای تغذیه ی مدار می توانید از آداپتور یا باتری استفاده کنید.
نکته
پروتکل ارتباطی نمایشگر OLED ما SPI است. اگر از نمایشگر I2C استفاده می کنید، باید مدار خود را کمی تغییر دهید.
نکته
سنسور DHT11 قابلیت اندازه گیری دما و رطوبت را دارد. ما فقط دمای محیط را روی نمایشگر نشان می دهیم. اگر علاقه دارید که میزان رطوبت محیط را نیز نمایش دهید، باید چند دستور ساده به کد اضافه کنید.

گلدان هوشمند: سرهم بندی

اگر از یک گلدان کوچک استفاده می کنید و محدودیت جا دارید، می توانید پین هدر و بخش های اضافی سنسور ها را جدا کنید. اگر می خواهید سیم های متصل به نمایشگر در داخل گلدان قرار بگیرند و قابل دید نباشند، می توانید با یک چاقوی تیز نمایشگر را از برد آن جدا کنید. دقت کنید که نمایشگر صدمه نبیند. چون قرار است قطعات و برد ها در محیطی مرطوب قرار بگیرند، باید آن ها را در یک پوشش ضد آب قرار دهید. ما برای این کار از وارنیش های حرارتی و مقداری چسب حرارتی استفاده کردیم. برد آردیونو و برد نمایشگر و سنسور ها را با پوشش ضد آب بپوشانید.
پس از اینکه مدار پروژه آماده شد، مقداری از خاک گلدان را خالی کرده و مدار را در جای مناسبی دفن کنید.
نکته
سنسور DHT11 باید خارج از خاک نصب شود. (مثلا روی بدنه ی گلدان)
بعد از انجام مراحل بالا، کد را روی آردوینو آپلود کنید.

گلدان هوشمند: کد

برای راه اندازی راحت نمایشگر و سنسور DHT11، می توانید از کتابخانه ی آماده ی آن ها استفاده کنید. پس از دانلود و نصب کتابخانه های مورد نیاز، کد زیر را روی آردوینو بریزید.

اگر اولین بار است که از آردوینو استفاده می کنید، نگران نباشید! فقط کافیست مراحل زیر را دنبال کنید:

  1. به آدرس www.arduino.cc/en/Main/Software رفته و نرم افزار IDE را متناسب با سیستم عامل خود دانلود و نصب کنید.
  2. نرم افزار Arduino IDE را اجرا کنید. تمام کد های پیش فرض را پاک کرده و کد زیر را به جای آن کپی کنید.
  3. برای نصب کتابخانه ها، از پنجره ی Sketch و بخش Include Library، گزینه ی Add .ZIP Library را انتخاب کنید و فایل های کتابخانه ای که دانلود کردید را انتخاب کنید.
  4. نوع آردوینو خود را از پنجره ی Tools و قسمت Board انتخاب کنید.
  5. پورتی که (COM) آردوینو به آن متصل است را در پنجره ی Tools انتخاب کنید.
  6. دکمه ی Upload (شکلی که شبیه فلش است) را بزنید تا کد شما روی آردوینو آپلود شود.
  7. شما با موفقیت کد خود را روی آردوینو ریختید.

کتابخانه های مورد نیاز:

#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)

  • jason ruello Reply

    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)

    آوریل 15, 2019 at 3:16 ب.ظ
    • Saeed Hosseini Reply

      Hi
      1-Make sure you installed the SSD1306 library correctly
      2-Make sure you added the SSD1306 library to the code -> #include”SSD1306″

      آوریل 16, 2019 at 7:30 ق.ظ
  • jason ruello Reply

    ok thanks now my arduino nano doesnt upload the program… stk500 not responding.. maybe the drivers …

    آوریل 16, 2019 at 4:25 ب.ظ
    • Saeed Hosseini Reply

      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)

      آوریل 17, 2019 at 5:34 ق.ظ
  • وحید Reply

    سلام ممنونم
    میشه بگین بعد از ساخت چه خروجی هایی رو صفحه نمایش نشون میده؟ من رطوبت خاک و دمای هوا رو لازم دارم
    و اینکه خرید لوازم تقریبا چقدر هزینه داره

    نوامبر 7, 2019 at 7:00 ب.ظ
    • سعید حسینی Reply

      خروجی ها دست خودتون هستکه چی نشون بده
      لوازم رو می تونید با جستجو در سایت خودمون پیدا کنید، قیمتاش هم بروز هست.

      دسامبر 18, 2019 at 5:04 ب.ظ
      • علیرضا زیدوند Reply

        به نظر من باید ابیاری خود کار هم می بود
        قیمتشم نهایتا میشه 160

        دسامبر 19, 2019 at 9:01 ب.ظ
        • سعید حسینی Reply

          بله، فیچرهای مختلفی میشه به این پروژه اضافه کرد 🙂

          دسامبر 22, 2019 at 12:52 ب.ظ
  • عرفان Reply

    سلام
    توی لیست قطعات مقاومت نبود
    ولی الان که لوازم رو سفارش دادم ، توی عکسا مقاومت استفاده کردین
    اگه نذارم مشکلی داره؟

    ژوئن 27, 2020 at 1:54 ب.ظ
  • سید حسین Reply

    این چجوریه که نه تابع ستاپ داره نه حلقه تکرار

    آگوست 9, 2020 at 7:29 ب.ظ
    • مهران ملکی Reply

      سلام
      کد تابع setup و loop داره، اما متاسفانه در موقع انتشار مقاله به درستی وارد نشده بوده. الان کد اصلاح شده.
      ممنون از توجهتون

      دسامبر 21, 2021 at 3:06 ب.ظ
  • ماکان Reply

    میتوانید بگویید برای اندازه گرفتن رطوبت باید چه کدی را اضافه کرد
    و چطور باید ایموجین را درست کرد
    اگر میخواهیم پمپ اب کار بزاریم باید چه تفاوتی ایجاد کنیم
    جواب بدید ممنون میشم

    آگوست 21, 2020 at 11:22 ب.ظ
    • مهران ملکی Reply

      سلام
      برای اندازه گیری رطوبت میتونید از کد خود ماژول DHT11 که در آموزش اومده استفاده کنید. برای اینکه ببینید به طور دقیق چطور میشه اطلاعات رطوبت رو از ماژول DHT11 گرفت میتونید از آموزش زیر که به طور خاص برای این ماژول نوشته شده کمک بگیرید.
      https://thecaferobot.com/learn/beginners-guide-use-dht11-dht22-sensors-arduino/
      ساخت ایموجی ها هم صرفا به 0 و 1 کردن پیکسل های ماژول OLED ممکنه. برای این کار ماژول OLED رو میتونید نگاه کنید و تعیین کنید که دقیقا برای ایموجی مورد نظرتون کدام پیکسل ها لازمه که روشن و کدوم ها خاموش باشن. در نهایت یک ماتریس به ابعاد OLED مورد استفاده تعریف میکنید و آرایه های اون رو به طور صحیح 0 و یا 1 قرار میدید. در نهایت میتونید با استفاده از اون ماتریس، ایموجی مورد نظرتون رو روی نمایشگر نشون بدید.
      برای کار گذاشتن پمپ آب هم کافیه فقط یکی از پایه های آردوینو رو اختصاص بدید. در ابتدا لازمه که متناسب با پمپ آبتون یک منبع تغذیه مناسب تهیه کنید. همچنین یک رله هم برای ارتباط بین آردوینو و پمپ آب نیاز دارید. موقعی که رله، پمپ آب و منبع تغذیه رو متصل کردید، کافیه پایه trigger رله رو به پایه آردوینو که براش اختصاص دادید متصل کنید. برای روشن و خاموش کردن پمپ آب کافیه که اون پایه آردوین رو HIGH و LOW کنید.

      دسامبر 21, 2021 at 3:22 ب.ظ
  • محمدرسول Reply

    سلام خسته نباشید من اولد ۸ خروجی گیرم نیومد بجاش ۴ خروجی میتونم استفاده کنم؟؟

    ژوئن 12, 2021 at 11:23 ق.ظ
    • مهران ملکی Reply

      سلام. خیلی ممنون
      بله هیچ مشکلی نداره. فقط کافیه نحوه سیم‌بندی و همچنین کد رو متناسب با اولدی که استفاده میکنید تغییر بدید. اولدی که مد نظرتون هست 4 تا پایه داره، 2 پایه اون مربوط به تغذیه ماژول یعنی vcc و gnd هست، و 2 پایه دیگه SCL و SDA مربوط به ارتباط به میکروکنترلرها با پروتکل I2Cئه، که اگر میخواید به آردوینو متصل کنید، باید اون‌هارو به ترتیب به پایه‌های 5 و 4 آردوینو متصل کنید.
      در مورد نحوه کدزنی هم، کتابخونه SSD1306 رو از لینک “https://github.com/adafruit/Adafruit_SSD1306” دانلود کنید و بر روی arduino ide خودتون نصب کنید. در قسمت مثال‌های این کتابخونه میتونید نحوه استفاده از تابع‌هاش رو یاد بگیرید و به سادگی ازشون استفاده کنید.

      ژوئن 14, 2021 at 9:18 ق.ظ
  • محمد رسول Reply

    سلام خسته نباشید من دادم برنامه نویس برام وارد کنه ولی نتونست گفت کد اشتباه هست یا ممکنه فرق داشته باشه با اتصالی های من باید چکار کنم؟؟

    ژوئن 22, 2021 at 1:30 ق.ظ
    • مهران ملکی Reply

      سلام.
      متاسفانه در انتشار مقاله روی سایت مشکلی به وجود اومده بوده و کد به درستی آپلود نشده بوده. الان کد اصلاح شده و میتونید ازش استفاده کنید.

      دسامبر 21, 2021 at 3:23 ب.ظ
  • علیرضا Reply

    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}
    سلام این خطا موقع اپلود میاد

    فوریه 19, 2022 at 7:28 ب.ظ
    • مهران ملکی Reply

      سلام.
      برای استفاده از دو کتابخونه ای که تو این آموزش گذاشته شده، شما نیاز به نصب یک کتابخونه کمکی دیگه به نام “adafruit unified sensor” هم نیاز دارید. برای نصب این کتابخونه وارد بخش Tools -> Manage Libraries بشید و عبارت “adafruit unified sensor” رو جستجو و نصب کنید.

      فوریه 20, 2022 at 10:54 ق.ظ
  • Alireza Reply

    میشه اموزش بدید چطوری آبیاری خودکار رو هم به این اضافه کنم خواهش میکنم جواب بدید

    می 29, 2022 at 2:56 ق.ظ
  • mobin Reply

    سلام ممنون از سایت خوبتون واقعا عالیه
    من میخوام پرژه رو برای یک کار عملی تحویل مدرسه بدم
    و دانش کد نویسی کمی دارم میشه لطف کنید مقاله رو اپدیت کنید و این که توضیحات هر بخش از کد رو بزارید
    من پایتون بلدم ولی با این زبان اشنا نیستم اگه اینکار رو بکنید خیلی میتونه تو درک این کد ها به همه کمک کنه
    و اینکه میشه کدی که برای اب یاری گل که پمپ رو راه بندازه به مقاله اضافه کنید
    من قطعات رو خریداری کردم و تو این قسمت به مشکل خوردم
    واقعا لطف میکنید

    فوریه 19, 2023 at 8:02 ب.ظ
    • علی عبدالملکی Reply

      سلام
      ممنون از توجهتون.
      حتما بنده سعی میکنم که کدها رو دوباره ویرایش کنم و تا حد امکان توضیحات رو اضافه کنم

      فوریه 21, 2023 at 9:49 ق.ظ
      • mobin Reply

        واقعا ازتون ممنونم که اهمیت
        دادین خیلی خوشحال کننده بود
        تا اون موقع لحظه شماری میکنم
        سایتتون رو به تمام علاقه مندان معرفی میکنم تا اون ها هم بتونن از سایت عالی شما لذت ببرن

        فوریه 21, 2023 at 7:37 ب.ظ
        • علی عبدالملکی Reply

          سلام
          خواهش میکنم، انشالله بتونیم با کمک شما دوستان عزیز همیشه در مسیر رشد باشیم.

          فوریه 26, 2023 at 8:45 ق.ظ
  • mobin Reply

    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.
    این ارور برای چیه ؟

    مارس 2, 2023 at 4:41 ب.ظ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.