فهرست مطالب:

سرگرم کننده با صفحه نمایش OLED و آردوینو: 12 مرحله (همراه با تصاویر)
سرگرم کننده با صفحه نمایش OLED و آردوینو: 12 مرحله (همراه با تصاویر)

تصویری: سرگرم کننده با صفحه نمایش OLED و آردوینو: 12 مرحله (همراه با تصاویر)

تصویری: سرگرم کننده با صفحه نمایش OLED و آردوینو: 12 مرحله (همراه با تصاویر)
تصویری: حرکات زشت سحر قریشی در باشگاه مردانه در دبی#سحرقریشی #امیرتتلو #تتلو #سحر_قریشی 2024, نوامبر
Anonim
سرگرم کننده با صفحه نمایش OLED و آردوینو
سرگرم کننده با صفحه نمایش OLED و آردوینو

من مطمئن هستم که شما قطعا در مورد فناوری صفحه نمایش OLED شنیده اید. نسبتاً جدید است و کیفیت بهتری نسبت به فناوری LCD قدیمی ارائه می دهد. در این آموزش ما می خواهیم مراحل مورد نیاز برای نمایش داده ها در یکی از متداول ترین ماژول های نمایشگر تک رنگ OLED موجود در بازار را مرور کنیم. من سعی می کنم ویژگی های ارائه شده توسط کتابخانه Adafruit مربوطه را برای نمایش داده ها در این ماژول توضیح دهم.

مرحله 1: از چه ماژول های OLED استفاده خواهیم کرد؟

از چه ماژول های OLED استفاده خواهیم کرد؟
از چه ماژول های OLED استفاده خواهیم کرد؟
از چه ماژول های OLED استفاده خواهیم کرد؟
از چه ماژول های OLED استفاده خواهیم کرد؟
از چه ماژول های OLED استفاده خواهیم کرد؟
از چه ماژول های OLED استفاده خواهیم کرد؟

ماژول های OLED در اندازه ها و ویژگی های بسیار متنوعی در دسترس هستند. چیزی که ما در این آموزش استفاده می کنیم یک ماژول تک رنگ 128x64 OLED است. این نوع ماژول در اندازه های زیر موجود است (به ترتیب که در تصاویر مشاهده می کنید):

  • 128x64
  • 32x128
  • 96x16
  • 64x48
  • 32x64

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

مرحله 2: I2C به طور خلاصه

I2C به طور خلاصه
I2C به طور خلاصه

مدار مجتمع (IIC) که معمولاً I2C (I مربع C) نامیده می شود ، توسط فیلیپس در دهه 80 توسعه یافته و به عنوان گذرگاه تبادل داده مورد استفاده برای انتقال داده ها بین واحد پردازش مرکزی (CPU) یا واحد میکروکنترلر (MCU) یک دستگاه و تراشه های جانبی اساساً برای برنامه های تلویزیونی مورد هدف قرار گرفت. به دلیل سادگی آن ، آنقدر محبوب شد که پس از مدتی به یکی از مکانیسم های اصلی انتقال داده برای CPU ها و MCU ها و دستگاه های جانبی تبدیل شد که بخشی از یک برد PCB نیستند و از طریق سیم به آن متصل می شوند (به عنوان مثال سنسورها ، ماژول های نمایش و غیره).

I2C شامل یک گذرگاه ارتباطی ساخته شده از دو سیم است که از انتقال داده های دو طرفه بین یک دستگاه اصلی و چندین دستگاه برده پشتیبانی می کند. معمولاً گره اصلی وظیفه کنترل گذرگاه را بر عهده دارد - که در واقع با ایجاد سیگنال همگام سازی در خط ساعت سریال (SCL) انجام می شود. این سیگنالی است که در حین انتقال به طور مداوم توسط استاد ارسال می شود و سایر گره های متصل به گذرگاه از آن برای همگام سازی ارتباط خود و تشخیص سرعت گذرگاه استفاده می کنند. داده ها از طریق خط داده های سریال (SDA) بین master و slave منتقل می شوند. سرعت انتقال می تواند تا 3.4 مگابیت بر ثانیه باشد. همه دستگاه هایی که می خواهند داده ها را از طریق I2C منتقل کنند باید آدرس منحصر به فردی داشته باشند و بسته به عملکرد دستگاه می توانند به عنوان فرستنده یا گیرنده عمل کنند. به عنوان مثال ، یک صفحه نمایش OLED یک گیرنده است که برخی از داده ها را می پذیرد و آنها را نمایش می دهد ، در حالی که یک سنسور دما یک فرستنده گیرنده است که دمای ثبت شده را از طریق گذرگاه I2C ارسال می کند. به طور معمول یک دستگاه اصلی دستگاهی است که انتقال داده را در گذرگاه آغاز می کند و سیگنال های ساعت را ایجاد می کند تا امکان انتقال وجود داشته باشد. در حین انتقال ، هر دستگاهی که توسط این استاد خطاب می شود برده تلقی می شود و داده ها را می خواند.

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

