ブログを検索

2024/06/21

LRA1 BASIC で気になったことや処理速度実験

 気になったのでメモ

「その1」はプログラムの書き方によっては受信データロストに繋がるという件

気付いた都度追記していく

その1 知らずにデータをロストしていた orz

下記プログラムで150行目で Stat=10のときがある。
タイミングでそうなるということは別の考え方をするとStatを確認したら速やかにStat=0をセットしないとデータをロストする確率が高まる。しかもロストしていることに気付かない。ここは行数をケチったりコードの見た目を綺麗にするのは考えないようにする

発生頻度

送信側は5分毎送信。受信側は RECV 0 で常に受信待ち受け、100msec毎受信データ有無を確認している状態
1時間で12回受信のうち4回がこのタイミングになった。結構な頻度でロストしていた 汗

受信プログラム
10 RxStop:Stat=0
20 Recv 0
100 Do
110   If Stat=10 Then
120     Stat=0
130     Print Rxd
140   Else
150     ' ここでstat=10のときがある
160     If Stat!=0 Then
170       Print "Error Stat=";Stat
180     EndIf
190     Stat=0
200   EndIf
210   Delay 100
999 Loop

なので下記のように 190行目削除。160行目~170行目修正と追加
10 RxStop:Stat=0
20 Recv 0
100 Do
110   If Stat=10 Then
120     Stat=0
130     Print Rxd
140   Else
150     ' ここでstat=10のときがある
160     If Stat!=0 && Stat!=10 Then
165       S=Stat:Stat=0
170       Print "Error Stat=";S
180     EndIf
190     Stat=0
200   EndIf
210   Delay 100
999 Loop

その2 ループ方法やコメント有無の処理速度への影響


BASICインタプリタ全盛の1980年代前半にやってたような簡易テストをしました。
ワタクシ当時は中学~高校生 遠い目
下記コードで簡易的に試した結果をまとめると

・ループ方法は For Next が一番速い Step有無は影響なし。ただし無限ループとしての Do Loop や Goto は不明。exit条件のIf文を入れるとFor Nextより遅い事だけ判った
・コメント行があると遅くなる
・コメント行はコメント文字列が長いと遅くなる
・I=I+1 より I++ のインクリメントが速い
・マルチステートメントは遅くなる
・ラベル名が長いと遅くなる
問題点を挙げてるわけじゃなくBASICプログラム書くときの目安としてテキトーに実験してみた
プログラムエリアの消費量との兼ね合いがあると思うのでマルチステートメントは使うところは使う
分かりやすさとの兼ね合いでラベル名も最低限の長さはとる
結論は実験結果を参考にしつつもそもそも処理速度は求めていないので書きやすいように書けばいいだけかな

■For Next これが基準 所要時間19秒
100 Print "20"; Datetime (Clock);".";Milisec
110 RxStop
120 I=0:J=0
130 For I=0 To 100000 Step 1
140   I=I+1
150   J=J+1
160   'NOP
170 Next
180 Print "20"; Datetime (Clock);".";Milisec

■Step省略 効果なし 所要時間19秒
100 Print "20"; Datetime (Clock);".";Milisec
110 RxStop
120 I=0:J=0
130 For I=0 To 100000
140   I=I+1
150   J=J+1
160   'NOP
170 Next
180 Print "20"; Datetime (Clock);".";Milisec

■インクリメント 効果あり 所要時間14秒
100 Print "20"; Datetime (Clock);".";Milisec
110 RxStop
120 I=0:J=0
130 For I=0 To 100000
140   I++
150   J++
160   'NOP
170 Next
180 Print "20"; Datetime (Clock);".";Milisec

■コメント行増 逆効果あり 所要時間45秒
100 Print "20"; Datetime (Clock);".";Milisec
110 RxStop
120 I=0:J=0
130 For I=0 To 100000
140   I++
150   J++
160   'NOP
161   'NOP
162   'NOP
163   'NOP
164   'NOP
165   'NOP
166   'NOP
167   'NOP
168   'NOP
169   'NOP
170 Next
180 Print "20"; Datetime (Clock);".";Milisec

