対策装置の警報 時刻一覧
現在、電子音の改良中です。
- i以下 テレビニュースでの情報です
- 本年は熊による被害が多く発生し、ニュースになっています。
- 死亡事故も含むニュースです。
- ついに、AIカメラによる警報・威嚇装置の実証実験がありました。
- 会津大学の先生による研究です。
- カメラで熊を検知すると、相当大きな電子音およびストロボ発光があります。
- 犬の吠える音声も発していました。
- 熊は一目散に退散しました。ニュースでの情報でした。
対策装置の警報 時刻一覧
関数定義とその使用法 について(C言語)
===============================================
関数定義について プロトタイプ宣言とは。関数を定義し、その関数を使用する前に その型(プロトタイプ)を
コンパイラーに通知・教えます。その必要があります。
関数名 flash_1() について解説します。setup{ }内は1回だけの実行です。
以下の様に、3か所の位置での記述が必要になります。
1つ目が setup内、2つ目はloop内、3つ目は それ以外で定義内容を書くことになります。
================================================
setup{
flash_1();//プロトタイプ宣言 関数定義の前に ひな型をコンパイラーに通知します
}//setup
void loop() {//loop
flash_1();//定義関数の実行
}//loop
int flash_1()//以下定義した関数の内容です xx:x0 xx:x2 xx:x4 xx:x6 xx:x8
{
digitalWrite(ledPin8, HIGH); // LED赤1を点灯させる 確認Action
delay(1000);
digitalWrite(ledPin8, LOW);//LED赤1を
}
==============================================
秋分の日です。 20度以下になりました。
2023-09-23 02:38:00 19.2 mode 19.2
2023-09-23 02:48:04 19.2 mode 19.2
2023-09-23 02:58:08 19.2 mode 19.2
2023-09-23 03:08:12 19.2 mode 19.2
2023-09-23 03:18:16 19.2 mode 19.2
2023-09-23 03:28:20 19.2 mode 18.2
2023-09-23 03:38:23 19.2 mode 19.2
2023-09-23 03:48:27 19.2 mode 19.2
2023-09-23 03:58:31 18.2 mode 18.2
2023-09-23 04:08:35 18.2 mode 18.2
2023-09-23 04:18:39 19.2 mode 19.2
2023-09-23 04:28:43 18.2 mode 19.2
2023-09-23 04:38:47 18.2 mode 18.2
2023-09-23 04:48:50 18.2 mode 18.2
2023-09-23 04:58:54 18.2 mode 18.2
2023-09-23 05:08:59 18.2 mode 18.2
2023-09-23 05:19:03 18.2 mode 18.2
2023-09-23 05:29:07 18.2 mode 18.2
2023-09-23 05:39:11 18.2 mode 18.2
2023-09-23 05:49:15 18.2 mode 18.2
2023-09-23 05:59:19 18.2 mode 18.2
2023-09-23 06:09:22 18.2 mode 18.2
2023-09-23 06:19:27 18.2 mode 18.2
2023-09-23 06:29:31 18.2 mode 18.2
2023-09-23 06:39:35 18.2 mode 18.2
2023-09-23 06:49:36 error
2023-09-23 06:59:40 19.2 mode 18.2
2023-09-23 07:09:45 19.2 mode 19.2
2023-09-23 07:19:48 19.2 mode 19.2
「夜明け」「朝」「昼」「夕方」「夜」「夜中」 この時刻帯は
夜明け dawn 4:00~6:00
朝 morning 6:00~9:00
昼 day 9:00~17:00
夕方 evening 17:00~19:00
夜 night 19:00~24:00
真夜中 midnight 24:00~4:00
季節によって感じが変化するかもしれません。
これをプログラムで使う予定で調べました。この時間帯でアラームのモードを変更するためです。プログラムに入れ込みました。下記がその時刻においての応答です。
「夜明け」から「朝」の時刻帯への境界の状況をCopyしました。
プログラムで例えば mornig_flag=1 などとフラグを立てその時刻帯である事を通知します。これによりプログラムが考え易くなります。
現在時刻 05:00
■--------------------↓
05:00
p_alarm
xx:x405:00
p_alarm
xx:x6_was not detected△
05:00
p_alarm
xx:x8_was not detected△
05:00
p_alarm
xx:x0_Detected time●◎xx:x0●
05:00
p_alarm
xx:30_was not detected△
05:00
p_alarm
xx:x2_was not detected△
05
00
△B―実験1 [偽 false] else動作です.
●◎A-dawn_夜明け [真 true] 動作です●
△B―Not morning [偽 false] else動作です.
△B―Not day [偽 false] else動作です.
△B―Not evning [偽 false] else動作です.
△B―Not night [偽 false] else動作です.
△B―Not midnight [偽 false] else動作です.
■■-------------------------↑
■■-------------------------↑
現在時刻 06:19
■--------------------↓
06:19
p_alarm
xx:x406:19
p_alarm
xx:x6_was not detected△
06:19
p_alarm
xx:x8_was not detected△
06:19
p_alarm
xx:x0_was not detected△
06:19
p_alarm
xx:30_was not detected△
06:19
p_alarm
xx:x2_was not detected△
06
19
△B―実験1 [偽 false] else動作です.
△B―Not dawn [偽 false] else動作です.
●◎A-mornig_朝 [真 true] 動作です●
△B―Not day [偽 false] else動作です.
△B―Not evning [偽 false] else動作です.
△B―Not night [偽 false] else動作です.
△B―Not midnight [偽 false] else動作です.
■■-------------------------↑
現在時刻 08:40
■--------------------↓
08:40
p_alarm
xx:x408:40
p_alarm
xx:x6_was not detected△
08:40
p_alarm
xx:x8_was not detected△
08:40
p_alarm
xx:x0_Detected time●◎xx:x0●
08:40
p_alarm
xx:30_was not detected△
08:40
p_alarm
xx:x2_was not detected△
08
40
△B―実験1 [偽 false] else動作です.
△B―Not dawn [偽 false] else動作です.
●◎A-mornig_朝 [真 true] 動作です●
△B―Not day [偽 false] else動作です.
△B―Not evning [偽 false] else動作です.
△B―Not night [偽 false] else動作です.
△B―Not midnight [偽 false] else動作です.
■■-------------------------↑
■--------------------↓
02:47
p_alarm
xx:x402:47
p_alarm
xx:x6_was not detected△
02:47
p_alarm
xx:x8_was not detected△
02:47
p_alarm
xx:x0_was not detected△
02:47
p_alarm
xx:30_was not detected△
02:47
p_alarm
xx:x2_was not detected△
02
47
△B―実験1 [偽 false] else動作です.
△B―Not dawn [偽 false] else動作です.
△B―Not morning [偽 false] else動作です.
△B―Not day [偽 false] else動作です.
△B―Not evning [偽 false] else動作です.
△B―Not night [偽 false] else動作です.
●◎A-midnight_真夜中 [真 true] 動作です●
■■-------------------------↑
* 各時刻帯域にflagを導入します。 C言語の広域(global)変数と局所(local)変数の扱いができる必要があります。
グローバル変数として扱うには、関数の外で定義します。
int global_midnight_flag = 0; //このように関数外で再宣言します ->グローバル変数。ここはglobal変数の位置です。
int local_midnight_flag = 1; //
global_midnight_flag=local_midnight_flag;
このようにローカル変数の値をグローバル変数へ渡して、どこからでも参照できるようにします。
loopの先頭でLED緑、loopの最後でLED青を1回点滅動作をさせます。これにより、プログラム実行の様子が推測できます(ここでは見れません)。 このように時刻帯を識別させます。
●◎A-evning △B―Not night などの A、Bの意味について
A if の真の動作を意識するために付けました。
B は if の偽の動作を意識するために付けました。
人間の生活エリアである証
小型ラジオを買いました。
TOSHIBA TY-HR4 FM/AM 2BAND PORTABLE RECIVER AC/DC 2WAY POWER
DCバッテリーで動作させるため、電池部の電極に工作を施しました。
このラジオの電池仕様は、単1電池3本の直列接続です。
電源電圧は 3X1.5=4.5[V] です。
この対策装置の電源は12Vを主電源と考えています。
12V -->5V 半導体7805という三端子レギュレータを使用します。
5V ---> ダイオードを通過(0.65V 降下)---> 4.35 V
この方式で対応しました。Just 4.5 V ではありませんが、良好です。
ダイオードには1S1588 を使いました。
単1電池と同等の径の棒をホームセンターで買いました。
電極部への接触は、感光基板の未使用プリント基板を使用しました。
適切な大きさを切り出します。
接続コードをはんだ付けします。
両面テープ止めます。(接着剤)
*最初は単1電池3本分の長さの1/2 の丸棒2本を作りました。
しかし、ラジオの電池BOXへ収納できませんでした。結局、3本となる寸法での切断となりました。特に、均等な長さではありません。
===============================
2023.8.19 現在の設定
[xx:x0] pin5 PIC電子音 ショット#1 約4秒
[xx:x2] pin6 電子音Ⅱ_12vAMP ショット#2 約4秒
[xx:x4] pin4 ラジオON ショット#3 77秒
[xx:x6] A0端子 青色ダイオード発光 1.5[Sec]
[xx:x8] A1端子 5Vブザー 1.0[Sec]
======================================
机上での準備実験ですが良好です。
*放熱器の付いた装置がありますが、10Wモノラルアンプです。
「TDA2030使用 10Wモノラルアンプキット」(秋月電子)
10Wとありますが、 AMP電源電圧24V使用時ですので注意してください。
しかし、12V~24Vの電源に応じて動作します。
2分毎に何らかの反応をします。そのようなプログラムを試しています。
「 [xx:x6] A0端子 青色ダイオード発光 1.5[Sec] 」
この発光部分を今後変更します。
より高輝度となるように検討します。あるいは、単に1.5秒間の点灯では動物に認識されないかもしれません。そこで、フラッシャー動作をPICマイコンを介して行わせることも検討します。
■ Unoマイコンの端子の利用状況
折り返されて見ずらいかもしれません。興味ある方は別テキストエデッタにコピー展開してご覧ください。
=========================================================================================================
Unoには4個のLEDを取付け--> D4?,D7,D8,D9
---------------------------------------------------------------------------------------------------------
基板番号 機能(Diodeは3~9) 信号状態 用途 接続回路
---------------------------------------------------------------------------------------------------------
9~ D9(L9) ledPin9 (緑LED)プログラム実行確認LED Normal Low プログラム実行確認LED 点滅現象
8 D8(L8) ledPin8 (赤LED)◎A-夜間 [真] Normal Low ◎A-夜間 [真 true]
7 D7(L7) ledPin7 (青LED) △B―昼間[偽] Normal Low △B―昼間 [偽 false]
6~ D6(L6) ledPin6 xx:x5 Normal ★High 電子音Ⅱ(12V10W-AMP) Shoot#2 (黄LED)
5~ D5(L5) ledPin5 xx:x3 Normal ★High PIC電子音Ⅰ Shoot#1 (黄LED)
4 D4(L4) ledPin4 (緑LED) xx:x0 Normal ★High ラジオON Shoot#3 (黄LED) 77秒
3 D3(L3) ledPin3 未使用 空き
2 INPUT(INT) [分]更新中にINTが入ると、時刻取得が正しく行われず時刻が乱れた。INT動作は採用できません。
--------------------------------------------------------------
A0 アナログ 0 --> デジタルへ LED
A1 アナログ 1 --> デジタルへ BZ Tr:2SC1815の最大コレクタ電流は150mAである
---------------------------------------------------------------------------------------------------------
Oneshoot IC555 は、 2pin Active Lowで3pin OUT(HIGH)
=========================================================================================================
One Shoot#1 PIC電子音Ⅰ C=33μF R=100KΩ T=3.6 [Sec] PICに引き渡すので周期Tを越えて可能
One Shoot#2 電子音Ⅱ_12vAMP C=33μF R=100KΩ T=3.6 [Sec] 周期T以内の動作
One Shoot# C=33μF R=100KΩ T=3.6 [Sec]
One Shoot#3 ラジオ C=33μF R=2M(2x10^6)Ω T=77[Sec] 周期T以内の動作
=========================================================================================================
T=1.1xCR=1.1x33x10^(-6)x1x10^6=36秒
T=1.1xCR=1.1x33x10^(-6)x10x10^6=360秒(6分) 茶黒緑 デジタル抵抗計で 10.8MΩ <--- カラー表示おかしい
Shoot#3 赤黒緑 20x10^5=2x10^6 2MΩ T=1.1CR=1.1x33x10Exp(-6)x2x10Exp(6)=72.6秒
*実測値は理論値より長めの値となる。すると4~5分のワンショットを設計するなら、
理論値
2MΩ 73秒
3MΩ 108秒(1分超)
5MΩ 181秒(3分)
10MΩ 6分
One Sootの強制動作スイッチ(IC555の2pinを10KΩでPull Up,IC555の2pinをGND)は設ける必要がある。
このスイッチにより、電子音Ⅰ・電子音ⅡのONを確認できる。
=====================================================================================
2023.7.5 現在の設定
[xx:x3] pin5 PIC電子音 ショット#1 約4秒
[xx:x5] pin6 電子音Ⅱ_12vAMP ショット#2 約4秒
[xx:x0] pin4 ラジオON ショット#3 77秒
==============================================================
■ [xx:x0] 時刻でラジオがONとなります
プログラムの一部です。
時刻「分」の桁が例えば、10,20,30,40,50,00 で動作します。要するに10分間隔の動作が実現できます。ON継続時間はおおよそ77秒間です。この77秒とはワンショット・マルチ・バイブレータのパルス長です。
このような記述で [xx:x3] 電子音1 [xx:x5] 電子音2 の各回路を起動動作させます。
下記がArduino Uno のプログラム(スケッチ)です。
p_alarm = "xx:x0"; //ポインタalarmに時分をセット @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ xx:x0 1件目の検索設定あり
Serial.println(p_Ntime);//ポインタNewTimeの意味
Serial.println("p_alarm");//ポインタalarmの意味
Serial.print(p_alarm);//シリアルモニタに印字(変数p_alarmの内容)
int m = 4;//基数0 "xx:x0" 下1桁を照合 "xx:xx" は照合無し
int n = 4;//基数0 4で最下位となる
//xx:x0 10分インターバルでラジオ駆動 ワンショットマルチバイブレーターをトリガーします
if (strncmp(p_alarm + m, p_Ntime + m, n + 1 - m) == 0) { //<-- 注意 n-m=4-3=1 1文字を比較
Serial.println("_Detected time●◎xx:x0●");//あたり
digitalWrite(ledPin4, HIGH); // //Normal High LEDを点灯 ラジオを Soot#3使用。
digitalWrite(ledPin4, LOW);// One Shoot Active Low
delay(100);// One Shoot Active Low
digitalWrite(ledPin4, HIGH);
} else {
//Serial.println("_was not detected△");// はずれ
//digitalWrite(ledPin4, HIGH); // LEDを消灯 ラジオをOFF
}
p_alarm = "xx:x3"; //ポインタalarmに時分をセット @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ xx:x3 件目の検索設定
Serial.println(p_Ntime);//ポインタNewTimeの意味
Serial.println("p_alarm");//ポインタalarmの意味
Serial.print(p_alarm);//シリアルモニタに印字(変数p_alarmの内容)
m = 4;//基数0 "xx:30" m = 3; n = 4;下2桁を照合 "xx:xx" は照合なし
n = 4;//基数0
if (strncmp(p_alarm + m, p_Ntime + m, n + 1 - m) == 0) { //<-- 注意 n-m=4-3=1 1文字を比較
Serial.println("_Detected time●◎xx:x3●");//あたり
digitalWrite(ledPin5, HIGH);
delay(100);
digitalWrite(ledPin5, LOW); // LED消灯灯させる xx:x8でOne Shoot#2 PIC警報音 電子音Ⅱを送出
delay(100); //PIC電子音1 Up Edge でトリガーされる
digitalWrite(ledPin5, HIGH); // One Shoot#1 の2pin Active Low 信号をPIC alarmの起動信号に利用
/*
digitalWrite ( A0, 1 );//A0に接続したLEDを点灯
delay(1000);
digitalWrite ( A0, 0 );//A0に接続したLEDを
// LEDの状態をトグル(反転)
if (A0 == 0) {
//A0 = 1; // 消灯から点灯に変更
digitalWrite ( A0, 1 );
} else {
//A0 = 0; // 点灯から消灯に変更
digitalWrite ( A0, 0 );
}
*/
if(global_night_flag){
digitalWrite ( A0, 1 );//A0に接続したLEDを点灯
}
else { digitalWrite ( A0, 0 );//A0に接続したLEDを
}
} else {
Serial.println("_was not detected△");// はずれ
//digitalWrite(ledPin3,HIGH); // LEDを消灯
}
p_alarm = "xx:x5"; //ポインタalarmに時分をセット @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ xx:x5 3件目の検索設定
Serial.println(p_Ntime);//ポインタNewTimeの意味
Serial.println("p_alarm");//ポインタalarmの意味
Serial.print(p_alarm);//シリアルモニタに印字(変数p_alarmの内容)
m = 4;//基数0 "20:10" 5桁を照合
n = 4;//基数0
if (strncmp(p_alarm + m, p_Ntime + m, n + 1 - m) == 0) { //<-- 注意 n-m=4-3=1 1文字を比較
Serial.println("_Detected time●◎xx:x5●");//あたり
digitalWrite(ledPin6, HIGH);
delay(100);
digitalWrite(ledPin6, LOW); // Active Low ワンショット#2 のTrigger Normal High
delay(100); //電子音Ⅱ
digitalWrite(ledPin6, HIGH);
} else {
Serial.println("_was not detected△");// はずれ
//digitalWrite(ledPin6, HIGH); // LEDを点灯 ワンショットのTrigger Normal High ハード部でプルアップ済
}
******************************
■ プログラムの後半です。部分抜き書きで申し訳ありません。
main ルーチン すなわちUnoプログラムのloop 内を60秒(1分)以内に実行完了する必要があります。
理由はRTCが「60秒」毎に新時刻を送り出します。
RTCからのこの新時刻を受信スタンバイの状態であることが必要です。Unoでそのようなプログラムとしています。
digitalWrite(ledPin7, LOW);//RTCの「分」更新時に1回だけ点滅
確認のため、上記の命令を入れています。
イメージ的にはこの「マイコンの生存確認プログラム」と理解してください。
60秒以内に点滅を繰り返します。
この点滅を見ると安心できます。
//char n_time[6] = "06:00"; // 現在時刻を文字列で指定
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(ledPin8, HIGH); // LEDを点灯させる
delay(1000);
digitalWrite(ledPin8, LOW);//RTCの「分」更新時に1回だけ点滅
Serial.println("●◎A-夜間 [真 true] 動作です●");
int night_flag = 1;
global_night_flag= night_flag;
}
else {
// Bの動作を行います
digitalWrite(ledPin7, HIGH); // LEDを点灯させる
delay(1000);
digitalWrite(ledPin7, LOW);//RTCの「分」更新時に1回だけ点滅
Serial.println("△B―昼間 [偽 false] else動作です.");
int night_flag = 0;
global_night_flag= night_flag;
}
******************************
RTCの威力がすごいです。私の指定した時刻、例えば夜中でも正確に動作し、機器を起動します。私が寝ずに夜中に手動でスイッチを操作する作業を自動で行ってくれます。
このRTCは「RTC-10」というもので、10年以上前に購入したものです。
マイクロテクニカさんからの購入でした。
非同期のRTCです。現在、このRTCは手に入りません。残念です。バックアップとしてほしかったのですが。
今後、RTCは同期式のタイプの使用になります。この場合、プログラムを一から考える必要がまたあり、一苦労強いられます。
机上のブレッドボードの回路を、基板に組む必要があります。これがまた大変です。
ブレッドボードで済ませることが可能ならその部分はブレドボードで済まそうと思います。
現在時刻の時間帯を識別(朝 午前 午後 昼 夕方 夜 真夜中)
現在時刻がどの時間帯であるか識別・判別するプログラムです。例えば「朝」と識別させる
には、朝とは時刻が~から~でると定義しておく必要があります。
プログラムの一部を載せます。
真夜中にある動作を予定している場合、自分が考える真夜中の時間帯を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(シリアルモニタ) を眺めていても進展しません。
実験接続図
[RTC-10] [インターフェースIC] [Arduino Uno] [通信ソフトTeraterm]
パソコンにUSBケーブルを2本差すことになります。
Arduino Uno のシリアルモニタ画面です。このシリアルモニタの設定での「bps」は
4800をセットします。その理由はRTC-10は4800bpsでの通信を行うからです。RTC-10は4800bps固定で変更できません。
両者の通信速度を一致させないと正しく通信できません。
暗号の羅列に見えますが、そうではありません。
「:」の前後の各2桁を見ます。Serial Monitor での最右端の表示は 06:35 です。
すなわち「6時35分」を表しています。
Serial Monitorの受信スタートは *「時分」のどの部分から受信するか不明です。
重要なことは、 「○□:△×」 の表示規則中「:」が重要な意味を果たしています。
*C受信プログラム作成により、RTC-10の「分」の桁上げに連動し、必ずxx:xxの形式で受信できました。
RTC-10は一分毎に「xx:xx」の形式で時刻を吐き出します。
「通信速度」という言葉が出ましたが、上記画面にあります。
RTCに反応がありましたー2
RTC-10の接続回路の詳細は、後日述べます。
RTC-10から下記写真のように1分おきに時刻を表示できました。
TearTerm通信端末画面に表示できただけです。
RTC-10は1分の最下位桁の桁上げ毎にTx端子に時刻データを吐き出します(その様らしいです)。
このRTCの初期設定などは、どのようにしたか後日述べたいと思います。
ここまでがおそらくRTCのステージ1(Step1)に相当すると考えています。
ステージ2:マイクロコンピュータ側で時刻データを受け取ること。
ステージ3:時刻を含んだマイクロコンピュータのプログラムをつくること。
とにかくこの時刻をマイクロコンピュータで受信し、この時刻を活用できるプログラムへ発展させる必要があります。
RTCに反応がありました-1
このRTCはマイクロテクニカ より購入したものです
超高精度UARTリアルタイムクロックモジュール
現在時刻(時、分、秒)及び現在日付(年、月、日、曜日)の情報を非同期シリアル通信(UART)にて簡単なコマンドで取得することができます。