緑の中に

緑の中に
国立天文台

11/21/2023

対策装置の警報 時刻一覧

 対策装置の警報 時刻一覧




赤外線センサーはまだ未実装です。これからです。
現在、電子音の改良中です。



季節により時間帯イメージを変更します。
変更はプログラムで容易に可能です。

  • i以下 テレビニュースでの情報です
  • 本年は熊による被害が多く発生し、ニュースになっています。
  • 死亡事故も含むニュースです。
  • ついに、AIカメラによる警報・威嚇装置の実証実験がありました。
  • 会津大学の先生による研究です。
  • カメラで熊を検知すると、相当大きな電子音およびストロボ発光があります。
  • 犬の吠える音声も発していました。
  • 熊は一目散に退散しました。ニュースでの情報でした。






9/25/2023

関数定義とその使用法 について(C言語)

 関数定義とその使用法 について(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を

}

==============================================

 *何回も使用するルーチンは、関数として扱うと楽になる。
変更が発生した場合、関数内を修正するだけで済む。


9/23/2023

温度データーロガー 順調です

 

秋分の日です 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

9/21/2023

「夜明け」「朝」「昼」「夕方」「夜」「夜中」 この時刻帯は

 「夜明け」「朝」「昼」「夕方」「夜」「夜中」 この時刻帯は

夜明け 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動作です.

■■-------------------------↑


現在時刻 09:00
■--------------------↓
09:00
p_alarm
xx:x409:00
p_alarm
xx:x6_was not detected△
09:00
p_alarm
xx:x8_was not detected△
09:00
p_alarm
xx:x0_Detected time●◎xx:x0●
09:00
p_alarm
xx:30_was not detected△
09:00
p_alarm
xx:x2_was not detected△
09
00
△B―実験1 [偽 false] else動作です.
△B―Not dawn  [偽 false] else動作です.
△B―Not morning  [偽 false] else動作です.
◎A-day_昼 [真 true] 動作です
△B―Not evning [偽 false] else動作です.
△B―Not night  [偽 false] else動作です.
△B―Not midnight  [偽 false] else動作です.
■■-------------------------↑

現在時刻 17:00
■--------------------↓
17:00
p_alarm
xx:x417:00
p_alarm
xx:x6_was not detected△
17:00
p_alarm
xx:x8_was not detected△
17:00
p_alarm
xx:x0_Detected time●◎xx:x0●
17:00
p_alarm
xx:30_was not detected△
17:00
p_alarm
xx:x2_was not detected△
17
00
△B―実験1 [偽 false] else動作です.
△B―Not dawn  [偽 false] else動作です.
△B―Not morning  [偽 false] else動作です.
△B―Not day  [偽 false] else動作です.
◎A-evning_夕方 [真 true] 動作です
△B―Not night  [偽 false] else動作です.
△B―Not midnight  [偽 false] else動作です.
■■-------------------------↑



現在時刻 19:07
■--------------------↓
19:07
p_alarm
xx:x4_was not detected△
19:07
p_alarm
xx:x6_was not detected△
19:07
p_alarm
xx:x8_was not detected△
19:07
p_alarm
xx:x0_was not detected△
19:07
p_alarm
xx:3019:07
p_alarm
xx:x2_was not detected△
19
07
△B―実験1 [偽 false] else動作です.
△B―実験2 [偽 false] else動作です.
△B―Not dawn  [偽 false] else動作です.
△B―Not morning  [偽 false] else動作です.
△B―Not day  [偽 false] else動作です.
△B―Not evning [偽 false] else動作です.
◎A-night_夜 [真 true] 動作です
△B―Not midnight  [偽 false] else動作です.
■■-------------------------↑
global_dawn_flag
0
global_morning_flag
0
global_day_flag
0
local_evening_flag
0
global_night_flag
1
global_midnight_flag
0
global_dawn_flag
0
global_morning_flag
0
global_day_flag
0
local_evening_flag
0
global_night_flag
1
global_midnight_flag
0




現在時刻 02:47

■--------------------↓

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変数の位置です。

void loop() {//loop

      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 の偽の動作を意識するために付けました。






8/20/2023

人間の生活エリアである証

 人間の生活エリアである証

小型ラジオを買いました。
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マイコンを介して行わせることも検討します。


8/17/2023

■ Unoマイコンの端子の利用状況


■ 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;

      


    }


******************************









































7/20/2023

机が大変! 

机がブレッドボードで一杯です!! 


 RTCおよびワンショット・マルチバイブレーター さらに音源1・音源2と順調に動作します

RTCの威力がすごいです。私の指定した時刻、例えば夜中でも正確に動作し、機器を起動します。私が寝ずに夜中に手動でスイッチを操作する作業を自動で行ってくれます。

このRTCは「RTC-10」というもので、10年以上前に購入したものです。
マイクロテクニカさんからの購入でした。
非同期のRTCです。現在、このRTCは手に入りません。残念です。バックアップとしてほしかったのですが。

今後、RTCは同期式のタイプの使用になります。この場合、プログラムを一から考える必要がまたあり、一苦労強いられます。


机上のブレッドボードの回路を、基板に組む必要があります。これがまた大変です。
ブレッドボードで済ませることが可能ならその部分はブレドボードで済まそうと思います。