■すべてのコメント削除 効果あり 所要時間11秒
100 Print "20"; Datetime (Clock);".";Milisec
110 RxStop
120 I=0:J=0
130 For I=0 To 100000
140   I++
150   J++
170 Next
180 Print "20"; Datetime (Clock);".";Milisec

■コメント1件 「■インクリメント 効果あり」の再掲 所要時間15秒
100 Print "20"; Datetime (Clock);".";Milisec
110 RxStop
120 I=0:J=0
130 For I=0 To 100000
140   I++
150   J++
160   'NOP
170 Next
180 Print "20"; Datetime (Clock);".";Milisec

■コメント長増 逆効果あり 所要時間19秒
100 Print "20"; Datetime (Clock);".";Milisec
110 RxStop
120 I=0:J=0
130 For I=0 To 100000
140   I++
150   J++
160   'NOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOPNOP
170 Next
180 Print "20"; Datetime (Clock);".";Milisec

■マルチステートメント 逆効果あり 所要時間18秒
100 Print "20"; Datetime (Clock);".";Milisec
110 RxStop
120 I=0:J=0
130 For I=0 To 100000
140   I++:J++
160   'NOP
170 Next
180 Print "20"; Datetime (Clock);".";Milisec

■For Next から While Loopへ変更 逆効果あり 所要時間38秒
100 Print "20"; Datetime (Clock);".";Milisec
110 RxStop
120 I=0:J=0
130 While (I<=100000)
140   I++:J++
160   'NOP
170 Loop
180 Print "20"; Datetime (Clock);".";Milisec

■while LoopからDO~LOOP WHILE へ変更 逆効果あり 所要時間52秒
100 Print "20"; Datetime (Clock);".";Milisec
110 RxStop
120 I=0:J=0
130 Do
140   I++:J++
160   'NOP
170 Loop While (I<=100000)
180 Print "20"; Datetime (Clock);".";Milisec

■ForからDo If exitへ変更  逆効果あり 所要時間45
100 Print "20"; Datetime (Clock);".";Milisec
110 RxStop
120 I=0:J=0
130 Do
135   If I=100000 then exit endif
140   I++:J++
160   'NOP
170 Loop
180 Print "20"; Datetime (Clock);".";Milisec

■Do If exit から goto If End へ変更  逆効果あり 所要時間61秒
100 Print "20"; Datetime (Clock);".";Milisec
110 RxStop
120 I=0:J=0
130 _looppoint
135   If I=100000 then Print "20"; Datetime (Clock);".";Milisec::End endif
140   I++:J++
160   'NOP
170 Goto _looppoint
180 Print "20"; Datetime (Clock);".";Milisec

■ラベル文字列長増  逆効果あり 所要時間147秒
100 Print "20"; Datetime (Clock);".";Milisec
110 RxStop
120 I=0:J=0
130 _looppoint_looppoint_looppoint_looppoint_looppoint_looppoint_looppoint_looppoint_looppoint_looppoint
135   If I=100000 then Print "20"; Datetime (Clock);".";Milisec::End endif
140   I++:J++
160   'NOP
170 Goto _looppoint_looppoint_looppoint_looppoint_looppoint_looppoint_looppoint_looppoint_looppoint_looppoint
180 Print "20"; Datetime (Clock);".";Milisec

■ラベル文字列長短 効果あり 所要時間53秒
100 Print "20"; Datetime (Clock);".";Milisec
110 RxStop
120 I=0:J=0
130 _l
135   If I=100000 then Print "20"; Datetime (Clock);".";Milisec::End endif
140   I++:J++
160   'NOP
170 Goto _l
180 Print "20"; Datetime (Clock);".";Milisec


