2018年1月29日 星期一

DIY - ESP8266:SSD1306 0.96吋 OLED 顯示屏模塊顯示圖案(六十)

DIY - ESP8266:SSD1306 0.96吋 OLED 顯示屏模塊顯示圖案(六十):

在程式執行中,用家都需要獲悉執行的結果或執行過程中的資料,而這些資料或結果會通過文字訊息提供給用家,當然圖像化的顯示,更加令到用家容易閱讀和理解。其實在 LCD / OLED 屏顯示文字和圖像都是使用點來組成,所以要明白 LCD / OLED 屏的顯示方式是很重要。

SSD1306 OLED 顯示屏的圖像顯示
SSD1306 OLED 顯示屏的圖像顯示
基本的圖像顯示功能: 
  • 文字(Font)- gfx_drawString("BugWorkShop ESP12Fv31", 0, 0, 1, 1, 0) 
  • 直線(Line)- gfx_drawLine(0, 42, 127, 42, 1) 
  • 圓圈(Circle)- gfx_Circle(64, 42, 16, 1) 
  • 點陣圖(Bitmap)- gfx_drawXbm1( 0, 48, 16, 16, 1, BWS0_16x16)  

文字(Font)顯示功能程式:
void gfx_drawString(char *str, uint16_t posX, uint16_t posY, uint8_t sizeFont, uint16_t colorFont, uint16 colorBackground)
{
            void gfx_nextString(void)
            {
                posX = 0;
                posY += 8 * sizeFont + 1;

                if( (posY + 8 * sizeFont) > (GFX_MAX_TFT_Y + 1) )
                {
                        posX = 0;
                        posY = 0;
                }
            }
    while(*str)
    {
            gfx_drawChar(*str, posX, posY, sizeFont, colorFont, colorBackground);
        str++;

        posX += GFX_FONT_X * sizeFont; // Move cursor right


        if ( (posX + GFX_FONT_X * sizeFont) > (GFX_MAX_TFT_X + 1) )
            gfx_nextString();

        if (*str == 0x0A)
        {
            str++;
            gfx_nextString();
        }
    }
}

直線(Line)顯示功能程式:
void gfx_drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t *colors)
{
  int16_t steep = abs(y1 - y0) > abs(x1 - x0);
  if (steep) {
    _swap_int16_t(x0, y0);
    _swap_int16_t(x1, y1);
  }

  if (x0 > x1) {
    _swap_int16_t(x0, x1);
    _swap_int16_t(y0, y1);
  }

  int16_t dx, dy;
  dx = x1 - x0;
  dy = abs(y1 - y0);

  int16_t err = dx / 2;
  int16_t ystep;

  if (y0 < y1) {
    ystep = 1;
  } else {
    ystep = -1;
  }

  for (; x0<=x1; x0++) {
    if (steep) {
            ssd1306_PutPixel(y0, x0, colors);
    } else {
            ssd1306_PutPixel(x0, y0, colors);
    }
    err -= dy;
    if (err < 0) {
      y0 += ystep;
      err += dx;
    }
  }
}

圓圈(Circle)顯示功能程式:
void ICACHE_FLASH_ATTR
gfx_Circle(int8_t x0, int8_t y0, uint8_t r, uint16_t *colors)
{
    int8_t x = r;
    int8_t y = 1;
    int16_t radius_err = 1 - x;

    if (r == 0)
        return;

    ssd1306_PutPixel(x0 - r, y0, colors);
    ssd1306_PutPixel(x0 + r, y0, colors);
    ssd1306_PutPixel(x0,     y0 - r, colors);
    ssd1306_PutPixel(x0,     y0 + r, colors);

    while (x >= y)
    {

        ssd1306_PutPixel(x0 + x, y0 + y, colors);
        ssd1306_PutPixel(x0 - x, y0 + y, colors);
        ssd1306_PutPixel(x0 + x, y0 - y, colors);
        ssd1306_PutPixel(x0 - x, y0 - y, colors);

        if (x != y)
        {
            ssd1306_PutPixel(x0 + y, y0 + x, colors);
            ssd1306_PutPixel(x0 - y, y0 + x, colors);
            ssd1306_PutPixel(x0 + y, y0 - x, colors);
            ssd1306_PutPixel(x0 - y, y0 - x, colors);
        }
        ++y;
        if (radius_err < 0)
        {
            radius_err += 2 * y + 1;
        }
        else
        {
            --x;
            radius_err += 2 * (y - x + 1);
        }

    }
}

