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

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

ただいまの
回答率

87.34%

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

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 752

score 0

前提・実現したいこと

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/ツールのバージョンなど)

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2021/06/24 22:20

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

    キャンセル

  • Haru_0108

    2021/06/24 23:07

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

    キャンセル

回答 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 23:09

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

    キャンセル

  • 2021/06/24 23:26

    void loopの中に入ってます。

    キャンセル

  • 2021/06/24 23:30

    全体提示できませんか

    これだけでは答えようがないです

    キャンセル

  • 2021/06/24 23:34

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

    キャンセル

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

  • ただいまの回答率 87.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る