راه اندازی نمایشگر تک رنگ ارزان قیمت با آردوینو (Nokia 1202)

زمان مورد نیاز برای مطالعه 2 دقیقه میباشد

توضیحات

در قسمت قبلی راه اندازی یک نمایشگر رنگی ارزان قیمت رو با آردوینو آموزش دادیم ، حالا توی این آموزش به راه اندازی یک نمایشگر تک رنگ ارزان قیمت میپردازیم ، این نمایشگر باز هم قیمت پایین تری داره و قیمتش اندازه دوتا سون سگمنته🙂 . از طرف دیگه به دلیل تک رنگ بودن خوانایی بالاتری نسبت به نمایشگر های رنگی داره و جاهای بیشتری میشه از اون استفاده کرد، در مورد این نمایشگر قبلا در سایت سیسوگ صحبت شده اما این بار باز هم با یک کتابخونه محبوب برای نمایشگر های تک رنگ (u8g2) میخوایم این lcd رو راه بندازیم ، با امبددتک همراه باشید تا به بررسی و راه اندازی اون بپردازیم…

 

 

سخت افزار

نمایشگر مورد استفاده ما این بار هم مخصوص تلفن های همراه هست ، گوشی های مدل NOKIA 1202, 1203, 1280 و … این نمایشگر دارای ویژگی های زیر هست:

  • تک رنگ (monochrome)
  • ابعاد 1.3 اینچ
  • رزولویشن 96*68

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

nokia 1202

راه اندازی کتابخانه u8g2-ste2007

ste2007 اسم درایور این نمایشگر هست و کل کار ما ارتباط با همین درایور هست برای نمایش اطلاعات روی صفحه ، این درایور از پروتکل spi 9 bit پشتیبانی میکنه ، چیزی که توی خیلی از میکروکنترلر ها وجود نداره ، البته جای نگرانی نیست چراکه به دلیل تک رنگ بودن این نمایشگر اطلاعات کمی نیاز هست برای نمایش براش ارسال بشه و در صورت استفاده از spi 9 bit نرم افزاری هم تقریبا رفرش شدن صفحه مشخص نیست. توی این کتابخونه فعلا spi 9 بیت فقط به صورت نرم افزاری پیاده شده و با یاری خدا در آینده از spi 9 bit سخت افزاری esp8266 هم پشتیبانی میکنه.

برای استفاده ابتدا به آدرس https://github.com/mahdi2001h/u8g2-ste2007 رفته و فایل zip کتابخانه رو دانلود میکنیم.

 

حالا نرم افزار آردوینو رو باز کرده و از منوی Sketch -> Include library -> add .zip library فایل زیپی که دانلود کردیم رو انتخاب میکنیم

arduino spfd54124b

برای تست کتابخونه از نمونه کد GraphicsTest استفاده میکنیم

در ادامه کد این example رو مشاهده میکنید

/*

  GraphicsTest.ino

  Universal 8bit Graphics Library (https://github.com/olikraus/u8g2/)

  Copyright (c) 2016, olikraus@gmail.com
  All rights reserved.

  Redistribution and use in source and binary forms, with or without modification, 
  are permitted provided that the following conditions are met:

  * Redistributions of source code must retain the above copyright notice, this list 
    of conditions and the following disclaimer.
    
  * Redistributions in binary form must reproduce the above copyright notice, this 
    list of conditions and the following disclaimer in the documentation and/or other 
    materials provided with the distribution.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
  CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 
  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  

*/

#include <Arduino.h>
#include <U8g2lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif


/*
  U8g2lib Example Overview:
    Frame Buffer Examples: clearBuffer/sendBuffer. Fast, but may not work with all Arduino boards because of RAM consumption
    Page Buffer Examples: firstPage/nextPage. Less RAM usage, should work with all Arduino boards.
    U8x8 Text Only Example: No RAM usage, direct communication with display controller. No graphics, 8x8 Text only.
    
*/

U8G2_STE2007_96X68_F_3W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 13, /* data=*/ 11, /* cs=*/ 10, /* reset=*/ 8);