اگر علاقمند به کسب اطلاعات بیشتر در مورد جزئیات و نظریه های مربوط به گذرگاه I2C هستید ، می توانید از منابع زیر استفاده کنید:

www.i2c-bus.org

learn.sparkfun.com/tutorials/i2c

مرحله 3: ماژول ها و اجزای مورد نیاز

ماژول ها و اجزای مورد نیاز
ماژول ها و اجزای مورد نیاز
ماژول ها و اجزای مورد نیاز
ماژول ها و اجزای مورد نیاز
ماژول ها و اجزای مورد نیاز
ماژول ها و اجزای مورد نیاز

در اینجا می توانید لیستی از اجزای مورد نیاز برای تکمیل این آموزش را بیابید:

پیوندهای eBay:

  • 1 عدد آردوینو Uno:
  • 1 عدد ماژول OLED 128x64:
  • 4 کابل Dupont:
  • 1 عدد تخته کوچک نان بدون لحیم:

پیوندهای Amazon.com:

  • 1 عدد آردوینو Uno:
  • 1 عدد ماژول OLED 128x64:
  • 4 کابل Dupont:
  • 1 عدد تخته کوچک نان بدون لحیم:

مرحله 4: سیم کشی ماژول نمایش OLED به آردوینو

سیم کشی ماژول نمایش OLED به آردوینو
سیم کشی ماژول نمایش OLED به آردوینو
سیم کشی ماژول نمایش OLED به آردوینو
سیم کشی ماژول نمایش OLED به آردوینو
سیم کشی ماژول نمایش OLED به آردوینو
سیم کشی ماژول نمایش OLED به آردوینو
سیم کشی ماژول نمایش OLED به آردوینو
سیم کشی ماژول نمایش OLED به آردوینو

نکته مهم در مورد دستگاه های دارای قابلیت I2C این است که نحوه اتصال آنها به Arduino همه یکسان است. این به این دلیل است که آردوینو ارتباط I2C خود را فقط بر روی پین های خاص اجرا می کند. در این آموزش من از Arduino Uno استفاده می کنم. Arduino Uno از پین A5 به عنوان SCK و A4 به عنوان SDA استفاده می کند. بنابراین ما می توانیم ماژول صفحه نمایش OLED را به Arduino Uno وصل کنیم که در نمای شماتیک نشان داده شده است. همانطور که ممکن است در تصویری که از ماژول صفحه نمایش OLED گرفته ام متوجه شوید ، اتصال VCC و GND با نمای شماتیک متفاوت است. به یاد داشته باشید که برچسب پین های ماژول خود را بررسی کنید تا مطمئن شوید که آن را به روش صحیح متصل کرده اید.

ما فقط به 4 پین نیاز داریم که باید به شکل زیر به هم متصل شوند:

Arduino VCC -> ماژول OLED VCC

آردوینو GND -> ماژول OLED GND

آردوینو 4 -> ماژول OLED SDA

آردوینو 5 -> ماژول OLED SCK

مرحله 5: یافتن آدرس ماژول نمایش

یافتن آدرس ماژول نمایش
یافتن آدرس ماژول نمایش

به عنوان اولین قدم برای اتصال به دستگاهی با قابلیت I2C ، باید آدرس ماژول را داشته باشید. برای انجام این کار ، پس از اتصال ماژول به Arduino خود ، فقط باید کد پیوست شده را روی Arduino خود بارگذاری کنید. این کد شامل کتابخانه Wire است که یک کتابخانه شامل Arduino IDE است که ارتباطات I2C را اداره می کند. سعی می کند دستگاه های متصل I2C را اسکن کرده و آدرس آنها را از طریق پورت سریال به رایانه شما ارسال کند. بنابراین می توانید از طریق ابزار Serial Monitor در Arduino IDE به خروجی آن دسترسی پیدا کنید. نسخه اصلی در Arduino Playground در دسترس است). همچنین می توانید آن را به شیوه ای خواندنی تر در ویرایشگر آنلاین آردوینو مشاهده کنید. انتظار نداشته باشید وقتی این کد در حال اجرا است چیزی روی صفحه نمایش داده شود.

