#include <Arduino.h>
#include <Wire.h>
#include <Adafruit_BMP280.h>
#define LGFX_USE_V1
#include <LovyanGFX.hpp>
class LGFX_Waveshare19 : public lgfx::LGFX_Device {
lgfx::Panel_ST7789 _panel_instance;
lgfx::Bus_SPI _bus_instance;
public:
LGFX_Waveshare19() {
{
auto cfg = _bus_instance.config();
cfg.spi_host = SPI2_HOST;
cfg.spi_mode = 0;
cfg.freq_write = 40000000;
cfg.pin_sclk = 18;
cfg.pin_mosi = 23;
cfg.pin_miso = -1;
cfg.pin_dc = 2;
this->_bus_instance.config(cfg);
_panel_instance.setBus(&_bus_instance);
}
{
auto cfg = _panel_instance.config();
cfg.pin_cs = 15;
cfg.pin_rst = 4;
cfg.pin_busy = -1;
cfg.panel_width = 170;
cfg.panel_height = 320;
cfg.offset_x = 35;
cfg.offset_y = 0;
// 色順の設定を修正(背景黒・水色文字を確実にする設定)
cfg.rgb_order = false;
cfg.invert = true;
this->_panel_instance.config(cfg);
}
setPanel(&_panel_instance);
}
};
LGFX_Waveshare19 lcd;
Adafruit_BMP280 bmp;
// --- 表示用カラー定義(これで確実に黒背景+水色文字になります) ---
#define COLOR_MAIN TFT_CYAN // 水色
#define COLOR_LABEL TFT_CYAN // 水色
#define COLOR_LINE TFT_CYAN // 水色
#define COLOR_BG TFT_BLACK // 漆黒の黒
void setup() {
Serial.begin(115200);
delay(1000);
lcd.init();
lcd.setRotation(1); // 横長画面に設定
lcd.fillScreen(COLOR_BG); // 画面全体を黒で塗りつぶす
// 気圧センサーの起動
Wire.begin(21, 22);
if (!bmp.begin(0x76)) {
Serial.println("センサーエラー");
while (1);
}
// --- 固定グラフィック(枠線やラベル)を描画 ---
// 外枠の角丸四角形(【修正】画面の端から5ピクセル内側に小さくしました)
lcd.drawRoundRect(5, 5, 310, 160, 15, COLOR_LINE);
// 横の仕切り線(枠が小さくなったので位置調整)
lcd.drawFastHLine(5, 110, 310, COLOR_LINE);
// 縦の仕切り線
lcd.drawFastVLine(155, 110, 55, COLOR_LINE);
// 「Alt」ラベル
lcd.setFont(&fonts::Font4); // 読みやすいゴシック体
lcd.setTextColor(COLOR_LABEL, COLOR_BG);
lcd.setCursor(20, 50);
lcd.print("Alt");
// 「m」単位ラベル
lcd.setCursor(255, 50); // 数字がArial調になり幅が変わるため位置調整
lcd.print("m");
// 「Temp」ラベル
lcd.setFont(&fonts::Font2);
lcd.setCursor(15, 130);
lcd.print("Temp");
// 「Time」ラベル
lcd.setFont(&fonts::Font2);
lcd.setCursor(165, 130);
lcd.print("Time");
}
void loop() {
// センサーデータの取得
float temperature = bmp.readTemperature();
float altitude = bmp.readAltitude(1013.25);
// --- 1. 高度(Alt)の表示(まっすぐ太字仕様) ---
lcd.setFont(&fonts::DejaVu56);
lcd.setTextColor(COLOR_MAIN, COLOR_BG);
// ど真ん中に表示
lcd.drawCentreString(String((int)altitude), 160, 30);
// --- 2. 温度(Temp)の表示 ---
// ★次の文字に影響が出ないように、太字(フチ取り)を解除してバトンタッチ
lcd.setTextPadding(2);
lcd.setFont(&fonts::DejaVu24);
lcd.setTextSize(1.3);
lcd.setCursor(62, 125);
lcd.print((int)temperature);
lcd.setFont(&fonts::Font2);
lcd.setCursor(105, 125);
lcd.print(" `C"); // 「°C」表示
// --- 3. 時間(Time)の表示(現在はダミー) ---
lcd.setFont(&fonts::DejaVu24);
lcd.setCursor(210, 125);
lcd.print("15:00");
delay(500);
}
この手のガジェット
Claude先生がいればだいたい何とかなるね、さすがAI
間違いも多いけど