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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

2回答

2847閲覧

arduinoでsleep機能を使いたい

777333555

総合スコア4

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2021/12/17 08:07

前提・実現したいこと

arduinoでセンサ値を読み取り、センサの出力がない(センサが反応しない)時間が4分を超えたら出力をリセットするシステムを作りたいです。

発生している問題・エラーメッセージ

sleep関数を使用するとloop文が回らない(program)が回らない

該当のソースコード

arduino

1#include <avr/sleep.h> 2#include <MsTimer2.h>//時間計測 3#include <avr/wdt.h> 4fastIoPin<3>PPR1; 5fastIoPin<10>LED_BLUE; 6fastIoPin<11>LED_GREEN; 7fastIoPin<12>LED_RED; 8fastIoPin<13>buza_Pin; 9unsigned int state1 = 0; 10void time_count(void); 11void delayWDT2(unsigned long t); 12ISR(WDT_vect); 13unsigned int lastState1 = LOW; 14unsigned long risingEdgeTime1 = 0; 15unsigned int stage1 = 0; //0=初期, 1=監視期間, 2=HIGH期間 16int x; 17 18void setup() { 19 MsTimer2::set(20, value_count);//オーバーフローする時間が20sで20ミリ秒ごとにtime_count関数を呼出, 20 PPR1.pinMode(INPUT);//センサ値 21 LED_BLUE.pinMode(OUTPUT);//青LED 22 LED_GREEN.pinMode(OUTPUT);//緑LED 23 LED_RED.pinMode(OUTPUT);//赤LED 24 buza_Pin.pinMode(OUTPUT);//buza 25 set_sleep_mode(SLEEP_MODE_PWR_DOWN);//sleep設定 26 wdt_enable(WDTO_8S);//秒数設定 27 Serial.begin(9600); 28 MsTimer2::start(); 29} 30//sensor値取得 31void value_count(void) { 32 float t = (millis() - 30000) * 0.001; //loop開始からの経過秒 33 state1 = digitalNoiselessRead1(3, 40, 10000); //PPR1 ピンが 0.04秒間 HIGH になっていたら,その後 10秒間 HIGH が返る 34 Serial.print(t, 2); 35 Serial.print(" "); 36 Serial.println(state1); 37 delayWDT2(7); // 引数でスリープ時間指定(詳細はdelayWDT_setup参照)//7=2s 38  39} 40 41void delayWDT2(unsigned long t) { // パワーダウンモードでdelayを実行 42 Serial.flush(); // シリアルバッファが空になるまで待つ 43 delayWDT_setup(t); // ウォッチドッグタイマー割り込み条件設定 44 45 // ADCを停止(消費電流 147→27μA) 46 ADCSRA &= ~(1 << ADEN); 47 48 set_sleep_mode(SLEEP_MODE_PWR_DOWN); // パワーダウンモード指定 49 sleep_enable(); 50 51 // BODを停止(消費電流 27→6.5μA) 52 MCUCR |= (1 << BODSE) | (1 << BODS); // MCUCRのBODSとBODSEに1をセット 53 MCUCR = (MCUCR & ~(1 << BODSE)) | (1 << BODS); // すぐに(4クロック以内)BODSSEを0, BODSを1に設定 54 55 asm("sleep"); // 3クロック以内にスリープ sleep_mode();では間に合わなかった 56 57 sleep_disable(); // WDTがタイムアップでここから動作再開 58 ADCSRA |= (1 << ADEN); // ADCの電源をON(BODはハードウエアで自動再開される) 59} 60 61void delayWDT_setup(unsigned int ii) { // ウォッチドッグタイマーをセット。 62 // 引数はWDTCSRにセットするWDP0-WDP3の値。設定値と動作時間は概略下記 63 // 0=16ms, 1=32ms, 2=64ms, 3=128ms, 4=250ms, 5=500ms 64 // 6=1sec, 7=2sec, 8=4sec, 9=8sec 65 byte bb; 66 if (ii > 9 ) { // 変な値を排除 67 ii = 9; 68 } 69 bb = ii & 7; // 下位3ビットをbbに 70 if (ii > 7) { // 7以上(7.8,9)なら 71 bb |= (1 << 5); // bbの5ビット目(WDP3)を1にする 72 } 73 bb |= ( 1 << WDCE ); 74 75 MCUSR &= ~(1 << WDRF); // MCU Status Reg. Watchdog Reset Flag ->0 76 // start timed sequence 77 WDTCSR |= (1 << WDCE) | (1 << WDE); // ウォッチドッグ変更許可(WDCEは4サイクルで自動リセット) 78 // set new watchdog timeout value 79 WDTCSR = bb; // 制御レジスタを設定 80 WDTCSR |= _BV(WDIE); 81} 82 83//ISR(WDT_vect) { // WDTがタイムアップした時に実行される処理 84// wdt_cycle++; // 必要ならコメントアウトを外す 85//} 86 87unsigned int digitalNoiselessRead1(unsigned int pin1, long monitoringPeriod1, long highPeriod1) { 88 state1 = digitalRead<3>(); 89 unsigned long now = millis(); 90 if (stage1 == 0 && lastState1 == LOW && state1 == HIGH) { //立ち上がり検出 91 risingEdgeTime1 = now; 92 stage1 = 1; //監視期間開始 93 } 94 lastState1 = state1; 95 if (stage1 == 1) { //監視期間中 96 if (state1 == LOW) { //ノイズだった 97 stage1 = 0; 98 } else if (now - risingEdgeTime1 >= monitoringPeriod1) { 99 stage1 = 2; //HIGH 期間へ移行 100 } else { 101 state1 = LOW; //監視期間中は LOW 102 } 103 } else if (stage1 == 2) { //HIGH期間中 104 if (now - risingEdgeTime1 <= monitoringPeriod1 + highPeriod1) { 105 state1 = HIGH; //HIGH期間中は HIGH 106 } else { 107 stage1 = 0; //HIGH期間終了 108 } 109 } 110 return state1; 111} 112void loop() { //LED,システム 113 switch (x) { 114 case 0: 115 //buza_Pin.digitalWrite(LOW); 116 LED_RED.digitalWrite(LOW); 117 LED_GREEN.digitalWrite(HIGH); 118 LED_BLUE.digitalWrite(LOW); //青 119 break; 120 case 1: 121 //buza_Pin.digitalWrite(LOW); 122 LED_RED.digitalWrite(HIGH); 123 LED_GREEN.digitalWrite(LOW); 124 LED_BLUE.digitalWrite(HIGH); //黄 125 break; 126 case 2: 127 //buza_Pin.digitalWrite(HIGH); 128 LED_RED.digitalWrite(HIGH); 129 LED_GREEN.digitalWrite(HIGH); 130 LED_BLUE.digitalWrite(HIGH); //赤 131 delay(100); 132 //buza_Pin.digitalWrite(HIGH); 133 LED_RED.digitalWrite(LOW); 134 LED_GREEN.digitalWrite(HIGH); 135 LED_BLUE.digitalWrite(HIGH); //赤 136 delay(100); 137 break; 138 case 3: 139 //buza_Pin.digitalWrite(HIGH); 140 LED_RED.digitalWrite(HIGH); 141 LED_GREEN.digitalWrite(LOW); 142 LED_BLUE.digitalWrite(LOW); //白 143 break; 144 } 145 if (state1 == LOW) { //青 00000 146 x = 0; 147 } 148else if (state1 == HIGH) {//5m~10m黄色11000 149 x = 1; 150 } 151//その他30通り記載 152}

