ATTiny13Aが省電力化できない

このQ&Aのポイント
  • ATTiny13Aでフォトカプラを一定時間ONにする回路を作成しましたが、省電力にできません。
  • 仕様としては10分、30分、60分をジャンパー等で選択し、ボタンを押したら一定時間の間、フォトカプラをONにします。
  • LR44電池2個で1年以上、動けばと思っています。
回答を見る
  • ベストアンサー

ATTiny13Aが省電力化できない

ATTiny13Aでフォトカプラを一定時間ONにする回路を作成しましたが、省電力にできません。 仕様としては10分、30分、60分をジャンパー等で選択し、ボタンを押したら一定時間の間、フォトカプラをONにします。 また、途中で再度、割り込みがあっても時間の延長はしません。 LR44電池2個で1年以上、動けばと思っています。 コードも拙い上、回路図もまともに書けない初心者ですが、よろしくお願いいたします。 #include <avr/wdt.h> #include <avr/sleep.h> //LED_PIN #define LED_PIN (5) //interrupt pin #define ACC_IN (2) //Time_select #define TIME_PIN1 (0) #define TIME_PIN2 (4) #define TIME_PIN3 (1) volatile int sleep_flg=0; volatile int counter; int count_max=15;//4second * 15 = 60 second int wait_minutes=1;//wait_time (minutes) //arduino wakeup interrupt void wakeUp() { //wdt_reset(); //sleep end sleep_flg = 0; //counter reset counter = 0; } //watch dog timer setup void wdt_set() { wdt_reset(); cli(); MCUSR = 0; WDTCR |= 0b00011000; //WDCE WDE set WDTCR = 0b01000000 | 0b100000;//WDIE set |WDIF set scale 4 seconds sei(); } //watch dog timer unset void wdt_unset() { wdt_reset(); cli(); MCUSR = 0; WDTCR |= 0b00011000; //WDCE WDE set WDTCR = 0b00000000; //status clear sei(); } //watch dog timer call ISR(WDT_vect) { //wdt_reset(); if(sleep_flg == 1) { counter++; if( counter >= (count_max * wait_minutes)) { //sleep end sleep_flg = 0; //counter reset counter = 0; } } else { } } //status reset void init_status() { counter=0; } //sleep arduino void sleep() { wdt_set(); //watch dog timer set sleep_flg=1; //enable on sleep flag set_sleep_mode(SLEEP_MODE_PWR_DOWN); //set sleep mode attachInterrupt(0,wakeUp, RISING); //set level interrupt while(sleep_flg){ noInterrupts(); //cli(); sleep_enable(); interrupts(); //seii(); sleep_cpu(); //cpu sleep sleep_disable(); byte adcsra_old = ADCSRA; //NEW ADCSRA = 0; //NEW ADCSRA = adcsra_old; //NEW } wdt_unset(); //watch dog timer unset detachInterrupt(0); //unset level interrupt } //set up void setup() { init_status(); pinMode(LED_PIN,OUTPUT); pinMode(ACC_IN, INPUT); pinMode(TIME_PIN1, INPUT); pinMode(TIME_PIN2, INPUT); pinMode(TIME_PIN3, INPUT); } //main loop void loop() { if(!digitalRead(ACC_IN)) { sleep(); //sleep if (digitalRead(0) == HIGH) { digitalWrite(5, HIGH); //delay(1800000); // Wait for 1800 second(s) uint16_t i; for (i = 0; i < 10*60; i++) { _delay_ms(1000); } digitalWrite(5, LOW); delay(1000); // Wait for 1 second(s) } else { if (digitalRead(4) < HIGH) { digitalWrite(5, HIGH); //delay(600000); // Wait for 600 second(s) uint16_t i; for (i = 0; i < 30*60; i++) { _delay_ms(1000); } digitalWrite(5, LOW); delay(1000); // Wait for 1 second(s) } else { if (digitalRead(1) < HIGH) { digitalWrite(5, HIGH); //delay(36000000000); // Wait for 3600 second(s) uint16_t i; for (i = 0; i < 60*60; i++) { _delay_ms(1000); } digitalWrite(5, LOW); delay(1000); // Wait for 1 second(s) } else { delay(1000); // Wait for 1 second(s) } } } sleep(); //sleep } }