همانطور که در تصویر مشاهده می کنید ، ماژول من به آدرس 0x3C متصل شده است. به طور معمول همه دستگاه های یک خط تولید خاص (به عنوان مثال همه ماژول های 128x64 OLED) آدرس یکسانی دارند.

آدرس دستگاههای I2C از 1 تا 126 محدود است. این کد به سادگی سعی می کند به ترتیب به هر دستگاه (بدون انتقال داده) متصل شود و سپس بررسی کند که آیا خطایی در ارتباط با آدرس ارائه شده توسط کتابخانه زیرین گزارش شده است. اگر خطایی وجود نداشت ، آدرس را به عنوان یک ماژول موجود برای اتصال چاپ کنید. همچنین لازم به ذکر است که 15 آدرس اول محفوظ است ، بنابراین از روی آنها می گذرد و فقط آدرس های بالای این محدوده را چاپ می کند. به یاد داشته باشید که آدرس این ماژول های I2C روی دستگاه سخت کد شده است و نمی توان آن را تغییر داد. بنابراین بهتر است زمانی که می خواهید آن را در قفسه آزمایشگاه خود قرار دهید ، آن را در جایی یادداشت کنید یا برچسبی روی ماژول بگذارید تا دفعه بعد ، اجرای کد اسکنر ضروری نباشد. اما این روش پیچیده ای نیست؛)

مرحله 6: نصب کتابخانه های مورد نیاز برای نمایش داده ها در ماژول OLED

نصب کتابخانه های مورد نیاز برای نمایش داده ها در ماژول OLED
نصب کتابخانه های مورد نیاز برای نمایش داده ها در ماژول OLED
نصب کتابخانه های مورد نیاز برای نمایش داده ها در ماژول OLED
نصب کتابخانه های مورد نیاز برای نمایش داده ها در ماژول OLED

کتابخانه Wire می تواند ارتباطات پایینی را با دستگاه های I2C انجام دهد. هنگامی که می خواهید برای خواندن/نوشتن داده ها از/به یک دستگاه خاص متصل شوید ، معمولاً از یک کتابخانه ارائه شده توسط شرکتی که در ابتدا آن ماژول را ساخته است استفاده می کنید. این کتابخانه تمام جزئیات ارتباطی I2C را با ماژول داده شده مدیریت می کند و به ما اجازه می دهد تمرکز بیشتری بر روی کسب و کار خود داشته باشیم که در این مورد داده ها را به روشی که ما می خواهیم نمایش می دهد.

Adafruit ، شرکتی که نسخه اصلی چنین ماژول های صفحه نمایش را تولید می کند ، کتابخانه هایی با نام Adafruit SSD1306 را برای نمایش داده ها در این نمایشگرهای تک رنگ ارائه می دهد. بنابراین قبل از شروع برنامه نویسی ، ما باید این کتابخانه را از طریق مدیر کتابخانه (قابل دسترسی از طریق Sketch> Include Library> Manage Libraries … menu) در Arduino IDE نصب کنیم. همچنین کتابخانه دیگری به نام Adafruit GFX Library وجود دارد که موارد گرافیکی سطح پایین تری را اداره می کند و داخلی توسط Adafruit SSD1306 استفاده می شود. همانطور که در تصاویر مشاهده می کنید ، باید هر دو آنها را بر روی Arduino IDE خود نصب کرده باشید.

مرحله 7: راه اندازی ماژول نمایش

راه اندازی اولیه ماژول نمایش
راه اندازی اولیه ماژول نمایش

ماژول طراحی روی صفحه در یک کلاس به نام Adafruit_SSD1306 پیچیده شده است. تعریف این کلاس در کتابخانه Adafruit است ، بنابراین ابتدا باید آن کتابخانه را وارد کنیم. سپس ابتدا باید نمونه ای از این کلاس را مثال بزنیم. سازنده این کلاس شماره پورتی را می گیرد که صفحه نمایش می تواند تنظیم مجدد شود که پین 4 است (متصل به SCK). این قسمت از کد باید در ابتدای فایل (خارج از توابع setup () و loop ()) قرار گیرد.