void u8g2_prepare(void) {
  u8g2.setFont(u8g2_font_6x10_tf);
  u8g2.setFontRefHeightExtendedText();
  u8g2.setDrawColor(1);
  u8g2.setFontPosTop();
  u8g2.setFontDirection(0);
}

void u8g2_box_frame(uint8_t a) {
  u8g2.drawStr( 0, 0, "drawBox");
  u8g2.drawBox(5,10,20,10);
  u8g2.drawBox(10+a,15,30,7);
  u8g2.drawStr( 0, 30, "drawFrame");
  u8g2.drawFrame(5,10+30,20,10);
  u8g2.drawFrame(10+a,15+30,30,7);
}

void u8g2_disc_circle(uint8_t a) {
  u8g2.drawStr( 0, 0, "drawDisc");
  u8g2.drawDisc(10,18,9);
  u8g2.drawDisc(24+a,16,7);
  u8g2.drawStr( 0, 30, "drawCircle");
  u8g2.drawCircle(10,18+30,9);
  u8g2.drawCircle(24+a,16+30,7);
}

void u8g2_r_frame(uint8_t a) {
  u8g2.drawStr( 0, 0, "drawRFrame/Box");
  u8g2.drawRFrame(5, 10,40,30, a+1);
  u8g2.drawRBox(50, 10,25,40, a+1);
}

void u8g2_string(uint8_t a) {
  u8g2.setFontDirection(0);
  u8g2.drawStr(30+a,31, " 0");
  u8g2.setFontDirection(1);
  u8g2.drawStr(30,31+a, " 90");
  u8g2.setFontDirection(2);
  u8g2.drawStr(30-a,31, " 180");
  u8g2.setFontDirection(3);
  u8g2.drawStr(30,31-a, " 270");
}

void u8g2_line(uint8_t a) {
  u8g2.drawStr( 0, 0, "drawLine");
  u8g2.drawLine(7+a, 10, 40, 55);
  u8g2.drawLine(7+a*2, 10, 60, 55);
  u8g2.drawLine(7+a*3, 10, 80, 55);
  u8g2.drawLine(7+a*4, 10, 100, 55);
}

void u8g2_triangle(uint8_t a) {
  uint16_t offset = a;
  u8g2.drawStr( 0, 0, "drawTriangle");
  u8g2.drawTriangle(14,7, 45,30, 10,40);
  u8g2.drawTriangle(14+offset,7-offset, 45+offset,30-offset, 57+offset,10-offset);
  u8g2.drawTriangle(57+offset*2,10, 45+offset*2,30, 86+offset*2,53);
  u8g2.drawTriangle(10+offset,40+offset, 45+offset,30+offset, 86+offset,53+offset);
}

void u8g2_ascii_1() {
  char s[2] = " ";
  uint8_t x, y;
  u8g2.drawStr( 0, 0, "ASCII page 1");
  for( y = 0; y < 6; y++ ) {
    for( x = 0; x < 16; x++ ) {
      s[0] = y*16 + x + 32;
      u8g2.drawStr(x*7, y*10+10, s);
    }
  }
}

void u8g2_ascii_2() {
  char s[2] = " ";
  uint8_t x, y;
  u8g2.drawStr( 0, 0, "ASCII page 2");
  for( y = 0; y < 6; y++ ) {
    for( x = 0; x < 16; x++ ) {
      s[0] = y*16 + x + 160;
      u8g2.drawStr(x*7, y*10+10, s);
    }
  }
}

void u8g2_extra_page(uint8_t a)
{
  u8g2.drawStr( 0, 0, "Unicode");
  u8g2.setFont(u8g2_font_unifont_t_symbols);
  u8g2.setFontPosTop();
  u8g2.drawUTF8(0, 24, "☀ ☁");
  switch(a) {
    case 0:
    case 1:
    case 2:
    case 3:
      u8g2.drawUTF8(a*3, 36, "☂");
      break;
    case 4:
    case 5:
    case 6:
    case 7:
      u8g2.drawUTF8(a*3, 36, "☔");
      break;
  }
}