質問者が選んだベストアンサー

  • ベストアンサー
  • TIGANS
  • ベストアンサー率35% (244/680)
回答No.3

とりあえずご希望の用途であれば ①タイマ開始のトリガにはAVRマイコンの機能である5番ピンのLowレベル割り込み(INT0)を使って割り込み駆動にするべき ②リセット後は128kHzクロックに切り替え割り込みが来ないときにはパワーダウンモードに入りクロックを止めて割り込み待ち ③10分、30分、60分のタイマー動作はウォッチドッグタイマー最大で8秒ごとに割り込みかかるので毎回CPUをパワーダウンしながら75,225,450をカウントしてタイマー動作させる。 でも120mAhのLR44電池2個直列でフォトカプラを駆動するとなると 5mA動作でも24時間分しか無いですよ。60分タイマーなら24回使ったら電池無くなりますよ。

ponpon8626
質問者

補足

ご教授、ありがとうございます。 やはり、5番ピンのLowレベル割り込み(INT0)を使って割り込み駆動が良いのですね。 ②、③は自分の理解度では難しいかもしれませんが、頑張ってやってみたいと思います。 ちなみのLEDは動作確認のためで、実際は通信機のスイッチをONにしたいと思っていますので、スリープで駆動できる時間は1年程度、フォトカプラをONにする時間は400時間程度あればと考えています。 通信機の送信スイッチの電気的特性 接点入力条件 Open:端子間抵抗1MΩ以上、Close:端子間抵抗200Ω以下 信号検知 Open→Closeの片エッジ 極性 無し

その他の回答 (3)

  • kaba__san
  • ベストアンサー率46% (27/58)
回答No.4

>LEDはフォトカプラの動作確認です。実際はスイッチのON-OFFをフォトカプラでしたいだけです。 いやいや・・・・フォトカプラの中のLEDを言ったんですけどね。 フォトカプラの中身ってどうなるか知らないんですか? ジャンパーの電力削減なら。IOピンが一つ余ってるんだからマイナスコモンをそのピンにあてて、待機中はHighにしとけばいいんです。 必要な時だけLowにしてジャンパーの状態を読めばいい。 フォトカプラじゃON時電流がでかいので、許されるならFETを使えばいい。電圧制御素子なので駆動電流を限りなくゼロに出来ます。

ponpon8626
質問者

補足

お世話になっております。 ご回答、ありがとうございます。 LEDを外にも使用していましたので、フォトカプラの中のLEDとは気づきませんでした。 すみませんでした。 フォトカプラの中身は理解しています。 >ジャンパーの電力削減なら。IOピンが一つ余ってるんだからマイナスコモンをそのピンにあてて、待機中はHighにしとけばいいんです。 必要な時だけLowにしてジャンパーの状態を読めばいい。 なるほど、やってみます。 >フォトカプラじゃON時電流がでかいので、許されるならFETを使えばいい。電圧制御素子なので駆動電流を限りなくゼロに出来ます。 接続する機器の関係で、フォトカプラかリレーで行う必要がありましたので、FETは使えません。

  • hahaha8635
  • ベストアンサー率22% (800/3609)
回答No.2
ponpon8626
質問者

補足

ご教授いただきましたサイトも参考にさせていただきましたが、ジャンパーピンの選択とボタンONでスリープから抜ける方法が分からず、別なサイトの情報からコード書きました。 ご教授いただきましたサイトも参考に勉強してみます。 ありがとうございました。

  • kaba__san
  • ベストアンサー率46% (27/58)
回答No.1

