آردوینو آموزش آردوینو خانه هوشمند نمایشگر OLED پروژه های آردوینو

ساخت پروژه تشخیص سطح آب و مایعات با نمایشگر OLED و آردوینو

نوشته شده توسط CiferTech

شاید برای شما پیش آمده باشد نیاز داشته اید که در محل کار خود یا محلی که وسایل حساسی را نگه داری می‌کنید نظارتی بر وجود آب و یا آگاهی بر میزان وچود آب در محل مربوط داشته باشید، خب راه حل شما سنسور های سطح آب است، که از این سنسور می توان برای اندازه گیری سطح آب، نظارت بر مخزن آب، تشخیص بارندگی یا تشخیص نشتی استفاده کرد. در این آموزش با استفاده از همین سنسور یعنی Water Level Sensor و نمایشگر Oled و همچنین برد آردوینو، اقدام ساخت دستگاه پایش میزان سطح آب و یا وجود نشتی آب خواهیم کرد. از این پروژه میتوان برای تشخیص کافی بودن میزان آب در آبیاری های اتوماتیک نیز استفاده کرد تا با رسیدن به میزان آب مدنظر در خروجی فرمانی ارسال و پمپ آب مربوط غیر فعال شود، همانطور که دیدید این سنسور در حالی که قابلیت ساده ای دارد و پیچیدگی در کار وجود ندارد به امکان اجرای سناریو های مختلفی را میدهد. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.

 

 


Water Level Sensor چیست؟!


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

این سنسور دارای سه پایه بای راه‌اندازی است، پین signal (سیگنال) یک خروجی آنالوگ است که به یکی از ورودی های آنالوگ آردوینو شما متصل می شود. پین” + ” برق سنسور را تأمین می کند. توصیه می شود سنسور را بین ۳٫۳ ولت و ۵ ولت تغذیه کنید. البته توجه داشته باشید که خروجی آنالوگ بسته به ولتاژ ارائه شده برای سنسور متفاوت خواهد بود. و در آخر پین با علامت ” – ”  اتصال زمینی است.

 


نمایشگر Oled 0.96 SSD1306


معمولا در پروژه های اینترنت اشیا و دیگر پروژه های امبدد از برای نمایش متن و مقادیر مختلف از نمایشگر های Oled استفاده می شود، این ماژول ها بدر انواع مختلق بسته به نوع درایور اندازه یافت می شوند که یکی از پرطرفدار ترین آن ها SSD1306 می باشد، این نوع از Oled ها معمولا در اندازه های ۰٫۹۶ و ۱٫۳ اینچ ساخته می شوند همچنین پروتکل ارتباطی Oled ها I2C می باشد. صفحه نمایش دیود ساطع کننده نور (OLED) که ما در این آموزش استفاده خواهیم کرد مدل SSD1306 است، یک صفحه نمایش تک رنگ، ۰٫۹۶ اینچی با ۱۲۸ × ۶۴ پیکسل همانطور که در شکل زیر نشان داده شده است. نمایشگر OLED نیازی به نور پس زمینه ندارد، که نتیجه آن ایجاد تضاد بسیار خوب در محیط های تاریک است. همچنین پیکسل های آن فقط هنگام روشن بودن انرژی مصرف می کنند، بنابراین صفحه نمایش OLED در مقایسه با سایر نمایشگرها، مصرف برق کمتری دارد.

 


برد آردوینو Arduino


مجموعه بردهای آردوینو از جمله بردهای توسعه پرطرفدار بین مهندسین امبدد هستند که در مدل های مختلفی از جمله Micro ,  proMini , Nano , Uno و همچنین Mega قابل تهیه هستند، هسته مرکزی این برد های محبوب از سری AtMega328 می باشد. آردوینو پلتفرم سخت‌افزاری و نرم‌افزاری متن‌باز است. همان طور که قبل تر اشاره کردیم، پلتفرم آردوینو شامل یک میکروکنترلر تک‌بردی متن‌باز است که قسمت سخت‌افزار آردوینو را تشکیل می‌دهد. علاوه بر این، پلتفرم آردوینو یک نرم‌افزار آردوینو IDE که به منظور برنامه‌نویسی برای بردهای آردوینو طراحی شده‌است و یک بوت لودر نرم‌افزاری که بر روی میکروکنترلر بارگذاری می‌شود را در بر می‌گیرد.

 


