今回のプログラムはかなり長い。ATTiny2313のメモリを100%近くまで使っている。長けりゃいいってもんじゃない。増設を繰り返すうちにこうなってしまった。○適マークのもらえない温泉旅館のようだ。
処理は単純でマイコンAttiny2313の中に時計をセットし、正時になったら設定された秒数だけポンプモーターを回す、というものである。ひまわりタイマーという物があるが、あれのマイコン版である。
最初はやはりお約束のコメント。内部クロック8MHzを1/8分周している。ヒューズビットの設定値。各ポートの割付けなどを書いてある。後に読み返すときにはとても助かるので必ず書いておこう。しばらくするとわからなくなってしまう痛い経験から学習した習慣。
変数の定義、ポートの入出力設定やタイマーカウンターの設定、変数の初期値設定などが終わるとサブルーチンの設定。今回は7セグの表示と、ポンプモーターのPWM制御を行う2つのサブルーチンを設定する。尚、入力に設定したポートに1を書き込むとプルアップされるという便利な機能がある。

prog1
Onoffという配列変数が出てくる。これは各時間のポンプモーターの運転時間(秒)が設定されている。0なら運転しない。ゴーヤが小さいうちはそれほど水をやらなくても良いのだが、大きくなり気温も上がるにつれ水の量を多くするために運転時間が多くなる。その値はゴーヤの様子を見ながらなので変数の値は頻繁に変えるようになる。
prog3
初期設定が終わったら、時計の設定に入る。ここは人間が設定してやらなければならない。分、秒まで正確に設定する必要もないし、水晶発振でないので狂いは当然でてくる。数分だろうが数十分だろうが狂っても影響ないのでイイカゲンでよしとする。
prog4
最初に10分の値を合わせる。Bポート0番につながったSWを押すと、0.3秒ごとに1から5そして0を繰り返す。精確な時間近くになったらSWを離し、Bポート1番につながったSWを押す。10桁用7セグの一番上のセグメントが2回点滅し設定が終わる。
prog5
次に時間設定になる。Bポート0番のSWを押すと進み、Bポート1番のSWを押すと戻る。現在時に合わせ、Bポート0番SWとBポート1番SWを同時に押す。これで時刻設定は終わりスタートする。10秒後には表示も消え省エネモードになる。
prog6
さて、常時走るメインルーチンの説明へと入ろう。最初に現在時間を変数に入れ、表示も10秒間ONとする。 DO〜LOOPの無限ループに入る。時間管理はタイマーが行い、0になったら割り込みをかけて処理する。 無限ループ内での処理。Bポート0番SWが押されたらテストモードONで強制的に5秒間ポンプを運転する。ポンプやタンクの運転状況、配管と給水の状況確認をするために便利な機能。
3600秒になったら時間を1進める。その時間の配列変数Onoff()の値が0以上なら運転時間をOpにセットしてポンプ運転サブルーチンPwm()に飛ぶ。

prog7
次は表示サブルーチン。引数は時間値を渡す。24時間表示ができればよかったのだが、ピン数が足りなかったのでAM,PM表示でPMの時はAポート1番ピンを1にして10桁用LEDの一番上のセグメントを点灯してPM表示とし、表示時間値を実時間−12とする。つぎに、2桁時(10時、11時、12時)の処理でBポート4番ピンを1にして1_時と−10して1桁用LEDの表示データとする。
ポンプモータをONする時間帯は1桁用LEDのドットを点けて区別している。
このように処理した表示データの配列変数の値をDポートに送りLEDを点灯している。尚、各表示出力の前にEnbsw変数の値をチェックしているが、これは省エネスイッチでBポート1番SWが押されるとEnbswの値が10秒間だけ1となる。この間LEDをONしている。
わかりにくい説明で申し訳けないが、リストを読みながら書いているとよくこんなプログラムで動いているなと思ってしまう。実機で動かしながら作ったのでスマートではない、つぎはぎ張り合わせ、張子の虎である。

prog8
クロックは内部発振と分周で1MHzに設定している。クリスタルほど正確でないが実用範囲といったところ。 タイマーが250でカウントアップし割り込みをかける。ここではその割り込み処理を行っている。
初期値4000から割り込みの度に−1し、0になったら処理ルーチンに入る。250×4000=1MHzで処理ルーチンは1秒ごとに走るしくみである。
先ず省エネタイマー、後から付けたのであるが、10カウントしている間はLEDの表示がONとなっている。また、Bポート1番ピンがオン(0に)なったら初期値10を設定している。こんな単純なしかけでも消費電力は大幅に減った。
次に1秒ごとにLEDの表示を現在時と設定時の表示を繰り返している。1秒現在時を表示すると次の1秒は設定時を表示する。ポンプモーターが運転する時間は7セグのドットが点灯する。設定時は24時間を繰り返して表示する。少ない7セグ表示器で少しでもモニターしたい苦心の策。

prog9
最後はポンプモーターのPWM制御である。分数の分母が1024、分子が700であれば,ON時間700、OFF時間324の割合で制御している。周期はほぼ1KHzである。このオン時間は実験の結果で決めた。
起動トルクが必要だったので最初にガツンと放り込み、0.3秒休みにしている。休み時間でも慣性とフライホイールダイオードでモーターはまわっている。その後各時間ごとに設定された秒数のあいだ運転し、すぅーとゆるやかに止まる。すぅーと止まるのはポンプのクランクが都合よい位置で止まるためと、タンクの水撃作用をおさめるため、とカッコつけたいが単なる飾り、遊びの範囲である。
各時間の運転秒数はグローバル変数で渡している。当初は運転秒数とON時間をローカル変数で渡し各時間ごとに特色ある運転をと試みた。結果はRAMが足りなかったようで、スタックがオーバーし引数がメチャクチャになってポンプモーターが運転しっぱなしとなった。タンクは空になってしまったが、幸い空気を送り込む方式なのでそれ以上の浸水はなかった。
コンパイルすると90%以上の容量を使っているのでこのあたりで限界であろう。
GOYAhard編へ
ホームページへ戻る 管理人室へ戻ります。