ブログを検索

2024/06/18

[TIPS] LoRa 端末 LRA1 日の出までの秒数計算

注意:これは「超」簡易計算です。ここで算出した日の出までの秒数は数分のズレがあります

 ある地点の日の出、日の入りの時間を月毎に取得したので表っぽくしておく
カッコ内は0:00からの経過秒数 

日付  日の出       日の入
---- ----------- ------------
 1/1 6:54(24840) 16:29(59340)
 2/1 6:42(24120) 17:01(61260)
 3/1 6:07(22020) 17:34(63240)
 4/1 5:19(19140) 18:05(65100)
 5/1 4:36(16560) 18:35(66900)
 6/1 4:09(14940) 19:03(68580)
 7/1 4:11(15060) 19:13(69180)
 8/1 4:34(16440) 18:54(68040)
 9/1 5:03(18180) 18:12(65520)
10/1 5:31(19860) 17:24(62640)
11/1 6:02(21720) 16:40(60000)
12/1 6:35(23700) 16:19(58740)

LRA1のインタラクティブモードで
? datetime(clock)
24/06/18 09:14:35
OK
と返ってくる

「LRA1_ソフトウェアリファレンスマニュアル」によると
TOINT(文字列 [、[オフセット] [、[文字数]]])   文字列中の指定部分を数値に変換
とのこと

左記の ’24/06/18 09:14:35’ の中の '06' と '18' を「整数として」抜き出す
? toint(datetime(clock), 3,2)
6
? toint(datetime(clock), 6,2)
18
それぞれ整数で取れる

'09:14:35' の '09' '14' '35'を「整数として」抜き出して本日0時からの経過秒数算出
? toint(datetime(clock),9,2)*3600 + toint(datetime(clock),12,2)*60 + toint(datetime(clock),15,2)
33275
OK

ここまでを踏まえて BASICで書いてみる

10 Gosub _until_sunrise_time
20 If I>0 Then
21   '算出値取得した 
22   '日の出までSleepしたり日の出から晴れるのが分かっている場合は少し早く稼働したり
30   Print "until_sunrise_time ";I
40 Else
41   ' エラーだろう
50   Print "NOP ";I
60 EndIf
999 End


10000 ' 次の日の出までの秒数Iを返却する 0はエラー 変数IJN使用
10002 ' 毎月1日~9日  :1日の日の出時刻までの秒数算出
10003 ' 毎月10日~20日:(今月1日と次月1日の中間時刻までの秒数算出
10004 ' 毎月21以降    :翌月1日の日の出時刻までの秒数算出
10010 _until_sunrise_time
10020   N=ToInt( Datetime (Clock),3,2)
10040   '0時から現在までの経過秒数
10050   I=ToInt( Datetime (Clock),9,2)*3600+ToInt( Datetime (Clock),12,2)*60+ToInt( Datetime (Clock),15,2)
10060   ' 下記  ToInt( Datetime (Clock),6,2)<10 Then は上旬 Elseif ToInt( Datetime (Clock),6,2)>20 Then は下旬 Elseは中旬
10070   If N=1 Then If ToInt( Datetime (Clock),6,2)<10 Then J=24840 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=24120 Else J=24480 EndIf
10080   ElseIf N=2 Then If ToInt( Datetime (Clock),6,2)<10 Then J=24120 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=22020 Else J=23070 EndIf
10090   ElseIf N=3 Then If ToInt( Datetime (Clock),6,2)<10 Then J=22020 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=19140 Else J=20580 EndIf
10100   ElseIf N=4 Then If ToInt( Datetime (Clock),6,2)<10 Then J=19140 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=16560 Else J=17850 EndIf
10110   ElseIf N=5 Then If ToInt( Datetime (Clock),6,2)<10 Then J=16560 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=14940 Else J=15750 EndIf
10120   ElseIf N=6 Then If ToInt( Datetime (Clock),6,2)<10 Then J=14940 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=15060 Else J=15000 EndIf
10130   ElseIf N=7 Then If ToInt( Datetime (Clock),6,2)<10 Then J=15060 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=16440 Else J=15750 EndIf
10140   ElseIf N=8 Then If ToInt( Datetime (Clock),6,2)<10 Then J=16440 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=18180 Else J=17310 EndIf
10150   ElseIf N=9 Then If ToInt( Datetime (Clock),6,2)<10 Then J=18180 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=19860 Else J=19020 EndIf
10160   ElseIf N=10 Then If ToInt( Datetime (Clock),6,2)<10 Then J=19860 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=21720 Else J=20790 EndIf
10170   ElseIf N=11 Then If ToInt( Datetime (Clock),6,2)<10 Then J=21720 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=23700 Else J=22710 EndIf
10180   ElseIf N=12 Then If ToInt( Datetime (Clock),6,2)<10 Then J=23700 ElseIf ToInt( Datetime (Clock),6,2)>20 Then J=24840 Else J=24270 EndIf
10190   Else
10200     I=0:Return
10210   EndIf
10220   '下記 I>28800 Then I=J+(86400-I) は0時前の場合の補正
10230   If I>28800 Then I=J+(86400-I) Else I=J-I EndIf
19999 Return


テストが足りないかもしれません。流用する際は十分検証してください
そもそもClock値はズレ進んでしまうのでこんな大雑把な計算にしました

0 件のコメント:

コメントを投稿

MySQL で SELECT into outfile 出来なくてハマった件

 Windows上の MySQL で SELECT into outfile で CSVファイルをエクスポートしようとしてハマったので残しておく 環境 Windows10 Pro バージョン 1809 MySQL 8.4.0 という環境で SELECT * FROM table1...