#عبارتند از

صفحه نمایش Adafruit_SSD1306 (4) ؛

اکنون در داخل تابع setup () باید با شروع آدرس I2C خود ، تابع شروع شیء نمایش را فراخوانی کنید (SSD1306_SWITCHCAPVCC یک مقدار ثابت است که نوع منبع تغذیه کتابخانه را مشخص می کند):

void setup () {

display.begin (SSD1306_SWITCHCAPVCC ، 0x3C) ؛ display.display ()؛ حلقه} void () {} // حلقه فعلا می تواند خالی باشد

اکنون شیء نمایش آماده است و می توانیم توابع آن را فراخوانی کنیم (به عنوان مثال display.write () ، display.drawLine و غیره). نکته مهم این است که هر زمان که چیزی را با فراخوانی شیء صفحه نمایش خود ترسیم می کنیم ، باید تابع display.display () را فراخوانی کنیم تا رسم واقعی در سطح سخت افزار اتفاق بیفتد. این عمدتا به این دلیل است که توابع طراحی که ما آنها را می نامیم ، فقط به دلایل عملکرد نمایش "در حافظه" نمایشگر را به روز می کنند. در واقع تغییرات حافظه را ذخیره می کند. بنابراین همیشه باید به خاطر داشته باشیم که وقتی کار رسم چیزی روی صفحه را تمام کردیم ، تابع display () را فراخوانی کنیم.

display.write (…)؛ // در حافظه به روز می شود

display.drawLine (…) ؛ // در حافظه به روز می شود. display.display ()؛ // همه تغییرات سخت افزار صفحه نمایش را فلاش می کند

اگر سعی کنید کد خود را در این مرحله بارگذاری کنید ، متوجه خواهید شد که آرم صنایع Adafruit نمایش داده می شود. شاید تعجب کنید که چه کسی از آن خواسته تا آن را بکشد! در واقع این همان کاری است که کتابخانه Adafruit انجام می دهد. این حافظه ماژول (نمایش حافظه در سخت افزار صفحه نمایش) را با نشان این شرکت راه اندازی می کند. اگر نمی خواهید این را در حین راه اندازی اولیه مشاهده کنید ، می توانید سعی کنید قبل از فراخوانی display.display () در عملکرد تنظیمات ، تابع display.clearDisplay () را فراخوانی کنید. این عملکرد ، همانطور که از نامش پیداست ، صفحه را کاملاً پاک می کند.

#عبارتند از

صفحه نمایش Adafruit_SSD1306 (4) ؛ void setup () {display.begin (SSD1306_SWITCHCAPVCC ، 0x3C) ؛ display.clearDisplay ()؛ display.display ()؛ } void loop () {}

بر اساس اسناد کتابخانه Adafruit_SSD1306 ، می توانید از توابع مختلف ارائه شده توسط این کلاس برای ترسیم روی صفحه یا دستکاری مستقیم پیکسل های آن استفاده کنید. در بخشهای بعدی سعی می کنیم برای هر یک نمونه ای ارائه دهیم تا بتوانید در مورد نحوه عملکرد آن ایده ای داشته باشید. اکثر این مثالها فقط یک محتویات ساده را نمایش می دهند ، بنابراین ما می توانیم آنها را در داخل تابع () setup (بعد از کد راه اندازی) قرار دهیم. با این کار فقط یکبار اجرا می شود و همانجا باقی می ماند.

مرحله 8: نمایش یک متن ساده

نمایش یک متن ساده
نمایش یک متن ساده
نمایش یک متن ساده
نمایش یک متن ساده
نمایش یک متن ساده
نمایش یک متن ساده

برای نمایش یک متن ، می توانیم از تابع display.println () کتابخانه استفاده کنیم. متن را به عنوان یک رشته می پذیرد و سعی می کند آن را نمایش دهد. این مهم است که بدانیم ما باید به کتابخانه بگوییم که در کدام قسمت از صفحه قرار است متن را ارائه دهیم. هر پیکسل روی صفحه نمایش دارای مختصاتی است که با X و Y مشخص شده است. X از چپ به راست و Y از بالا به پایین افزایش می یابد. گوشه سمت چپ بالای صفحه (X = 0 ، Y = 0) و گوشه سمت راست پایین (X = 127 ، Y = 63) است. من مختصات گوشه ها را در تصویر اول ذکر کردم. ما می توانیم از تابع display.setCursor () برای تعیین مکان نمایش متن در صفحه استفاده کنیم.