#define cross_width 24
#define cross_height 24
static const unsigned char cross_bits[] U8X8_PROGMEM  = {
  0x00, 0x18, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x00, 0x42, 0x00, 
  0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 
  0xC0, 0x00, 0x03, 0x38, 0x3C, 0x1C, 0x06, 0x42, 0x60, 0x01, 0x42, 0x80, 
  0x01, 0x42, 0x80, 0x06, 0x42, 0x60, 0x38, 0x3C, 0x1C, 0xC0, 0x00, 0x03, 
  0x00, 0x81, 0x00, 0x00, 0x81, 0x00, 0x00, 0x42, 0x00, 0x00, 0x42, 0x00, 
  0x00, 0x42, 0x00, 0x00, 0x24, 0x00, 0x00, 0x24, 0x00, 0x00, 0x18, 0x00, };

#define cross_fill_width 24
#define cross_fill_height 24
static const unsigned char cross_fill_bits[] U8X8_PROGMEM  = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x64, 0x00, 0x26, 
  0x84, 0x00, 0x21, 0x08, 0x81, 0x10, 0x08, 0x42, 0x10, 0x10, 0x3C, 0x08, 
  0x20, 0x00, 0x04, 0x40, 0x00, 0x02, 0x80, 0x00, 0x01, 0x80, 0x18, 0x01, 
  0x80, 0x18, 0x01, 0x80, 0x00, 0x01, 0x40, 0x00, 0x02, 0x20, 0x00, 0x04, 
  0x10, 0x3C, 0x08, 0x08, 0x42, 0x10, 0x08, 0x81, 0x10, 0x84, 0x00, 0x21, 
  0x64, 0x00, 0x26, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, };

#define cross_block_width 14
#define cross_block_height 14
static const unsigned char cross_block_bits[] U8X8_PROGMEM  = {
  0xFF, 0x3F, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 
  0xC1, 0x20, 0xC1, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 0x01, 0x20, 
  0x01, 0x20, 0xFF, 0x3F, };

void u8g2_bitmap_overlay(uint8_t a) {
  uint8_t frame_size = 28;

  u8g2.drawStr(0, 0, "Bitmap overlay");

  u8g2.drawStr(0, frame_size + 12, "Solid / transparent");
  u8g2.setBitmapMode(false /* solid */);
  u8g2.drawFrame(0, 10, frame_size, frame_size);
  u8g2.drawXBMP(2, 12, cross_width, cross_height, cross_bits);
  if(a & 4)
    u8g2.drawXBMP(7, 17, cross_block_width, cross_block_height, cross_block_bits);

  u8g2.setBitmapMode(true /* transparent*/);
  u8g2.drawFrame(frame_size + 5, 10, frame_size, frame_size);
  u8g2.drawXBMP(frame_size + 7, 12, cross_width, cross_height, cross_bits);
  if(a & 4)
    u8g2.drawXBMP(frame_size + 12, 17, cross_block_width, cross_block_height, cross_block_bits);
}

void u8g2_bitmap_modes(uint8_t transparent) {
  const uint8_t frame_size = 24;

  u8g2.drawBox(0, frame_size * 0.5, frame_size * 5, frame_size);
  u8g2.drawStr(frame_size * 0.5, 50, "Black");
  u8g2.drawStr(frame_size * 2, 50, "White");
  u8g2.drawStr(frame_size * 3.5, 50, "XOR");
  
  if(!transparent) {
    u8g2.setBitmapMode(false /* solid */);
    u8g2.drawStr(0, 0, "Solid bitmap");
  } else {
    u8g2.setBitmapMode(true /* transparent*/);
    u8g2.drawStr(0, 0, "Transparent bitmap");
  }
  u8g2.setDrawColor(0);// Black
  u8g2.drawXBMP(frame_size * 0.5, 24, cross_width, cross_height, cross_bits);
  u8g2.setDrawColor(1); // White
  u8g2.drawXBMP(frame_size * 2, 24, cross_width, cross_height, cross_bits);
  u8g2.setDrawColor(2); // XOR
  u8g2.drawXBMP(frame_size * 3.5, 24, cross_width, cross_height, cross_bits);
}