おまけ実験 ループの中で For Next が一番速いなら・・・
■For Nextで無限ループ
100 Print "20"; Datetime (Clock);".";Milisec
110 RxStop
120 I=0:J=0
130 For I=1 To 2
140   I=1
170 Next
180 Print "20"; Datetime (Clock);".";Milisec




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値はズレ進んでしまうのでこんな大雑把な計算にしました

2024/06/17

[TIPS] LoRa 端末 LRA1 時刻設定(リモート側)

 リモート局LRA1はスタンドアロンで動くのでラズパイや外部マイコンからの時刻設定は出来ない
GPSも無い、RTCバックアップも無い
という状況で基地局LRA1から時刻をLora通信で受け取って自身にセットしてみた

最初に決めごととして通信先頭が"002" だったら時刻設定コマンド、その場合続いて Clock値が入ってくるとした場合


■基地局LRA1

10  Send "002";Clock
20 End

■リモート局LRA1

10 Recv 5000
20 If Stat=10 Then
30   If ToInt(Rxd(8))=48&&ToInt(Rxd(9))=48&&ToInt(Rxd(10))=50 Then
40     Gosub _calc_clock:Clock=B
50   Endif
60 Endif
70 Stat=0
80 Print "20";DATETIME(Clock)
999 End

30000 _calc_clock
30010 B=((Chr(ToInt(Rxd(11))))*100000000)
30020 B=B+((Chr(ToInt(Rxd(12))))*10000000)
30030 B=B+((Chr(ToInt(Rxd(13))))*1000000)
30040 B=B+((Chr(ToInt(Rxd(14))))*100000)
30050 B=B+((Chr(ToInt(Rxd(15))))*10000)
30060 B=B+((Chr(ToInt(Rxd(16))))*1000)
30070 B=B+((Chr(ToInt(Rxd(17))))*100)
30080 B=B+((Chr(ToInt(Rxd(18))))*10)
30090 B=B+(Chr(ToInt(Rxd(19))))
39999 Return

こんな感じで基地局LRA1から貰ったClock値をリモート局LRA1でセットする

これで Clock値がズレていく件は優先度が低くなって一旦保留にできそう

基地局LRA1でラズパイからClock値をセットするのはこちら

以上


2024/06/16

【無線機発作】FTM-500Dほしい病を発症した

 見てしまった・・・

先日、無線屋さんに来てさらっとFTM-500Dを購入した方がいました

知ってる方なんですが、目の前でセットアップを始めたのを食い入るように見ているとワタクシのFTM-300D がおもちゃに思えたったのでした ← ここはAdhocでワタクシの第3言語岩手弁

それから3週間経ち、給料が入ったので今から FTM-500D を買いに無線屋さんに行ってきます

お値段は5マンスウセンエンだっけか!?

ワタクシ出力何ワットまでだしていいんだっけ?3アマだから200Wくらい?

以前にも増してだいぶアタマが弱ってきているように感じつつ詳細な購入仕様を考えながら行ってきます


数時間後、


買ってきました

FTM-300 に比べると見た感じも操作した感じも高級感があります

残念ながら FTM-500 の200W機はありませんでしたのでしかたなく50W機です

更に残念なことは、機能や性能は(ワタクシの使い方では)いま使っている FTM-300 とあまり変わらないことです

後日、軽トラに設置しようと思います

増設申請中なのでセットアップは後でやることにします

ほしくてたまらなくなって買ってきたら放置とか

2024/06/15

【諦めて別の方法に】LRA1でClock値から日の出日の入り時刻を導いてみようとした

はじめにお断りしておきます
「Clock値から日の出日の入り時刻を導いてみよう」というのは諦めて別の方法を採りましたっていう話です


ソーラーパネルとスーパーキャパシタを使った電源で、夜間できるだけ多くの時間LRA1を動かしたいときがある「かも」しれない
例えば田植え前の田んぼに水を入れ始めて数週間は夜間の水量の推移を知りたい、早朝、それを参考に行動計画を立てるのだ
とかあるかも。田んぼやってないですが