かなり道のりは遠いですね。 Arduino言語で書かれているので若干なにがなんだかですが・・・・ ウォッチドッグをタイマー代わりに使っているのに、なぜdelayを使うのか? LED点灯中はずっと電力を使っちゃうのですか? まあ、フォトカプラのLEDほど消費しないのでどうでもいいですが。 タクトスイッチが押されたらスリープから復帰しようとしています? 無理ですよ、そのピンはパワーダウン中は機能しません。 ジャンパーによってはプルダウン抵抗で常に電力消費しますね。 1年なんて夢のまた夢かな。

ponpon8626
質問者

補足

説明が不足しており、申し訳ありません。 >ウォッチドッグをタイマー代わりに使っているのに、なぜdelayを使うのか?  参考にしたサイトで、ウォッチドッグでスリープして消費電力を抑え、スイッチONでリレー等をONにしていましたので、それを参考にしました。  LEDはフォトカプラの動作確認です。実際はスイッチのON-OFFをフォトカプラでしたいだけです。  (すみません、どこのサイトか忘れました。) >タクトスイッチが押されたらスリープから復帰しようとしています? 無理ですよ、そのピンはパワーダウン中は機能しません。 ジャンパーによってはプルダウン抵抗で常に電力消費しますね。  ご指摘の通り、プルダウン抵抗で常に電力消費してしまうので、こちらで質問させていただきました。  ありがとうございました。

関連するQ&A

  • Arduino のプログラムについて

    下のプログラムはArduinoで、4個のバッテリーの電圧を取得して、あるバッテリー電圧が14.5V以上だったら、充電を停止し、14.5Vよりも低いバッテリーには充電をするようにしたいのです。例えば、4個のバッテリーの取得電圧が下の図の様な状況の時、それぞれのバッテリーに充電、充電停止を行いたいのです。 AnalogPin 0 → 14.8V → digitalPin 10 を充電停止(LOWにする) AnalogPin 1 → 12.8V → digitalPin 11 を充電(HIGHにする) AnalogPin 2 → 13.7V → digitalPin 12 を充電(HIGHにする) AnalogPin 3 → 13.0V → digitalPin 13 を充電(HIGHにする) 質問:下のプログラムでArduinoに書き込んで動作させてみると、バッテリーの電圧は読み取っているのですが、digitalPin10~13のHIGH、LOWがうまくいきません。良い方法を教えてください。 void setup() { Serial.begin(9600); pinMode(10,OUTPUT); pinMode(11,OUTPUT); pinMode(12,OUTPUT); pinMode(13,OUTPUT); } void loop() { float battery_v[4];            for(int i=0;i<4;i++){ float convert_v=analogRead(i)*5./1024; battery_v[i]=convert_v/30*130; delay(100); Serial.print(i); Serial.print(" is "); Serial.println(battery_v[i]); delay(100); for(int r=9;r<14;r++){  // ここから下の命令がうまく動作しません。 if(battery_v[i]>14.5){ // digitalPin は10~13です。 digitalWrite(r,LOW); // すべてのdigitalWriteが }else { // LOWのままか、HIGHのままになってしまいます。 digitalWrite(r,HIGH); // } }   } delay(1000); } 以上、宜しくお願い致します。

  • Arduino プログラミングのエラーについて

    現在、Arduino、4桁7セグメントLED(カソードコモン)、タクトスイッチ3つで、3人クイズ対決で利用する得点加算機を作成しています。 プログラムで、下記のようなエラーが出てしまいます。 invalid types 'int[int]' for array subscript このエラーに対して、何か解決策があればご教授お願い致します。 下記にプログラムを載せます。 const int first_BUTTON = 0; //プレイヤー1の得点ボタン const int second_BUTTON = 1; //プレイヤー2の得点ボタン const int third_BUTTON = 4; //プレイヤー3の得点ボタン const int anode_a = 12; //アノードに接続するArduinoのピン const int anode_b = 8; const int anode_c = 5; const int anode_d = 3; const int anode_e = 2; const int anode_f = 11; const int anode_g = 6; const int cathode_first = 7; // カソードに接続するArduinoのピン const int cathode_second = 9; const int cathode_third = 10; int val_1= 0; int val_2= 0; int val_3= 0; int old_val_1 = 0; int old_val_2 = 0; int old_val_3 = 0; // LEDの状態(0ならオフ、1ならオン) int state_first=0; int state_second=0; int state_third=0; int w; int N; // setup() は、最初に一度だけ実行される void setup () { // ピンを出力モードに設定する pinMode(first_BUTTON, INPUT); pinMode(second_BUTTON, INPUT); pinMode(third_BUTTON, INPUT); pinMode(anode_a, OUTPUT); pinMode(anode_b, OUTPUT); pinMode(anode_c, OUTPUT); pinMode(anode_d, OUTPUT); pinMode(anode_e, OUTPUT); pinMode(anode_f, OUTPUT); pinMode(anode_g, OUTPUT); pinMode(cathode_first, OUTPUT); pinMode(cathode_second, OUTPUT); pinMode(cathode_third, OUTPUT); } //LEDレイアウトを定義 boolean Num_Array[11][7]={ {1,1,1,1,1,1,0},//0 {0,1,1,0,0,0,0},//1 {1,1,0,1,1,0,1},//2 {1,1,1,1,0,0,1},//3 {0,1,1,0,0,1,1},//4 {1,0,1,1,0,1,1},//5 {1,0,1,1,1,1,1},//6 {1,1,1,0,0,1,0},//7 {1,1,1,1,1,1,1},//8 {1,1,1,1,0,1,1},//9 {0,0,0,0,0,0,0} //space }; //LED表示関数を定義 void NumPrint (int Number){ for (int w=0; w<=6; w++){ digitalWrite(w+1,Num_Array[Number][w]); } } boolean Led_Array[3][3]={ {1,0,0,}, //LED1 {0,1,0}, //LED2 {0,0,1} //LED3 }; void Led_Active(int Number){ for(w=0;w<=2;w++){ digitalWrite(w+11,Led_Array[Number][w]); } } // loop() は、setup ()実行後、無限に実行される void loop(){ for(int i=0;i<=2;i++){ NumPrint(N[i]) } Led_Active(i); delay(5); } val_1 = digitalRead(first_BUTTON); NumPrint(state_first); //変化があるかどうかチェック if((val_1 == HIGH) && (old_val_1 == LOW)) { state_first = (state_first+1) % 10; NumPrint(state_first); delay(300); } delay(100); old_val_1 = val_1; val_2 = digitalRead(second_BUTTON); NumPrint(state_second); //変化があるかどうかチェック if((val_2 == HIGH) && (old_val_2 == LOW)) { state_second = (state_second+1) % 10; NumPrint(state_second); delay(300); } delay(100); old_val_2 = val_2; val_3 = digitalRead(third_BUTTON); NumPrint(state_third); //変化があるかどうかチェック if((val_3 == HIGH) && (old_val_3 == LOW)) { state_third = (state_third+1) % 10; NumPrint(state_third); delay(300); } delay(100); old_val_3 = val_3; }

  • アルディーノのプログラムについて

    アルディーノのプログラムについてです。 アルディーノのプログラムについてです。 現在はトグルスイッチをON、センサーOFFでモーターが動きだし、センサーがONになるとそこからプラスで3.2秒モーターが動きその後停止し、またセンサーがOFFになるとモーターが動き出すと言うプログラムの動作を確認出来ています。この動作にモーターとセンサーをもう一つ加え、同じ動作をさせたいです。トグルスイッチは共通で、モーターの動きは対応しているセンサーによって独立させたいです。そこでプログラムを作ったのですが、このプログラムだと片方ずつしかモーターが動きません uint32_t time=3201; byte dir=2; byte pul=3; byte dir2=8; byte pul2=9; byte tgl_sw=6; byte sensor=7; byte sensor2=10; word wait_us=2500 ;//2500us*2*200→フルステップで約1RPS void setup() { pinMode(dir,OUTPUT); pinMode(pul,OUTPUT); digitalWrite(dir,HIGH); pinMode(dir2,OUTPUT); pinMode(pul2,OUTPUT);// digitalWrite(dir2,HIGH); pinMode(tgl_sw,INPUT_PULLUP);//※LOWでON pinMode(sensor,INPUT); pinMode(sensor2,INPUT);//※ } } void loop() { if(digitalRead(tgl_sw)==LOW && digitalRead(sensor)==HIGH) delay(2000); time=millis(); while(millis()-time<3200) {//センサがオンになってから1500msまで if(digitalRead(tgl_sw))return; digitalWrite(pul,HIGH);//回す delayMicroseconds(wait_us); digitalWrite(pul,LOW); delayMicroseconds(wait_us); if(digitalRead(sensor)==HIGH)time=millis();//センサがオフなら更新 } {if(digitalRead(tgl_sw)==LOW && digitalRead(sensor2)==HIGH) delay(2000); time=millis(); while(millis()-time<3200) {//センサがオンになってから1500msまで if(digitalRead(tgl_sw))return; digitalWrite(pul2,HIGH);//回す delayMicroseconds(wait_us); digitalWrite(pul2,LOW); delayMicroseconds(wait_us); if(digitalRead(sensor2)==HIGH)time=millis();//センサがオフなら更新 //停止 } } } 修正点を教えていただけるとありがたいです。よろしくお願いします。

  • arduinoで7セグメントを使いたい

    arduinoで下記のスケッチを使って7セグメントledを動かしているのですが、 /////////////////////////////////////////////////////////////////////////////////////////////////////// //LED表示関数を定義 void NumPrint(int Number){ for (int w=0; w<=7; w++){ digitalWrite(w+1,Num_Array[Number][w]); } } /////////////////////////////////////////////////////////////////////////////////////////////////////// (1)この部分がどのような動作をしているのかわかりません。 (2)また、arduinoMEGAを使用して22~29番ピンを出力にして動かそうとしても上手くいきません。 (1)についての説明と(2)の解決法を知りたいです。 よろしくお願いしますm(._.)m ↓使っているスケッチ(1~8番ピンが出力のもので上手く動作します) void setup(){ //1~8番ピン デジタル出力へセット for (int i=1; i<=8; i++){ pinMode(i,OUTPUT); } } //LEDレイアウトを定義 //0,1,2,3,4,5,6,7,8,9,0,. の順。 boolean Num_Array[11][8]={ {0,0,0,1,0,0,0,1},{1,1,0,1,0,1,1,1},{0,0,1,1,0,0,1,0},{1,0,0,1,0,0,1,0}, {1,1,0,1,0,1,0,0},{1,0,0,1,1,0,0,0},{0,0,0,1,1,0,0,0},{1,1,0,1,0,0,0,1}, {0,0,0,1,0,0,0,0},{1,0,0,1,0,0,0,0},{1,1,1,0,1,1,1,1} }; //LED表示関数を定義 void NumPrint(int Number){ for (int w=0; w<=7; w++){ digitalWrite(w+1,Num_Array[Number][w]); } } void loop(){ for(int t=0;t<=10;t++){ NumPrint(t); delay(500); } }

  • Arduino 条件式

    Arduinoでシリアルモニタを使用しています。 それで、入力した数字を条件式で判断し、真ならLEDを光らせるプログラムを作りたいのですが、入力した数字をどのようなコードで描いたらいいでしょうか? ちなみに、if (Serial.readString() <= 40) { と書いたらダメでした。 #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); int RST = 3; int RstFlag = 0; int Tr = 4; int TrFlag = 0; int LED = 2; //初期設定 void setup() { pinMode(RST, INPUT); pinMode(Tr, INPUT); pinMode(LED, OUTPUT); lcd.init(); lcd.backlight(); //起動後一回のみ表示 lcd.setCursor(2, 0); lcd.print("Lab"); delay(2000); lcd.clear(); //シリアル通信開始 Serial.begin(9600); } void loop() { RstFlag = digitalRead(RST); TrFlag = digitalRead(Tr); lcd.setCursor(0, 0); lcd.print("Auto Mode"); lcd.setCursor(0, 1); lcd.print("Trigger = "); //シリアルポートにデータがあるか判断 if (Serial.available()) { delay(100); lcd.clear(); //データがある場合の動作 if (Serial.available() > 0) { //print"ln"はモニタに入力後改行するコマンド Serial.println("LCD Received!"); //Serial.readString():データを”文字列”として読み込む lcd.setCursor(10, 1); lcd.print(Serial.readString() + "s"); } } if (RstFlag == 0) { delay(100); lcd.clear(); Serial.println("LCD Clear!"); } /*if ( ○○○ <= 40) { //仮に40とする delay(100); Serial.println("Trigger Out!"); digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(200); digitalWrite(LED, HIGH); delay(200); digitalWrite(LED, LOW); delay(200); } */ length(readString()); }

  • pic 16f84a割り込み処理について

    pic cともに初心者です。 至らないところなどございますが、よろしければご教授くださいm(__)m 現在pic 16f84aで、電球の明るさ(交流100v)を決まったタイミングでフェードインフェードアウトさせる回路を製作しています。 コンパイラはccs社のpcm、MPLAB使用です。 基本的なプログラムの構成についての疑問です。 まず (1)インターバルタイマを使用し、タイマを10msec(約)に再セット。 変数icount で秒数をはかり、 メイン関数では、それを元にduty という変数(0-255)を変化させます。 #int_timer0 void intval(){ set_timer0(0x3c); icount++; } その処理に平行して (2)ゼロクロスパルスの割り込みをRB0への入力から発生させます。 RB0にはハードから入力(H_to_L)がはいるように出来ており これも10msec毎です。 #int_EXT void isr(){ int i if((duty > 10) & (duty < 250)){ delay_us(200); for(i = 0; i <(255-duty); i++){ delay_us(38); output_low(PIN_C5); delay_us(100); output_high(PIN_C5); } else{ if(duty <= 10){ output_high(PIN_C5); } else{ output_low(PIN_C5); }} メイン関数では duty を icount(時間)によって、変化させる関数を書きます。 25秒かけて、消灯状態から(duty= 0)点灯(duty = 255)まで スムーズに変化させます。 疑問点は 上記の二つの割り込みは、ともに10msec 毎で、(2)の割り込みに至っては いちど割り込むとdelay が多いので10msecの間ほとんど割り込み禁止です。 こういう場合でも、問題なく二つの割り込みは動いてくれるのでしょうか?(1)のカウントがある程度正確に動いてくれないと、秒数が狂ってしまうので、不安です。 また、この段階で、考え方そのものが間違っていないかも わかりません。 よろしければ、ご意見などいただけると幸いです。 なにとぞ、よろしくお願いいたします。

  • MPLABでのビルドがうまくいかない

    C、picともに初心者です。 いまだにビルドがうまくいかず、書き込みができなくて困っています。 以下のようなソースです ・・・・・・・・・・・・・・・・・・・・・・・・・ #include <12f675.h> #fuses INTRC_IO,NOWDT,NOPROTECT,BROWNOUT,NOMCLR //#device ADC = 10 #use delay(CLOCK = 4000000) #use fast_io(A) #define GP0 PIN_A0 #define GP1 PIN_A1 #define GP2 PIN_A2 #define GP3 PIN_A3 #define GP4 PIN_A4 #define GP5 PIN_A5 #define DAN 255 void main() { set_tris_A(0x04); setup_adc(ADC_OFF); setup_comparator(NC_NC_NC_NC); setup_vref(FALSE); setup_counters(RTCC_INTERNAL,RTCC_DIV_32); setup_timer_1(T1_DISABLED); while(1) { int i,j,k; for(i=0;i<DAN;i++) { for(k=0;k<DAN-i;k++) { for(j=0;j<i;j++) { output_a(0x12); delay_us(10); } for(j=0;j<DAN-i;j++) { output_a(0x00); delay_us(10); } } } } } ・・・・・・・・・・・・・・・・・・・・・・・・・ エラーメッセージは以下のとおりです。 Clean: Deleting intermediary and output files. Clean operation failed. BUILD FAILED: Fri Aug 01 13:19:45 2008 簡単な事のように思いますが、なぜうまくいかないのかわかりません。 よろしければ、ご教授ください。。

  • PIC I2C について

    8ビットのデータを送り、そのままスレーブのLEDに反映させるプログラムを組んでいます。 マスターからはリピートして何度もデータを送ります。 このとき、なぜか一瞬アドレスのビットデータをLEDに反映させてから本来のデータを表示します。 つまり、アドレスとデータを交互にLEDに表示する状況です。 たとえば、アドレスが 0b1111111 データが 0b00000000 だとします。 本来LEDは消灯状態にならなくてはいけないのですが、なぜか一瞬アドレスデータの内容で光ります 原因がお分かりの方はいらっしゃいますか? 使用PIC PIC16F873A //master #use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3, SLOW, RESTART_WDT, FORCE_HW) output_float(PIN_C3); output_float(PIN_C4); while (1) { i2c_start(); i2c_write(AddData << 1); i2c_write(sBitData); i2c_stop(); delay_ms(50); } //slave #use i2c(SLAVE, SDA=PIN_C4, SCL=PIN_C3, ADDRESS=0x00, SLOW, RESTART_WDT, FORCE_HW) output_float(PIN_C3); output_float(PIN_C4); while (1) { if (i2c_poll()) { indata = i2c_read(); output_b(indata); } }

  • C言語プログラミングについて…Arduinoを用い

    C言語プログラミングについて…Arduinoを用いて、以下の文でスイッチ「RedSwitch(赤スイッチ)」が押された回数だけ後で光るというプログラミングを作りました。次にその使用した「switch case」文を「if」文、もしくは「if else」に変換して同じプログラミングを作りなさいという課題が出て、いろいろと変えてみたのですが、シリアルモニタを見るとif文を用いた時に「RedSwitch」が押された「回数」ではなく連続的に?押した「秒数」をカウントして困ってます。どうやったら改善できるのでしょうかか?ご教授お願いしたします。 void sw_check(void) { switch(SW_RedSwitch) { case 0: if ( digitalRead(2)==SW_ON ) { SW_RedSwitch=1; } break; case 1: if ( digitalRead(2)==SW_OFF ) { SW_RedSwitch=2; } break; } } void blink(void) { digitalWrite(13,LED_ON); delay(500); digitalWrite(13,LED_OFF); delay(500); } void loop() { unsigned char SW_CNT=0,SW_TIME=0,i; while( (SW_TIME<100) || (SW_CNT==0) ) { sw_check(); if ( SW_RedSwitch==2 ) { SW_RedSwitch=0; SW_CNT++; SW_TIME=0; } SW_TIME++; delay(20); } for (i=1 ; i<=SW_CNT ; i++) { blink(); } }

  • hard reset aquos sh-01g

    hi sorry i am from Pakistan i cant speak Japaneses language i have ntt docomo aquos sh-01g but i didnt find any way how to hard reset it please reply me as soon as possible because my phone locked i cant open it i want to hard reset it thanks i will wait for reply ※OKWAVEより補足:「ドコモの製品・サービス」についての質問です。