グラフィック・ディスプレイを使う (4) テキストとフォント

 前回動かしたサンプル・スケッチBME280testをスリムにしました。SPIインターフェースは複数のスレーブ・デバイスをつなげられます。デバイスを区別するためにチップ・セレクト信号CSを独立して指定します。BME280は、マイコン・ボードNano 33 IoTのD7端子でセレクトされます。ディスプレイはD10端子がチップ・セレクト端子がつながっています。

//bme280 Written by Limor Fried & Kevin Townsend for Adafruit Industries.

#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

#define BME_CS 7

Adafruit_BME280 bme(BME_CS); // hardware SPI

void setup() {
Serial.begin(9600);
while(!Serial); // time to get serial running
Serial.println("Start BME280");

unsigned status;
status = bme.begin();
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
while (1);
}
Serial.println();
}

void loop() {
printValues();
delay(5000);
}

void printValues() {
Serial.print("Temperature = ");
Serial.print(bme.readTemperature(),1);
Serial.println(" *C");

Serial.print("Pressure = ");
Serial.print((bme.readPressure() / 100.0F),0);
Serial.println(" hPa");

Serial.print("Humidity = ");
Serial.print(bme.readHumidity(),0);
Serial.println(" %");
Serial.println();
}

 シリアルモニタには、次のように測定結果が表示されています。

グラフィックLCDに表示

 第2回のスケッチから必要な部分を抜き出し、上記のスケッチに追加します。テキスト関係は、次の関数が使えます。

tft.setTextColor(YELLOW); 16ビットの色の指定
tft.setTextWrap(true);   文字列が長い場合、行を折り返す
tft.setCursor(0, 0);    左上が原点の(0,0)。(x,y)の座標でドット単位でテキストの描画スタート位置を指定する
tft.print("Temperature = "); 文字列を表示する

 色はRGBの順番で、Redが5ビット、Greenが6ビット、Blueが5ビット、合計16ビットです。

//bme280 Written by Limor Fried & Kevin Townsend for Adafruit Industries.
//ST77* Written by Limor Fried/Ladyada for Adafruit Industries.

#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <Adafruit_GFX.h> // Core graphics library
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789

#define BME_CS 7
#define TFT_CS 10
#define TFT_RST 9 // Or set to -1 and connect to Arduino RESET pin
#define TFT_DC 8

#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF

Adafruit_BME280 bme(BME_CS); // hardware SPI
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);

void setup() {
Serial.begin(9600);
while(!Serial); // time to get serial running
Serial.println("Start BME280");
Serial.print("Hello! ST77xx TFT Test");

unsigned status;
status = bme.begin();
if (!status) {
Serial.println("Could not find a valid BME280 sensor, check wiring, address, sensor ID!");
while (1);
}

tft.init(240, 320); // Init ST7789 320x240
Serial.println("Initialized TFT");
tft.fillScreen(ST77XX_BLACK);
Serial.println();
}

void loop() {
printValues();
printValuesToLCD();
delay(5000);
}

void printValuesToLCD() {
tft.fillScreen(ST77XX_BLACK);
tft.setTextColor(YELLOW);
tft.setTextWrap(true);

tft.setCursor(0, 0);
tft.print("Temperature = ");
tft.print(String(bme.readTemperature(),1));
tft.print(" *C");

tft.setCursor(0, 50);
tft.print("Pressure = ");
tft.print(String((bme.readPressure() / 100.0F),0));
tft.print(" hPa");

tft.setCursor(0, 100);
tft.print("Humidity = ");
tft.print(String(bme.readHumidity(),0));
tft.print(" %");
}

void printValues() {
Serial.print("Temperature = ");
Serial.print(bme.readTemperature(),1);
Serial.println(" *C");

Serial.print("Pressure = ");
Serial.print((bme.readPressure() / 100.0F),0);
Serial.println(" hPa");

Serial.print("Humidity = ");
Serial.print(bme.readHumidity(),0);
Serial.println(" %");
Serial.println();
}

 実行結果です。

 テキストの指定方法は、上記以外に、

void setTextColor (uint16_t color 、uint16_t backgroundcolor );
void setTextSize (uint8_t size );

が使えます。文字を大きくしてみます。

tft.setTextSize(2);

 2倍になりました。

フォントを変える

 第2回のときに、Fontsフォルダを用意しました。使うフォントをincludeします。

#include <Fonts/FreeMonoBoldOblique12pt7b.h>
#include <Fonts/FreeSerif9pt7b.h>

 そのフォントを使うときは、

<tft.setFont(&FreeMonoBoldOblique12pt7b);

 元に戻すときは次の関数を使います。

tft.setFont();

 実際に、FreeMono18pt7bを使ってみます。文字が大きいのでy方向は調整しています。

 90度回転します。引数には0、1、2、3が使え、90度ずつ回転します。

tft.setRotation(1);

前へ

グラフィック・ディスプレイを使う (3) Nano 33 IoT+BME280

次へ

グラフィック・ディスプレイを使う (5) ライン、円、図形