google-site-verification: google3bd66dd162ef54c7.html

ソーラータイマースイッチの製作 基本検討

 以前、日の出・日の入り時刻をArduinoを使った計算で求めてみました。この計算には三角関数を何度も(約40回)使わないといけないので、計算時間が心配でした。しかしやってみると数ミリ秒で結果が出て来て処理速度には問題が無いことが判りました。それに計算誤差も最大で50秒くらいに収まっていて、日の出・日の入り時刻の予想に使うには問題無さそうなことが確認出来ました。

 つまりArduinoを使って日付と位置情報から日の出・日の入り時刻が計算出来る訳です。こうなると応用問題として、夜になると自動的にスイッチが入るタイマーを作ってみたくなります。

◆夜になったらスイッチを入れる方法
 ところで、夜になると自動的にスイッチを入れる方法として、タイマーを使うことを最初に考えると思います。でも日の出・日の入り時刻は季節によってかなり変わるので、年に数回以上タイマーの設定値を変える必要があります。これでは大変です。
 他の方法として明るさセンサーを使う手があります。つまり外が暗くなってきたら夜が始まったと判断する方法です。でもこの方法ではセンサーの設置や配線が必要になります。ということで、どちらの方法もちょっと難点があります。

◆ソーラータイマースイッチ
 その日の、日の出・日の入り時刻を自分で知ることが出来れば、上に書いたような問題が解決出来ます。実はこういう機能を持った製品は、ソーラータイマースイッチという名前で売られています。でもこれ、制御盤に取り付ける機器なので値段は高くて1万円以上します。

 だったらArduinoで作ってみよう、というのがこの記事の趣旨です。

▼回路図(実験用)
ソーラータイマーの回路図
 ArduinoにRTC(リアルタイムクロック)とキャラクタ液晶をI2Cで接続しています。どちらも電源電圧5Vで動くのでレベル変換無しでArduino UNOに接続できます。

 Timer Outの信号は相手に合わせたインターフェイスが必要になりますが、そこは後でどうにでもなるので、とりあえずこの状態でプログラムを作っていきます。

 以前の記事でI2Cキャラクタ液晶のライブラリをあれこれ選んでいましたが、実はこの回路を作るのが目的でした。

▼スケッチ
 まだ全部完成していませんが、基本的な機能は動くようになっています。ソーラータイマースイッチのスケッチはこちら(拡張子をinoに要変更)
 RTCのライブラリは以前使った経験があるRTC8564.hを使いました。実は最初はきむ茶工房さんのRTCライブラリを使いたくて、いろいろいじったのですが、割込みあたりの処理がうまく書けなかったので実績のあるものに戻しました。
 なお、もし実際に試される方は、ライブラリ、RTC8564.hを使う時の修正点をご覧ください。

▼動作中のメイン画面
メイン画面
 一行目に月日と時刻。二行目に日の出・日の入り時刻を表示します。つまり、この日の日の出は4時28分、日の入りは19時1分ということとです。なお、ボタン操作で西暦も確認できます。

▼時刻合わせ画面
時計時刻合わせ
 カーソルの位置の値を順番に修正していきます。こういう機能を作るのはかなり面倒ですが、以前作ったプログラムがほとんどそのまま使えたので助かりました。

▼経緯度確認画面
経緯度確認画面
 市販のソーラータイマースイッチでは設置場所を10種類くらいの地区から選ぶようになっていますが、このプログラムでは経緯度を直接指定する方式にしました。といってもこの画面は入っている値の確認用で、経緯度を変更したい時には再コンパイルが必要です。

