Power MOS FET をインターフェースとして使用する
書きかけ途中です
現在時刻の時間帯を識別(朝 午前 午後 昼 夕方 夜 真夜中)
現在時刻がどの時間帯であるか識別・判別するプログラムです。例えば「朝」と識別させる
には、朝とは時刻が~から~でると定義しておく必要があります。
プログラムの一部を載せます。
真夜中にある動作を予定している場合、自分が考える真夜中の時間帯をif文にセットします。
時刻範囲の指定のif文は間違いやすいので、事前にシミュレーションすると良いです。
char *hour_str = strtok(p_Ntime, ":");
char *minute_str = strtok(NULL, ":");
Serial.println(hour_str);
Serial.println(minute_str);
int hour = atoi(hour_str);
int minute = atoi(minute_str);
if ((hour >= 18 && minute >= 00) || (hour <= 4 && minute >= 00)) {
// 04時00分は真 04時01分は真 04時59分は真 05時00分は偽 05時01分は偽
// (注意)04時代は真となる. 00時代~04時代は真となる。18時以降は真となる。
//if ((hour >= 17 && minute >= 30)) {
// 17時30分 以降 真 00時00分 偽
// 夜間の時間帯にある場合の処理を想定
digitalWrite(led4, HIGH); // LEDを点灯させる
delay(1000);
digitalWrite(led4, LOW);
Serial.println("●◎A [真 true] 動作です●");
} else {
// Bの動作を行います
digitalWrite(led5, HIGH); // LEDを点灯させる
delay(1000);
digitalWrite(led5, LOW);
Serial.println("△B [偽 false] else動作です.");
}
次回はプログラムの全体を載せる予定です。
*獣害動物が夜の何時に出没するのか? 人間の活動時間外に出没している事は確かです。
獣害動物が出没した時の時刻を知りたくなりました。
もしその時刻に集中して出現しているようなら、その時間帯で威嚇すれば効果があるかもしれません。
より高度な対策装置を考えるなら、画像認識により獣害動物を識別して警報を発する方法が一番です。(ハイレベルです)
獣害動物の出現をどのようにして検知するか!!
RTC実験風景
RTC 時刻範囲での動作
例えば、「マイコンに夜間帯においてある動作をさせたい」この事の実験です。
良好に動作しました。
RTCの内蔵アラームを5件セット
[12:00]にアラームをセットしました。
見事! 応答しました。 ◎
(16:00の表示はこの資料の撮影時刻です。気にしないでください)
内蔵設定時刻になるとRTCはarmx xは1~5を返します。
テストプログラムの実行状態です。
-----------------------------
基板番号 機能
9~ D9
8 D8
7 D7
6~ D6
5~ D5
4 D4
----------------------------
Arduino Uno に5個のLEDを上記対応表のよに取りつけました。
取得時刻の下1桁が[0],[3],[5]に一致したらLEDを点灯(1分間)させたり、[xx:xx]の指定時刻と一致したらLEDを点灯させたりプログラムの確認をしました。
またRTC-10の内蔵アラームは5件設定できます。
このアラーム設定は[xx:xx]の形式で登録します。
下写真 現在時刻の1桁が[5]に一致しました。
Atariに2重まる。◎を表示させました。
(現在時刻が15:45ですが、シリアルモニタの10分前にスクロールした写真を撮影しています。)
内蔵アラームも問題なく動作しました。良好です。
しかし、内蔵アラームは使用しません。
自作プログラムで柔軟に対応できます。
*2つの時刻の大小関係のプログラムの理解が要求されます。
*以上により私が眠っている夜中の指定した時刻に動作を可能にできます。
また、バッテリーの消耗も防止できると思います。
照度センサーで「夜中」を判定する場合は、範囲が広すぎ単に「暗い」の判定しかできません。月夜? こんなときもあるわけですので。
RTC内蔵のアラームの実験
「RTC-10」には5件のアラーム時刻を登録できます。
登録形式は[xx:xx] です。日についてのアラーム登録はできません。
登録すなわちセットした時刻になると[arm1],[arm2],[arm3],[arm4],[arm5]と返します。
よって、Arduino Uno のプログラムでこの[xxxx]の4文字を照合すればアラーム時刻を活用できると考えます。
これから[arm1]を登録し実験します。
内蔵アラームは使用しないことにしました。
理由は[arm1]を受信後、受信並びがずれ以降の時刻表示が乱れました。
確実性のあるプログラムにはまだ至っていません。
また、設定もTera Termの画面上で行う必要がありややこしさもありました。
Arduino Unoのプログラム上より実行させることで十分です。そして、自分のプログラムである事より柔軟性に優れています。
取出した[時分]の活用(レベル3)
[05:30]にアラームをセットしました。
ここで言うアラームとはRTC-10独自のアラームとは違います。
誤解無いようにお願いします。
時刻5桁(5文字xx:xx)を照合し、現在時刻がアラーム時刻と一致するとLEDを点灯します。点灯時間は1分間です。
分の桁上げが発生するまで点灯は継続することになります。
Arduino Uno には5個のLEDを取付けました。理由はプログラムの実行位置を確認するためです。if文などでは、論理がややこしくなりシーケンスの確認が必要です。
確認方法として他には、シリアルプリント命令を使用して分かりやすい記号を印字する方法を採用しました。
気づいた事をランダムに記します。
・ハード部ですが、RTCの受け端子(Rx)を構築する必要があることです。
0,1番ピンを使用してはいけません。
・C言語の配列・文字・文字列の扱いが要求されました。
・ポインタの使用は避けて通れません。ポインタの威力を実感しました。
・Chat GPTと私のコラボとも考えられます。しかし、相当の修正が余儀なくさ れ ました。参考書をめくるより早いです。
・11番ピン(Tx端子)に構築しましたが、ジャンパー(配線)は外しています。
今のところ未使用です。
#include <stdio.h>
#include <string.h>
#include <SoftwareSerial.h>
SoftwareSerial rtcSerial(10, 11);// RTC-10のTxをArduinoの10番ピン(Rx)に接続し、11番ピン(Tx)を使用して通信する
--------------- ----------------- -------------
if (rtcSerial.available() >= 6) {//if_1 // RTC-10から10バイトのデータが受信可能な場合 6でok
char nowTime[6];// 受信したデータを格納する文字配列 [要素数] 6でok 現在時刻の意味
rtcSerial.readBytes(nowTime, 6); // データを読み込み、nowTimeに格納する 6でok
nowTime[6] = '\0';// 文字列の終端を追加する
Serial.println(nowTime);// Arduinoのシリアルモニターに受信したデータを表示
char* firstColon = strchr(nowTime, ':'); // 最初のセミコロン「:」を検索する firstColonが文字型のポインタであることを示し
//strchrは「ストリング・クラ」と発音します。
//nowTime文字列内で最初に見つかったセミコロン(:)のポインタを返す関数です。
//セミコロンが見つからない場合はNULLポインタを返します。
---------- ----------------- ----------------
char nowTime[6];// 受信したデータを格納する文字配列 [要素数] 6でok 現在時刻の意味
char *p_Ntime;//ポインタ(アドレス値を格納している) ポインタNewTimeの意味
p_Ntime=nowTime;//配列の先頭のアドレス値を格納する
char *p_alarm;//ポインタ(アドレス値を格納している) ポインタalarmの意味
Serial.println(p_Ntime);//ポインタNewTimeの意味
Serial.println("p_alarm");//ポインタalarmの意味
Serial.print(p_alarm);//シリアルモニタに印字(変数p_alarmの内容)
p_alarm="06:05";//ポインタalarmに04時03分をセット @@@@@@@@@@@@@@@
Serial.println(p_Ntime);//ポインタNewTimeの意味
Serial.println("p_alarm");//ポインタalarmの意味
Serial.print(p_alarm);//シリアルモニタに印字(変数p_alarmの内容)
if(strncmp(p_alarm,p_Ntime,5)==0){//2つの文字列の比較 5文字
Serial.println("_Atari◎");//あたり
digitalWrite(led1, HIGH); // LEDを点灯させる
} else{
Serial.println("_Hazure○");// はずれ
digitalWrite(led1, LOW); // LEDを消灯
}
================
順序はランダムです。ここに出ている命令は意味があります。
その意味で掲載しました。
非常にランダムに不完全な記載です。ご承知ください。勘所の参考にして下さい。
別機会にプログラム(スケッチ)の全容を掲載したいと思います。
RTC-10に着手してから3週間経ちました。
RTC-10の時刻の取出し-3
スケッチ(プログラム)の様子
ここまでがRTCの扱いの私が思うレベル2です。
レベル3として、「この現在時刻_1と設定した時刻_2が一致したときLEDを点灯」させる。
この事が出来たら目標達成です。
RTCの難関 ここからです!
この現在時刻いや5分遅れ時刻でも十分です。
Arduino UnoマイコンのSerial monitor(シリアルモニタ) を眺めていても進展しません。