グラフィック三昧 ② ST7789とMKR WiFi 1010
今回は、前回のと同じドライバが使えるTFTディスプレイです。スイッチサイエンスで入手しました。
ST7789搭載 Adafruit 1.47インチ 320x172 角丸 カラーIPS TFTディスプレイ
1.47インチ、高密度250 ppiの172 x 320ピクセル フルカラーTFTディスプレイです。大きさは前回とほとんど変わりません。裏面にメモリ・カードのソケットがついています。
電源およびロジック電圧は3~5Vです。
マイコンは、前回と同じMKR WiFi 1010です。
●接続
SPIのハード制御を使います。
ST7789表示器 | MKR WiFi 1010 |
---|---|
Vin | Vcc(3.3V) |
3V(Backlight) | - |
GND | GND |
SCK | SCK 9 |
MISO | - |
MOSI | MOSI 8 |
TFTCS | 5 |
RST | 7 |
DC | 6 |
SDCS | - |
Lite | - |
●前回とほぼ同じ文字列表示のスケッチ
ライブラリは、前回と同じです。ヘッダはAdafruit_ST7789.hに変更しています。
// Written by Limor Fried/Ladyada for Adafruit Industries.
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
#define TFT_CS 5
#define TFT_RST 7
#define TFT_DC 6
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
void setup(void) {
tft.init(172, 320); // Init ST7789 172x320
tft.setSPISpeed(40000000);
tft.setRotation(1);
}
void loop() {
tft.setTextWrap(false);
tft.fillScreen(ST77XX_BLACK);
tft.setCursor(0, 30);
tft.setTextColor(0b1100101110000000);
tft.setTextSize(1);
tft.println("Temperature:25.5`C");
for (int xx=0;xx<100;xx++){
tft.setCursor(-xx, 38);
tft.setTextColor(ST77XX_YELLOW);
tft.setTextSize(3);
tft.fillRect(0,38,320,30,ST77XX_BLACK);
tft.println("Temperature:25.5`C");
delay(200);
}
delay(2000);
}
実行例です。
●グラフィック
色の指定ST77XX_の記述が面倒なので、定義しなおしました。
// Color definitions
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
●ドットと直線
ドット;drawPixel(10,10,YELLOW); (座標x、座標y、色)
直線;drawLine(20,20,100,200,WHITE);(開始座標x、開始座標y、終了座標x、終了座標y、色)
がありますが、水平と垂直には別途関数が用意されています。
水平線;drawFastHLine(40,40,100,WHITE);(座標x、座標y、幅、色)
垂直線;drawFastVLine(30,30,100,WHITE);(座標x、座標y、高さ、色)
DMAを使って高速化?した関数もあります。
テストで使ったスケッチです。
// Written by Limor Fried/Ladyada for Adafruit Industries.
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
#define TFT_CS 5
#define TFT_RST 7
#define TFT_DC 6
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
// Color definitions
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
void setup(void) {
tft.init(172, 320); // Init ST7789 172x320
tft.setSPISpeed(40000000);
tft.setRotation(1);
}
void loop() {
tft.fillScreen(BLACK);
tft.drawPixel(10,10,YELLOW);
tft.startWrite();
tft.writePixel(15,15,RED);
tft.writeLine(50,50,100,140,RED);
tft.writeFastVLine(130,30,100,RED);
tft.writeFastHLine(140,40,100,RED);
tft.endWrite();
tft.drawLine(20,20,100,200,WHITE);
tft.drawFastVLine(30,30,100,WHITE);
tft.drawFastHLine(40,40,100,WHITE);
delay(3000);
}
実行例です。