روش کار پروژه


در این پروژه با استفاده از سنسور سنجش سطح آب، مقدار نشتی آب را اندازه گیری خواهیم کرد و در نمایشگر میزان مقدار اندازه گیری شده را با اعداد نمایش و در ادامه مقدار بصورت گرافیکی نیز نمایش داده می‌شود. این مقادیر به این صورت بدست می‌آیند که با تغییر میران آب بر روی سنسور Water level میزان مقاومت بین خطوط مسی بر روی pcb این سنسور تغییر خواهد کرد و به این ترتیب خواهیم توانست با اندازه گیری تغییر ولتاژ در خروجی میزان صحیح نشتی آب را متوجه شویم. البته یک مسئله معمول شناخته شده در مورد این سنسورها، طول عمر کوتاه آنها در معرض یک محیط مرطوب است. داشتن ولتاژ بر روی پروب به طور مداوم سرعت خوردگی را به میزان قابل توجهی افزایش می دهد.

 


وسایل مورد نیاز


برد آردوینو Arduino

سنسور تشخیص سطح آب

نمایشگر Oled 0.96

سیم برد برد

 


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


ابتدا در نرم افزار Arduino IDE اقدام به نصب کتابخانه مورد نیاز خواهیم‌کرد. مراحل زیر را دنبال کنید:

  1. این مسیر را دنبال کنید Sketch Include Library > Manage Libraries
  2. کلمه Adafruit SSD1306 و “GFX” را جستجو کنید.
  3. کتابخانه ها را نصب کنید.

شماتیک و اتصالات


در این پروژه از پین های A4 , A5 که پین های i2c در برد آردوینو نانو هستند برای راه‌اندازی نمایشگر Oled استفاده کردیم، همچنین از خروجی های پاور برد برای تغذیه نمایشگر استفاده می‌کنیم، در ادامه برای راه‌اندازی سنسور Water Level از پین های تغذیه آردوینو و همچنین برای دریافت و تحلیل مقادیر خروجی از سنسور از یک پین آنالوگ استفاده خواهیم کرد، در این مورد من از پین A0 استفاده کرده‌ام. اتصالات را مطابق جدول و شماتیک زیر برقرار کنید.

اتصالات سنسور آب به آردوینو - دیجی اسپارک

 

اتصالات ماژول oled به برد آردوینو - دیجی اسپارک

 

  • شماتیک اتصالات پروژه اندازه‌گیری سطح آب و نمایش در نمایشگر Oled

 


کد و راه‌اندازی تشخیص سطح آب


در این پروژه از نمایشگر Oled ssd1306 استفاده کردیم، برای راه‌اندازی این نمایشگر کتابخانه های متفاوتی و متنوعی وجود دارد که ما از کتابخانه Adafruit استفاده خواهیم کرد که قبل تر روش نصب کتابخانه را برای شما شرح دادم، همچنین در کنار این کتابخانه نیاز به کتابخانه های دیگری نیز داریم از جمله GFX , Wire و SPI که در کل به ما در راه‌اندازی این نمایشگر کمک می کنند اما برای سنسور Water Level نیازی به کتابخانه نداریم و تنها با چند دستور ساده اقدام به راه‌اندازی این سنسور خواهیم کرد.

          // کتابخانه های مورد نیاز برای راه اندازی نمایشگر را فراخوانی می کنیم
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

 

در این بخش اقدام تعریف دو مقدار در کد می کنیم، اول پین مورد نیاز بای اتصال سنسور و در ادامه یک متغیر به نام Value که تمام مقادیر بدست آمده از سمت سنسور در این متغیر ذخیره و در ادامه می توانیم از آن برای نمایش مقادیر استفاده کنیم.

                                        //پین های مد نظر را در کد تعریف می کنیم
#define SIGNAL_PIN A0

                                           //متغیری برای ذخیره مقادیر بدست آمده
int value = 0; 

 

در این قسمت مقدار پین معرفی شده برای خواندن مقادیر سنسور را که از قبل مشخص کردیم را با استفاده analogRead بدست می‌آوریم و در متغیر مربوط ذخیره میکنیم. و در ادامه مقادیر را در بخش loop پرینت می کنیم.

  value = analogRead(SIGNAL_PIN);  // خواندن مقادیر در پین آنالوگ مشخص شده 

 

کد کامل پروژه دستگاه اندازه‌گیری سطح آب و نمایش در نمایشگر Oled.

          // کتابخانه های مورد نیاز برای راه اندازی نمایشگر را فراخوانی می کنیم
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

                                  //ابعاد و نوع درایور  نمایشگر را مشخص می کنیم
Adafruit_SSD1306 display = Adafruit_SSD1306(128, 32, &Wire);

                                        //پین های مد نظر را در کد تعریف می کنیم
#define SIGNAL_PIN A0

                                           //متغیری برای ذخیره مقادیر بدست آمده
int value = 0; 

void setup() {
  Serial.begin(9600);

                                                        // آدرس دهی به نمایشگر 
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);


  // پاک کردن بافر
  display.display();
  delay(1000);

  display.clearDisplay();
  display.display();
  
  pinMode(SIGNAL_PIN, OUTPUT);   
  digitalWrite(SIGNAL_PIN, LOW); 
}

void loop() {
               
  value = analogRead(SIGNAL_PIN);  // خواندن مقادیر در پین آنالوگ مشخص شده 

  Serial.print("Sensor value: ");
  Serial.println(value);

                                // چاپ مقادیر مورد نیاز در نمایشگر 
  display.setTextSize(1);                      // لندازه فونت نوشته
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0,0);        // مکان دقیق چاپ نوشته در نمایشگر 
  display.print("Water Level:");           // متن مد نظر برای پرینت
  display.setCursor(50,15);
  display.setTextSize(2);
  display.println(value);
  display.display();                                // نمایش مقادیر
  display.clearDisplay();                          // پاک کردن صفحه
  

       if (value >= 50){    // مشخص کردن شرط هایی برای نمایش سطح آب
    display.setTextSize(1);
    display.setCursor(80,0);
    display.print("I");   
  }
      if (value >=150){     
    display.setTextSize(1);
    display.setCursor(80,0);
    display.print("II");   
  }

      if (value >=300){
    display.setTextSize(1);
    display.setCursor(80,0);
    display.print("III");   
  }

      if (value >=500){
    display.setTextSize(1);
    display.setCursor(80,0);
    display.print("IIII");   
  }

      if (value >=520){
    display.setTextSize(1);
    display.setCursor(80,0);
    display.print("IIIII");   
  }

  delay(1000);
}

 


جمع بندی


پس از آپلود کد و برقرای اتصالات، یک پنجره Serial Monitor را باز کنید تا خروجی آردوینو را ببینید، همچنین در لحظه می‌توانید شاهد تغییر مقادیر در نمایشگر Oled نیز باشید. وقتی سنسور چیزی را لمس نمی کند، باید مقدار ۰ را ببینید. برای مشاهده تغییرات در آب، می توانید در یک لیوان آب، به آرامی سنسور را آن قرار دهید و شاهد تغییرات با تغییر سطح آب باشید.برای دریافت دقیق مقادیر از سنسور سطح آب، توصیه می شود ابتدا آن را برای نوع خاصی از آب که قصد دارید آن را کنترل کنید، کالیبره کنید. همانطور که می دانید آب خالص رسانا نیست. در واقع مواد معدنی و ناخالصی های موجود در آب است که آن را رسانا می کند. بنابراین، سنسور شما ممکن است بسته به نوع آبی که استفاده می کنید حساسیت کم و بیش داشته باشد.

 

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

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

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

CiferTech

تبادل نظر و رفع عیب با ثبت دیدگاه