點陣圖(Bitmap)顯示功能程式:
void gfx_drawXbm1(uint8 x, uint8 y, uint8 width, uint8 height, uint8 sizeFont, const char *xbm)
{
            uint8 i,j;
            uint8 charColumn;
            uint8 *dataptr;
            uint8 posX, posY;

            posX = x;
            posY = y;

            for (i = 0; i < height/8; i++ ){
                                    posX=x;

                        for (j = 0; j < width; j++) {
                                    unsigned char charColumn = xbm[i*width + j];
                                    dataptr = &charColumn;
                                    ssd1306_Put8bit(posX, posY,(uint8_t *)dataptr);
                                    posX++;
                                    }
                        posY = posY+8;
            }
}

2018年 1月 29日 天氣報告
氣溫:9.9@ 09:20
相對濕度:百分之 70%
天氣:多雲

2018年1月15日 星期一

DIY - ESP8266:SSD1306 0.96吋 OLED 顯示屏模塊顯示圖案資料(五十九)

DIY - ESP8266:SSD1306 0.96吋 OLED 顯示屏模塊顯示圖案資料(五十九):

筆者製作了 ESP8266 的 ESCORT 3146A 萬用電錶數據記錄儀(DMM Data Logger),對 ESP8266 和 SSD1306 OLED 顯示屏提昇了興趣。因為這片小巧的 OLED 顯示屏,雖然顯示範圍祇有 21.74mm × 10.86mm,但顯示出來的字體和顏色都很亮麗,希望將來的小型製作都會用上這款 OLED 顯示屏。其實 OLED 顯示屏不是單純顯示文字,還可以顯示圖案,但須要進一步加深了解這片 SSD1306 OLED 顯示屏規格,才可以發揮 SSD1306 OLED 顯示屏的功能。

ESP8266 的 ESCORT 3146A 萬用電錶數據記錄儀(DMM Data Logger)
SSD1306 0.96吋 OLED 顯示屏模塊
SSD1306 是支援多種匯流排驅動蕊片,包括 SPI 串列外設介面(SPI:Serial Peripheral Interface)、積體電路匯流排(I²C / I2C:Inter-Integrated Circuit)和並口(Parallel:8 bit 6800 / 8000)方式,但這種 0.96吋 OLED 顯示屏模塊的介面,一般的供應是祇有3-Wire SPI、4-Wire SPI 和 I2C 選擇。由於 ESP8266 的 I/O 比較少,筆者會偏向選擇 I2C 介面,但I2C 介面是不可以讀取 SSD1306 內的 GD_DDRRAM,如果要做圖案顯示,便需要在程式內提供 RAM(容量 1024 Bytes)作顯示屏記憶作 Bit Mapping。

Solomon Systech (晶門)SSD1306 驅動晶片方塊圖
使用 I2C 介面時,SSD1306 允許有最多兩個 7位的 I2C 位址,同樣通過相應的 IO 口拉低拉高來切換,一般默認是 0x3C,在螢幕模組的背面,可以看到一個I2C 位址切換提示,需要改變模組I2C位址時,只需要把提示位置的電阻取下焊接到另外一端即可。要注意的是版上的I2C 地址是加上了第零位讀寫位後的數值,即 0x78 = 0x3C << 1 0x7A = 0x3D << 1。

OLED 屏模塊是由 128×64 點陣(X=128點、Y=64點)組成,在坐標系中,左上角是原點,向右是 X軸(X=0 ~ 127),向下是 Y軸(Y=0 ~ 63)。因為 GD_DDRRAM 是 8bits, SSD1306 的 GD_DDRRAM 容量是 1024 Bytes(X×Y = 128點×64點/8Bits = 1024Bytes)。 Y 軸是64點(Y=0 ~ 63),Y 軸是共分 8 頁(Y=Page 0 ~ Page 7)。

GDDRAM Page Structure of SSD1306(Y軸:Y=Page 0 ~ Page 7)
X的點陣是從 LSB0 ~ MSB7 (D0 ~ D7)開始,最低有效位 Bit 0 (LSB:Least Significant Bit)是在頂部,最高有效位 Bit 7(MSB:Most Significant Bit)是在底部,所以要小心處理 OLED 屏模塊和 GDDRRAM 的相對位置。

SSD1306 Enlargement of GDDRAM Structure
SSD1306 Address Pointer Movement of Page addressing mode
在正常的顯示屏的數據 RAM 讀取或寫入和頁面尋址模式下,需要執行以下步驟: 定義起始RAM訪問指針位置:
•通過命令 B0h 至 B7h 設置目標顯示位置的起始頁地址(Page)。
•用 00h〜0Fh 命令設置指針的低位起始地址(Lower Start Column)。
•通過命令 10h〜1Fh 設置指針的起始列起始地址(Upper Start Column)。

例如:如果頁面地址設置為 B2h(Page 0xB2-0xB0 = Page 2),低位地址為 03h,高位地址為 10h, 那麼這意味著起始欄是 Page 2 的 SEG3。 RAM 訪問指針的位置如下圖所示。 輸入數據字節將被寫入第 3列的 RAM 位置。

SSD1306 顯示屏的數據 RAM 讀取或寫入和頁面尋址模式
以上是 SSD1306 0.96吋 OLED 顯示屏模塊顯示基本圖案資料,其實 SSD1306 還有很多功能是有待發掘!

相關網址:
※ DIY - PIC24:SSD1306 0.96吋 OLED 屏模塊(六十)
※ DIY - PIC24:Solomon 晶門 SSD1306 驅動控制晶片(六十一)
※ DIY - PIC24:PIC24FJ64GA008 SSD1306 0.96吋 OLED 屏模塊 I/O 電路(六十二)
※ DIY - ESP8266:SSD1306 0.96吋 I2C OLED 屏模塊(十七)
※ DIY - ESP8266:Solomon 晶門 SSD1306 驅動控制晶片 - I2C(十八)
※ DIY - ESP8266:ESP8266 SSD1306 0.96吋 I2C OLED 屏模塊 I/O 電路(十九)
※ DIY - ESP8266:ESP8266 SSD1306 0.96吋 I2C OLED 屏模塊 I/O 電路 2(二十)
※ DIY - ESP8266:SSD1306 0.96吋 SPI OLED 屏電路(二十三)
※ DIY - ESP8266:ESP-12F SSD1306 I2C OLED 屏模塊(四十三)

2018年 1月 15日 天氣報告
氣溫:16.0@ 20:10
相對濕度:百分之 80%
天氣:天色良好

2018年1月10日 星期三

WD(威騰)Elements 1TB 移動硬碟開箱文

WD(威騰)Elements 1TB 移動硬碟開箱文:

由於 Asia Miles 有積分到期,所以選擇了 WD(Western Digital / 威騰)Elements 1TB 移動硬碟,其實以前也有一台 WD Elements SE 1TB 移動硬碟,分別是舊的用 USB 2.0 接口,新款是使用 USB 3.0 接口,隨插即用,免安裝,免等待,支援 Dropbox 雲端備份。

WD(威騰)Elements 1TB 移動硬
WD(威騰)Elements 1TB 移動硬碟包裝盒正面
WD(威騰)Elements 1TB 移動硬碟包裝盒背面
拆開WD(威騰)Elements 1TB 移動硬碟包裝盒
WD(威騰)Elements 1TB 移動硬碟的內部包裝盒
WD(威騰)Elements 1TB 移動硬碟
WD(威騰)Elements 1TB 移動硬碟的接口
WD(威騰)Elements 1TB 移動硬碟的 USB 電纜
WD(威騰)Elements 1TB 移動硬碟的 USB接口
WD(威騰)Elements 1TB 移動硬碟的標貼
品牌型號:WD(威騰)Elements 1TB 移動硬碟
型號:WDBUZG0010BBK
串列傳輸率:USB 3.0、USB 2.0
串列匯滙流排傳輸率:5000 Mb /s
容量:500GB、1TB、2TB
硬碟:2.5吋 5400rpm
介面:USB 3.0
顏色:黑色
作業系統:Windows 10、Windows 8、Window 7 格式化為 NTFS。
包裝內容:WD Elements 可攜式裝置、USB 纜線、快速安裝指南
尺寸:111mm × 82mm × 21.5mm
重量:136g
作業溫度:5° C 至35° C
非作業溫度:-40° C 至 65° C
發售日期:估計2013年
產地:馬來西亞生產

2018年 1月 10日 天氣報告
氣溫:14.6@ 20:10
相對濕度:百分之 43%
天氣:多雲
 

2018年1月9日 星期二

踏入 2018年,新的開始

踏入 2018年,新的開始:

筆者每年一般都會在香港渡過大除夕夜(2017年12月31日),當天會回顧今年過去和計劃明年,但今年這時間要出差,所以不可以和已往一樣,博文(Blog)都要延後了!

中國旅遊集團 2018 香港除夕倒數。(香港旅發局提供)
筆者在 2017年的計劃: 
  • DIY – PIC24FJ64GA008 繼續製作 
  • DIY – PIC18F4550 繼續製作 
  • DIY – 機械人繼續製作 
  • DIY – OpenWrt / ESP8266 研究 
  • DIY – FPGA 繼續研究
筆者回顧過去一年(2017年),由於公司變動,2017年下半年已經離開了舊公司,找尋了另外工作做,工作相對比較安穩,但在 2017年設定的計劃都有部分實現了,最主要是 ESP8266開始了,在 12月也完成了一個 ESP8266 製作。因為工作安穩,編寫博文(Blog)時間多了!在 2017年共有 145 篇,比較 2016年(116篇)多了 29篇!2017年瀏覽量是 143380人次(2017年平均每日 393人次,2016年平均每日 388人次),總瀏覽量超過 55萬人次,達到 551644人次,希望 2018年能夠持續努力寫博文 (Blog) 和實現目標!

Blogspot Bugworkshop 2017年有 143380 瀏覽人次(總瀏覽 551644人次)
Blogspot Bugworkshop 從 2010年 至 2017年的瀏覽人次
Blogspot Bugworkshop 從 2010年 至 2017年的地區瀏覽人次
Blogspot Bugworkshop 歷年的博文(Blog)紀錄
BugWorkshop 的 Blog 紀錄:
Year
BSP
Blog
累計 Blog
瀏覽量
累計瀏覽量
2010/2/7
Yahoo
0
0
0
0
2010/12/31
Yahoo
191
191
17906
17906
2011/12/31
Yahoo
311
504
?
?
2012/4/7
Yahoo
4
508
?
161612
2012/4/8
Google
0
0
0
0
2012/12/31
Google
147
655
30932
30932
2013/12/31
Google
152
807
65469
95861
2014/12/31
Google
171
978
84627
180488
2015/1/23
Google
22
1000
5391
185879
2015/12/31
Google
186
1164
85821
266309
2016/12/31
Google
116
1280
141867
408176
2017/12/31
Google
145
1425
143380
551556
 
BSP = Blog Service Provider

ESCORT 3146A 萬用電錶數據記錄儀(DMM Data Logger)
在筆者 2017年的計劃中,DIY-ESP8266已經開始,而且在 2017年底完成了 ESCORT 3146A 萬用電錶數據記錄儀(DMM Data Logger),所以 2018年將會增加其他的項目,其他的計劃也要繼續跟進,所以 2018年一定要努力。 

筆者 2018年的計劃:
  • DIY – ESP8266 繼續研究
  • DIY – FPGA 繼續研究
  • DIY – ESP32 研究
相關網址:
※ 踏入 2013年,新的開始
※ 踏入 2014年,新的開始
※ 踏入 2015年,新的開始
※ 踏入 2016年,新的開始
※ 踏入 2017年,新的開始

2018年 1月 9日 天氣報告
氣溫:9.2@ 20:50
相對濕度:百分之 72%
天氣:微雨
※ 寒冷天氣警告現正生效,天氣寒冷可能影響健康,市民應小心保暖