در این آموزش قصد داریم دمای محیط را در یک نمایشگر TFT مانیتور کنیم اما این به این معنا نیست که تنها عدد مقدار دما بر روی نمایشگر نمایش داده شود، به لطف نمایگر های های TFT به تمام رنگ های مورد نیاز دسترسی داریم و همچنین قادر حواهیم بود اشکال مختلف را نمایش دهیم. در این آموزش برای بدست آوردن مقادیر دما از سنسور LM35 استفاده خواهیم کرد که یکی سنسور های دقیق و همچنین مقرون به صرفه برای خرید است. در ادامه این آموزش با مرجع تخصصی آردوینو به زبان فارسی، دیجی اسپارک همراه باشید.
سنسور دما LM35
LM35 می تواند از ۵۵- درجه سانتیگراد تا ۱۵۰ درجه سانتیگراد اندازه گیری کند، اگر در سطح دما و رطوبت مناسب استفاده شود از سطح دقت بسیار زیادی برخوردار خواهد بود، ولتاژ ورودی LM35 می تواند از ۴+ ولت تا ۳۰ ولت باشد و حدود ۶۰ میکروآمپر جریان مصرف می کند. Lm35 دارای خانواده بزرگی از سنسور های مشابهی است که با نام های LM35C ،LM35CA ،LM35D ،LM135 ،LM135A ،LM235 ،LM335 ساخته میشوند. همه اعضای خانواده LM35 بر اساس اصول پایه LM35 کار می کنند اما ظرفیت اندازه گیری دما در آنها متفاوت است.
نمایشگر LCD 240×240 TFT
TFT مخفف “Thin Film Transistor” است. صفحه نمایش TFT LCD رنگی، دارای ترانزیستورهایی است که از فیلمهای نازک سیلیکون آمورف روی شیشه رسوب کرده اند. این به عنوان یک شیر کنترل برای ایجاد ولتاژ مناسب بر روی کریستال های مایع برای زیر پیکسل های جداگانه عمل می کند. به همین دلیل صفحه نمایش TFT LCD را نمایشگر Active Matrix نیز می نامند. این صفحه نمایش ۱٫۵۴ اینچی دارای ۲۴۰×۲۴۰ پیکسل، ۱۶ بیتی تمام رنگ است و یک نمایشگر IPS است، بنابراین رنگ تا ۸۰ درجه از محور در هر جهت عالی به نظر می رسد. این LCD از درایور ST7789 استفاده میکند.
برد ESP8266
تراشه های ESP8266 از موارد محبوب در زمینه اینترنت اشیا هستند که نسبت به دیگر نمونه ها کیفیت بهتر و همچنین قیمت پایین تری نیز دارند، هسته مرکزی این ماژول ESP8266 EX می باشد که در واقع زیر این شیلد فلزی قرار گرفته است، در ضمن این شیلد فلزی به منظور کاهش نویز و همچنین محافظت از قطعات SMD حساس این ماژول قرار داده شده است. این ماژول ها در سری های مختلفی تولید میشوند از جمله esp01 و esp12، در واقع تفاوتی که مدل ها با یکدیگر دارند تعداد GPIO ها و همچنین حافظه آن ها است البته معمولا از نظر ظاهری نیز تفاوت هایی که با یکدیگر دارند که قابل تشخیص است. این ماژول ها از شبکه WIFI داخلی پشتیبانی میکنند، این میکرو کنترلر ها اولین بار در سال ۲۰۱۴ به بازار عرضه شدند. ESP8266 دارای ۱۳ GPIO و همچنین یک ورودی آنالوگ (A0) است.
توضیح تکمیلی
در این آموزش با رسم شکل یک دماسنج بر روی صفحه نمایش و همچنین با تعریف یک انیمیشن برای آن دمای محیط را نمایش خواهیم داد. در این آموزش از برد Nodemcu بر پایه تراشه ESP8266 به عنوان برد راهانداز استفاده میشود همچنین برای اندازه گیری دما از سنسور LM35 استفاده خواهیم کرد. سنسور دما LM35 از جمله موارد پر مصرف و مناسب برای سنجش دمای محیط است.
وسایل مورد نیاز
شماتیک و اتصالات
ابتدا اتصالات مربوط به نمایشگر TFT و همچنین سنسور دمای LM35 را مطابق جدول و شماتیک زیر برقرار کنید، ابتدا اتصالات مربوط به سنسور LM35 را برقرار میکنیم. پین دیتا در LM35 به پین آنالوگ به دیجیتال ESP8266 یعنی A0 متصل میشود.
- اتصالات نمایشگر TFT و برد nodemcu
- شماتیک مربوط به اتصالات هر دو قطعه استفاده شده
راهاندازی و کدنویسی
در این مرحله بعد از برقراری اتصالات، نوبت به کد های این پروژه خواهد رسید. مرحله به مرحله بخش های مختلف کد را یک بار با هم مرور خواهیم کرد. ابتدا کتابخانه های مورد نیاز برای راهاندازی ماژول نئوپیکسل را فراخوانی خواهیم کرد.
#include <Arduino_ST7789.h> #include <SPI.h>
در این بخش پین های مورد نیاز را تعریف خواهیم کرد که هر یک به کدام پین از برد NodeMCU متصل خواهند شد.
#define TFT_DC D1 #define TFT_RST D0 #define TFT_MOSI D7 #define TFT_SCLK D5
در ادامه به این دلیل که این نمایشگر تمام رنگ است، رنگ های مورد نیاز را با استفاده از کد رنگیه آن ها را تعریف خواهیم کرد.
#define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF #define VIOLET 0xAEAE8DF
کد کامل پروژه.
#include <Arduino_ST7789.h> #include <SPI.h> #define TFT_DC D1 // pin of your choice #define TFT_RST D0 // pin of your choice #define TFT_MOSI D7 // fixed pin #define TFT_SCLK D5 // fixed pin #define BLACK 0x0000 #define BLUE 0x001F #define RED 0xF800 #define GREEN 0x07E0 #define CYAN 0x07FF #define MAGENTA 0xF81F #define YELLOW 0xFFE0 #define WHITE 0xFFFF #define VIOLET 0xAEAE8DF #define YP A3 #define XM A2 #define YM 9 #define XP 8 #define XGRAPH 50 #define YGRAPH 75 #define HGRAPH 135 #define WGRAPH 21 #define LM35 A0 Arduino_ST7789 tft = Arduino_ST7789(TFT_DC, TFT_RST); int newHeight; int oldHeight = 0; int heightDiff; void setup(void) { tft.init (240, 240); tft.fillScreen (BLACK); tft.drawRect(10, 10, 220, 220, WHITE); tft.fillRect(10, 10, 220, 220, BLACK); Serial.begin(9600); tft.fillCircle(XGRAPH, YGRAPH, (WGRAPH/2), WHITE); tft.fillRect((XGRAPH-(WGRAPH/2)), YGRAPH, WGRAPH, HGRAPH, WHITE); tft.fillCircle(XGRAPH, (HGRAPH+YGRAPH), ((WGRAPH/2)+10), WHITE); tft.fillCircle(XGRAPH, YGRAPH, (WGRAPH/2)-3, WHITE); tft.fillRect((XGRAPH-(WGRAPH/2)+3), YGRAPH, (WGRAPH-6), HGRAPH, WHITE); tft.fillCircle(XGRAPH, (HGRAPH+YGRAPH), ((WGRAPH/2)+7), WHITE); tft.fillCircle((XGRAPH+WGRAPH), YGRAPH, 3, WHITE); tft.setTextColor(WHITE); tft.setTextSize(2); tft.setCursor(((XGRAPH+WGRAPH)+8), (YGRAPH-5)); tft.print("100"); tft.setTextSize(1); tft.print("0"); tft.setTextSize(2); tft.print("C"); tft.fillCircle((XGRAPH+WGRAPH), ((YGRAPH+(HGRAPH/2))-(WGRAPH/2)), 3, WHITE); tft.setTextColor(WHITE); tft.setTextSize(2); tft.setCursor(((XGRAPH+WGRAPH)+8), (((YGRAPH+(HGRAPH/2))-(WGRAPH/2)))-5); tft.print("50"); tft.setTextSize(1); tft.print("0"); tft.setTextSize(2); tft.print("C"); tft.fillCircle((XGRAPH+WGRAPH), ((YGRAPH+HGRAPH)-((WGRAPH/2)+7)), 3, WHITE); tft.setTextColor(WHITE); tft.setTextSize(2); tft.setCursor(((XGRAPH+WGRAPH)+8), (((YGRAPH+HGRAPH)-((WGRAPH/2)+7))-5)); tft.print("0"); tft.setTextSize(1); tft.print("0"); tft.setTextSize(2); tft.print("C"); tft.fillRect((XGRAPH-(WGRAPH/2)+5), YGRAPH, (WGRAPH-10), HGRAPH, RED); tft.fillCircle(XGRAPH, (HGRAPH+YGRAPH), ((WGRAPH/2)+5), RED); } void loop(void) { int suhu=(analogRead(LM35)*5)/10; tft.setCursor(150, 145); tft.setTextColor(VIOLET, BLACK); tft.setTextSize(4); tft.print(suhu); tft.setTextSize(2); tft.print("0"); tft.setTextSize(4); //tft.print("C"); tft.fillRect(130, 255, 80, 4, RED); if(suhu <= 100){ newHeight = map(suhu,0, 100, 0, (HGRAPH-(WGRAPH/2))); heightDiff = oldHeight-newHeight; // only draw new part of bar graph for faster display if (oldHeight != newHeight) tft.fillRect((XGRAPH-(WGRAPH/2)+5), YGRAPH+((HGRAPH-suhu)-((WGRAPH/2)+7)), (WGRAPH-10), HGRAPH-((HGRAPH-suhu)-((WGRAPH/2)+7)), RED); tft.fillRect((XGRAPH-(WGRAPH/2)+5), YGRAPH, (WGRAPH-10), ((HGRAPH-suhu)-((WGRAPH/2)+7)), WHITE); if (suhu==100)tft.fillCircle(XGRAPH, YGRAPH, (WGRAPH/2)-5, RED); oldHeight=newHeight; // remember how high bar is } tft.fillCircle(XGRAPH, (HGRAPH+YGRAPH), ((WGRAPH/2)+5), RED); delay(300); }
جمع بندی
در نهایت با استفاده از LCD TFT با درایور ST7789 و البته سنسور دما LM35، دمای محیط را اندازه گیری و بصورت گرافیکی و انیمیشنی در نمایشگر مورد نظر نمایش دهیم و در هر زمان قادر به خواندن دما خواهیم بود.
چنانچه در مراحل راه اندازی و انجام این پروژه با مشکل مواجه شدید، بدون هیچ نگرانی در انتهای همین پست، به صورت ثبت نظر سوالتان را مطرح کنید. من در سریعترین زمان ممکن پاسخ رفع مشکل شما را خواهم داد. همچنین اگر ایرادی در کدها و یا مراحل اجرایی وجود دارند میتوانید از همین طریق اطلاع رسانی کنید.
در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.
سلام با چه برنامه ای کد ها را می نویسیم؟ با برد ویموس هم می شود پروژه را انجام دهیم؟
با سلام
توسط کامپایلر آردوینو میتوانید اقدام کنید. برای تغییر برد بایستی تغییراتی هم در کدها اعمال کنید.
سلام
اون نوشتهWGRAPHکه در همه جای کد اومده چیست؟
این متن سمپل است و بایستی درکدها آنرا با مقادیر مورد نظرتان جایگزین کنید.