arduino カウントダウンタイマーエラー
Q&A
Closed
解決したいこと
arduinoで、第三者入力で入力してもらったタイマーをもとに、ゲーム開始時にミリ秒を加えてカウントダウンしたい。
発生している問題・エラー
指定したタイムではないタイマーになってしまう。また、00:00:00になったら71579:44などからリスタートされてしまう。
例)1m 0s が71579:44などから始まる。
NameError (uninitialized constant World)
または、問題・エラーが起きている画像をここにドラッグアンドドロップ
該当するソースコード
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Keypad.h>
#include <Servo.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
const byte ROWS = 4;
const byte COLS = 3;
char keys[ROWS][COLS] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
byte rowPins[ROWS] = {2, 3, 4, 5};
byte colPins[COLS] = {6, 7, 8};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
const int buzzerPin = A1;
const int servoPin = 10; // サーボのピン
char correctCode[5]; // ユーザーが設定するパスワード
int codeIndex = 0;
int attemptCounter = 0; // 試行回数のカウンター
const int maxAttempts = 3; // 最大試行回数
unsigned long startTime;
unsigned long timerMillis; // タイマーの時間
bool timerActive = false; // タイマーがアクティブかどうか
int timerMinutes = 0; // 設定された分
int timerSeconds = 0; // 設定された秒
bool passwordSet = false; // パスワードが設定されたかどうか
Servo myServo;
void setup() {
pinMode(buzzerPin, OUTPUT);
myServo.attach(servoPin);
myServo.write(0); // サーボを初期位置に設定
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(F("Set Password:"));
display.display();
}
void loop() {
if (timerActive) {
unsigned long currentMillis = millis();
unsigned long elapsedTime = currentMillis - startTime;
// 残り時間を計算
unsigned long remainingTime = timerMillis - elapsedTime;
// タイマーが切れた場合
if (remainingTime <= 0) {
handleTimeExpired();
return;
}
// 残り時間を表示
display.clearDisplay();
display.setTextSize(2);
display.setCursor(0, 0);
display.print(F("Remaining: "));
display.print(formatTime(remainingTime));
display.display();
} else {
if (!passwordSet) {
// パスワード設定の入力を受け付ける
char key = keypad.getKey();
if (key) {
handleKeyPress(key);
}
// 入力後の表示更新
display.clearDisplay();
display.setCursor(0, 0);
display.print(F("Set Password: "));
display.setTextSize(2);
for (int i = 0; i < codeIndex; i++) {
display.print('*'); // 入力された分だけアスタリスクを表示
}
display.display();
} else {
// 時間設定の入力を受け付ける
char key = keypad.getKey();
if (key) {
handleTimeInput(key);
}
// 入力後の表示更新
display.clearDisplay();
display.setCursor(0, 0);
display.print(F("Set Time: "));
display.print(timerMinutes);
display.print(F(":"));
display.print(timerSeconds);
display.display();
}
}
}
void handleKeyPress(char key) {
if (key == '#') {
// エンター処理(パスワードの確定)
if (codeIndex > 0) {
correctCode[codeIndex] = '\0'; // 終端文字を追加
if (codeIndex == 4) {
passwordSet = true; // パスワード設定完了
display.clearDisplay();
display.setCursor(0, 0);
display.println(F("Password Set!"));
display.display();
delay(2000); // 確認メッセージ表示
}
}
} else if (key == '*') {
// 文字削除処理
if (codeIndex > 0) {
codeIndex--;
correctCode[codeIndex] = '\0'; // 最後の文字を削除
}
} else if (codeIndex < 4) {
// 入力を保存
correctCode[codeIndex] = key;
codeIndex++;
}
}
void handleTimeInput(char key) {
if (key == '#') {
// タイマー開始処理
startTimer(); // タイマーを開始する関数
} else if (key >= '0' && key <= '9') {
// 数字の入力処理
if (timerMinutes < 10) {
timerMinutes = timerMinutes * 10 + (key - '0'); // 分の設定
} else if (timerSeconds < 60) {
timerSeconds = timerSeconds * 10 + (key - '0'); // 秒の設定
}
}
}
void startTimer() {
timerMillis = (timerMinutes * 60 + timerSeconds) * 1000; // ミリ秒に変換
startTime = millis(); // タイマー開始時刻を記録
timerActive = true; // タイマーをアクティブにする
}
void handleTimeExpired() {
// タイマーの期限切れ処理
timerActive = false;
display.clearDisplay();
display.setTextSize(3);
display.setCursor(25, 20);
display.println(F("Time's Up!"));
display.display();
myServo.write(180); // サーボを動かす
delay(2000);
myServo.write(0); // サーボを元の位置に戻す
}
String formatTime(unsigned long milliseconds) {
unsigned long seconds = milliseconds / 1000;
milliseconds %= 1000;
unsigned long minutes = seconds / 60;
seconds %= 60;
String formattedTime = "";
if (minutes < 10) formattedTime += "0";
formattedTime += String(minutes) + ":";
if (seconds < 10) formattedTime += "0";
formattedTime += String(seconds) + ":" + String(milliseconds / 10); // ミリ秒を表示
return formattedTime;
}
まだまだ初心者なのでわかりません助けてください。
お願いします。