Created
February 14, 2025 15:27
-
-
Save 18bai-Kaiohken/1be513e73f515b6ac3b9062ab70a147f to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #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