۲۳ دیدگاه

  • سلام ببخشید این پروژه رو با arduino uno هم میشه انجام داد؟ و اگه میشه کد ها و شماتیک اتصالات به همین شکله یا کلا فرق میکنه بخاطر تفاوت نوع arduino؟؟؟ و شماره پایه ها فرق داره؟

    • سلام؛ خیر مشکلی نیست تنها تفاوت برد های nano و uno برای این پروژه در اندازه آنهاست، مراحل را بر روی آردوینو Uno اجرا کنید، بدون مشکل اجرا خواهد شد.

  • سلام ببخشید من همین پروژه رو میخواستم انجام بدم ولی میخوام مقادیر رو روی گوشی با ماژول وای فای یا بلوتوث نشون بدم. هرچی جستجو کردم چیزی پیدا نکردم. شما تو همین سایت یا سایت های دیگه چیزی مطابق به خواسته من سراغ دارید که لینکش رو بدید؟ ممنون میشم اگه بهم کمک کنید

    • با سلام، بصورت اپلیکیشن، blynk را پیشنهاد میکنم اما ممکن است بدلیل تحریم ها قابل اجرا نباشد. همچنین از آموزش های Thngspeak یا دیگر دشبورد ها نیز می‌توانید استفاده کنید.

  • سلام، خسته نباشی.
    من میخواستم این پروژه رو در node red نمایش بدم، شما آموزشی در این باره دارین؟
    میشه راهنمایی کنین که چجوری میزان اب رو. با این پروژه به نود رد وصل کنم

  • سلام من میخوام پروژه ای رو اجرا کنم که وسیله ای بسازم برای تشخیص وجود آب یا رظوبت داخل کیسه های گرانول پلاستیک. آیا این پروژه این کار رو انجام میده ؟

    • با سلام
      لطفا اطلاعات بیشتری ارائه دهید تا راهنمایی شود. انتخاب سخت افزار مناسب وابسته به شرایط محیط و روش تست دارد.
      سنسور تشخیص سطح آب با قرار گرفتن در آب دیتا ارسال می‌کند. برای اندازه گیری رطوبت بایستی از سنسورهای تشخیص رطوبت استفاده کنید.

    • با سلام
      اگر منظور شما OLED SPI است، تفاوتی در اجرا وجود ندارد و فقط بایستی از پایه های SPI و در کد برنامه از دستورات SPI استفاده کنید.
      پس از نصب کتابخانه در فایل EXAMPLE مثال هایی برای OLED SPI در کتابخانه adafruit ssd1306 قرار گرفته شده است.

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

    • با سلام و تشکر از شما
      کاربر گرامی به نظر آموزش را به درستی بررسی نکرده‌اید. برد مورد استفاده در این پروژه از نوع آردوینو نانو است. هر تغییری که بخواهید در سخت افزارها بدهید، نیازمند تغییرات در برنامه نویسی است. سایز برد بورد هم در اجرای پروژه تاثیری ندارد.

  • سلام خسته نباشید.منظورتون از POWER_PIN در بخش کد برنامه نویسی کدام پایه ی برد اردوینو هست؟ چون در نرم افزار برای این عبارت ارور دریافت میکنم.متن ارور هست (‘POWER_PIN’ was not declared in this scope
    pinMode(POWER_PIN, OUTPUT);) لطفا راهنمایی کنید.خیلی ممنون

  • سلام
    ببخشید چند تا سوال داشتم
    من از برد رزبری پای پیکو استفاده می‌کنم و همین کد های آردوینو روش آپلود میکنم اما نمایشگر همچنان خاموشه
    آیا مشکل اینه که برد من رزبری پای پیکو هستش ؟ (البته قبلا از همین کد های آردوینو برای سنسور های مختلف استفاده کردم و هیچ مشکلی نداشتم )
    نمایشگر من (ماژول نمایشگر OLED دو رنگ آبی و زرد ۰٫۹۶ با پروتکل ارتباطی I2C درایور SSD1306)
    هستش و بجای رنگ سفید در کد display.setTextColor(SSD1306_WHITE);
    از آبی یا زرد استفاده می‌کنم ارور میده
    آیا مشکل از نمایشگر هست یا کتابخانه؟

    خواهشاً اگه میشه راهنمایی کنید هر کاری میکنم نمایشگر راه اندازی نمیشه

  • با سلام
    من میخواستم این مدل رو برای مخزن به ارتفاع ۱۵۰ سانتی متر نصب کنم
    امکانش هست بتونم با تغییراتی روی سنسور اینکارو بکنم ؟