試したこと

実際はセンサを5つ使用しています。loop文、新しい関数内などにdelayWDT2関数を入れてみましたが正常に動作しません。関数をコメントアウトするとシステムは正常に動きますがリセット機能がないので5分ほどでシステムが停止します。

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

モバイルバッテリーを使用すると約5分ほどでシステムが停止します。恐らく、モバイルバッテリーの過電流防止回路が発生しているのだと思います。そこで、5分以内に定期的にシステムのリセットをすることができればシステムを長時間使用することができると思い、いろいろ試しましたができませんでした。もしわかる方がいらっしゃいましたらご教示いただけないでしょうか。よろしくお願い致します。

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

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

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

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

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

ozwk

2021/12/17 08:18 編集

ただ単にLチカするだけのArduinoをモバイルバッテリーで動かしても停止しますか?
777333555

2021/12/17 08:22

そのようです。そのため、バッテリーが安定して出力をするようにするためにウォッチドッグタイマなどを使用してみましたが、その場合そもそもバッテリーにつながなくてもプログラムが停止してしまいます。
guest

回答2

0

ベストアンサー

モバイルバッテリーは負荷が軽すぎると自動停止するので多分そのせいでしょう

適当な抵抗などで無駄に電力を使うようにするなどしてください

投稿2021/12/17 08:28