uint8_t draw_state = 0;

void draw(void) {
  u8g2_prepare();
  switch(draw_state >> 3) {
    case 0: u8g2_box_frame(draw_state&7); break;
    case 1: u8g2_disc_circle(draw_state&7); break;
    case 2: u8g2_r_frame(draw_state&7); break;
    case 3: u8g2_string(draw_state&7); break;
    case 4: u8g2_line(draw_state&7); break;
    case 5: u8g2_triangle(draw_state&7); break;
    case 6: u8g2_ascii_1(); break;
    case 7: u8g2_ascii_2(); break;
    case 8: u8g2_extra_page(draw_state&7); break;
    case 9: u8g2_bitmap_modes(0); break;
    case 10: u8g2_bitmap_modes(1); break;
    case 11: u8g2_bitmap_overlay(draw_state&7); break;
  }
}


void setup(void) {
  u8g2.begin();
}

void loop(void) {
  // picture loop  
  u8g2.clearBuffer();
  draw();
  u8g2.sendBuffer();
  
  // increase the state
  draw_state++;
  if ( draw_state >= 12*8 )
    draw_state = 0;

  // deley between each page
  delay(100);

}

من برای تست میخوام از نود ام سی یو استفاده کنم ، برای اینکار قسمت معرفی نمایشگر رو در خط 55 به این صورت تغییر باید تغییر بدیم

U8G2_STE2007_96X68_F_3W_SW_SPI u8g2(U8G2_R0, /* clock=*/ D5, /* data=*/ D7, /* cs=*/ D0, /* reset=*/ D1);

قبل از ادامه بگم که اگر قبل این مطلب داشتید قسمت قبل این آموزش رو میخوندید و مدارش رو بستید ، دست به برد برد نزنید چرا که پین های این دوتا ماژول نمایشگر کاملا منطبق هستند و نیازی به تغییر شماتیک نیست ، این هم شماتیک مناسب برای اتصال به node mcu

node mcu 1202 schematic

 

این هم از خروجی کد بالا

u8g2-ste2007

 

خرید ماژول نمایشگر تک رنگ نوکیا از فروشگاه امبددتک:

 

دیدگاه ها

دیدگاهی در مورد “راه اندازی نمایشگر تک رنگ ارزان قیمت با آردوینو (Nokia 1202)

  1. اسی ام گفت:

    سلام
    امکان استفاده از این کتابخونه برای میکروی STM هم وجود داره ؟

  2. mahdi2001h گفت:

    سلام. این کتابخانه از SPI نرم افزاری استفاده میکنه
    اگر که تحت آردوینو از STM اسفتاده کنید این کتابخانه بدون تغییر قابل استفاده هست

    1. اسی ام گفت:

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

        1. اسی ام گفت:

          سپاس مهندس
          اینو هم دیده بودم تو سیسوگ
          مقاله ی شما رو هم اول اونجا خوندم ولی چون نتونستم اونجا کامنت بزارم اینجا مزاحم شدم (:

  3. احمدرضا گفت:

    سلام
    سربندی اتصالات اشتباهه
    لطفا یه بررسی بکنید
    تغذیه ماژول نمایشگر با رنگ قرمز به clk ماژول esp متصل شده که قطعا اشتباهه
    از طرفی ولتاژ ۳.۳ از ماژول esp به scl ماژول نمایشگر با رنگ بنفش متصل شده که اینم قطعا اشتباهه
    از طرفی پایه زمین ماژول esp به پایه sda نمایشگر متصل هست که اینم اشتباهه

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

    1. mahdi2001h گفت:

      ممنون از توجهتون. اصلاح شد.
      البته هر چند اشتباه سهوی بوده، ولی کلا آسیبی هم به جایی نمیزده چون مثلا اون قسمت که 3.3 وصل شده بود به SCL ، خب در حالت عادی هم وقتی دیتا بیاد ولتاژ اون پایه 3.3 میشه.

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *