送信装置のメモ

 

送信装置を通販で手に入れたんですが、
例によって説明書も何もない状態で袋に入って届きます。

一応、販売者のページには説明が有るんですが、
 ホームページって消えてしまったりしますよね。
 ですので、そのバックアップを上げておきます。

 

今回はただそれだけー

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

概要

 

 


動作電圧: DC 2V-9V
電流: 9mA (電圧3V)
基準距離: オープングラウンド 100 メートル、屋内環境障害物 10 ~ 30 メートル (3v 電圧テスト、電圧が大幅に増加)
動作周波数: 85MHZ --- 115MHZ (通常は 99 ~ 101 の起動デフォルト周波数)
受信方法: 88-108MHz FM ラジオが受信できる限り、FM フィーチャーフォンを使用できます。
周波数調整: 調整可能なコンデンサ
出力インピーダンス: 50オーム
サイズ:2cm*1cm 長さ*幅
 
組み立て要件:
 
1.この製品を組み立てます。少なくとも、ラジオの基本を理解するには、はんだごてとマルチメーターが必要です。
2、モジュールはデバッグされており、3本のワイヤ(2つの電源1アンテナ)を溶接して使用できます。
 
C高出力長距離ワイヤレスマイクモジュール:
モジュールはAモデルをベースとした高周波パワーアンプで構成されています。出力が大きいため、その出力を発揮するにはより優れたアンテナを適合させる必要があります。75cm ロッドアンテナまたは 1mm 厚のエナメル線を使用して基板に直接はんだ付けすることをお勧めします。
 
[製品パラメータ]
 
寸法: 25*10mm
動作電圧: 2V-5V (モバイル電源を使用できますが、安定化電源を使用すると、携帯電話の充電器にACノイズが発生する可能性があります。電圧が高すぎると、発射管が焼けてしまいます)
動作電流: 30-80mA (測定入力動作電流: 4.8V-87mA、3.6V-63mA、2.4V-36mA、それぞれアンテナの80cmワイヤーをテスト、4個、3個、2個のBPI2100mahニッケル水素充電式バッテリーテストを使用)
送信周波数: 80-110MHz (家庭用 FM ラジオ周波数を完全にカバー)
送信電力: 150mw (C モデル)、50 メートル - 800 メートル (距離はアンテナ効率によって決まります)
受信方法:一般家庭用FMラジオ受信。携帯電話に付属のFMラジオも受信できますが、ソフトウェアAPPが必要なネットワークトラフィックを必要とするインターネットアプリは使用できません。適合するラジオを販売しております。
放射距離:障害物の直線伝送距離は800メートル以上に達することができます(6V電源、80cmのプロフェッショナルアンテナ、Desheng PL606高感度無線テスト結果、共通アンテナまたは建物グループの障害物グループ環境テストの場合、距離は短縮されます)
 
 
【製品の利点】
 
1.外部オーディオ入力を備えたオンボードマイク (モノラル)
2.入力マイクとオーディオ感度は調整可能で、送信周波数は連続的に調整可能です。
3.送信電力: 5v 入力は 150mw の送信電力に達し、距離は 300 メートル以上です。
4.すべて輸入コンポーネント、安定した動作、周波数ドリフトなし、ハンドタッチアンテナドリフトなし。
5.広帯域変調、非常に優れた音質、FM ラジオ局の音質に匹敵します。
 
予防策:
 
1、発熱の説明:
 
モジュールが熱い場合は、アンテナがうまく適合していないことを意味します。送信電力の一部はアンテナを介して送信できません。熱くなり基板が熱くなります。このような状況が見つかった場合は、アンテナの調整を検討する必要があります。
 
2.アンテナの設計:
 
(1) アンテナにより伝送距離が決まります。優れたアンテナは、貧弱なアンテナよりもも数倍、数百倍多くの送信を行うことができます。
(2) 長さ 75 ~ 80 cm、直径 0.5 ~ 1 mm のエナメル線を使用することをお勧めします。回路基板上の送信アンテナ パッドに直接はんだ付けし、まっすぐにして垂直に使用すると、効果がより優れています。
(3) 距離要件は高くないが、より繊細にしたい場合は、通常のワイヤーを使用できます。ワイヤーは短くなりますが、発射距離は短くなります。ぜひ自分で試してみてください。
 
3、バッテリー寿命:
 
多くのお客様がこの質問をしますが、自分で計算できます。バッテリーが異なり、容量が異なり、モジュールの動作時間も異なります。次のように計算されます。
 
5v 電源 - 使用時間 (時間) = バッテリー容量 (mah) を 85ma で割った値
3.7v 電源 - 使用時間 (時間) = バッテリー容量 (mah) を 63ma で割った値
例えば:
Samsung 2600mah 18650 リチウム バッテリー (3.7V) はどのくらいの時間このモジュールに電力を供給しますか?
2600mah / 63ma = 41.2 時間、約 41 時間、非常に省電力です
 
[Cモジュール - 周波数デバッグ手順]
 
最初のステップでは、モジュールの電源を入れた後、右端の三極管 (左から 4 番目、音量がわずかに大きい) をタッチして、温度があるかどうかを確認します。温かい場合は、動作を開始したことを意味します。熱がない場合は、電源が接続されていません。マルチメータを使用して、モジュールの正および負の電圧を測定できます。(A タイプの電力は低く、三極管は熱くないので、次のステップに直接ジャンプできます)
 
2番目のステップは、最初のステップが完了した後、モジュールの電源が正常にオンになっていることを確認し、FMラジオをオンにし、最大音量にし、ラジオの手動モードで周波数を調整し、88〜108mhzを完全に検索し、周波数を見つけることができるはずです (工場出荷時のデフォルト周波数は 96 ~ 101mhz です)。自動検索は使用しないでください。自動検索ではモジュールの周波数がスキップされ、自動的に停止しない場合があります。
 
3 番目のステップでは、上記の手順でも周波数を見つけることができません。心配しないでください。ラジオ局のない周波数 (100mhz など) にラジオを固定できます。次に、0.8mmの極小無誘導ドライバー(当店で入手可能)を使用して、微調整コンデンサーの周波数調整を締めます。ネジを締めるのがとても遅いはずです。ラジオから突然音が鳴った場合は、ラジオを停止し、手動で周波数を調整してください。今ならその時だろう。固定周波数付近で周波数が見つかり、音が最もクリアになり、デバッグが完了します。

パッケージに含まれるもの(選択してください):


1×100M 88-115MHz

1×800M 80-110MHz


もう一ひとつの説明

 

 

 

 

 

 

 

 

スペクトラムアナライザwaveGeneとwaeSpectraのメモ

 

前の記事でwaveGeneとwaeSpectraを使って自宅の機材を測定してみた
 https://miha.jugem.cc/?eid=430
  の記事を書いたんですが、
 
久々に使ってみよう!!
 と思って起動してみたんですが
  なんと使い方を忘れてた。
 
仕方がないので一度説明書(ヘルプ)を読んで
 測定手順をまとめておく事にしました。
 
自分は自己満足系ブロガーなんで。すみません。自分向けな記事です。

 

前提条件
 waveGeneのバージョン 1.50
 waveSpectraのバージョン 1.51
 前もってインストールは済ませておく
 予めユーザ波形のサンプルをwaveGeneと同じディレクトリに配置しておく
  UserWaveSample1.ZIPを解凍したもの
   FLATNOISE_xxxxxx.WAV、FLATSWEEP_xxxxxx.WAVなど
 
手順
 
測定したい装置を接続する。
 例
  パソコンのオーディオ出力にアンプとスピーカーを接続
  パソコンのマイク入力にマイクを接続(またはUSBマイクをUSBに接続)
 
 waveGene起動
  
  
  
 waveGeneの出力デバイス選択する
  →右上のスピーカーマークをクリック
  ドライバ 任意のものを選択 今回はMME
  デバイス 任意のものを選択 今回はスピーカー(High Difinition And・・・ を選択

  

  

  閉じる


 時間の指定
  →秒の左の入力で60秒を選んでおく
 再生waveファイルの選択
  →wave1の所ユーザ波形を選択
  →ユーザー波形登録をクリック
  →開く→FLATNOISE_40096.WAVを選択→閉じる
   
   
   
  →再生ボタンをクリックして ザー という音声が流れることを確認しておく。
    この音は20Hzから20KHzまでの周波数が含まれたホワイトノイズ
   
   
  
 waveSpectra起動
 
  
  
 waveSpectraの入出力デバイスを選択する
  →右上のスパナマークをクリック
  →再生録音タブをクリック
  →ドライバ、再生、録音を任意のものを選択
   今回は
    ドライバ:MME
    再生デバイス:WaveMapper
    録音デバイス:WaveMapper
  →設定をクリック
  
  
 
測定
 
 waveGeneで再生をクリックして音を出しておく
 
 waveSpectraで測定開始
  →赤●の録音をクリック
  
  
 
 パソコンのオーディオ出力をオーディオ入力に直接接続した場合は
  上記のようなフラットな線が表示されるはず
 いまいちフラットにならない場合はパソコンの音量を少し絞ってみる。
 
waveファイルを分析したい場合

 DR05などで録音したファイルをSDカードなどを使ってPCに取り込む
 
 waveSpectraを起動して左上のディスクから読み込むをクリック
  分析対象のファイルを選択
 
 緑▶をクリック
 
 
 
 波がブレる場合は⏸をクリックする。止めたい場合は⏹をクリックする。
 
 20KHz以上の部分は無視する

スペクトラムアナライザで遊んでみた話
 
スペクトラムアナライザーといえば、憧れの測定装置です。
電気信号に含まれる周波数をグラフ化してどの部分の周波数が強いとか、
ノイズが含まれてそうだ。とか分析する装置になります。
 
それでですね。
今まで知らなかったんですけど、パソコンでスペクトラム分析ができるソフトが有るって。
 例によってyoutubeによって知らされたわけです。
 
waveGeneとwaveSpectraになります。
もう古いみたいで、欠片を集めるのに苦労しましたが、
  必要なものはタイムマシーンの中にありました。
上記キーワードを駆使して探してみてください。
 なお、この記事は2024年5月ぐらいに書いていて、今はもう少し探しやすいみたいです。


インストールしたのは古いノートパソコンで、PanasonicのSX3ですね。
 こちらにソフトを入れていろいろ試してみました。
 スペックはIntel4世代Core5の8MにSSD200G入ってます。
 これでも、災害用受信機、インターネット、文書作成、VTR録画編集、オシロスコープ等など
  うちでは現役でやっています。Windows10のままずっと使う予定。
 
まず基本的な流れですが、
 waveGeneで音声信号を生成して、
  waveSpectraでその信号を分析します。
 
 waveSpectraで分析するのはなんの信号でも構わないのですが、
 今回はアンプとか、スピーカーとかの特性を見たいなーと思いますので、
  基本的に以下の構成を取ります。
   
   waveGene→測定対象機器→waveSpectra
   
  具体的には
  
   PC(waveGene)オーディオ出力から信号を取り出し
   → アンプ → スピーカー → マイク
   →PCのオーディオ入力へ信号を入力
   →PC(waveSpectra)
  
  waveGeneで20Hzから20KHzまでの信号を生成して、
   測定機器を通して 出てきた信号をwaveSpectraで分析するという流れですね。
   
 
実際に測定してみましょう。

[1]
まずは測定機器を何も挟まないで
 
 waveGene→waveSpectra
 ノートPCのオーディオ出力をオーディオ入力へ直接接続します。
 
 
 
 フラットですね。
 すべての周波数が一直線で同じレベルになってます。
 
次はアンプの特性を測っていきます。
 
[amp直結]
waveGene→アンプ→waveSpectra
 
 ノートPCのオーディオ出力→アンプ→オーディオ入力へ直接接続します。
 このアンプは秋月のキットの入力段に3経路のミキサーを接続したものです。
   ミキサーは独自設計なのでこれが悪さしている可能性あります。
    特に0.1μFのコンデンサーとかもうちょっと大きくしたいです。
     https://miha.jugem.cc/?eid=323
 
 
 
 それでも、わりとフラットですね。それでも50Hz以下とか500Hz以上の部分で徐々に下がっていきますね。
 実用上問題ないと思いますので、この特性を頭に入れて他のも見ていくことになります。
 
■スピーカーとマイクを繋いでいきます。

waveGene→アンプ→スピーカー→空気→マイク→waveSpectra
 
 スピーカーとマイクという新しい要素が出てきましたね。
 この2つの要因で色々と変わってくるはずなので、
 いろいろ試したいと思います。
 これ以降で空気が間に入るものはスピーカーから約30cmの距離でマイクで拾っています。

[sp-usb]
waveGene→自作アンプ→自作スピーカー→空気→USBマイク→waveSpectra
 
 USBマイクですが、電話会議用にamazonで1000円ぐらいで購入したものです。
 スピーカーも自作のため
  https://miha.jugem.cc/?eid=84
  こちらです。昔秋月でF77G98-6といういい音がなりそうなスピーカーを300円ぐらいで買って
   木で枠を作ったものですね。
 
 
 
 2000Hzが急激に下がっているのが少し気になりますが、
  周辺の周波数でカバーするので問題にはなりません。
 1Khzを中心にして上下-10dbぐらいで比較します。
  下は200Hzから上は8000Hzまでが範囲に入ります。
   結構フラットな数字が出ています。
  下は2000Hzをピークにして徐々に下がります。100Hzでは-20dbぐらい下がります。
  上は8000Hz以上が減衰が激しいです。
  そこから上は、10000KHzで-40dbぐらいになってしまうのでそこまでは仕様の範囲外と思われます。
 USBマイクで上をカットしているのか、
  そもそも、スピーカーから音が出ていないのか?
  この段階では判断は難しいです。下記※1参照
 
[sp-cnd]
waveGene→自作アンプ→自作スピーカー→空気→秋月コンデンサーマイクキット→waveSpectra
 
 同じスピーカーでマイクを変更していきます。
 秋月の高性能マイクアンプキット
  https://akizukidenshi.com/catalog/g/g105757/
 「高性能」の一言に釣られて買ってきて
  電話会議用に電池と組み合わせて一つ作っていたものです。
 
 
 
 これだけ-20dbの所で拾ってしまった。マイクの感度高すぎ。
 同じように1Khzを中心にして上下-10dbぐらいで比較していきます。
  下は20Hzから上は8000Hzまで範囲に入ってきます。すごいフラットですね。
 9000Hzから減衰が激くなりますが、アンプの周波数特性を考慮すると
  15000Hzぐらいまで実用の範囲となります。
 
 ※1
 この結果を踏まえてもう一度[sp-usb]の結果を振り返ると、
 アンプからは音が出ていて、スピーカーからも音が出ている。
 1000円のUSBマイクが上の周波数をカットしているか何らかの理由で
 拾えていないと判断します。とは言っても会議用マイクでは
 不要な周波数ですから、理にかなっているし実用の範囲です。
 
[sp-DR05][sp-DR22WL]
waveGene→自作アンプ→自作スピーカー→空気→TASCAMのDR-05でwaveファイル保存→waveSpectra
waveGene→自作アンプ→自作スピーカー→空気→TASCAMのDR-22WLでwaveファイル保存→waveSpectra

 今度はリニアPCMレコーダーのTASCAMから2種 DR-05とDR22WLです。
 スペックは似たような感じですね。
 DR22WLの方が古いんですけど、スマホから遠隔操作できたり、
 ファイルを取り出したりできるのは便利ですね。
 次世代のX付きの機種からはPCにUSB接続した状態でマイクとして機能するそうです。
  そうするとメモリーカードを経由せずにPCにへ直接取り込めるので便利ですね。
 機器の設定で下の周波数をカットする機能が有りますがOFFの状態です。
 録音設定は24Bitステレオ96KbpsWAVとしています。
 
 2つ同時に出します。
  DR05
 
  DR22WL

 
 
 基本設計が同じだから?なのか、同じ特性を示しています。
  まず、2000Hz、5500Hz、7500Hzの所で極端に落ち込みますね。
   原因がわかりませんが、筐体の形から来るものか?
   それとも、回路やパーツから来るのかわかりませんけど、
   兄弟の持つ特性と考えて良いのかもしれません。
 この落ち込みは周囲のほか周波数でカバーしているはずなので、音質に大きな影響は無いです。
 
 他と同じように1Khzを中心にして上下-10dbぐらいで比較していきます。
 下は90Hzから5000Hzまでは範囲に入っています。非常にフラットですね。
 90Hzから下の方はノイズを拾わないような仕様にされている可能性ありですね
 5000Hzから上は20000Hzまで-20dbの範囲になりますので、アンプの特性を考慮すると
 ほぼフラットで問題ないですね。
 
[sp-AquosSense6]
waveGene→自作アンプ→自作スピーカー→空気→スマホAquosSense6でwaveファイル保存→waveSpectra
 
 上記のTASCAMと同じようなものを比較したいと思い、
 手持ちのスマホで同じ実験してみました。
 スマホで録音するアプリとして「PC録音」というソフトをインストールしました。
 これでwavファイルに48Kbpステレオで録音しました。
 
 
 
 他と同じように1Khzを中心にして上下-10dbぐらいで比較していきます。
 180Hzぐらいから2000Hzまでフラットです。その上が減衰ひどくなりますが、
 20000Hzまでぎりぎり-10dbの範囲になりますので、アンプの特性を考慮すると
 ほぼフラットで問題ないですね。

 

[notepcSP-usb]
waveGene→ノートPC直付けスピーカー→空気→USBマイク→waveSpectra

 USBマイクは上でも使用したもので、
  電話会議用にamazonで1000円ぐらいで購入したものです。
 
 今回はスピーカーの違いとして
  ノートPC内臓の小さいスピーカーです。
 
 
 
 すごい極端ですね。ノートPCのスピーカーのため、小さいので低い部分の減衰がひどいです。
 上は8000Hzまで出ているようですが、とてもフラットとは呼べないです。
 


総合的にノートPC用スピーカー以外ならば
 どの組み合わせでも問題ないレベルで録音あんど再生出来る。
 
TASCAMに関しては文句なしの高性能です。
 その他の機能がいろいろ有りますし、単純に比較できない部分もあり、
 何と言っても持っていると格好が良いので所有する満足感がすばらしいです。

スマホのAquosSense6が意外と健闘していてびっくりですね。
 実用上問題ありませんので、TASCAM陣営としては脅威なのではないでしょうか?
  ステレオ対応とか、いろいろな便利機能がアプリに搭載されると面白いかもしれません。
  ただし、音質的なものは機種によってばらつきが大きい可能性もあり。

マイクで周波数特性という意味では秋月の高性能マイクアンプキットが高性能でした。

スピーカーの差という意味ではPC内蔵スピーカーと
 秋月購入のF77G98-6に箱つけたものしか実施していないのでいろんなバージョンでテストしてみたいですね。
 今後の課題になりそうです。

スピーカーとの距離が今回は30cm固定ということで
 近すぎる気もします。
 仕事をしながら卓上で効く分にはこの距離でも良いんですけど、
 オーディオという意味だと、1m以上かな~と・・・

という事で課題を残しつつ、基礎データが取れたので、
 これを基準値として発展していけるとうれしいです。

K1Cプリンタのセラミック加熱ブロックキット比較

 

特に何かと比較したいとかそういうのじゃないんですけど。
自分が購入する時にすごく迷ったので、その記録。
自分が見る以外には役に立たないかもですけど。
他の人の参考になれば嬉しかったりします。

 

どれを買えば良いのか?CREALITYのページを探します。
こちら。
 https://store.creality.com/jp/products/k1c-3d-printer-ceramic-heating-block-kit-quick-swap-nozzle-kit

 

 

 

新型と旧型がありますね。
そして

 右側中段に以下のように書いてます。
「ご注意: 本品はシリーズ複数モデルが販売されております。最適なモデル選定のため、
 事前にカスタマーサービスへお問い合わせいただきますようお願い申し上げます。」

 

つまり、カスタマーサービスに連絡をしないといけない。
そのままメーカーのページのチャットで質問。
 最初AIが対応というお決まりのケースで、
  人間が対応してくれるまでいくつかあれをヤれとかコレをヤれとか言ってくるので
  AIに従って、人間に繋ぐように操作していると。
 
やっと中国語で人間が出てきてくれる。
 日本語大丈夫ですか?と聞くと、翻訳するので大丈夫と返ってきました。
 
時代だねーと思いつつ。
 どれを買えば良いのか聞くと、プリンタのカバーを外した中の写真を送れと言ってきます。
 基盤に繋がっているコネクターの種類が違うらしいです。
 一応待ってもらいつつ、プリンタのカバーを外して写真をgetしチャットの添付で送った。
 (ちなみに、今のスマホは解像度が高いせいで画像のサイズがデカくて、縮小しないと送れなかった。
  普通に、ここらへんで躓く人も多い気がする。でも、そんな人は3Dプリンタには興味ないかもな。)
 
で、自分のは旧型と判明。
 3400円で旧型を購入と思ったんだけど。送料1000円上乗せで4400円のご請求となりました。
 
むーん高いなーって思いながら、中国製ならaliexpressだよねーと思い。探してみた。
 そうしたら、750円。コネクタの形状については写真で確認しながら慎重に。
  ちなみに、新型は抜けにくい様にでっかい目の爪が付いております。
   最悪間違ってしまった場合はケーブルをちょん切って交換すればいいよねーって
   覚悟してこちらも注文した。
  ちなみに、1500円超えると送料無料ってなってたので、
   他の欲しかったモノも抱き合わせて発注。結局1500円ちょい払った。

どっちも中国から送ってくるのかと思って待ってましたが、
 CREALITYが翌日発送。その翌日に届くという、楽天も真っ青な速度で到着。
 送り元が大阪でしたので、大阪に在庫持っているみたいですね。
 
もう一方のaliexpressは予定通り、通関通って、飛行機乗って、
 日本の通関通って1週間で到着でした。
 
届いたもの比較していきます。
 
 

 

 荷姿は写真撮ってないですが、一番外側の袋から出した状態です。
  左がaliexpressで右がCREALITYです。
  メーカーのCREALITYが箱入りでなかったのは意外ですが、バルクってやつですね。
  中身が同じなら良きよ。

 

 箱(袋)から出していく。
 

  
 コネクタは同じですね。aliexpressのほうは丸くて黒いのが2つ付属しています。
 
 

 

 ネジ穴のところにくっつけるスペーサー的存在ですね。
 

 
 
 よく見るとCREALITYの方は最初からくっついていて分解不可能ですね。
 
 

 
 外側のシリコンのカバーを外してみた。
 本体は同じ形です。
 右側には取り付け用のネジがくっついています。
 これが無くても何とかなりますけど。ありがたいですね。
 
 
 
 角度を変えてもう一枚
 本体は同じ形です。
 aliexpressの方はスペーサーをくっつけてみた。
 aliexpressの方がケーブルが若干長いんですね。
 
今回はここまで。
 実際に印刷してってなると、フィラメントを通さないと出来ないので、
 新品のまま保守部品として保管したいと思います。

 

総評ですが、
 CREALITYさんサポートとっても良かったです。
  ただ、購入ページにこの情報を判るように書いてもらうと、
  サポートさんとチャットしなくて済んだのにと思ったりします。
  到着までの時間が早いのは助かります。
  
 aliexpressは価格が約「六分の一」ってところが驚異的ですね。
  
 スピードを要求しない場合は
  CREALITYでサポート受けつつ、aliexpressで購入って言うのがベストな気がします。
 スピード優先の場合はCREALITY一択ですね。国内在庫は強いですよね。
 
 あたりまえの結果になってしまった感はありますけど、
  価格が六分の一なら5回まで間違って購入してもOKってなりますからね。
  
 品質の問題は残りますけど、
  これは試してみないとわからんので今回は対象外って事で。
  aliexpressでも初期不良には親切に対応してくれると思います

ESP32のROM-BASICでLチカ
 
昔々、ESP32でBASICが使えた時代があった。らしい。
 と知り、自分でも試したくなってやってみました。
 
うちの部品庫を探しまくって、
 古いROMのESP32を探してきました。
 
 
 
 
 
■接続図
 
 ESP32  USB-UARTコンバーター
 ----- ----------------------
 IO12  10KΩの抵抗を間に入れて3.3Vへ
 EN   3.3Vへ
 3.3V  3.3Vへ
 GND   GNDへ
 RX   TXへ
 TX   RXへ
 
 上記の通りESP32とUSB-UARTコンバーターを接続する。
 
■シリアル接続
 パソコンのteratermでシリアル接続していきます。
  シリアルポートの設定
   スピード : 115200
   データ  : 8bit
   パリティー: none
   ストップビット : 1
   フロー制御: none
 
 
 
 
 
■端末の設定
 改行コード
  受信 LF
  送信 LF
 
 
 
 
 
■シリアル接続すると以下のようにメッセージが繰り返すので
 
 rst:0x10 (RTCWDT_RTC_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
 flash read err, 1000
 Falling back to built-in command interpreter.
 OK
 >ets Jun  8 2016 00:22:57
 
 略
 
 rst:0x10 (RTCWDT_RTC_RESET),boot:0x33 (SPI_FAST_FLASH_BOOT)
 flash read err, 1000
 Falling back to built-in command interpreter.
 OK
 >
 
teratermからなにかキーボードを押すと繰り返しが止まってコマンド入力モードになります。
 
>   ← これがプロンプト
 
■ヘルプを表示してみる
>help
A very Basic ROM console. Available commands/functions:
LIST
NEW
RUN
NEXT
LET
IF
GOTO
GOSUB
RETURN
REM
FOR
INPUT
PRINT
PHEX
POKE
STOP
BYE
MEM
?
'
DELAY
END
RSEED
HELP
ABOUT
IOSET
IODIR
PEEK
ABS
RND
IOGET
USR
>
>
 
■aboutって有るな。
>about
ESP32 ROM Basic (c) 2016 Espressif Shanghai
Derived from TinyBasic Plus by Mike Field and Scott Lawrence
>
 
良いね。ESP32 ROM Basicって名前なんだね。
 
■さて、プログラムを入力してみる。
 
>10 input a
>20 print "kotae"
>30 print a
 
>list   ←今入れたプログラムが表示される
10 INPUT A
20 PRINT "kotae"
30 PRINT A
OK
>
実行!!
>run   ←runで実行
555   ←INPUT入力待ちになるので555を入力
kotae  ←kotaeが表示
555   ←入れた値がそのまま表示された
OK
>
 
少しプログラムを変える
>5 print "A wo irete kudasai"
>15 print "B wo irete kudasai"

>16 input B
>30 print a+b
 
>list
5 PRINT "A wo irete kudasai"
10 INPUT A
15 PRINT "B wo irete kudasai"
16 INPUT B
20 PRINT "kotae"
30 PRINT A+B   ←足し算するプログラムにした
OK
>
実行!!
>run
A wo irete kudasai
10
B wo irete kudasai
20
kotae
30  ←10+20は30
OK
>
 
inputは数字しか扱えないっぽいですね。
inputで文字列を扱う方法教えて下さい。
 
変数は整数だけしか扱えないみたいです。
小数点は切り捨て
 a=100/3は33になります。
文字列も駄目
 
■Lチカ(IO2にLEDをくっつけた)
>list
10 FOR I = 1 TO 100 ←100回繰り返し
20 PRINT I
30 IODIR 2,1  ←IO2を出力に設定
40 IOSET 2,1  ←IO2に1を出力
50 DELAY 500  ←0.5秒待つ
60 IOSET 2,0  ←IO2に0を出力
70 DELAY 500
90 NEXT I    ←繰り返しの終わり
OK
>
 
CTRL+Cで実行が停止されますね。
 
■GPIOから値を取得
 
10 IODIR 4,0  ←IO4を入力に設定
100 a=IOGET(4) ←IO4の値を取得してaに代入 0または1
110 print a
120 IF A=1 PRINT "ON" ←入力がONなら
130 IF A=0 PRINT "OFF" ←入力がOFFなら
140 GOTO 100  ←行番号100へ実行行を移す
 
■比較演算
 <, <=, =, <>, !=, >=, >
 
■メモリ使用状況
 
>mem
32560 bytes free.
>
 
■乱数
 
>rseed(100)
>a=rnd(100)
>print a
22
>
 
■サブルーチン

10 print "start"
20 gosub 100    ←行番号100のサブルーチンを呼び出す
30 print "end"
40 end       ←プログラムを停止
100 ' subroutine
110 print "YES"  ←サブルーチン入口
120 return     ←呼び出し元に戻る
 
■プログラムのクリア
 
>new
>
 
■再起動
 
>bye
 
■絶対値
 
>a=abs(-1)
>print a
1
>
 
■16進数表現
 
>a=&h3800
>print a
14336
>
 
■16進数表示
 
>a=14336
>phex a
3800
>
 
■2進数表現
 
>a=&b1010
>print a
10
>
 
■メモリ読み書きと実行
 
>a=peek(0)  ←固まる
>poke 0 0  ←固まる
>usr(1000,1,1)
 
■いろいろ調べてたら本家さんに解説ありました。
 
https://docs.espressif.com/projects/esp-idf/en/v4.3/esp32/api-guides/romconsole.html
 
現在のESP32ではこの機能は起動できないようにされているとの事で大変もったいないですね。
 
 

 

特定小電力920Mhz無線温湿度センサー
 
interplan社の無線モジュールが4つ手元に有ったのと、
 sht20温湿度センサーモジュールが2つ手元に有ったので、
 外のイナバ物置と、食料存庫の常時測定がしたいと思い
 温湿度センサーを追加で作りました。
 
今回の目標
 電池駆動で何ヶ月か電池交換無しで運用できる
 
前の前ぐらいの記事で
 https://miha.jugem.cc/?eid=425
 ATMEGA328を1.8Vで駆動させたりしていましたが、
 これの続きというか、元々電池駆動のセンサーが欲しくて実験していました。
 
それに合わせて、手持ちのSHT20はもともと省電力設計で
 2.1Vから動作して3.6VまでOKです。
  電流はsleep時は0.4μA
  性能的にはAHT10の方が向いていますが、手持ち優先で行きます。
 
送信モジュールとしてIM920cを使いますが、
 2.0V~3.6Vとなっており、
 省電力モードを備えています。
 
システム構成は
 
 センサー部→920Mhz通信→中継機→WIFI通信→ルーター→インターネット→サーバー
 
少し細かく書くと
 
 センサー部
  SHT20→(i2c)→ATMEGA328→(uart)→IM920c→(920Mhz通信)
 中継機
  (920Mhz通信)→IM920c→(uart)→ESP32→(WIFI)
 
となります。
 
センサー部中心で記述します。
 
回路
 
 
 
 
完成
 
   
 
 
ソフトウェア
 
 https://drive.google.com/file/d/1TQ8RdwDCgzXRFjdlZZdqZcXwENvrrMYh/view?usp=sharing
 
ソフトウェア部分解説
 
 今回はATMEGA328なので、arduinoIDEです。
 
 IM920との通信用にソフトウェアシリアルを用意します。
 
  SoftwareSerial IM920Serial(10,11);    // RX, TX
  IM920Serial.begin(4800); // ソフトウェアシリアルを準備
  
  本当は115200bpsで通信したいのですが、
   ATMEGA328で1Mhz動作だと、4800bpsが限界みたいです。
 
 デバッグの通信のためにハードウェアシリアルを準備します。
 
  Serial.begin(4800);
  
  本当は115200bpsで通信したいのですが、
   ATMEGA328で1Mhz動作だと、4800bpsが限界みたいです。
 
 SHT20との通信の準備
  ※https://github.com/u-fire/uFire_SHT20/tree/master
   から拝借しております。
 
  uFire_SHT20 sht20;
  Wire.begin();
  sht20.begin();
  
 IM920のsleep制御
 
  IM920Serial.println("RDID");    //ID呼び出しコマンドを送ってみて
  int data_num = IM920Serial.available(); //戻りが有るか確認 sleepの場合は戻らないはず
  if (data_num >= 1) {      //戻りがあったらsleepしていないので
   IM920Serial.println("ENWR"); //書き込みモード開始
   IM920Serial.println("DSRX"); //スリープさせる
   IM920Serial.println("DSWR"); //書き込みモード終了
  }
 
 温湿度を取得
 
  float temp=sht20.temperature();
  float humidity=sht20.humidity();
 
 sleepを解除してデータ送信
 
  IM920Serial.print("?"); //?を送るとsleep復帰。次のコマンドを受け付けると再度sleep
  
  sprintf(buf, "TXDA %s・・・・・略", 略);
  IM920Serial.println(buf);
  
 データ送信後500ms待ってから送信結果を取得。
  
  delay(500);  //500ms未満だと変な動きになる。
  
  char buffer[33];
  while (IM920Serial.available() > 0) {
   buffer[index] = IM920Serial.read();
   index++;
   if (index >= 32) {//バッファ以上の場合は中断
    break;
   }
   delay(1);
  }
    
  bufferにOKが戻ってれば送信は成功。
   ただし、受信できているとは限らない。(笑)
   電波が届く距離なら普通にOKと思われ。
    よほどの豪邸でない限りは
     実用上問題ないと思われます。
  bufferにNGが戻ってれば送信は失敗。
   IM920が使っているARIB STD-T108という規格とか、
    他の送信モジュールとの干渉によってNGが発生する。
    実際に、周辺で連続送信するIM920を配置して実験するとNG発生するが、
     それ以外では発生することはまれです。
  
 文字化け対策
 
  ASCII_extract(ascii);
 
  時々8ビット目が1になる。なんでかはわからん。文字化けしているか確認する。
  範囲外のコードを文字化けと判定する。
 
 ATMEGA328のdeepsleep
 
  watchDogSleep(7, 8); //8×7=56秒sleep
  
  ATMEGA328は8秒以上はdeepsleep出来ないので、
   8秒以上sleepさせたい場合は一度復帰してループする
   
 
電流測定
 
 ATMEGAとセンサーとIM920cを接続した状態で測定
 
 deepsleep時の消費電流が10μA
 SHT20からのデータ読み取り時で2mA
 IM920cへデータ送信時で40mA(カタログ値)
 
 その継続時間ですが
  sleep時間5600msec
  SHT20からのデータ読み取り時間333msec
  IM920cへデータ送信時間1000msec(体感)
 
 計算
  1回のループの消費電流   全体で 57333msec
   56000msec ×   0.01mA
     333msec ×  2.00mA
    1000msec ×  40.00mA
    
   
  全体で57.333秒で何%?
   56.000sec ÷ 57.333sec=97.67%
     0.333sec ÷ 57.333sec= 0.58%
    1.000sec ÷ 57.333sec= 1.74%
    
  消費電流(1時間あたり)
    0.01mA × 0.9767 = 0.0097mA
    2.00mA × 0.0058 = 0.0116mA
   40.00mA × 0.0174 = 0.6960mA
   ----------------------------------
   計            0.7173mA
   
  電池持ち
   2000mA容量のエネループの場合
    2000mA ÷ 0.7173mA = 2788時間
    = 116日 = 3.7ヶ月
 
 さて、計算通り行くかどうか?
   実験開始!!

 

2025/12/11 追記

 切れましたね。気温が0℃の時だったので、もしかしたら、

  電池の方が温度低下のため電力供給を停止した可能性もありますけど。

 開始が2025/9/8なので、約3ヶ月 94日 でしたね。

  まあまあかな~って感じです。

 電池がエネループじゃなかったので、この寒い中エネループを入れて再スタート。

  今度はどのぐらい持つかなー?

 

「バーチャルホスト」、「仮想ホスティング」、「マルチドメイン」の場合のhttps通信

 

呼び方は色々ありますけど、
 1台のwebサーバーで複数のドメイン名に対応するための方法であります。
 
google先生によると
 「IPアドレス一つで複数のHTTPサーバー(ウェブサイト)を動かすことは、
  仮想ホスティング(またはバーチャルホスト) と呼ばれます。これは、
  単一のIPアドレスを持つサーバーに複数のホスト名(ドメイン名)を割り当て、
  HTTP/1.1の Host ヘッダー情報を利用して、
  どのホスト名への要求なのかをサーバーが識別することで実現されます。」
 
となっております。
 
そもそも、
 「IPアドレスが決まれば、ドメインネームが決まる」
  はずだったんですけどね。(1:1)
 
 IPアドレスが不足したので、
  一つのIPアドレスに複数のドメイン名が
   割り当てられます。
   つまり、IPアドレス一つに対してドメイン名が複数ってなります。
   (1:n)
  ※それだけじゃなく、
   1台のサーバーで複数のドメインを扱えれば便利ですし。こうなっています。
   
 その為にhttpアクスセスする時にIPアドレスだけでは識別できなくなり、
  hostというヘッダを加えるように追加されました。
   ex...
    host=www.domain1.jp
  
  →「HTTP/1.1におけるバーチャルドメイン(バーチャルホスト)は、
    HostヘッダというHTTPリクエストヘッダの追加機能によって実現されました。
    Hostヘッダにより、1つのIPアドレスを持つ同じサーバー上で、
    複数のドメイン名を運用し、それぞれのドメインに対応する異なるWebサイトを
    提供できるようになりました。」 by google先生

 
 プログラム的には、httpのリクエスト送るときに、最初にIPアドレスに対して接続するんですけど
  それだけでは、ドメインが決まらないためにhostというヘッダを追加するんですね。
  
 コードで書くと
  s.connect(ipaddres)
  s = ussl.wrap_socket(s) #この行はSSL=暗号化を処理する。
  s.write("GET /list.cgi HTTP/1.0¥r¥nHost: domainname.jp¥r¥n¥r¥n")
   って感じで、Host: に続けてアクセス先のドメイン名を指定します。
  
具体的には以下のようになります。※主流のsslの場合で書いています。

コードはESP32のmycropythonです。

 

importとWIFI接続

 import usocket
 import ussl
 import network
 import utime
 
 ssid = "xxxx"
 passkey = "xxxx"
 
 timeout=60
 wifi= network.WLAN(network.STA_IF)
 wifi.active(True)
 wifi.connect(ssid, passkey)
 
 wifi.isconnected()

 

SSLでマルチドメインのコード 

 s = usocket.socket()
 addr = usocket.getaddrinfo("domainname.jp", 443)[0][-1]
 s.connect(addr)
 s = ussl.wrap_socket(s)
 print(s)
 s.write("GET /list.cgi HTTP/1.0¥r¥nHost: domainname.jp¥r¥n¥r¥n")
 result = s.read(4096)
 print(result)

 

マルチドメインの結果

 >>> print(result)
 b"HTTP/1.1 200 OK¥r¥nServer: nginx¥r¥nDate: Thu, 28 Aug 2025 08:54:31 GMT¥r¥nContent-Type: text/html; charset=utf-8¥r¥nConnection: close¥r¥n¥r¥n<html lang='ja'><meta http-equiv=refresh content=30; URL=></html> 
 略
 >>>
 
 上のように200 OKが戻ります。

 

マルチじゃない場合のコード(google)

 マルチドメインのコードで書いても可能

 

 s = usocket.socket()
 addr = usocket.getaddrinfo("google.com", 443)[0][-1]
 s.connect(addr)
 s = ussl.wrap_socket(s)
 print(s)
 s.write("GET /?hl=ja&zx=1756370286184&no_sw_cr=1 HTTP/1.0¥n¥n")
 result = s.read(4096)
 print(result)

 

マルチじゃない場合の(google)の結果

 >>> result = s.read(4096)
 >>> print(result)
 b'HTTP/1.0 200 OK¥r¥nDate: Thu, 28 Aug 2025 08:44:16 GMT¥r¥nExpires: -1¥r¥nCache-Control: private, max-age=0¥r¥nContent-Type: text/html; charset=Shift_JIS¥r¥nContent-Security-Policy-Report-Only: object-src ¥'none¥';base-uri ¥'self¥'; 
 略
 >>>


前に書いたESP32とmicropythonでhttps=SSLで通信する記事
 https://miha.jugem.cc/?eid=332
 を久々に見たら、使えないサンプルだったのでマルチドメインで書いてみました。

ATMEGA328を1Mhzで動かすと、1.8Vで動くようになります

 

マイコン工作でエネループで動くようにしたいと思った場合、
 いくつかの選択枝があります。
 
 ①マイコンの動作電圧に合わせて降圧する。
 ②マイコンの動作電圧に合わせて昇圧する。
 ③エネループの電圧でマイコンがそのまま動く。
 
 この場合①②は意外と電気が捨てられてしまい、電池が長持ちしません。
 ③の場合は電池から給電される電気が100%マイコンで使われるので、
  電池持ちは良いです。

 

昇圧も高圧もしないと一番効率はよろしい。

 

それで、ですね。
 ATMEGA328はデータシートによると最低は1.8Vから動くんですが、
 条件があって、クロック周波数を1Mhzにすれば良いと書かれています。

 

 


 8MHz動作の場合は最低2.8Vでないと動きませんでした。
  エネループ2本でギリギリですね。
 
 上は5.5Vまで大丈夫ですね。エネループ3~4本ぐらいです。
  4本つなぐともしかしたらやばいかもですね。
 下は1.8Vなので、エネループ2本ぐらいですね。
 
エネループ。定格では1.2Vって事になってますけど、
 フル充電だと1.4Vぐらい出力するので、
  2本で2.8V~マイコンの動作限界の1.8Vまで動作してくれって事で
   そんな感じの電力効率が良い機器をを目指して作っていきます。

 

想定しているのはsleepしながら、
 時々温度とか測定して、電波で送る等の用途向けですね。

エネループ2本で2ヶ月とか持ってくれると嬉しいです。

 

ここから本題。

問題はATMEGA328を1Mhzで動作させるって所です。

 

arduinoIDEのボードマネージャーから探しても、
 1Mhz動作のブートローダー見つかりませんね。
 前に8Mhzで動かすやつは
 こちら
  https://miha.jugem.cc/?eid=180
 で書きました通り。
  本家さんから
   ブートローダーダウンロードできます。
    https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard
 
 しかし、1Mhzのは無いんですよねー。

 

と思いつつ探しました。
 日本の人ですね。
  https://firewheel.xrea.jp/blog/archives/259
  make atmega328_1MHzでコンパイルしてますね。
  すごいです。

 

でその結果を
 ダウンロードできるように置いてくれていますので、
  使わせて頂くことにしました。
  感謝です。
  https://firewheel.xrea.jp/resources/ATmegaBOOT_168_atmega328_1MHz.hex

 

解説によると、
 いつものarduinoIDEのフォルダにhardwareという名前でフォルダーが有る。
 その中に上記のファイルをそのまま入れて
  boards.txtを書き換えると良いらしい。
 
  hardware
  ├─breadboard
  │ └─avr
  │   │ boards.txt ←これの中身を書き換える
  │   │
  │   ├─bootloaders
  │   │ └─atmega
  │   │     ATmegaBOOT_168_atmega328_1MHz.hex ←これをそのままいれる。
  │   │     ATmegaBOOT_168_atmega328_pro_8MHz.hex
  │   │
  │   └─variants
  └─tiny
    └─ATTinyCore-1.5.2 
     以下略。 
 
 上の階層図の「←」の部分ですね。
  ATmegaBOOT_168_atmega328_1MHz.hexはそのまま入れます。
  boards.txtは以下の内容を書き足します。
   ##############################################################
   
   atmega328bb1i.name=ATmega328 on a breadboard (1 MHz internal clock)
   
   atmega328bb1i.upload.protocol=arduino
   atmega328bb1i.upload.maximum_size=30720
   atmega328bb1i.upload.speed=9600
   
   atmega328bb1i.bootloader.low_fuses=0x62
   atmega328bb1i.bootloader.high_fuses=0xDA
   atmega328bb1i.bootloader.extended_fuses=0xFE
   
   atmega328bb1i.bootloader.file=atmega/ATmegaBOOT_168_atmega328_1MHz.hex
   atmega328bb1i.bootloader.unlock_bits=0x3F
   atmega328bb1i.bootloader.lock_bits=0x0F
   
   atmega328bb1i.build.mcu=atmega328p
   atmega328bb1i.build.f_cpu=1000000L
   atmega328bb1i.build.core=arduino:arduino
   atmega328bb1i.build.variant=arduino:standard
   
   atmega328bb1i.bootloader.tool=arduino:avrdude
   atmega328bb1i.upload.tool=arduino:avrdude
 
 hardwareディレクトリの中身が異なる場合は上記のとおりに作ってあげると良いと思われ(無責任(^^))
 前に内蔵8M版を本家から持ってきて作った時はzipを解凍すると上記構造になっておりましたので、
  https://miha.jugem.cc/?eid=180
   参考にどうぞ。
 
書き換えたら、arduinoIDEを再起動すると、メニューに追加されております。
 

 

 


あとはいつもの手順(書き込み装置使うよ)でブートローダーを書き込んで、
 スケッチも書き込みます。
  参考
   https://miha.jugem.cc/?eid=180
 
今回使ったファイルとかはこちら。
 
 https://drive.google.com/file/d/1SROdaPG_lMrN5H70eDDlGymXOfkQ6lgQ/view?usp=sharing

wingetってコマンド知ってました?。perlをインストールしてみます。
 
なんと、
windowsでLinuxみたいにパッケージ管理が出来るコマンドでっす。
びっくりしちゃいました。
 
ちなみに以下の写真はインドの女優のJennifer Wingetさんです。
 
 
 
 関係ないですけど。この殺風景なブログに初登場の女性ですね。
 
geminiに聞いてみたら
 「winget(Windows Package Manager)は、
  2020年5月20日に開催されたMicrosoft Build 2020でプレビュー版が発表されました。
  その後、2021年5月26日にバージョン1.0が正式リリースされました。」
   by Gemini
 という事ですね。
 
ここ10年ほどWindowsの開発から離れてたからね。
 知らなかったよ。
  ごめんね知らなくて。
 
そのまま起動してみると
 winget
 
実行結果 
 使用できるコマンドは次のとおりです:
  install    指定されたパッケージをインストール
  show       パッケージに関する情報を表示します
  source     パッケージのソースの管理
  search     アプリの基本情報を見つけて表示
  list       インストール済みパッケージを表示する
  upgrade    利用可能なアップグレードの表示と実行
  uninstall  指定されたパッケージをアンインストール
  hash       インストーラー ファイルをハッシュするヘルパー
  validate   マニフェスト ファイルを検証
  settings   設定を開くか、管理者設定を設定する
  features   試験的な機能の状態を表示
  export     インストールされているパッケージのリストをエクスポート
  import     ファイル中のすべてのパッケージをインストール
  pin        パッケージ ピンの管理
  configure  システムを適切な状態に構成します
  download   指定されたパッケージからインストーラをダウンロードする
 
 一通りyumとかaptとかrpmとかdpkgとかと同じ様なコマンドありますね。
 
という訳で、
 知ってしまった以上は試さないと。そしてブログに足跡を残さないとね。
 
 で、考えた結果、今のところインストールしていないWindowsにperlを
  インストールしてみる。
 
perlのIDを検索
 winget search perl
 
実行結果
 ソースの検索中にエラーが発生しました;結果は含まれません: msstore
 名前                     ID                            バージョン 一致           ソース
 ---------------------------------------------------------------------------------------
 Strawberry Perl          StrawberryPerl.StrawberryPerl 5.42.0.1   Command: perl  winget
 MAMP & MAMP PRO          MAMP.MAMP                     5.0.5      Tag: perl      winget
 EditPlus                 ES-Computing.EditPlus         6.0.632.0  Tag: perl      winget
 XAMPP 8.2                ApacheFriends.Xampp.8.2       8.2.12-0   Tag: perl      winget
 XAMPP 8.1                ApacheFriends.Xampp.8.1       8.1.25-0   Tag: perl      winget
 Sharperlight 5.4         PhilightPtyLtd.Sharperlight   5.4.60                    winget
 Paperlib                 FutureScholars.Paperlib       3.1.10                    winget
 Microsoft Hyperlapse Pro Microsoft.HyperlapsePro       1.6.116                   winget
 PerlPrimer               OwenMarshall.PerlPrimer       1.1.21                    winget
 Teambition               Alibaba.Teambition            2.0.3      Tag: paperless winget
 
一番上のやつですね。
 IDが「StrawberryPerl.StrawberryPerl」
 
インストール実施。
 winget install StrawberryPerl.StrawberryPerl
 
実行結果
 ソースの検索中に失敗しました: msstore
 コマンドの実行中に予期しないエラーが発生しました:
 0x8a15005e : The server certificate did not match any of the expected values.
 
 作業ソースの中以下のパッケージが見つかりました。
 続行するには、'--source' オプションを使用していずれかのパッケージを指定してください。
 名前            ID                            ソース
 ----------------------------------------------------
 Strawberry Perl StrawberryPerl.StrawberryPerl winget
 
うーん。msstoreしか検索しないっぽいですね。
 一番右に出ているwingetの所が--sourceで指定する部分か?
  ここらへんの指定が判りにくすぎてやばい。
 
もう一回。sourceにwingetを指定して実行
 ※途中 いつもインストール中に出るUAC制御の画面になってたりするので注意!!
 winget install StrawberryPerl.StrawberryPerl --source=winget
 
実行結果
 見つかりました Strawberry Perl [StrawberryPerl.StrawberryPerl] バージョン 5.42.0.1
 このアプリケーションは所有者からライセンス供与されます。
 Microsoft はサードパーティのパッケージに対して責任を負わず、ライセンスも付与しません。
 ダウンロード中 https://github.com/StrawberryPerl/Perl-Dist-Strawberry/releases/download/SP_54201_6 4bit/strawberry-perl-5.42.0.1-64bit.msi
  ██████████████████████████████   198 MB /  198 MB
 インストーラーハッシュが正常に検証されました
 パッケージのインストールを開始しています...
 インストールが完了しました
 
インストールできたっぽい。
 
実行
 perl
 
実行結果
 'perl' は、内部コマンドまたは外部コマンド、
 操作可能なプログラムまたはバッチ ファイルとして認識されていません。
 
うーん、どこにインストールしたん?
いろいろ探して・・・途中で、ひらめいて
 
cmdプロンプトもう一個起動して
 
実行
 perl
 
実行結果に何も表示されず。何も起きてないように見えるが、
 コマンドに入って何も出てない状態になるので、
  ctrl+Cで抜ける。
 
 どうやら
 インストールしてたcmdプロンプトはpathの設定が自動では入らないですね。
  ま、そういうもんか?
 インストール自体は成功してました。
 
バージョン表示
 perl -v
 
実行結果
 This is perl 5, version 42, subversion 0 (v5.42.0) built for MSWin32-x64-multi-thread
 Copyright 1987-2025, Larry Wall
 
 略
 
プログラムを書いて
 
 print "Hello, miha!¥n";
 
 hello.plで保存
 
perlで実行
 perl hello.pl
 
実行結果
 Hello, miha!
 
 
成功成功

perlでメール送信 sendmail

 

センサーシステムが停止している場合に
 メールで知らせてくれると良いよなーと思っておりましたが、
  なかなか腰が重くて今までなんにもしていなかったんですけど。

 

止まったまま1週間とかデータが上がってこないまま気づかない
 なーんて事が発生したりして。

 

流石に対策することにしました。

 

データベースを検索して最終更新時刻が1時間以上経過したら
 次のバッチ処理でメールを送る事にしました。

 

言語はperl。

 

まず
 DBには更新日付が入っていて、
  文字列の12桁で年月日時分秒が記録されています。
   形式は
    YYYYMMDDhhmmで、YYYYが年、MMが月、DDが日、hhが時、mmが分

 

これに合わせて60分前の文字列を作成
 #現在時刻から各種変数を作り出す、時間単位、日付単位、最終更新時刻
 my ($sec, $min, $hour, $mday, $mon, $year) = (localtime(time-(60*60)))[0..5];  #60分前
 my $last_update=sprintf("%d%02d%02d%02d%02d", $year + 1900, $mon + 1, $mday, $hour, $min);

 

DB検索は
 select sensor_id, sensor_name, last_update, batch_flag 
  from sensor 
  where last_update < '$last_update' and batch_flag=1 order by display_order;

 最終更新時刻が60分より前でしかも、batch_flagが1。

 

ちなみにbatch_flagは処理する場合は1処理しない場合は0を入れておいて、
 そもそも、センサーが接続されていない場合は0を入れておけばOK。
 でないと毎回止まってますよーってメールが来ちゃうので。嘘つき狼みたいになってしまうのでめんどい。

 

そしてメール送信します。

 

今回はメール送信に的を絞って以下になります。

 sendmailにパイプでつなげて、
  open(MAIL, "| $sendmail -t ")
 次々と必要な文字列を送信
   print MAIL "X-Mailer: x-mail V1.00¥n";
   print MAIL "Errors-To: $mailfrom¥n";
   print MAIL "Return-Path: $mailfrom¥n";
   print MAIL "From:$mailfrom¥n";
   print MAIL "To: $mailto¥n";
   print MAIL "Subject:$subject¥n";
   print MAIL $message;
 そしてパイプクローズ
   close(MAIL);

 

半角の英数字送る場合は上記でOKなんですけどね。
 日本語を送りたい場合はJISに変換して送らないといけません。
 
 メールタイトルは
  $subject=Encode::encode('MIME-Header-ISO_2022_JP', $subject);
 メール本文は
  $message=Encode::encode('iso-2022-jp', $message);
 
詳しくはソース参照。
 
 https://drive.google.com/file/d/1glL2HAaCKFOGp20MMY4g31Z1JHouaOBN/view?usp=sharing
 
そしてそして、大問題
 自分の環境が古いせいなんですけど。
  老舗のsakuraのレンタルサーバなんですが、
   perlがv5.14.4でmysqlが5.7なんです。
    ちなみに最新はPerl5.43.0、mysql8.4ですね。

    sakuraさんが悪いわけじゃなくて、自分が古いまま使いたいってだけです。


 たぶん、そのせいで
  日本語が素直に扱えない問題が発生してしまいました。


 事象としては
  SELECT で取得してきた日本語。
   そのままprintしてあげる分には、表示されるし、
    htmlとして出力しても大丈夫なんですけど。


 他の文字と合体
  $GATTAI = "停止中".$row[1]
   とすると、文字化けになります。
 
 色々ヤッてみて駄目だったので調べると。
  https://adiary.adiary.jp/0367
   何やら、UTF8フラグなるものがあり。普通のUTF8とは扱いが異なる模様です。
 
 結局、自分専用機能なので、日本語じゃなくても良くて、
  センサーのIDが判れば良いってことにして今回妥協しました。
 
 sakuraさんからも、新しいサーバーに移行しても良いんですよー
  って無料の案内が来てますので、こういう事がたくさん起きるようであれば
   移行したほうが良いかもしれません。