Skip to content

Instantly share code, notes, and snippets.

@18bai-Kaiohken
Created February 14, 2025 15:27
Show Gist options
  • Select an option

  • Save 18bai-Kaiohken/1be513e73f515b6ac3b9062ab70a147f to your computer and use it in GitHub Desktop.

Select an option

Save 18bai-Kaiohken/1be513e73f515b6ac3b9062ab70a147f to your computer and use it in GitHub Desktop.
#include <Arduino.h>
#include "M5Dial.h"
#include <M5GFX.h>
M5GFX lcd; // 画面表示用のインスタンス
M5Canvas canvas(&lcd); // スプライト機能を使うためのインスタンス
// 初期設定
void setup(void) {
auto cfg = M5.config();
M5Dial.begin(cfg, true, false);
lcd.begin(); // 画面初期化
Serial.begin(115200);
// メモリ描画領域の初期設定(スプライト)----------------------------------------------------------------------------
canvas.setColorDepth(8);
canvas.createSprite(lcd.width(), lcd.height()); // メモリ描画領域サイズを縦×横のサイズ(全画面)にする
canvas.setTextDatum(MC_DATUM);
canvas.setTextColor(YELLOW); // 文字の色
canvas.setFont(&fonts::Font8);// フォント
canvas.setTextSize(0.9);//フォントサイズ
M5Dial.Speaker.tone(8000, 20);//起動音
}
int hour_count = 0;
int second_count = 0;
long oldPosition = 0;
int setting_range = 1;
static m5::touch_state_t prev_state;
String state = "idle";
unsigned long previousMillis; // 最後に時間を記録した時刻
unsigned long currentMillis;//現在時刻
bool brinking = true;
// メイン処理
void loop(void) {
M5Dial.update();
auto t = M5Dial.Touch.getDetail();
//リセットボタン処理-----------------------------------------------------------
if (M5Dial.BtnA.pressedFor(1500)) {
second_count = 0;
hour_count = 0;
M5Dial.Speaker.tone(8000, 20);//効果音
state = "idle";
}
if (prev_state != t.state && t.state == 3) {//画面タッチ時の処理
M5Dial.Speaker.tone(8000, 20);
if(state == "idle"){
state = "timer";
previousMillis = millis(); //現在の時刻を格納
}else if(state == "timer"){
state = "pause";
delay(10000);
}else if (state == "pause"){
state = "timer";
}
}
prev_state = t.state;
if (state == "idle"){ //待機状態の処理
//ローリーエンコーダ関連処理---------------------------------------------------------------
long newPosition = M5Dial.Encoder.read();
Serial.println(second_count);
if (newPosition != oldPosition) {
//M5Dial.Speaker.tone(8000, 20);
if(newPosition > oldPosition){//正の方向に回転した場合
second_count += setting_range;
if(second_count >= 60){
hour_count += (second_count / 60);
second_count %= 60;
}
}else if (newPosition < oldPosition){
second_count -= setting_range;
if(second_count < 0){
if(hour_count == 0){
second_count = 0;
}else{
hour_count -= (-1*(second_count/60)+1);
second_count = 60-(-1*second_count % 60);
}
}
}
oldPosition = newPosition;
}
//時刻レンジ変更処理
if(M5Dial.BtnA.wasPressed()){
if (setting_range == 1){
setting_range = 5;
}else if(setting_range == 5){
setting_range = 1;
}
}
}
if (state == "timer"){//タイマー動作時の処理
currentMillis = millis();//現在の時刻を格納)
if (currentMillis - previousMillis >= 1000){; //前回から1秒以上経過した場合
if (second_count == 0){
if(hour_count == 0){
state = "alarm";
canvas.setFont(&fonts::Font4); // フォント
canvas.setTextSize(2.2);//フォントサイズを指定
}else{
hour_count -= 1;
second_count = 60;
}
}
if (state == "timer"){
second_count -= 1;
previousMillis = currentMillis;
}
}
}
if (state == "pause"){
while(true){
delay(10000);
}
}
// 描画処理用文字列の作成-------------------------------------------------------
char second_padding[2] = "";
char hour_padding[2] = "";
sprintf(hour_padding,"%02d",hour_count);
String hour_indicate = hour_padding;
sprintf(second_padding,"%02d",second_count);
String second_indicate = second_padding;
String time_indicate = hour_indicate + ":" +second_indicate;
if(state == "alarm"){
while(state == "alarm"){
M5Dial.update();
auto t = M5Dial.Touch.getDetail();
currentMillis = millis();//現在の時刻を格納)
if(prev_state != t.state && t.state == 3) {//画面タッチ時の処理){
state = "idle";
canvas.setFont(&fonts::Font8); // フォント
canvas.setTextSize(0.9);//フォントサイズを指定
brinking = true;
}
if (currentMillis - previousMillis >= 500){; //前回から1秒以上経過した場合
if (brinking == true){
// スプライトによる描画処理-------------------------------------------------------
time_indicate = "time's up!";
canvas.fillRect(0, 0, lcd.width(), lcd.height(), BLACK); // 塗り潰し四角(指定色で範囲を塗りつぶす)
canvas.setCursor(lcd.width()/2 - canvas.textWidth(time_indicate)/2, lcd.height()/2);
canvas.println(time_indicate);
canvas.pushSprite(&lcd, 0, 0);
brinking = false;
M5Dial.Speaker.tone(10000, 20);
delay(20);
M5Dial.Speaker.tone(4000, 20);
}else if (brinking == false){
canvas.fillRect(0, 0, lcd.width(), lcd.height(), BLACK); // 塗り潰し四角(指定色で範囲を塗りつぶす)
canvas.pushSprite(&lcd, 0, 0);
brinking = true;
}
previousMillis = currentMillis;
}
}
}else{
// スプライトによる描画処理-------------------------------------------------------
canvas.fillRect(0, 0, lcd.width(), lcd.height(), BLACK); // 塗り潰し四角(指定色で範囲を塗りつぶす)
canvas.setCursor(lcd.width()/2 - canvas.textWidth(time_indicate)/2, lcd.height()/2);
canvas.println(time_indicate);
canvas.pushSprite(&lcd, 0, 0);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment