ああ、我が日章旗は何処...

 

 

ブラウザはPalemoonを常用しています。

久しぶりにチェックしたら、27.4.1にバージョンアップしていたので早速アップデートしたのですね。

 

このブラウザのいいところは、バージョンが変わっても見かけがほとんど変わらないところ。毎日使う道具は本来こうあるべき、と思います。

 

しかし、今回は違いました。起動したら英語モードになっています。慌ててabout:configで言語設定をチェックしてみますが、特に問題なし。

ロケールファイルの互換性が崩れたのかしらん。ならば、とロケールファイルを取りに件のページを開いたらですね。

 

日本だけハブられてました。

 

 

最近はネットの自動翻訳の精度があがって、オンラインなドキュメントとかは普通に読めたりして驚くことも多いのですが、UIの翻訳はまだ手作業なんでしょうね。そういえば、機械翻訳の出力をほとんどそのままあげた輩がいて、ライセンスに絡んで大騒ぎ(もっぱらLinuxディストリ界隈)になったのは今年の上半期だったような。

 

 

各方面で翻訳作業される方に、この場を借りて感謝申し上げます。

 

 

とりあえず、使えないわけではないのでしばらく我慢することにしましょう。

 

8月6日早朝の室温記録。明け方の冷え込み、というのが見られない。7時半位から上昇するのは光線が差し込むようになるからで、8時台にグラフの傾きが変わっているのは起床して窓を開けた為。その後の急降下の気配はエアコンを動かしたことによります。

 

地味にesp8266を弄っています。nodemcu既製のsntpモジュールがデフォルトで組み込まれていないので、自分で書いて、rtcの時刻設定ができるようになりました。なんせ不慣れなので動かすまでまる1日かかりましたが、おかげでLuaを使うコツみたいなものがわかってきました。何でもそうですが、自分自身で手と頭を使って試すのが結局は一番の近道になると思います。(尚、納期は無視された模様)

 

 

 

自分宛てメモ

 

Lua5.1は実数しか扱わない。ので、符号なし32ビット整数のつもりでいると、負数にされたりする。

関数に渡す場合は、16進文字列(0xnnnnnnnn)で渡して受け取り側でtonumberをかける。

 

 

nodemcu単独での計時が難しいので、RTCを接続することにしました。

 

RTCには、世間での使用例が多いことからEPSONのRX-8025を試してみました。インターフェースはI2Cです。既にLCDや温度センサーを接続しているので、問題は少ないだろう、という判断でした。

 

しかし。

 

まあ、ろくにマニュアルを読まずに始めたのでハマるハマる。全く設定ができなくて、慌ててマニュアルを読み直したら、レジスタアドレスの与え方が間違っていたのが原因でした。また、ものが「時計」ということもあり、通信条件にちょっと注意が必要なところもありましたので、アプリケーションマニュアルの23ページ以降はしっかり読み込んだほうがいいと思います。

 

Luaレベルで注意しなくてはならないのは、通信開始から終了まで(i2c.start から i2c.stopを実行するまで)を0.5秒以内に収めなくてはならない、という部分です。これは、通信中にカウントが進んでデータ不整合になるのを防ぐ為、カウンターを一時停止し通信終了後に補正して再開することによるものです。

 

このRTCは割り込みを2通りの方法で発生できますが、今回は定時割り込み機能を使って1分毎に割り込みを行うことにしました。これでタイムスタンプ付きのデータをPCに飛ばすことができます。

 

プログラムをざっと書いて動かしてみたのですが、目論見通り動作してくれました。後はIPの自動取得や時刻の設定、エラー処理等細かいところを詰めて行くだけです。

 

自分宛てメモ


追加したいアプレットのdesktopファイルを改変する。

 

例)system-config-printer (red hat) を追加する場合

 

/usr/share/applications/system-config-printer.desktopの
Categories=に、
XFCE;X-XFCE-SettingsDialog;X-XFCE-HardwareSettings を付け加える。

 

 

何をどのように加えるかは
/etc/xdg/menus/xfce-settings-manager.menu を参照

