怠惰になるために本気出す

電子工作で色々作ってます

USB扇風機を改良!

以前市販のUSB扇風機に外付けでリズム風とタイマー機能を追加するギミックを作りました。
iotblog5296.hatenablog.com

前回の記事文末でも言っていますが10秒サイクルでしかスイッチを識別していないため最長で10秒経過しなければ通常モードからリズム風モードに切り替わることができない仕様になっていました。
普段使っていくうえで差支えは全くないのですが、ふとした時に気になり始めてしまし意識し始めると急に煩わしくなってきたので修正することにしました。

ソフト作成

int t1, t2, t3, timer1, timer2;
int tm1=0;
int tm2=0;
int timerstatus=0;
int normalcount=1;
int rismcount=1;
int rismcounton=1;
int rismcountoff=1;
int pin1=7;
int pin2=9;
int t=0;
int out=11;

void setup() {
  pinMode(out, OUTPUT); //出力ピン
  pinMode(pin1,INPUT); //タイマー1入力
  pinMode(pin2,INPUT); //タイマー2入力
  pinMode(5,INPUT); //リズム風用入力
}

void loop() {
  t1=digitalRead(pin1);
  t2=digitalRead(pin2);
  t3=digitalRead(5);
  if(t1==HIGH && t==0){ //タイマー1がON
    timer1=10800; //タイマー1に3時間
    timerstatus=1;
    while(tm1<timer1){
      if(digitalRead(5)==HIGH){ //リズム風ON
        Rism();
        rismcounton=1;
        rismcountoff=1;
      }else{ //通常ON
        Normal();
        normalcount=1;
      }
      tm1=tm1+1;
      if(digitalRead(pin1)==LOW){ //タイマー1をリセット
        tm1=0;
        break;
      }else{ //タイマーが満了時
        t=1;
        delay(200);
      }
    }
    
  }else if(digitalRead(pin2)==HIGH && t==0){ //タイマー2がON
    timer2=21600; //6時間
    timerstatus=2;
    while(tm2<timer2){
      if(digitalRead(5)==HIGH){
        Rism();
        rismcounton=1;
        rismcountoff=1;
      }else{
        Normal();
        normalcount=1;
      }
      tm2=tm2+1;
      if(digitalRead(pin2)==LOW){
        tm2=0;
        break;
      }else{
        t=2;
        delay(200);
      }
    }
  }else if(t1==LOW && t2==LOW){ //タイマーなし
    t=0;
    tm1=0;
    tm2=0;
    timerstatus=0;
    if(t3==HIGH){
      Rism();
      rismcounton=1;
      rismcountoff=1;
    }else{
      Normal();
      normalcount=1;
    }
  }else{
    if(t1==HIGH && t==2){ //タイマー1リセット
      t=0;
    }else if(t2==HIGH && t==1){ //タイマー2リセット
      t=0;
    }else{ //タイマーリセットかかるまでOFF
      digitalWrite(out,LOW);
      delay(200);
    }
  }
}

void Normal(){
  while(normalcount<50){
    digitalWrite(out,HIGH);
    delay(200);
    if(digitalRead(pin1)==HIGH && timerstatus!=1 || digitalRead(5)==HIGH){
      normalcount=1;
      break;
    }else if(digitalRead(pin2)==HIGH && timerstatus!=2 || digitalRead(5)==HIGH){
      normalcount=1;
      break;
    }else{
      normalcount=normalcount+1;
    }
  }
}

void Rism(){
  while(rismcounton<=35){
    if(digitalRead(pin1)==HIGH && timerstatus!=1 || digitalRead(5)==LOW){
      rismcounton=1;
      
      break;
    }else if(digitalRead(pin2)==HIGH && timerstatus!=2 || digitalRead(5)==LOW){
      rismcounton=1;
      break;
    }else if(digitalRead(pin1)==LOW && digitalRead(pin2)==LOW && timerstatus!=0 ||digitalRead(5)==LOW){
      rismcounton=1;
      break;
    }else{
      rismcounton=rismcounton+1;
    }
    digitalWrite(out,HIGH);
    delay(200);
  }
  while(rismcountoff<=15){
    if(digitalRead(pin1)==HIGH && timerstatus!=1 || digitalRead(5)==LOW){
      break;
    }else if(digitalRead(pin2)==HIGH && timerstatus!=2){
      rismcountoff=1;
      break;
    }else if(digitalRead(pin1)==LOW && digitalRead(pin2)==LOW && timerstatus!=0 || digitalRead(5)==LOW){
      rismcountoff=1;
      break;
    }else{
      rismcountoff=rismcountoff+1;
    }
    digitalWrite(out,LOW);
    delay(200);
  }
}


ソフトが完成して正常に動くかテストしみてるとどうも挙動がおかしい。
ハード面は何も変えてないはずなのでソフトにどこか抜け道があるのではないかと血眼になって探していたのですが、色々原因を探っているとどうやら入力ピンがおかしいそう。トグルスイッチ入力に対してソフト上では違う入力ピンがONしていることになっており、テスターで抵抗を測定するとどうやらプルダウン抵抗が浮いている状態になっていたようです。
直接的な要因にはなっていないですが前回外部割込み関数を使おうと無理やり渡り線を加えていたのですが、それを外して元々使用する予定だったピンに変更しました。

おそらく以前は10秒サイクルで入力ピンの判別を行っていたので接触不良があっても大して影響がなかったのですが、今回0.2秒サイクルで入力ピンの判別を行っていたためこのような事態を招いたようでした。

まとめ

不満だった10秒サイクルでしか切り替わらない問題は解消されましたが、新たな問題も発生しました。
コードを読み込むとわかるのですがおやすみタイマーが起動している状態で通常ーリズムを切り替えるとタイミング次第では最大10秒差し引かれて動く仕様となっています。
おやすみタイマーを使用する場合は概ね数時間単位になると思うので数時間のうちの10秒ならそれほど支障はありません。が、高速で通常ーリズムをトグルスイッチを何度も切り替えるとその都度10秒差し引かれるので3時間のタイマーでも頑張れば1080回トグルスイッチを切り替えるとタイマーが終了するので数分で終わることもできます。
修正しよう思いましたが、ちょっと面白かったので隠しコマンド的な感じでそのまま残しておこうと思います。

ソフト修正だけの予定でしたがハード面が原因による不良が発生していまい思わぬところで足を取られてしました。素人感満載のはんだや配線で接触不良もあるでしょうし今後プリント基板を自作してみたいですね。