「バッテリー容量増やす」というのはできないです
LRA1含むソーラーバッテリーシステム一式で200g以内の重さが絶対条件なのです。現在の試作機の重量は160gくらい。これに防水ケースなどの重さが加わります
リモート局LRA1なので外部マイコンでやる、というのは考えないです

日の出まであと何分かがわかればどれだけ電力消費していいか参考にできると思う。現在のバッテリー電圧と日の入りまでの時間から間欠運転時間の調整もできる

そこでLRA1のBASICで日の出日の入り時刻をClock値から求めてみる

ちなみに日の出少し前や日の入り後しばらくは空が明るいけど、実験しててわかったのは空が明るいだけたとソーラーパネルの電圧として有効な数字(1.8V以上)は出ない
まあ、使っているソーラーパネルの特性なんですけどね
2枚セットで税込1299円のソーラーパネル 笑 

日の出日の入り時刻の計算方法を調べてみたら結構な量のコードになることが分かった 汗
知りたい都度計算していたら計算機資源の無駄なので表で持てばいいやに着地
その表を探してみたらちょっと情報が少ない。。。いや日の出日の入りを検索できるサイトはたくさん有るんですが、欲しいのはピンポイントで標高を考慮して日の出日の入りを見れるサイト

すばらしい機能です

知りたい日付を入力して地図で設置予定の山の中をピンポイントで指定すると

2024年06月15日の日の出・日の入り(標高333m)
日の出 04:07 南中時刻 11:39 日の入り 19:10

のように表示してくれます。これはすごい

ブラウザの「開発者ツール」でPOST値などチラ見してみるとどうやら
https://www.tsukuba.co.jp/sun-gis/json.php?latlng=39.321052031997944%2C140.5691993236542&ymd=2024-06-15
のように緯度経度と日付を指定してブラウザのURL入力欄に入れるとJSONでレスポンスを返してくれる親切設計
↑ 緯度経度は適当な場所を指しています。設置予定場所ではありません

毎日の日の出時間はいらないので今年12か月分、毎月1日と15日のデータを入手しました
大変助かりますありがとうございます

ブログタイトルの「Clock値から日の出日の入り時刻を導いてみよう」は、やりませんでしたが欲しいデータを入手できました
ちなみに年によって日の出日の入り時刻に大きな差は無いとのことで同じデータを毎年使っていけるようです



LRA1ソーラーパネル電源実験中

 ソーラーパネルとスーパーキャパシタを繋いだ電源を実験中なんですが
使っているキャパシタは5.4V 25Fで容量は大きいのか小さいのかわかりません
キャパシタとして考えるととてつもなく大容量なんですが、蓄電池的に考えると 5.4V 18.75mAh!?なので小さいです
ソーラーパネルとLRA1
ひどい結線ですが
ベースに見える黒い四角の板はソーラーパネル(2.5W5V/500mAh)の裏面
左側の銅色の部分は銅箔テープでベタグランド
銅箔テープに囲まれた中にあるのはDCDCモジュールとショットキーダイオード
中心に横たわっているのがスーパーキャパシタ(5.4V 25F)
スーパーキャパシタの上に張り付けているのは電圧センサ
で右下にLRA1です
ちなみにベタベタ貼っている黄色いセロハンテープ状のものは中国製カプトンテープもどきです
「もどき」ですが半田コテをあてても大丈夫な耐熱性があって何より安いので重宝しています
セロハンテープ感覚で消費できます
これで重量154g

これを南に向けて垂直に立てかけておくと今の季節(6月中旬)だと朝5時過ぎにLRA1が起動します。夕方20時過ぎにDCDCモジュールの動作下限2.0Vを切ってLRA1は停止します
晴れや薄曇りであればです。天気が悪く暗い日は10時くらいにLRA1が起動して夕方17時過ぎに停止します
充放電状況を観察する実験中なのでLRA1は起動できる間は起動したままで5分毎にキャパシタの電圧を送信しています