ویژگی دیگر متن رنگ آن است. ما می توانیم رنگ را با استفاده از display.setTextColor () که در نمونه زیر نشان داده شده است ، مشخص کنیم.

display.clearDisplay ()؛

display.setTextColor (سفید) ؛ display.setCursor (35 ، 30) ؛ display.println ("سلام جهان!")؛ display.display ()؛

ما همچنین می توانیم از تابع display.write () برای نمایش یک کاراکتر استفاده کنیم. کد کاراکتر را به عنوان یک نوع uint8_t می پذیرد و کاراکتر مربوط به آن کد را روی رشته نمایش می دهد. به عنوان مثال ، اگر بخواهیم یک رشته را با استفاده از این تابع نمایش دهیم ، می توانیم از قطعه زیر استفاده کنیم:

display.clearDisplay ()؛

display.setTextColor (سفید) ؛ display.setCursor (35 ، 30) ؛ display.write (72)؛ display.write (101)؛ display.write (108)؛ display.write (108)؛ display.write (111)؛ display.write (32)؛ display.write (87)؛ display.write (111)؛ display.write (114) ؛ display.write (108)؛ display.write (100)؛ display.write (33)؛ display.display ()؛

همچنین امکان کشیدن متون به رنگ سیاه با زمینه سفید وجود دارد. برای انجام این کار ، باید تابع display.setTextColor را به صورت زیر فراخوانی کنید:

display.clearDisplay ()؛

// رنگ سیاه را با صفحه سفید نمایش می دهد. setTextColor (BLACK ، WHITE) ؛ display.setCursor (25 ، 30) ؛ display.println ("متن معکوس!")؛ display.display ()؛

همچنین می توانید اندازه متن را با استفاده از تابع display.setTextSize () تنظیم کنید. یک عدد صحیح را به عنوان یک اندازه می پذیرد. هرچه عدد بیشتر باشد ، متن بزرگتر خواهد بود. کوچکترین اندازه 1 است که اندازه پیش فرض متون است. کد زیر سعی می کند حرف "A" را در 6 اندازه مختلف بنویسد:

display.clearDisplay ()؛

display.setTextColor (سفید) ؛ display.setCursor (0 ، 0) ؛ display.setTextSize (1) ؛ display.print ("A") ؛ display.setTextSize (2) ؛ display.print ("A") ؛ display.setTextSize (3) ؛ display.print ("A") ؛ display.setTextSize (4) ؛ display.print ("A") ؛ display.setTextSize (5) ؛ display.print ("A") ؛ display.setTextSize (6) ؛ display.print ("A") ؛ display.display ()؛

مرحله 9: ترسیم اشکال اصلی

ترسیم اشکال اولیه
ترسیم اشکال اولیه
ترسیم اشکال اولیه
ترسیم اشکال اولیه
ترسیم اشکال اولیه
ترسیم اشکال اولیه

رسم اشکال اصلی مانند مستطیل ، دایره ، مثلث ، خط یا نقطه بسیار آسان است و برای هر یک یک تابع اختصاصی وجود دارد.

خط کشیدن

برای رسم خط می توانید display.drawLine (startX ، startY ، endX ، endY ، رنگ) را صدا کنید. به عنوان مثال کد زیر خطوط مورب را روی صفحه ترسیم می کند تا یک X بزرگ شکل دهد:

display.clearDisplay ()؛

display.drawLine (0 ، 0 ، display.width () - 1 ، display.height () - 1 ، WHITE) ؛ display.drawLine (display.width () - 1 ، 0 ، 0 ، display.height () - 1 ، WHITE) ؛ display.display ()؛

با استفاده از توابع display.width () و display.height () می توانید به عرض و ارتفاع صفحه دسترسی داشته باشید. با این کار کد شما مستقل از اندازه صفحه نمایش است.

رسم مستطیل

تابع رسم مستطیل display.drawRect (upperLeftX ، upperLeftY ، عرض ، ارتفاع ، رنگ) است. در اینجا کدی است که سه مستطیل را در برخی از نقاط تصادفی ترسیم می کند:

display.clearDisplay ()؛

