質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

Q&A

解決済

1回答

4781閲覧

M5StickCでmillis()を用いて時間計測

Haru_0108

総合スコア2

M5Stack

M5Stackは、小型のマイコンモジュールです。拡張モジュールが豊富に用意されており、センサと組み合わせることで測定機能を自由に追加することができます。

0グッド

0クリップ

投稿2021/06/24 13:07

編集2021/06/24 14:33

前提・実現したいこと

M5Stick温度センサを用いて42℃以上で10秒経過するとLED点滅+黄色文字警告,42℃以上で20秒経過するとLED点灯+赤文警告というプログラムを書きたいのですがうまくカウントが進んでくれません。どこの部分を変更したらいいか教えていただきたいです。 下記のソースコードにはM5の設定部分は省略してあります。

該当のソースコード

//セットアップ// #include<M5StickC.h> //m5StickCを使うための基本セットアップ #include<Wire.h>        //I2Cを使うための基本プラグラム uint16_t result; float temperature; const int tMax = 37 ; //1度きりの処理// void setup() { M5.begin(); //M5StickCを起動 Wire.begin(0,26); //I2Cの通信を0,26で開始 Serial.begin(115200); //シリアル通信を速度15200bpsで開始 M5.Lcd.setRotation(3); //文字の表示方向を回転(90*3=27度回転) M5.Lcd.setTextColor(WHITE); //M5StickCの画面に表示する文字の色を「白」に設定 M5.Lcd.setTextSize(3); //文字の大きさを「3」に設定 M5.Lcd.setCursor(0,60); //表示場所を「0,60」に設定 pinMode(GPIO_NUM_10,OUTPUT); //10ピン出力指令 digitalWrite(GPIO_NUM_10,HIGH); //10ピンにHIGHでLED消灯 } //繰り返しの処理// void loop() { Wire.beginTransmission(0x5A); //I2C通信の初期信号と温度センサのI2Cのアドレスを送信 Wire.write(0x07); //温度データを取得するための指令を送信 Wire.endTransmission(false); //送信完了 Wire.requestFrom(0x5A,2); //アドレスが0x5Aのセンサから,2バイトのデータを送信 result=Wire.read(); //温度データは8ビットをさらに受信してから,追加,16ビット分のデータを格納 result |=Wire.read() << 8; //上記の変数に,上位8bit分をさらに追加して16ビット分のデータを格納 //温度[℃]への変換と画面表示// temperature = result * 0.02 - 273.15; //温度への変換式より計算 M5.Lcd.fillRect(0,20,120,100,BLACK); //背景塗りつぶし M5.Lcd.setCursor(0,20); //座標指定 M5.Lcd.println(temperature); //温度画面に表示 Serial.println(temperature); //パソコンよりデータを確認できるように設定 delay(500); //約0.5s間隔で温度を表示するための待機時間を設定 M5.update(); delay(10); //変数の設定// int flag = 0; float st, t; //アラートの設定// if(temperature >=42) { M5.Lcd.fillRect(0,40,120,100,BLACK); //背景塗りつぶし M5.Lcd.setCursor(0,40); //座標指定 M5.Lcd.println(st-t); Serial.println(st - t); delay(1000); if(flag == 0){ flag == 1; float st = millis(); M5.Lcd.setTextColor(WHITE); //文字の色を白に戻す digitalWrite(GPIO_NUM_10,HIGH); //LED消灯 } float t = millis(); if(t-st > 10000){ M5.Lcd.setTextColor(RED); //20s過ぎたら赤字で警告 digitalWrite(GPIO_NUM_10,LOW); //LED点灯 } else if(t-st > 20000){ M5.Lcd.setTextColor(M5.Lcd.color565(255, 255, 0)); //tが10sを超えたら黄色字で警告 digitalWrite(GPIO_NUM_10,LOW); delay(500); digitalWrite(GPIO_NUM_10,HIGH); delay(500); //LED点滅 } } else{ flag == 0; delay(100); M5.Lcd.setTextColor(WHITE); //文字の色を白に戻す digitalWrite(GPIO_NUM_10,HIGH); //LED消灯 } }

試したこと

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/06/24 13:20

うまく進まないとは、どういうふうに進むんでしょうか
Haru_0108

2021/06/24 14:07

42℃を超えて時間が10秒過ぎたらLEdというふうにしたいのですが42℃を超えたら直ぐにLEDがついてしまうんです
guest

回答1

0

ベストアンサー

このコードはどこに書かれてるもんでしょうか。
関数にも入ってないし、どういうふうに実行されるものかわかりません


回答じゃありませんが、まずいところを述べておきます

1.

float st = millis();

mills関数の戻り値はfloatじゃありません。unsigned longです

2.
で、ここで float st= と変数定義を行ってますが、変数は定義をした{}内でしか有効ではありません

int flag = 0;

float st,
t;

で定義してるstと、millisの代入してるstとは別の変数となります

3.
んでもひとつ、関数の中で定義される変数は、その関数が終わると消滅します。
なので、flagという変数は、loop関数が実行されるとき、常に0となってます

関数から抜けて消滅してもらっては困る変数は、グローバル変数としましょう

投稿2021/06/24 13:26

編集2021/06/24 14:56
y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Haru_0108

2021/06/24 14:09

すみません。当方プログラミング超初心者でしてコードがどこに書かれて~っ言うのがよく分からないのですが詳しく説明して頂いてもよろしいですか??
Haru_0108

2021/06/24 14:26

void loopの中に入ってます。
y_waiwai

2021/06/24 14:30

全体提示できませんか これだけでは答えようがないです
Haru_0108

2021/06/24 14:34

全体に変更しました。よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問