◆プログラムのポイント
 以前作ったプログラムの寄せ集めで作ったので、新たに書いたのは20%くらいです。ポイントは以下の通りです。

 CPUは節電のために深いスリープに入れ、RTCから1秒間隔でピン割り込みを掛けて必要な処理を実行しています。プログラムの実行時間は約27msで残りの時間はスリープしています。ちなみに、スリープ中の消費電流は200μA程度になるはずです。(但しこれはCPU単独運転の場合の話で、UNOの状態では他の回路が電流を喰っているのでこんなに消費電流は減りません)
 
 現在のスケッチは日没から日の出までの期間に Pin10 にHIGHを出すようになっています。市販のソーラータイマースイッチの仕様を調べると、日の出・日の入り時刻の補正機能(各々±90分程度)と、固定時刻でON/OFFする機能を付けるのが普通のようなので、同等の機能を今後追加したいと思います。

◆まとめと今後の予定
 ソーラータイマースイッチとしての骨格の部分が完成したと思います。あとは使い易くするための機能の追加が残っていますが、このあたりはやり始めると切りが無いので、適当な所で切り上げるつもりです。複雑な処理をやりたい場合は専用のコードを書けば済む話です。

 ということで、時間が出来た時に少しずつプログラムを仕上げて行きたいと思います。
関連記事

コメントの投稿

管理者にだけ表示を許可する

活用させていただいています。

こんばんは。暑くなりましたね。
お陰様で日の出日の入りプログラム素晴らしく活躍しています。
自宅の電動シャッターの開閉装置に組み込みました。実は10年位前にpicで作ったシャッター開閉装置が有るのですが、季節月日に合わせて、その都度手動設定していたのすが、何台もあり設定がとても面倒で困っていました。
太陽ってじっとしていなく、あっという間に日の入り時間が変わるんですよね。冬の時間で設定してサボっていると、まだまだ明るいのに雨戸シャッターが閉まって近所にちょっと恥ずかしい気持ちになったり。
今回ラジオペンチさんがプログラム書いてくださったので、一台試作機を作りました。
内容としては、RTCから1分おきに信号が来たらスリープから復帰して、朝にシャッター開いて夜にシャッター閉じる。LCDの電源は消費電力を少なくするためarduinoのデジタルアウトpinからとり普段は表示オフで手動で表示するようにして単三電池3本で3年近くは持つ予定です。
殆どラジオペンチさんのスケッチを集めた物です。
1つ気になったのですが、ラジオペンチさんがarduinoを8Mhzで動かす時も、内部クロックを使わずセラロックを使っていますが、なにか問題が在るからですか?
部品数もハンダ付けも少なくなるのに何故なのか気になりました。

re:活用させていただいています。

hiroさん、おはようございます。プログラムを使っていただいて、ありがとうございます。

このプログラムで一番気になっているのは、1秒間隔で毎回、日の出・日の入り時刻の計算をやっているところです。この計算は日付が変わった時に一度やればいいので、ずいぶん無駄なことをやっているのが気になっていました。1分間隔で動かしているなら、少し罪が軽くなった気がします。

内部の8MHzオシレーターの件ですが、このオシレーターは周波数精度が悪いので、シリアル通信がうまくいかなくなる可能性があるので私はあまり使っていません。
まあ、実際は心配するほど精度は悪くないのかも知れませんが。

あと、内部オシレーターを使うと、外部水晶よりスリープからの復帰が大幅に速くなるので省エネという点で優れています。
http://radiopench.blog96.fc2.com/blog-entry-638.html

了解しました。

シリアル通信関係が不安定になる可能性があるのですね。
私の場合8MHzで使う時は、殆ど電池で使いスケッチ書き込んだらシリアル通信を繋げてなかったので何も気にしていなかったです。
疑問が解けました。

日の出日の入りの結果を見ていたら、これから日が短くなるみたいです。
感覚的にはこれから本格的な夏で日が長くなる気がするのに、なんか不思議です。

re:了解しました。

hiroさん、おはようございます

日照時間の変化に対して気温の変化が遅れるのは、地球の熱的な時定数の影響だったと思いますが、そういうことを実感できるのは面白いですよね。
カレンダー
10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード