M5Stackで顔の表示を動かしてみました。
さらに、接続したENV.Ⅲ SENSORで1気圧からのおおよその高さを表示させてみました。
使用したもの:M5Stack Basic V2.7、ENV.Ⅲ SENSOR、Arduino IDE 2.2.1(Windows11)
Arduinoのinoファイルは以下のようになりました
#include <M5Stack.h>
//#include <M5_ENV.h>
#include <QMP6988.h>
TFT_eSprite sprite = TFT_eSprite(&M5.Lcd);
QMP6988 qmp;
int mouth_x = 60;
int mouth_y = 50;
int mopen_f = 0;
int eye_y = 10;
int eye_hold = 100;
void setup() {
M5.begin();
dacWrite(25, 0);
Wire.begin(21,22);
qmp.init();
}
void loop() {
M5.update();
sprite.setColorDepth(8);
sprite.createSprite(M5.Lcd.width(),M5.Lcd.height());
sprite.setCursor(0,0);
sprite.printf("M5Stack Basic V2.7");
sprite.setCursor(60,230);
sprite.printf("A");
sprite.setCursor(155,230);
sprite.printf("B");
sprite.setCursor(250,230);
sprite.printf("C");
//eye
if(eye_y == 2){
eye_y = 10;
eye_hold = 100;
}
else if(eye_y == 10 && eye_hold !=0){
eye_hold =eye_hold -1 ;
}
else if(eye_y<=10){
eye_y = eye_y -2 ;
}
else{
eye_y = 10 ;}
sprite.fillRect(104, 105-(eye_y/2), 2, eye_y, 0xFFFFFF);
sprite.fillRect(204, 105-(eye_y/2), 2, eye_y, 0xFFFFFF);
//mouth
if(mouth_x == 30){
mouth_x = 60;
}
else if(mouth_x<=60){
mouth_x = mouth_x -5 ;
}
else{
mouth_x = 60 ;}
if(mouth_y == 10){
mouth_y = 60;
}
else if(mouth_y<=60){
mouth_y = mouth_y -5 ;
}
else{
mouth_y = 60 ;}
sprite.fillRect(155-(mouth_x/2), 170-(mouth_y/2), mouth_x, mouth_y, 0xFFFFFF);
if(M5.BtnA.isPressed()){
sprite.drawLine(43, 210, 53, 220, 0xFFFFFF);
sprite.drawLine(63, 210, 63, 220, 0xFFFFFF);
sprite.drawLine(83, 210, 73, 220, 0xFFFFFF);
}
if(M5.BtnB.isPressed()){
sprite.drawLine(138, 210, 148, 220, 0xFFFFFF);
sprite.drawLine(158, 210, 158, 220, 0xFFFFFF);
sprite.drawLine(178, 210, 168, 220, 0xFFFFFF);
}
if(M5.BtnC.isPressed()){
sprite.drawLine(233, 210, 243, 220, 0xFFFFFF);
sprite.drawLine(253, 210, 253, 220, 0xFFFFFF);
sprite.drawLine(273, 210, 263, 220, 0xFFFFFF);
}
//SHT30
Wire.beginTransmission(0x44);
Wire.write(0x2C);
Wire.write(0x06);
Wire.endTransmission(true);
Wire.requestFrom(0x44,6);
unsigned int tmsb = Wire.read();
unsigned int tlsb = Wire.read();
unsigned int tcrc = Wire.read();
unsigned int hmsb = Wire.read();
unsigned int hlsb = Wire.read();
unsigned int hcrc = Wire.read();
float temp = -45+(175*((256*tmsb)+tlsb)/65535.0);
float humi = (100*((256*hmsb)+hlsb)/65535.0);
sprite.setCursor(0,10);
sprite.printf("Temp:%2.2f`C",temp);
sprite.setCursor(0,20);
sprite.printf("Humi:%2.1f%%",humi);
//
float pres = qmp.calcPressure() / 100;
sprite.setCursor(0,30);
sprite.printf("Pres:%4.2fhPa",pres);
float heig = -10*(pres -1013.25);
sprite.setCursor(0,40);
sprite.printf("Heig:%4.2fm",heig);
//
sprite.pushSprite(0,0);
}
動かしてみた様子です。
1mほど上昇すると0.1hPa低下して高さ表示が1m上がりました。