ikkei blog

電子工作やパズルのブログです。主にLEDを使った電子工作をやっています。

delay( 10000 ); 再び

2024年12月15日 21時56分04秒 | 組み込みソフト
風呂に入っている時に
ひょっとして dealy 関数に何か消費電流低減とかの技があったりするのか?
と思って風呂上がってさっそく実験してみました。
プログラムはこれ

loop(
    while(true){
        delay( 10000 );
    }
}

ESP32

delay 無し 79.7mA
delay( 1 );  49.7mA
delay( 10 );  48.6mA
delay( 100 );  48.6mA
delay( 1000 );  48.5mA
delay( 10000 );  48.5mA

うーーん、確かに効果はある。10以上にしても変わらないけどね。
delay関数の中でsleepとかしてるんだろうか?

ならば、UNOならどうなんだろう?

Arduino UNO

delay 無し 51.0mA
delay( 1 );  61.0mA
delay( 10 );  61.2mA
delay( 100 );  61.2mA
delay( 1000 );  61.2mA
delay( 10000 );  61.2mA

あれれ?UNOだとdelayの方が消費電流多いね。

ここまでやって気が付いた。
無限ループで動作止めてる時の消費電流気にしてどうすんだ!

結論
ESP32のdelay関数は消費電流が小さくなる。
だけど無限ループに入れるdelayはやっぱり意味がない。

おまけ
デバッグで動作を止める時私は
while(1);
と1行で済ませてます。

最新の画像もっと見る

3 コメント

コメント日が  古い順  |   新しい順
イメージ的には (CDE)
2024-12-24 11:36:39
BRA *
と、
(タイマ割り込み設定)
WAI

の違いみたいなものでしょうか(違)

あ、arduinoは全然わからないので間違ってたらアレなんですが、
loop() {
でしょうか。

メリクリ&良き新年をお迎えください。
返信する
うーーん、そうですね (ikkei)
2024-12-24 13:49:13
この本の著者はラズパイメインの人でPythonだとLEDを点灯させてもプログラムが終了するとラズパイでは設定が初期化されてLEDが消えてしまうので無限ループで止めるようにしたようです。
(PythonはBASICと同じインタプリタなのでmain()が無く上から下に抜けて終了するのです)
また、その無限ループの中にsleepを入れるのを定番にしているようです。(消費電力低減のため?)

一方Arduinoではmain()は明記されておらず setup()とloop()の中身を書くのですが
実は
main(){
setup();
while(1){
loop(){
}
}
という構造になっていて loop()は必ずループするので終わらないわけです。(組み込みなので)

この著者はラズパイのPythonの記事をESP32のArduinoに使い回しで書いているようなので
loop()がmain()だと思ってloop()の中で1回だけ実行させるために無限ループを書いてしまっているのです。
1回だけ実行させるのならsetup()に書けばいいのです。
どっちにしても無限ループの中のdelay()は意味不明です。

ちょっと早いですが良いお年を!
返信する
ちなみにラズパイ公式によると (ikkei)
2024-12-27 17:32:54
動作を止める時は
While True:
ではなく
pause()
を使うのだそうです。
返信する

コメントを投稿