در قسمت قبل سراغ ساخت یک mp3 player رفتیم با ماژول mc60، توی این قسمت میخوایم سراغ به بخش جدایی ناپذیر از پروژه هامون بریم و اون چیزی نیست جز نمایشگر، توی این قسمت سراغ راه اندازی نمایشگر oled با ماژول mc60 میریم، پس با ما همراه باشید…
برای کار با ماژول mc60 بیشترین چیزی که کمکمون میکنه داکیومنت و example های کاملی هست که شرکت quectel در اختیارمون گذاشته، اما برای بحث نمایشگر oled متأسفانه کد آمادهای موجود نیست، به همین دلیل من کتابخونه ای رو برای کار با نمایشگرهای oled آماده کردم که میتونید برای mc60 از اون استفاده کنید.
اول از همه لازم هست که فایل هدر و سورس رو به پروژتون اضافه کنید، برای این کار فایل oled.h
و Adafruit5x7.h
رو به پوشه include
و فایل oled.c
رو به پوشه custom
اضافه میکنیم (فایلها میتونید از گیت هاب من دریافت کنید).
کد ما برای دو سایز 128*32 و 128*64 آماده شده که باید نوع مورد نظرتون رو با define کردن توی خط 17 و 18 فایل oled.h
مشخص کنید:
//#define Adafruit128x64 #define Adafruit128x32
کد زیر هم برای تست کتابخانه آماده شده که میتونید استفاده کنید:
#define __CUSTOMER_CODE__ #ifdef __CUSTOMER_CODE__ #include "ql_type.h" #include "ql_stdlib.h" #include "ql_trace.h" #include "ql_gpio.h" #include "ql_uart.h" #include "ql_iic.h" #include "ql_error.h" #include "oled.h" ///for DEBUG/////////////////////////////////////////////////////////////////////////////////////////////////////////// #define SERIAL_RX_BUFFER_LEN 2048 #define DEBUG_PORT UART_PORT1 #define DBG_BUF_LEN 512 static char DBG_BUFFER[DBG_BUF_LEN]; #define APP_DEBUG(FORMAT, ...) \ { \ Ql_memset(DBG_BUFFER, 0, DBG_BUF_LEN); \ Ql_sprintf(DBG_BUFFER, FORMAT, ##__VA_ARGS__); \ Ql_UART_Write((Enum_SerialPort)(DEBUG_PORT), (u8 *)(DBG_BUFFER), Ql_strlen((const char *)(DBG_BUFFER))); \ } char m_Read_Buffer[SERIAL_RX_BUFFER_LEN]; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// static void CallBack_UART_Hdlr(Enum_SerialPort port, Enum_UARTEventType msg, bool level, void *customizedPara); const u8 ant_1[] = { 0b11111111, 0b01011010, 0b00111100, 0b00011000, 0b00011000, 0b00011000, 0b00011000, 0b00011000, }; const u8 ant_2_full[] = { 0b00000001, 0b00000001, 0b00000101, 0b00000101, 0b00010101, 0b00010101, 0b01010101, 0b01010101, }; const u8 ant_low[] = { 0b00000000, 0b00000000, 0b00000000, 0b00000000, 0b00010000, 0b00010000, 0b01010000, 0b01010000, }; const u8 play[] = { 0b00000000, 0b11000000, 0b11110000, 0b11111100, 0b11111111, 0b11111100, 0b11110000, 0b11000000, }; const u8 pause[] = { 0b11100111, 0b11100111, 0b11100111, 0b11100111, 0b11100111, 0b11100111, 0b11100111, 0b11100111, }; const u8 stop[] = { 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, 0b11111111, }; const u8 bat_1[] = { 0b11111111, 0b10000000, 0b10111111, 0b10111111, 0b10111111, 0b10111111, 0b10000000, 0b11111111, }; const u8 bat_2[] = { 0b11111100, 0b00000110, 0b00000111, 0b00000111, 0b00000111, 0b00000111, 0b00000110, 0b11111100, }; void proc_main_task(s32 taskId) { s32 ret; ST_MSG msg; // Register & open UART port Ql_UART_Register(UART_PORT1, CallBack_UART_Hdlr, NULL); Ql_UART_Open(UART_PORT1, 115200, FC_NONE); APP_DEBUG("START PROGRAM (SISOOG.COM)\r\n"); ret = Ql_IIC_Init(0, PINNAME_RI, PINNAME_DCD, TRUE); Ql_Sleep(100); ret = Ql_IIC_Config(0, TRUE, I2C_ADDRESS, 1500); oledInit(); oledClear(); oledFill(); Ql_Sleep(500); oledClear(); Ql_Sleep(500); setFont(Adafruit5x7); set2X(); setCursor(28, 0); oledPrint("Sisoog"); set1X(); setCursor(0, 3); oledPrint("Mahdi.h"); oledDraw(0, 0, bat_1); oledDraw(8, 0, bat_2); oledDraw(110, 0, ant_1); oledDraw(119, 0, ant_2_full); oledDraw(50, 3, play); oledDraw(70, 3, pause); oledDraw(90, 3, stop); while (1) { Ql_OS_GetMessage(&msg); switch (msg.message) { case 0: break; default: break; } } } static void CallBack_UART_Hdlr(Enum_SerialPort port, Enum_UARTEventType msg, bool level, void *customizedPara) { u32 rdLen = 0; s32 ret; switch (msg) { case EVENT_UART_READY_TO_READ: { Ql_memset(m_Read_Buffer, 0x0, sizeof(m_Read_Buffer)); rdLen = Ql_UART_Read(port, m_Read_Buffer, sizeof(m_Read_Buffer)); if (Ql_strstr(m_Read_Buffer, "ok")) { APP_DEBUG("ok\r\n"); } break; } } } #endif // __CUSTOMER_CODE__
اینجا هم میتونید توابع و عملکرد هر کدوم از توابع کتابخونه رو مشاهده کنید
//آماده سازی و مقدار دهی اولیه نمایشگر oledInit(); // پاک کردن صفحه oledClear(); // روشن کردن تمام پیکسل های صفحه oledFill(); //تنظیم فونت نوشتاری setFont(Font); //تغییر سایز فونت به حالت 1 برابر set1X(); //تغییر سایز فونت به حالت 2 برابر set2X(); //نمایش متن روی نمایشگر oledPrint(text); //جابجایی مکان نما setCursor(x, y); //نمایش یک آیکون oledDraw(x, y, 8_8_icon);
سخت افزار mc60 oled
برای اتصال سخت افزاری به دلیل این که سطح ولتاژ ماژول mc60 ما 2.8 ولت هست و نمایشگر oled 5 ولت ، باید از level shifter استفاده کنیم.
در تصویر پایین میتونید اتصال سخت افزار من رو به همراه خروجی کدی که در بالا قرار دادم مشاهده کنید:
در این قسمت میتونید به همه قسمتهای سری آموزش های ماژول mc60 دسترسی پیدا کنید:
کار با ماژول تمام عیار mc60 – قسمت اول – برد راه انداز
کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU
کار با ماژول تمام عیار mc60 – قسمت سوم – ساخت ردیاب
کار با ماژول تمام عیار mc60 – قسمت چهارم – OpenCPU و تکمیل ردیاب
کار با ماژول تمام عیار mc60 – قسمت پنجم – ساخت MP3 Player
کار با ماژول تمام عیار mc60 – قسمت ششم – نمایشگر oled
منبع:سیسوگ