自分宛てメモ


原因:thunar-settings.desktop内のIcon指定にて、存在しないアイコン(file-manager)を参照している。
対策:アイコン側にシンボリックリンクを出す(例えば/usr/share/icons/hicolor/48x48/apps)か、.desktopを書き換える。

 

esp8266(以下センサーノード) と データ収集サーバー(以下PC)との接続について。


両方共LANに接続しているのでIPアドレスの参照は比較的容易だけど、それなりに手順を踏まなくてはならない。

 

以下、手順。


PC側

  1. PCでnmapか何かを使ってLAN上のアドレスを得る。
  2. 上記で得られたアドレスに「お前はセンサーか?」と問い合わせる。その際、PCのアドレスも送る。
  3. センサーノードが「俺はセンサーだ」と返してきたら、それを登録して、データが流れてくるのを待つ。

 

 

センサーノード側

  1. 初期化して、ルータがアドレスを割り当ててくれるのを待つ。
  2. サーバを作って、PC側からの問い合わせを待つ。
  3. PCに「俺はセンサーだ」を返信する。
  4. センシングして適宜PC側にデータを送る。

 

さて、ここで問題になるのはセンサーノード側の手順に待ちが多いこと。コールバック内での待ちループが使えないのは勿論、フォアグランド側の待ちも無駄なので差し控えたい。
また、手続き型のつもりでだらだらプログラムを書いていて、コールバックが動いているのを忘れて挙動不審に陥ったりするのも回避したい。

 

ということで、処理を細切れにしてスイッチャで繋ぐことにしました。コードは嵩みますがプログラムの見通しは良くなるはずです。(そうか?)

 

スイッチャは次の通り。全体として繰り返し処理する訳ではないので、処理を単純にするため起動と同時にそのタスクはテーブルから抜去してしまいます。もし、繰り返しが必要なら抜去した要素をテーブルの末尾に追加すれば良いと思います。タスク参照用の添字の管理が省けるでしょう。

 

function task_switch()
    tm:stop()
    tm:unregister()
    if #task > 0 then
        tm:register(10,tmr.ALARM_SEMI,table.remove(task,1))
        tm:start()
    end
end

タスクテーブルはLuaのテーブルそのまま。

task = {ipcheck, startmes, getready_for_dataserver, showserverip,
        sensor_start,showsensor
}

 

起動はタイマ(tmr)をSEMIモードで使います。このモードでは所定時間(ここでは10ms)後にコールバックを起動したら、そこで一時停止します。再開するにはtmr.start()を使います。

 

例えば上記テーブルの最初の要素 ipcheck はルータからのIP割当を「待って」いるのですが、wifi.sta.getip() の結果が nil ならtmr.start()を呼んで次のタイミング(10ms後)を待ちます。もし、IPが得られたならtask_switch()を呼んでコールバックに次のタスクをセットします。これで10msに次のタスクに遷移します。

 

SEMIモードで一時停止するのがミソで、これがAUTOモードだと次のタイミングまでに全ての処理を終えなくてはなりません。終わらない場合は一旦コンテキストを退避してルーチンを途中で抜けるという、面倒な処理を書かなくてはなりません。コルーチンが使えるので多少は楽できると思いますが。

 

その代わり、同時進行型のいわゆるマルチタスクにはなり得ません。もし、このままマルチっぽくしたいなら、別ルーチンでタスクの処理時間を計測して、タスクが遷移した時に不公平がないよう、呼び出し回数で調整するしかないでしょう。

 

管理するセンサーやデバイス(LCDとかブザーとか)が多くて、順番に見て回りたい時とか、タスクの挿抜が容易で使えそうと思うのですが。nodemcuはコールバックが充実しているので出番は少ないかも知れませんけど。

 


Search

Calendar

S M T W T F S
  12345
6789101112
13141516171819
20212223242526
2728293031  
<< August 2017 >>

Archive

Mobile

qrcode

Selected Entry

Link

Profile

Search

Other

Powered

無料ブログ作成サービス JUGEM