display.drawRect (100 ، 10 ، 20 ، 20 ، سفید) ؛ display.fillRect (10 ، 10 ، 45 ، 15 ، WHITE) ؛ display.drawRoundRect (60 ، 20 ، 35 ، 35 ، 8 ، WHITE) ؛ display.display ()؛

با فراخوانی display.fillRect (upperLeftX ، upperLeftY ، عرض ، ارتفاع ، WHITE) می توانید یک مستطیل با رنگ مشخص پر کنید. همچنین تابع سوم در این مثال display.drawRoundRect (upperLeftX ، upperLeftY ، عرض ، ارتفاع ، cornerRadius ، رنگ) است که همانطور که در تصویر مشاهده می کنید برای ترسیم مستطیلی با گوشه های گرد استفاده می شود. این یک پارامتر اضافی قبل از رنگ می پذیرد که یک عدد صحیح است که شعاع گوشه را نشان می دهد. هرچه مقدار بیشتر باشد ، گوشه گرد تر است. همچنین دارای یک تابع fill مربوطه به نام display.drawFillRoundRect است که فکر می کنم می توانید حدس بزنید چه کار می کند.

طراحی دایره

تابع display.drawCircle (centerX ، centerY ، شعاع ، رنگ) است. در اینجا مثالی است که شکل لبخند را ترسیم می کند:

display.drawCircle (60 ، 30 ، 30 ، WHITE) ؛

display.fillCircle (50 ، 20 ، 5 ، WHITE) ؛ display.fillCircle (70 ، 20 ، 5 ، WHITE) ؛

مانند مستطیل ، می توانید از تابع display.fillCircle برای رسم یک دایره پر از رنگ داده شده استفاده کنید.

رسم مثلث

آه ، دوباره تابعی به نام display.drawTriangle (poin1X ، point1Y ، point2X ، point2Y ، point3X ، point3Y ، رنگ) و display.fillTraangle که یک مثلث پر شده را ترسیم می کند.

display.drawTriangle (24 ، 1 ، 3 ، 55 ، 45 ، 55 ، WHITE) ؛

display.fillTriangle (104 ، 62 ، 125 ، 9 ، 83 ، 9 ، WHITE) ؛

یک نقطه بکشید

همچنین می توانید از طریق عملکرد display.drawPixel (pixelX ، pixelY ، color) یک نقطه خاص (که پیکسل نامیده می شود) را روی صفحه رنگ آمیزی کنید.

display.drawPixel (20 ، 35 ، WHITE) ؛

display.drawPixel (45 ، 12 ، WHITE) ؛ display.drawPixel (120 ، 59 ، WHITE) ؛ display.drawPixel (97 ، 20 ، WHITE) ؛ display.drawPixel (35 ، 36 ، WHITE) ؛ display.drawPixel (72 ، 19 ، WHITE) ؛ display.drawPixel (90 ، 7 ، WHITE) ؛ display.drawPixel (11 ، 29 ، WHITE) ؛ display.drawPixel (57 ، 42 ، WHITE) ؛ display.drawPixel (69 ، 34 ، WHITE) ؛ display.drawPixel (108 ، 12 ، WHITE) ؛

مرحله 10: طراحی تصویر

ترسیم تصویر
ترسیم تصویر
ترسیم تصویر
ترسیم تصویر

ترسیم یک تصویر متفاوت و کمی پیچیده است. از آنجا که ماژول صفحه نمایش تک رنگ است ، ابتدا باید تصویر خود را به فرمت به نام bitmap تک رنگ (که سیاه و سفید نیز نامیده می شود) تبدیل کنیم. در چنین قالبی ، هر پیکسل تصویر با 0 یا 1 ارائه می شود. 1s نشان دهنده وجود رنگ و 0s به معنای یک فضای خالی است. می توانید نمونه ای از آرم آردوینو با این فرمت را در بالای این بخش مشاهده کنید. عملکرد رسم یک تصویر bitmap display.drawBitmap (topLeftX ، topLeftY ، imageData ، عرض ، ارتفاع ، رنگ) است. پارامتر imageData مجموعه ای از اعداد در بایت است. هر بایت دارای 8 بیت است ، بنابراین هر بایت حاوی داده های 8 پیکسل تصویر است. با تعیین عرض و ارتفاع تصویر ، تابع drawBitmap می داند که ردیف بعدی پیکسل ها از کدام بیت شروع می شود.