LRA1が停止する原因というかトリガはキャパシタ電圧が
DCDCモジュールの動作下限2.0Vを切って電源供給が止まることなので、余裕をもって自分からDeepに移行すれば夜間も間欠動作や数十分の連続動作が可能と思います
いまはこんな状況


2024/06/13

【復旧済】 アメダスデータ取得が止まっていたので復旧させた

 自動で横手市のアメダスデータをチラ見してsqlite3のデータベースファイルに蓄積しているんですが

$ ls -l measure.db
-rw-r--r-- 1 pi pi 44851200  4月  6 08:00 measure.db
4月6日 08:00 を最後にデータを取得出来ていないことに気付いた
取得するスクリプトを手動で実行してみると
database disk image is malformed
と出る

sqlite3のデータベースファイルが論理的に壊れているぽい

再度確認してみると
$ sqlite3 measure.db  "PRAGMA integrity_check"
Error: database disk image is malformed
やっぱり壊れている

$ ls -l measure.*
-rw-r--r-- 1 pi pi 44851200  4月  6 08:00 measure.db
44MBytesか、ずいぶん大きくなったな 汗

下記で修復
$ sqlite3 measure.db ".recover" | sqlite3  temp.db
このくらいのサイズのデータベースファイルだと60秒かかった


修復して出来た temp.db ファイルを正規のファイル名に変更して復旧した
$ mv temp.db measure.db

$ ls -l measure.*
-rw-r--r-- 1 pi pi 31346688  6月 13 08:46 measure.db

作り直しでサイズが小さくなった

以上

2024/06/05

[TIPS] LoRa 端末 LRA1 時刻設定

 LoRa 端末 LRA1 は独自の BASIC言語でプログラムが書けて、電源さえ付ければ単体でプログラムの通り動作するんで助かっていますというかまだ運用していないので助かりたい、という段階

で、プログラムを書いていろいろ実験しつつ、ひとつ困ったことがありました
それは時刻というか日時設定です
電源が入ってからカウントアップするクロックはあるものの、電源が入るたびに0スタートになります。
そう、RTCの電源バックアップが無いのです。

じゃあ電源バックアップするかRTCを後付けするか考えると微小ながら電力を喰うのでNoです
GPSモジュール付けて時刻取得するか?もっと電力を喰うのでNoです

で、考えてみました


BASICで Print DATETIME(Clock)
のように DATETIMEコマンドを文字列中で使用したとき Clock変数は
「2020/1/1 00:00:00」からの経過秒数
で扱われるとのことなので

現在unixtimeから「2020/1/1 00:00:00」の unixtime 1577804400 を引けば Clock値がでます
Clock変数は LRA1のコマンドで Clock=1 のように設定できるので
ラズパイとLRA1をUART接続し、ラズパイから下記シェルコマンドを入力してLRA1のClockを設定

× uxtime1=$(date '+%s');uxtime2=$(($uxtime1-1577804400));echo -e "Clock=${uxtime2}\n" >/dev/ttyS0

〇 uxtime1=$(date '+%s');uxtime2=$(($uxtime1-1577804400));echo -e "Clock=${uxtime2}\r\n" >/dev/ttyS0

# 「/dev/ttyS0」部分は環境によっては「/dev/ttyAMA0」とか他のものになっているかも

この時 LRA1に UARTでコンソール接続していると device busy みたいな感じのエラーになるので注意が必要


Clockが設定できたらあとは LRA1のBASICプログラムで
Print "20";DATETIME(Clock)
とかすれば
2024/06/05 10:25:17
のように表示されてめでたし

あ、これはラズパイ接続している基地局LRA1のハナシで
リモートLRA1 はスタンドアロンなのでClock値をセットするとしたら別のやり方になります
それはこれから実験してみます

と思ったけど厳密な時刻を求めないのなら基地局が受信したときの日時をデータ発生日時として使えば良いのでリモートLRA1 の時刻合わせは要らないかな?

PS. 2024/06/11 に気がついたが、Clockを設定しても1日で10分以上ズレ進む。こんなものなのかな?個体差?ま、基地局側は毎日時刻合わせすればいいか

2024/06/13 また気付いた。時刻がズレていくのはリモート局LRA1だけみたい
10分で4、5秒くらい進む
1日あたり720秒(12分)か

Delay や Sleep に入る前や後で待機時間のようなものがあるんだろうか?
いやリモート局のClockは進んでいくんだから待機時間じゃない。何だろうか???
LRA1ファームウェアは基地局とリモート局で同じもの
>ver
i2-ele LRA1
Ver 1.26.f+
OK

いろいろ試して切り分けしたいけど
いま動かしてる2台のLRA1はソーラーバッテリーシステムの実験で使用中だから止めたくない
切り分けのため3台目のLRA1を開封する時が来たか・・・汗

■基地局側LRA1 BASICプログラム(Clockズレない)
  1 RxStop
 10 Recv 0
100 _LOOPSTART:
200   If Stat=10 Then
210     Print "20"; Datetime (Clock);" From:";Rxdw(2);" RSSI:";Rssi;" ";Rxd
220     Stat=0
230   Else
240     If Stat!=0 Then
250       Print "20"; Datetime (Clock);" Error! stat:";Stat
260       Stat=0
270     EndIf
280   EndIf
400   Delay 100
999 Goto _LOOPSTART

■リモート局LRA1 BASICプログラム(Clockズレる)
110 SpiBaud=0
120  ^=""
999 RxStop
1000 Do
1010   For I=1 To 5 Step 1
1020     C=Adc(10)
1030     If I=1 Then V=C EndIf
1040     If I=2 Then W=C EndIf
1050     If I=3 Then X=C EndIf
1060     If I=4 Then Y=C EndIf
1070     If I=5 Then Z=C EndIf
1080     Gosub _wait
1090   Next
1100   ^="Clock=";Clock;" ";V/250;".";Form("D02",((V-((V/250)*250))*100)/250);" ";W/250;".";Form("D02",((W-((W/250)*250))*100)/250);" ";
1110   ^=^;X/250;".";Form("D02",((X-((X/250)*250))*100)/250);" ";Y/250;".";Form("D02",((Y-((Y/250)*250))*100)/250);" ";Z/250;".";Form("D02",((Z-((Z/250)*250))*100)/250)
1120   Print "20"; Datetime (Clock);" Send Data=";^
1130   Send ^:^=""
9999 Loop
10000 _wait
10010   Sleep 20
10020   Delay 20000
10030   Sleep 20
19999 Return

■リモート局LRA1 10010行から10030行をこうしてみた
10010   'Sleep 20
10020   Delay 60000:' Delay 20000
10030   'Sleep 20
↑ 上記やったが変わらずClockズレる(ズレ進む量も同じ)
となると Sleep は原因ではなさそう
Delayも基地局側で使っているので問題ないだろう
Adc? あ、もしかして文字変数 ^(キャレット)の使い方だろうか?

■文字変数 ^ キャレットの使い方を間違っているかもしれず、キャレットを使わないよう 1100行目から1130行目をこうして ↓ みた
1100
1110
1120   Print "20"; Datetime (Clock);" Send Data=";Z/250;".";Form("D02",((Z-((Z/250)*250))*100)/250)
1130   Send Z/250;".";Form("D02",((Z-((Z/250)*250))*100)/250)
↑ 上記やったらClockズレなくなった
と思ったけどズレ進む量が小さくなっただけで4時間で39秒進んだ
1日あたり234秒(3分54秒)か
これくらいなら普通なんだろうか!?

Clockがズレ進むのは主に文字変数 ^ キャレットの使い方がマズイようなので何がマズイのか調べよう







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

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