ozwk

総合スコア13521

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

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

777333555

2021/12/17 08:38

ご回答ありがとうございます。できればもう少し詳しくお教えいただけると幸いです。 現段階では、usbケーブルでモバイルバッテリーとarduinoを直接つないでいる状況です。 バッテリーにはusb端子しかありません。 どのように対処すればよろしいでしょうか。
ozwk

2021/12/17 08:51

arduinoの5v-gnd間に適当な抵抗入れるだけです モバイルバッテリー ダミー負荷 などで検索してください
777333555

2021/12/17 10:03

ありがとうございます。 センサ、LED、ブザーなど使用機器が多いのでオートパワーオフキャンセラーを使用することにしました。 購入したので届き次第実践してみます。
thkana

2021/12/17 22:53

自動オフしないモバイルバッテリー https://cheero.net/canvas-iot/ また、Ankerのモバイルバッテリーは「低電流モード」と称して同様の機能をつけているらしい、という話もあります。ワイヤレスイヤホン等の充電での低負荷対応だとか。こちらは数時間でモード解除されてオフになる、とかいうウワサも聞いたのですが未確認。
777333555

2021/12/18 06:24

ありがとうございます.参考に致します.
777333555

2021/12/23 08:50

パワーオフキャンセラー、モバイルバッテリーを自身で充電しながらなどの方法でできました。ただ、これらの方法でも使用できないものもあるようです。いろいろ試していきたいと思います。
guest

0

sleep命令使ったところで、CPUの消費電流が少なくなるだけ、です
せいぜい数mA程度の節約にしかなりませんが、そんでいいんでしょうか

投稿2021/12/17 08:19

y_waiwai

総合スコア87774

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

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

777333555

2021/12/17 08:28

ご回答、ありがとうございます。 ソーラーモバイルバッテリーにarduinoを繋いでシステムが正常に動作するようにしたいです。 改善できるところがあればご教示お願い致します。よろしくお願いいたします。
y_waiwai

2021/12/17 08:40

復帰してこないってことなら、割り込みがイネーブルになってないとか、割り込みがかかってないとか、そこらへんチェックしてみては。
777333555

2021/12/17 08:51

割り込みはかかってないような気がします。関数を使用するとシリアルモニタに表示が出なくなります。システムが作動していません。関数を使用しなければシステムは動きます。
y_waiwai

2021/12/17 08:55

いやそりゃsleep実行したらCPUは停止しますよ なんか他のやり取り見てたら、まともにCPUが動いてないような気が。 オシロスコープ用意して、電源ラインがどうなってるのか確認してみては。 そこらへんの変動で暴走してるとかリセットかかってるとかな気がしますが
y_waiwai

2021/12/17 08:57

あれ、WDTの割り込みハンドラなんでコメントアウトしてんだw
777333555

2021/12/18 06:23

codeの理解が追い付いてなくてコメントアウトしてました.プログラムでできる気がしないのでパワーオフキャンセラーをモバイルバッテリーに繋いで行ってみようと思います.ほかに何かいい案がもしございましたらご教授お願いいたします.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問