راه حلی که من برای تبدیل تصویر به این فرمت انتخاب کردم این بود که ابتدا از یکی از مبدل های آنلاین "تصویر به ASCII" (به عنوان مثال https://my.asciiart.club) برای تبدیل تصویر خود به مجموعه ای از کاراکترهای ASCII و سپس جایگزینی آن استفاده کنم. نویسه هایی که برای فضای خالی 0 استفاده می شود و سایر موارد 1. این چیزی است که در زیر مشاهده می کنید. می توانید هر 0 و 1 را به عنوان پیکسل روی صفحه نمایش در نظر بگیرید. بنابراین اندازه تصویر نباید از اندازه صفحه نمایش ما که 128x64 است تجاوز کند.

توجه: استفاده از این تکنیک ASCII یک روش توصیه شده نیست زیرا به دلیل نسبت ابعاد کاراکترها ، تصویر شما تغییر شکل می دهد (کاراکترها یک مربع نیستند). من این تکنیک را فقط به این دلیل امتحان کردم که تبدیل تصویر را به فرمت مورد نیاز آسان تر می کند. در غیر این صورت ممکن است از طریق برنامه نویسی یا استفاده از برنامه های کاربردی کاملاً خارج از محدوده این متن ، به بهترین نتیجه برسید.

00000000000000000000011111111111111111111110000000000000000000000000000000000000011111111111111111111111111111100000000000000000 0000000000000111111111111111111111111111111111111110000000000000 0000000000011111111111111111111111111111111111111111100000000000 0000000001111111111111111111111111111111111111111111111000000000 0000000111111111111111111111111111111111111111111111111110000000 0000011111111111111111111111111111111111111111111111111111100000 0000111111111111111111111111111111111111111111111111111111110000 0001111111111111111111111111111111111111111111111111111111111000 0011111111111111111111111111111111111111111111111111111111111100 0111111111111111000000011111111111111111100000001111111111111110 0111111111110000000000000001111111111000000000000000111111111110 1111111111000000001111000000001111000000001111000000001111111111 1111111110000011111111111100000110000011111111111100000111111111 1111111100000111111111111111000000001111111001111110000011111111 1111111100001111100000011111100000011111100000011111000011111111 1111111100001111100000011111100000011111100000011111000011111111 1111111100000111111111111111000000001111111001111110000011111111 1111111110000011111111111100000110000011111111111100000111111111 1111111111000000001111000000001111000000001111100000001111111111 0111111111110000000000000000111111110000000000000000111111111110 0111111111111111000000001111111111111111000000001111111111111110 0011111111111111111111111111111111111111111111111111111111111100 0001111111111111111111111111111111111111111111111111111111111000 0000111111111111111111111111111111111111111111111111111111110000 0000011111111111111111111111111111111111111111111111111111100000 0000000111111111111111111111111111111111111111111111111110000000 0000000011111111111111111111111111111111111111111111111100000000 0000000000011111111111111111111111111111111111111111100000000000 0000000000000111111111111111111111111111111111111110000000000000 0000000000000000111111111111111111111111111111110000000000000000 0000000000000000000001111111111111111111111000000000000000000000

حالا ما باید هر خط را بر 8 تقسیم کنیم ، نشان دهنده یک بایت است و آنها را در یک آرایه به شکل زیر ذخیره می کنیم:

const static char unsigned char PROGMEM arduino_logo = {

B00000000، B00000000، B00000111، B11111111، B11111111، B11100000، B00000000، B00000000، B00000000، B00000000، B01111111، B11111111، B11111111، B11111110، B0000000000، B0000000000، B0000000000،

سپس می توانیم آن را با فراخوانی تابع drawBitmap روی صفحه ترسیم کنیم.

display.drawBitmap (32 ، 16 ، arduino_logo ، 64 ، 32 ، WHITE) ؛

مرحله 11: عیب یابی

این یک آموزش طولانی بود و بنابراین بسیار محتمل است که مشکلی پیش آمده باشد. در اینجا لیستی از برخی خطاهای رایج است که ممکن است هنگام راه اندازی ماژول نمایش OLED برای پروژه خود با آنها مواجه شوید (برخی از آنها هنگام تهیه این آموزش برای من اتفاق افتاده است).

اصلا چیزی نمایش داده نمی شود

این ممکن است به دلایل زیادی رخ دهد ، بنابراین من پیشنهاد می کنم لیست زیر را که به ترتیب ممکن است در پروژه شما ایجاد شود ، بررسی کنید:

آدرس I2C احتمالاً اشتباه است

هنگام تنظیم شیء صفحه نمایش خود ، مطمئن شوید نشانی ای را که در کد i2c-scanner دریافت کرده اید در تابع display.begin () تنظیم کرده باشید.

SCL و SDA به روش اشتباه به هم متصل شده اند

این در واقع برای من اتفاق افتاد. اگر از Arduino Uno استفاده می کنید ، باید دوباره اتصالات خود را بررسی کنید تا مطمئن شوید که آنها مانند اتصال من هستند. اگر از نسخه آردوینو دیگری استفاده می کنید (مانند مگا ، لئوناردو و غیره) ، باید بدانید که ممکن است I2C آنها روی پین های دیگر تنظیم شده باشد. می توانید آن را در اسناد کتابخانه Wire بررسی کنید.

شما در حال کشیدن چیزی از منطقه قابل مشاهده هستید

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

متن به هیچ وجه نمایش داده نمی شود

فراموش کرده اید که رنگ متن را تنظیم کنید یا مقدار آن را اشتباه تنظیم کرده اید

قبل از ترسیم متون باید با setTextColor تماس بگیرید. در غیر این صورت هیچ خطایی دریافت نکرده اید ، اما هیچ چیزی را در صفحه نمایش نمی بینید. همچنین ممکن است رنگ متن را مشابه رنگ پس زمینه تنظیم کرده باشید.

شما از یک فونت بسیار بزرگ استفاده می کنید

اگر اندازه متن را روی مقدار بسیار زیادی تنظیم کنید ، ممکن است کاراکترها به طور کامل از ناحیه قابل مشاهده خارج شوند.

یک خطای کامپایل در مورد اندازه نمایش وجود دارد

این برای من نیز اتفاق افتاده و فکر می کنم برای اکثر شما نیز اتفاق خواهد افتاد. به دلیل مقادیر ثابت اندازه صفحه نمایش است که در داخل فایل هدر Adafruit_SSD1306.h تعریف شده است که ما در بالای اسکریپت خود قرار می دهیم. این فایل در {your-project-folder} libraries / Adafruit_SSD1306 / Adafruit_SSD1306.h قرار دارد. اگر این فایل را باز کنید ، متوجه می شوید که یک قسمت نظرات در زیر وجود دارد که در آن توضیح داده شده است که فقط باید ثابت را که نشان دهنده اندازه ماژول نمایشگر OLED شما است ، کامنت گذاری کنید. برای ماژول های نمایش 128x64 ، خط #تعریف SSD1306_128_64 باید کامنت گذاری شود.

/*=====================================================================

SSD1306 نمایش می دهد ------------------------------------------------ ---------------------- درایور در چند صفحه نمایش (128x64 ، 128x32 و غیره) استفاده می شود. صفحه مناسب زیر را برای ایجاد فریم بافر با اندازه مناسب و غیره انتخاب کنید. SSD1306_128_64 صفحه نمایش 128x64 پیکسل SSD1306_128_32 صفحه نمایش 128x32 پیکسل SSD1306_96_16 --------------------------- --------------------------------------------* / #تعریف SSD1306_128_64 / / #تعریف SSD1306_128_32 // #تعریف SSD1306_96_16 /*====================================== ===============================*/

مرحله دوازدهم: بعد از آن چه باید بکنید؟

صفحه نمایش OLED به عنوان یک ماژول خروجی می تواند فرصتی عالی برای شما فراهم کند تا یک رابط حرفه ای برای پروژه های سرگرمی خود ارائه دهید. می توانید ایده های زیر را به عنوان نقطه شروع برای نمایش داده های معنی دار روی آن امتحان کنید یا به کاربر کمک کنید تا بداند چه اتفاقی در حال رخ دادن است یا اینکه آیا او نیاز به انجام کاری دارد. برای یک کاربر خواندن پیام روی صفحه نمایش بسیار واضح تر از تفسیر وضعیت یک پروژه/دستگاه از طریق برخی LED ها است.

آنچه شما می توانید به عنوان نقطه شروع انجام دهید این است:

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

فراموش نکنید که در مورد نظرات به من بگویید که چه کار می کنید (یا قبلاً انجام داده اید) با استفاده از ماژول صفحه نمایش OLED.

توصیه شده: