TFT液晶グラフィックモジュール
僕が購入したのは8・9年前で同じSPI通信のマイクロSDが裏面についていて、Arduino UNOにデータの読み書きの機能が追加される。
ST7735というチップでコントロールしているグラフィック液晶モニターです。
Arduino UNOはクロック周波数が遅いので、書き換えが遅くその際もチカチカする感じです。
文字だけ表示やライブラリのデモの下りは端折ります
雑ですみません。
基本的にAdafruitのライブラリを使用します。
ライブラリをインストール
グラフィック液晶なのに文字を表示するだけではもったいない。
アナログ時計の表示は三角関数でドットを描画しているので、ゲージ風表示などで応用が利きそうなので試してみた。
ライブラリはAdafruit社の提供のものを使用する。
Adafruit_GFX Library
これに加えてライブラリーマネージャー(ライブラリを管理)の検索窓で7735で検索してライブラリをインストール。
ライブラリの内容はSSD1306とほぼ同じで色が増えただけ。(と思います)
RTCモジュールも使用して時計表示
RTCモジュールはDS3231を使用。
RTCモジュールの接続方法など使い方はこちらを参照。
TFT液晶モジュールの接続
液晶モジュール Arduino UNO
GND → GND
VCC → 5V
SCL → 13
SDA → 11
DC → 8
RES → 9
CS → 10
時計のスケッチ
基本的にSSD1306でやった時計表示と同じ。
#include <Adafruit_GFX.h> // Core graphics library#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789#include <SPI.h>#include <DS3232RTC.h>#if defined(ARDUINO_FEATHER_ESP32) // Feather Huzzah32#define TFT_CS 14#define TFT_RST 15#define TFT_DC 32#elif defined(ESP8266)#define TFT_CS 4#define TFT_RST 16#define TFT_DC 5#else// For the breakout board, you can use any 2 or 3 pins.// These pins will also work for the 1.8" TFT shield.#define TFT_CS 10#define TFT_RST 9 // Or set to -1 and connect to Arduino RESET pin#define TFT_DC 8#endifDS3232RTC RTC;// OPTION 1 (recommended) is to use the HARDWARE SPI pins, which are unique// to each board and not reassignable. For Arduino Uno: MOSI = pin 11 and// SCLK = pin 13. This is the fastest mode of operation and is required if// using the breakout board's microSD card.// For 1.44" and 1.8" TFT with ST7735 use:Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);// For 1.14", 1.3", 1.54", 1.69", and 2.0" TFT with ST7789://Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);// OPTION 2 lets you interface the tft using ANY TWO or THREE PINS,// tradeoff being that performance is not as fast as hardware SPI above.//#define TFT_MOSI 11 // Data out//#define TFT_SCLK 13 // Clock out// For ST7735-based tfts, we will use this call//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);// OR for the ST7789-based tfts, we will use this call//Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);float p = 3.1415926;void setup(void) {Serial.begin(9600);Serial.print(F("Hello! ST77xx TFT Test"));Serial.begin(9600);// If you want to set the aref to something other than 5vanalogReference(EXTERNAL);Wire.begin();RTC.begin();setSyncProvider(RTC.get); // the function to get the time from the RTCif (timeStatus() != timeSet)Serial.println("Unable to sync with the RTC");elseSerial.println("RTC has set the system time");// Use this initializer if using a 1.8" TFT screen:tft.initR(INITR_BLACKTAB); // Init ST7735S chip, black tab// OR use this initializer if using a 1.8" TFT screen with offset such as WaveShare:// tft.initR(INITR_GREENTAB); // Init ST7735S chip, green tab// OR use this initializer (uncomment) if using a 1.44" TFT://tft.initR(INITR_144GREENTAB); // Init ST7735R chip, green tab// OR use this initializer (uncomment) if using a 0.96" 160x80 TFT://tft.initR(INITR_MINI160x80); // Init ST7735S mini tft// OR use this initializer (uncomment) if using a 0.96" 160x80 TFT with// plug-in FPC (if you see the tft is inverted!)//tft.initR(INITR_MINI160x80_PLUGIN); // Init ST7735S mini tft// OR use this initializer (uncomment) if using a 1.3" or 1.54" 240x240 TFT://tft.init(240, 240); // Init ST7789 240x240// OR use this initializer (uncomment) if using a 1.69" 280x240 TFT://tft.init(240, 280); // Init ST7789 280x240// OR use this initializer (uncomment) if using a 2.0" 320x240 TFT://tft.init(240, 320); // Init ST7789 320x240// OR use this initializer (uncomment) if using a 1.14" 240x135 TFT://tft.init(135, 240); // Init ST7789 240x135// OR use this initializer (uncomment) if using a 1.47" 172x320 TFT://tft.init(172, 320); // Init ST7789 172x320// SPI speed defaults to SPI_DEFAULT_FREQ defined in the library, you can override it here// Note that speed allowable depends on chip and quality of wiring, if you go too fast, you// may end up with a black screen some times, or all the time.//tft.setSPISpeed(40000000);//Serial.println(F("Initialized"));Serial.begin(9600);// If you want to set the aref to something other than 5vanalogReference(EXTERNAL);Wire.begin();uint16_t time = millis();time = millis() - time;Serial.println(time, DEC);//delay(500);// large block of text//tft.fillScreen(ST77XX_BLACK);//testdrawtext("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", ST77XX_WHITE);//delay(1000);// tft print function!//tftPrintTest();//delay(4000);// a single pixel//tft.drawPixel(tft.width() / 2, tft.height() / 2, ST77XX_GREEN);//delay(500);// line draw test//testlines(ST77XX_YELLOW);//delay(500);// optimized lines//testfastlines(ST77XX_RED, ST77XX_BLUE);//delay(500);//testdrawrects(ST77XX_GREEN);//delay(500);//testfillrects(ST77XX_YELLOW, ST77XX_MAGENTA);//delay(500);tft.fillScreen(ST77XX_BLACK);tft.fillCircle(tft.width() / 2, tft.height() / 2, 60, ST77XX_RED);}void loop() {//DateTime now = RTC.now();// Now draw the clock face//tft.fillCircle(tft.width() / 2, tft.height() / 2, 60, ST77XX_RED);tft.fillCircle(tft.width() / 2, tft.height() / 2, 50, ST77XX_BLACK);////hour ticksfor ( int z = 0; z < 360; z = z + 30 ) {//Begin at 0° and stop at 360°float angle = z ;angle = (angle / 57.29577951) ; //Convert degrees to radiansint x2 = (tft.width() / 2 + (sin(angle) * 58));int y2 = (tft.height() / 2 - (cos(angle) * 58));int x3 = (tft.width() / 2 + (sin(angle) * (58 - 5)));int y3 = (tft.height() / 2 - (cos(angle) * (58 - 5)));tft.drawLine(x2, y2, x3, y3, ST77XX_WHITE);}// tft second handfloat angle = second() * 6 ;angle = (angle / 57.29577951) ; //Convert degrees to radiansint x3 = (tft.width() / 2 + (sin(angle+1.570796) * (50)));//ラジアン表示は時計の3時がスタート地点なので90度(π/4)ずれてる分単純に1.570796足すint y3 = (tft.height() / 2 - (cos(angle+1.570796) * (50)));//tft.drawLine(tft.width() / 2, tft.height() / 2, x3, y3, ST77XX_ORANGE);//// tft second hand//float angle = now.second() * 6 ;//angle = (angle / 57.29577951) ; //Convert degrees to radiansint x4 = (tft.width() / 2 + (sin(angle + 0.3+1.570796) * (-10)));int y4 = (tft.height() / 2 - (cos(angle + 0.3+1.570796) * (-10)));int x5 = (tft.width() / 2 + (sin(angle - 0.3+1.570796) * (-10)));int y5 = (tft.height() / 2 - (cos(angle - 0.3+1.570796) * (-10)));//tft.drawLine(tft.width() / 2, tft.height() / 2, x4, y4, ST77XX_ORANGE);//tft.drawLine(tft.width() / 2, tft.height() / 2, x5, y5, ST77XX_ORANGE);tft.fillTriangle(x3, y3 , x4, y4, x5, y5, ST77XX_ORANGE);//// tft minute handangle = minute() * 6 ;angle = (angle / 57.29577951) ; //Convert degrees to radiansx3 = (tft.width() / 2 + (sin(angle+1.570796) * (50 - 3)));y3 = (tft.height() / 2 - (cos(angle+1.570796) * (50 - 3)));tft.drawLine(tft.width() / 2, tft.height() / 2, x3, y3, ST77XX_GREEN);//// tft hour handSerial.print(hour());angle = hour() * 30 + int((minute() / 12) * 6 ) ;angle = (angle / 57.29577951) ; //Convert degrees to radiansx3 = (tft.width() / 2 + (sin(angle+1.570796) * (50 - 20)));y3 = (tft.height() / 2 - (cos(angle+1.570796) * (50 - 20)));tft.drawLine(tft.width() / 2, tft.height() / 2, x3, y3, ST77XX_BLUE);////Serial.print(hour());Serial.print(minute());Serial.print(second());Serial.print(' ');Serial.print(day());Serial.print(' ');Serial.print(month());Serial.print(' ');Serial.print(year());Serial.println();delay(1000);}void testfastlines(uint16_t color1, uint16_t color2) {tft.fillScreen(ST77XX_BLACK);for (int16_t y = 0; y < tft.height(); y += 5) {tft.drawFastHLine(0, y, tft.width(), color1);}for (int16_t x = 0; x < tft.width(); x += 5) {tft.drawFastVLine(x, 0, tft.height(), color2);}}void testdrawrects(uint16_t color) {tft.fillScreen(ST77XX_BLACK);for (int16_t x = 0; x < tft.width(); x += 6) {tft.drawRect(tft.width() / 2 - x / 2, tft.height() / 2 - x / 2 , x, x, color);}}void testfillrects(uint16_t color1, uint16_t color2) {tft.fillScreen(ST77XX_BLACK);for (int16_t x = tft.width() - 1; x > 6; x -= 6) {tft.fillRect(tft.width() / 2 - x / 2, tft.height() / 2 - x / 2 , x, x, color1);tft.drawRect(tft.width() / 2 - x / 2, tft.height() / 2 - x / 2 , x, x, color2);}}void testfillcircles(uint8_t radius, uint16_t color) {for (int16_t x = radius; x < tft.width(); x += radius * 2) {for (int16_t y = radius; y < tft.height(); y += radius * 2) {tft.fillCircle(x, y, radius, color);}}}void testdrawcircles(uint8_t radius, uint16_t color) {for (int16_t x = 0; x < tft.width() + radius; x += radius * 2) {for (int16_t y = 0; y < tft.height() + radius; y += radius * 2) {tft.drawCircle(x, y, radius, color);}}}void testtriangles() {tft.fillScreen(ST77XX_BLACK);uint16_t color = 0xF800;int t;int w = tft.width() / 2;int x = tft.height() - 1;int y = 0;int z = tft.width();for (t = 0 ; t <= 15; t++) {tft.drawTriangle(w, y, y, x, z, x, color);x -= 4;y += 4;z -= 4;color += 100;}}void testroundrects() {tft.fillScreen(ST77XX_BLACK);uint16_t color = 100;int i;int t;for (t = 0 ; t <= 4; t += 1) {int x = 0;int y = 0;int w = tft.width() - 2;int h = tft.height() - 2;for (i = 0 ; i <= 16; i += 1) {tft.drawRoundRect(x, y, w, h, 5, color);x += 2;y += 3;w -= 4;h -= 6;color += 1100;}color += 100;}}
SSD1306の時と同じアナログ時計だが、秒針を細長の三角形にして強調してある。
それと再描画は文字盤の内側の針の部分だけ実施している。
ちなみに縦長方向が標準の向きなので、表示はライブラリの機能で90度回転している。
重たいおまけ
抗がん剤と糖尿でインシュリン注射の組み合わせってかなりしんどい。
記憶もほとんどないうちに一か月半経過していた。
抗がん剤治療が半年経ったので手術の予定。
ステージ4なので切ってもどんだけ先があるか。数か月か数年か。
ガン治療の様子はこちら。






