3Dプリンターノズル詰まり

 

3Dプリンターは不安定です。
3Dプリンターのインクであるフィラメントと言うプラスティックの糸を
丸いドラムに巻き付けた状態で購入するんですけど。
 
 
 
これの設定それぞれ違ったりして、
きちんと合わせないと印刷できません。

今回、TPUというゴムみたいな柔らかい素材で印刷したく。
購入したんですが、色々やっているうちにプリンタの心臓部にあたる
ノズルが詰まってしまいました。
 
 
 
ガーン!!。

プリンタ買った時に付いて来た上からシュッと入れてやる棒が
途中までしか入らん。


メーカーのページによるとノズルを温めて(230℃ぐらい)
上からその棒で挿すと、溶けたフィラメントが先っぽから出てきて
詰まりが解消されるはず。


しかしいくら突いても途中までしか入らん。結構力入れてるんだけどね。
中で焦げた?とか考えつつ。

 

誰かに助けを求めようと
TPUのメーカーに問い合わせたら、印刷速度を40mm/Sまで低下させるとOKだ。
と言うが、オタクの会社の製品のせいでウチのプリンタ詰まったやんけと思い。

返品キャンセルとした。ただのトバッチリかもしれんね。

 

つまり、製品によっては?または、他のフィラメントとノズルの中で混ざることで
固まったり、焦げる事が有るのでは?という疑い。

 

同じメーカーで統一したり、フィラメントの種類毎にノズルを専用で用意するのか?
って感じでしょうかね?

 

新品のノズルを注文しつつ。
ノズルの詰まりを解消する道具も一緒に注文。
治ったらTPU専用にする

 

今回詰まったノズルはプリンタ(CrearityのK1C)を買った時に付いてたやつです。
構造は以下の様になってて下に矢印付けましたが、ここまでは
付属の棒が入るはずです。そこから先は0.4mmなので入りません。
なので、ノズルの詰まり解消グッズの細い針も手に入れました。
 
 
 
はい。今回使う道具と詰まったノズル。

 
 
 

さて、メーカー付属の棒は4cmぐらいしか入らないです。
 本来は6.5cm入るはずなので、そこで詰まってますね。
 
なので、2mmのドリルを差し込んで穿っていきます。
 普通に電動ドリルでぐるぐるします。
  このドリルもそんなに長くはなくて長いと良いんですけど。
 届く所までやってあとは細い針
  本当はヒートガンで温めながら穿ったほうが良いかもですが、
   やけどが怖かったので、自分は常温で実施。
 ライターで少し炙ってみたりしたけど煤が付きます。

そして、貫通!!
 
 
 
そして、取り付けなんですけど、
 新品の届いたほうの箱に説明有るけど。
  写真の丸いところにthermal greaseをを塗るらしい。
   
   
   
ノズル新品買うと小さい袋入りのが付いてくるんですが、
 今後TPUかPETGとか、
  ただのPLAとか変える度に専用ノズルをとっかえひっかえすると
  これじゃ足りん。

と思い、crearityのページを見るとなんと、
 売ってた。
  https://www.amazon.co.jp/dp/B0D9BCV9HD
ま、パソコンので良い事にして
 CPUに塗るやつを塗っておいた。動くやろう。たぶん。

そして、印刷。

TPU印刷の肝になる部分ですが、
 「ベッド、ノズル温度高めでゆっくり印刷」
  が超重要。今回の件で学習しました。
 
今回のTPUは
 TINMORRYのやつで、
 https://www.amazon.co.jp/dp/B08HVQF4D8ですが、
 
印刷設定を以下にしました。
 ノズル230℃ 高め
 ベッド70℃ 高め
 Max Volumetric Speed: 3.2mm^3/s
 Speed (all): 40mm/s
amazonのレビューにそう書いてあった。先人の知恵は重要です。

以上で詰まりが解消できました。
めでたしめでたし。

ESP32の超省電力処理装置=ULPのプログラムが判った

 

ULPとは「Ultra Low Power」の略で、日本語では「超低消費電力」です。

 

google先生によると以下な感じですね。

 スペック:
  動作周波数:8MHz
  レジスタ:4つの16ビットレジスタ
  命令数:約30個
  メモリ:8KBの低速メモリ
  消費電力が少ない
 ULPとメインプロセッサの連携:
  ULPは、メインプロセッサから指示を受けて動作を開始できます。
  ULPが処理を終えると、メインプロセッサに割り込みを送信できます。
  ULPは、メインプロセッサのRAMにアクセスしてデータを読み書きできます。
 

 

 


ESP32ダイアグラム

 
 マークした所がULP

 

当方、C言語もたしなみますが、mycropythonから使ってみたいので、色々調べました。

 

ESP32のmycropythonに標準で付いてくる

 from esp32 import ULP
  を使っての方法だと、他でULP用のプログラムをコンパイルしないといけないので、
  敷居高いなーと思ってたんですが、
  以下のURLになんか良さげなのがありました。
   https://pypi.org/project/micropython-esp32-ulp/#files
   micropython-esp32-ulp 1.2.0
   これだと、pythonのソース中にULP用のプログラムを書いてあげれば実行可能です。

 

サイトにインストール方法も書いてましたが、
 自分は以下の方法で環境構築しました。

 

環境構築

 

 下記URLからダウンロード
  https://pypi.org/project/micropython-esp32-ulp/#files
 tar.gzを取得
  micropython-esp32-ulp-1.2.0.tar.gz
 解凍すると以下のように展開されるので
  micropython-esp32-ulp-1.2.0
   +-esp32_ulp
     +-assemble.py
     +-definesdb.py
     +-link.py
     +-nocomment.py
     +-opcodes.py
     +-parse_to_db.py
     +-preprocess.py
     +-soc.py
     +-util.py
     +-__init__.py
     +-__main__.py
 
 ampyでESP32に入れる。
 ex...
  ampy -p com3 -d 1 mkdir esp32_ulp
  ampy -p com3 -d 1 put micropython-esp32-ulp-1.2.0¥esp32_ulp/assemble.py    esp32_ulp/assemble.py   
  ampy -p com3 -d 1 put micropython-esp32-ulp-1.2.0¥esp32_ulp/definesdb.py   esp32_ulp/definesdb.py  
  ampy -p com3 -d 1 put micropython-esp32-ulp-1.2.0¥esp32_ulp/link.py        esp32_ulp/link.py       
  ampy -p com3 -d 1 put micropython-esp32-ulp-1.2.0¥esp32_ulp/nocomment.py   esp32_ulp/nocomment.py  
  ampy -p com3 -d 1 put micropython-esp32-ulp-1.2.0¥esp32_ulp/opcodes.py     esp32_ulp/opcodes.py    
  ampy -p com3 -d 1 put micropython-esp32-ulp-1.2.0¥esp32_ulp/parse_to_db.py esp32_ulp/parse_to_db.py
  ampy -p com3 -d 1 put micropython-esp32-ulp-1.2.0¥esp32_ulp/preprocess.py  esp32_ulp/preprocess.py 
  ampy -p com3 -d 1 put micropython-esp32-ulp-1.2.0¥esp32_ulp/soc.py         esp32_ulp/soc.py        
  ampy -p com3 -d 1 put micropython-esp32-ulp-1.2.0¥esp32_ulp/util.py        esp32_ulp/util.py       
  ampy -p com3 -d 1 put micropython-esp32-ulp-1.2.0¥esp32_ulp/__init__.py    esp32_ulp/__init__.py   
  ampy -p com3 -d 1 put micropython-esp32-ulp-1.2.0¥esp32_ulp/__main__.py    esp32_ulp/__main__.py   

これで、mycropythonから呼び出し可能です。

 

さっそくLチカ
 参考
  https://github.com/micropython/micropython-esp32-ulp
 これの中の
  https://github.com/micropython/micropython-esp32-ulp/blob/master/examples/blink.py
 
 参考に、いろいろいじくったのが以下のプログラムです。
 コメントが邪魔だったので外して解説代わりに日本語コメント入れています。
 初めての人にはすごく難しいですね。
  GPIO2にLEDを繋いで点滅してくれます。
  UARTにはprintで出力されたメモリの値magicとstateが表示され、
   stateは0→1→0→1と切り替わっています。

 

プログラム

 

 from esp32 import ULP
 from machine import mem32
 from esp32_ulp import src_to_binary
 
 source = """¥
 #define DR_REG_RTCIO_BASE            0x3ff48400
 
 #define RTC_IO_TOUCH_PAD2_REG        (DR_REG_RTCIO_BASE + 0x9c)
 #define RTC_IO_TOUCH_PAD2_MUX_SEL_M  (BIT(19))
 #define RTC_GPIO_OUT_REG             (DR_REG_RTCIO_BASE + 0x0)
 #define RTC_GPIO_ENABLE_REG          (DR_REG_RTCIO_BASE + 0xc)
 #define RTC_GPIO_ENABLE_S            14
 #define RTC_GPIO_OUT_DATA_S          14
 
 #define RTCIO_GPIO2_CHANNEL          12
 
 .set gpio, RTCIO_GPIO2_CHANNEL
 .set token, 0xcafe  # magic token
 
 .text
 magic: .long 0
 state: .long 0
 
 .global entry
 entry:
   # load magic flag
   move r0, magic
   ld r1, r0, 0
 
   # 初期化済みか?
   sub r1, r1, token
   jump after_init, eq  # すでにmagic token=0xcafeが入ってたらJUMP
 
 init:
   # GPIO2をULPに接続する1=GPIOをULPに接続)
   WRITE_RTC_REG(RTC_IO_TOUCH_PAD2_REG, RTC_IO_TOUCH_PAD2_MUX_SEL_M, 1, 1);
 
   # GPIO2を出力に設定する
   WRITE_RTC_REG(RTC_GPIO_ENABLE_REG, RTC_GPIO_ENABLE_S + gpio, 1, 1)
 
   # magicにtoken(0xcafe)を入れる
   move r0, magic
   move r1, token
   st r1, r0, 0

 

 after_init:
   move r1, state
   ld r0, r1, 0
   move r2, 1
   sub r0, r2, r0  # 0と-1を繰り返す  
   st r0, r1, 0  # 値を保存
 
   jumpr on, 0, gt  # r0の値が0より大きい場合はJUMP
   jump off  # 無条件にJUMP

 

 on:
   # GPIOをONにする
   WRITE_RTC_REG(RTC_GPIO_OUT_REG, RTC_GPIO_OUT_DATA_S + gpio, 1, 1)
   jump exit

 

 off:
   # GPIOをOFFにする
   WRITE_RTC_REG(RTC_GPIO_OUT_REG, RTC_GPIO_OUT_DATA_S + gpio, 1, 0)
   jump exit

 

 exit:
   halt  # 停止
 """
 
 binary = src_to_binary(source)  # アセンブル
 load_addr, entry_addr = 0, 8
 ULP_MEM_BASE = 0x50000000 #ULPのSLOWメモリ
 ULP_DATA_MASK = 0xffff  # 下位 16 bits マスク
 ulp = ULP() #ULP初期化
 ulp.set_wakeup_period(0, 500000)  # 0.5秒単位でULPプログラムを呼び出す
 ulp.load_binary(load_addr, binary) #バイナリを0x50000000番地に書き込む
 ulp.run(entry_addr) #entry_addrから実行(先頭バイトは変数格納用)
 while True:
     print(hex(mem32[ULP_MEM_BASE + load_addr] & ULP_DATA_MASK),  # magic token
           hex(mem32[ULP_MEM_BASE + load_addr + 4] & ULP_DATA_MASK)  # current state
           )
 
アセンブラの解説は公式を見て下さい。
 公式 https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/system/ulp_instruction_set.html

 

簡単なものだけ上げておきます。

 

 sub r1, r2, r3     // R1 = R2 - R3
 ld r1, r2, offset  //R1にR2のアドレスの内容を読み込む R1=R2[offset]
 st r1, r2, offset  //R1の内容をR2のアドレスへ書き込む R2[offset]=R1
 move r1, 1         //R1に値1を入れる
 Addr:
   MOVE R1, Addr      //R1にAddrのアドレスを入れる
 label:
   jump label, eq    //実行行を移す GOTO 直前の演算結果がzeroならばJUMP
   jumpr label, 1, eq //R0の中身を比較して同じならJUMP
 adc  r0, sar_sel, mux_sel  //ADCから読み込み-->r0
 stage_rst        //ステージカウントレジスタをリセット(0)
  label:           //8回ループ
   stage_inc  1     //ステージカウントレジスタに1加算
   jumps label, 8, lt //ステージカウントレジスタが8未満ならJUMP
  lsh r2,r2,1 // r2を1ビット左シフト
  halt //停止
  wake //本体復帰
 
 大文字小文字はどちらでもOK
 上記のr0、r1、r2、r3はCPUに内蔵されている16ビットのレジスタ
 ステージングレジスタはカウントしてくれるレジスタで8ビット、
  これ専用にjumpsってのを用意してくれてる。
 adcのmux_selはいつものGPIOの番号とは異なるULPのGPIO番号
 
ハマりポイントとしていくつかありますので上げていきます。

 

 あっちこっちの説明にrtcって書いてるのはULPの事。

 

 マクロの定義は追加で出来ないらしく、push、pop、ret、psrなどを使った
  あっちこっちのサンプルのコードはそのまま実行できない。

 

 GPIOの番号が普通のC言語とか、mycropythonでやってきたものとは
  異なる。ULP専用のGPIO番号が振られていてそれを書きます。
  一覧
   
   
  

 その他にも、外部レジスタが何種類も有り、
  それがさらに複雑さに磨きをかけています。
 
 deepsleepからの復帰はmicropythonでesp32.wake_on_ulp(True)を仕掛けておきますが、
  esp32.wake_on_ext0()と同時に使えません。エラーになります。
  esp32.wake_on_ext1()は同時に使える

 

おまじない(外部レジスタに設定するためのマクロ)全部ではない
 
 #GPIOを出力に設定
 WRITE_RTC_REG(RTC_GPIO_ENABLE_REG, RTC_GPIO_ENABLE_S + gpio, 1, 1)
 
 #GPIOをHIにする
 WRITE_RTC_REG(RTC_GPIO_OUT_REG, RTC_GPIO_OUT_DATA_S + gpio, 1, 1)
 
 #GPIOをLOにする
 WRITE_RTC_REG(RTC_GPIO_OUT_REG, RTC_GPIO_OUT_DATA_S + gpio, 1, 0)
 
 #GPIOをULPに接続
 WRITE_RTC_REG(RTC_IO_TOUCH_PAD0_REG, RTC_IO_TOUCH_PAD0_MUX_SEL_M, 1, 1)
 
 #GPIOからr0に読み込む
 READ_RTC_REG(RTC_GPIO_IN_REG, RTC_GPIO_IN_NEXT_S + channel, 1)

 

 #本体復帰可能か確認 可能ならr0に1が返る
 READ_RTC_FIELD(RTC_CNTL_LOW_POWER_ST_REG, RTC_CNTL_RDY_FOR_WAKEUP)

 

 #ULPタイマー停止 
 WRITE_RTC_FIELD(RTC_CNTL_STATE0_REG, RTC_CNTL_ULP_CP_SLP_TIMER_EN, 0)

 

 上記のRTC_xxな定義はC言語ならヘッダーインクルードすれば良し。
  なのですが、当方micropythonで書きたいので、
  これらはC言語のソースから拾ってきます。

 

おまじないの定義
 READ_RTC_REG(rtc_reg, low_bit, bit_width)
 WRITE_RTC_REG(rtc_reg, low_bit, bit_width, value)
 READ_RTC_FIELD(rtc_reg, field)
 WRITE_RTC_FIELD(rtc_reg, field, value)

 

WRITE_RTC_REG/READ_RTC_REG等のパラメータの探し方

 https://github.com/pycom/esp-idf-2.0/blob/master/components/driver/rtc_module.c
 の43行目からテーブルがある。
  それぞれの行の一番右側コメントの値がGPIOの番号
  ex..
   {RTC_IO_TOUCH_PAD0_REG, RTC_IO_TOUCH_PAD0_MUX_SEL_M, RTC_IO_TOUCH_PAD0_FUN_SEL_S, RTC_IO_TOUCH_PAD0_FUN_IE_M, RTC_IO_TOUCH_PAD0_RUE_M, RTC_IO_TOUCH_PAD0_RDE_M, RTC_IO_TOUCH_PAD0_SLP_SEL_M, RTC_IO_TOUCH_PAD0_SLP_IE_M, RTC_CNTL_TOUCH_PAD0_HOLD_FORCE_M, 10}, //4
 番号の一致する行の1番、2番、4番パラメータを参照し
  https://github.com/espressif/esp-idf/blob/v5.0.2/components/soc/esp32/include/soc/rtc_io_reg.h
 から値を探す

 

GPIO番号の変換
 .set gpio4, 10  # gpio4
 GPIOが何番になるか?
  https://github.com/espressif/esp-idf/blob/v5.0.2/components/soc/esp32/include/soc/rtc_io_channel.h
 から値を探す

 

GPIO毎の初期化一覧
 https://github.com/pycom/esp-idf-2.0/blob/master/components/driver/rtc_module.c

 

GPIOと値の変換
 https://github.com/espressif/esp-idf/blob/v5.0.2/components/soc/esp32/include/soc/rtc_io_channel.h

 

レジスタと数字の変換
 https://github.com/espressif/esp-idf/blob/v5.0.2/components/soc/esp32/include/soc/rtc_io_reg.h

 

RTC_IO_TOUCH_PAD0_MUX_SEL_M部の変換
 https://github.com/pycom/esp-idf-2.0/blob/master/components/esp32/include/soc/rtc_io_reg.h

 

レジスタの情報
 https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf

 

以下はよく使うと思われるポイントをまとめてみた。

 

deepsleep中にULPからの割り込みで本体復帰

 

 mycropythonではesp32.wake_on_ulp(True)をやってからdeelsleepします。
 
  #ULP割り込みON
  esp32.wake_on_ulp(True)
  #sleep
  machine.deepsleep(3600*1000)
 
 本体の状況によっては復帰コマンド(wake)を受け付けない。

  ULPでは本体復帰可能かを確かめて、可能=1ならwakeを行う。
   wakeを行う時にそれ以降ULPプログラムが実行されないようにタイマー停止も行う。


  wakeUp:
          #本体復帰OKか確認
          READ_RTC_FIELD(RTC_CNTL_LOW_POWER_ST_REG, RTC_CNTL_RDY_FOR_WAKEUP)
          #OKならr0に1が入る
          and r0, r0, 1
          jump wakeUp, eq #結果が0ならJUMP 1ならwake
          
          #本体復帰
          wake
          
          #ULPタイマー停止
          WRITE_RTC_FIELD(RTC_CNTL_STATE0_REG, RTC_CNTL_ULP_CP_SLP_TIMER_EN, 0)
          
          jump exit
  exit:
          halt
 
GPIOから値を入力


 #define DR_REG_RTCIO_BASE            0x3ff48400
 
 #define RTC_GPIO_IN_REG              (DR_REG_RTCIO_BASE + 0x24)
 #define RTC_GPIO_IN_NEXT_S           14
 #GPIO14------------------------------------------
 #define RTC_IO_TOUCH_PAD6_REG          (DR_REG_RTCIO_BASE + 0xac)
 #define RTC_IO_TOUCH_PAD6_MUX_SEL_M  (BIT(19))
 #define RTC_IO_TOUCH_PAD6_FUN_IE_M  (BIT(13))
 .set gpio14, 16  # gpio14
 
 state:      .long 0
 
 entry:
         
         # GPIO14
         WRITE_RTC_REG(RTC_IO_TOUCH_PAD6_REG, RTC_IO_TOUCH_PAD6_MUX_SEL_M, 1, 1)
         WRITE_RTC_REG(RTC_IO_TOUCH_PAD6_REG, RTC_IO_TOUCH_PAD6_FUN_IE_M, 1, 1)
 chk1:
         #GPIO14-----------------------------------------------
         # GPIOからr0に読む
         READ_RTC_REG(RTC_GPIO_IN_REG, RTC_GPIO_IN_NEXT_S + gpio14, 1)
 
         #押されてたら1 (PULLDOWNの場合。PULLUPは0)
         jumpr on1, 1, eq
         jump chk2
 on1:
         move r3, state
         move r0, 14
         st r0, r3, 0
         jump wakeUp
         
 chk2:
         次の処理
 wakeUp:
         復帰処理

 

GPIOからアナログ(ADC)入力

 

 mycropythonでADCを初期化しておく
  pin = 34
  ADC(Pin(pin),atten=ADC.ATTN_11DB)
  
  結果を変数領域から取得する
   u12 = mem32[ULP_MEM_BASE + load_addr] & ULP_DATA_MASK
   print("Volt:",u12*(3.3/4095))
  
 ULPではADCから値を読み込んで変数領域へ格納
  #gpio34
  .set sar_sel, 0
  .set mux_sel, 7
  
  .text
  val:     .long 0
  
  adc  r0, sar_sel, mux_sel
  
  move r3, val
  st   r0, r3, 0
  
そのまま実行できるサンプルプログラムを以下からダウンロードできます。

 https://drive.google.com/file/d/1qiiXNS387NZzNazFAt0WiogwVG5Z2qiZ/view?usp=sharing

電源逆接続での保護回路

 

3端子レギュレーターって、物にもよりますが、
 逆接続すると、一瞬で死にます。
 
そして人はなぜか電源を逆に接続してしまうという
 謎の行動を取ってしまう事があります。
 
それは頭では判っているのに、
 やってはイケナイのに
  気づくとやっているという恐ろしい病です。
 
人は完璧な存在では無いという証なのかもしれません。

 そんなあわれな人の為に保護回路が必要になってきます。

 

回路図
 

   
 上が正常時で、
 下が誤って接続した状態の回路になります。
 
 電流の流れの通りに電気が流れてヒューズが切れて回路を守ります。

 実際にやってみると、電源供給された瞬間にヒューズが光って
  電源の供給が絶たれて回路が守られます。

 
 

 ここの所 花火のようにヒューズの線が切れています。アナログメーターは反応してませんね。

 

 ダイオードの定格はなるべくでかいのを使って下さい。
 また、ヒューズはダイオードの定格よりも少ないのを使って下さい。

 

うちの安定化電源は10Aまでしか出せないので、
 実際12Vのバッテリーに接続した試験はしてませんが、
 どうなんでしょうね?


多分大丈夫だろうと思ってますが、だれか実験して報告お願いします。

 

今回お亡くなりになった英霊のお姿

 

 

 

左から


 1N4007 : 定格1Aの所2Aを流されたため延焼
 ヒューズ: 保護回路の実験のため本来の役割を果たし殉職
 NJM239605 : 逆接続で壊れてしまうレギュレーターを特定するために逆接続され死亡

 

ちなみに、その後、上の回路で正常に電圧を加えて、回路が守られたことは確認しております。

 

 

 

続き

 

 電源逆接続での保護回路2 リセッタブルヒューズ版

  https://miha.jugem.cc/?eid=420

雨量計システムを作ってみた話

 

Misol WH-SP-RG 1PCウェザーステーション用スペアパーツ雨量測定用雨量雨量計
 https://www.amazon.co.jp/dp/B07S3VKQXQ
 
 
 
 
製品の特徴
 上部の雨受けの面積
  50mm✖110mm=5500平方mm
 ケーブル長270cm、RJ11のコネクタ

 内部の構造は「転倒ます」方式で、
  シーソーのような機構で、左右に2つの容器(ます)が取り付けられています。
  ますの容量は0.3ccで、1回シーソーが傾きます。
 
 センサーの中のスイッチが入っている箇所に磁石を近づけると
  反応してON/OFFが切り替わるのでリードスイッチを使っていると思われます。
   完全に絶縁できるので屋外使用には向いていますね。

 

設置
 
 
 
 屋外のセンサーとかの設置用としてアイリスのボックスの中に置いています。
 風で飛ばないように3Kのダンベル1セット入っています。
 白いボックスが今回の雨量センサーのマイコン部です。
 
 設置の大まかなつなぎ方は以下のようになっていて
  屋外電源ーーーボックスーー(地中配線)ーーセンサーとなっております。
  ・ボックスの中のESP32がセンサーからのカウントを
   読み取ってWIFIで送信します。
  ・地中配線はPF管の中に通しています。
   60センチ埋めたほうが良いって言いますが、また掘り返したり、
   とか考えるとうんざりなので、10センチ埋めました。どうせ人しか通らないし
   5Vぐらいなら感電とか心配ないし。
   良いとします。
 
 センサー部
 
 
 
 こんな感じで庭に置きました。実験のためにコップを横においています。

 

実測
 次の雨の日
 
 うーん
 うまくいかんねー
 コップを横においた数字と比較して計算すると
  2パルスで1mmぐらいみたいです。
 
 精度を求めるなら再調整ですね。
 
 
  多少駄目でも良いんです。
  目安にはなりますからね。

 

観測結果


 こんな感じで表示しました。

 

 

 

  

  


 
 
 
 

 

  

  

ESP32pythonとサーバのperlでヘッダ情報送信

 

他のユーザーに見られないようにしたい!!
 という要求に簡単な方法としてアクセスキーをヘッダ情報に追加するってありますよね。
 アクセスキーを知らないユーザーはアクセスできないわけです。

 

cgiの中でhttpのヘッダにアクセスキーが無ければ、何も返さない。
 ってすれば実現可能です。

 

アクセスキーをサーバー側プログラムで取得必要があります。

 

perlなので、
 use CGI;
 my $q = CGI->new;
 print $q->header();
  とか書けば良いよねーって思っておりました。
 だけど、必要なヘッダー(今回の場合はユーザ独自のやつ)が
 取れてこなかったりしたんです。
  あっ自分の環境だけの問題かもですけど。
  
  
  
色々調べたら
  環境変数に入ってくるみたいですね。

 

こちらで一覧が取得できます。

 

 #! /usr/bin/perl
 print "Content-type: text/plain¥n¥n";  #DEBUG
 use CGI qw(:standard);
 use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
 foreach my $key (sort(keys(%ENV))) {
    print "$key = $ENV{$key}¥n";
 }

 

実行結果がこれ。

 

 CONTEXT_DOCUMENT_ROOT = /home/user/www/iot/
 CONTEXT_PREFIX = 
 DOCUMENT_ROOT = /home/user/www/iot/
 GATEWAY_INTERFACE = CGI/1.1
 HTTPS = on
 HTTP_ACCEPT = text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8
 HTTP_ACCEPT_ENCODING = gzip, deflate, br, zstd
 HTTP_ACCEPT_LANGUAGE = ja;q=0.9
 HTTP_HOST = xxxx.xxxx.jp
 HTTP_LISTEN_IPADDR = 2001:::::181:97:25
 HTTP_PRIORITY = u=0, i
 HTTP_SEC_CH_UA = "Chromium";v="134", "Not:A-Brand";v="24", "Brave";v="134"
 HTTP_SEC_CH_UA_MOBILE = ?0
 HTTP_SEC_CH_UA_PLATFORM = "Windows"
 HTTP_SEC_FETCH_DEST = document
 HTTP_SEC_FETCH_MODE = navigate
 HTTP_SEC_FETCH_SITE = none
 HTTP_SEC_FETCH_USER = ?1
 HTTP_SEC_GPC = 1
 HTTP_UPGRADE_INSECURE_REQUESTS = 1
 HTTP_USER_AGENT = Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36
 HTTP_X_REAL_IP = 2001::::::8bdd:2164
 HTTP_X_SAKURA_FORWARDED_FOR = 2001:::::1210:8bdd:2164
 PATH = /usr/local/bin:/usr/bin:/bin
 QUERY_STRING = id=A0000
 REMOTE_ADDR = 2001:::::1210:8bdd:2164
 REMOTE_PORT = 0
 REQUEST_METHOD = GET
 REQUEST_SCHEME = https
 REQUEST_URI = /bw/DL.cgi?id=A0000
 SCRIPT_FILENAME = /home/user/www/iot/bw/DL.cgi
 SCRIPT_NAME = /bw/DL.cgi
 SERVER_ADDR = 1.1.1.33
 SERVER_ADMIN = [no address given]
 SERVER_NAME = xxxx.xxxx.jp
 SERVER_PORT = 443
 SERVER_PROTOCOL = HTTP/1.1
 SERVER_SIGNATURE = 
 SERVER_SOFTWARE = Apache

 

上記の結果はchromeブラウザでの表示結果です。
 実際にはESP32のmicropythonとやり取りするんですね。

 

ESP側でHTTPのGETを送信する部分以下の通り(micropythonです。(^o^))

 

 wifi= network.WLAN(network.STA_IF)
 wifi.active(True)
 wifi.connect(ssid, passkey)
 addr = socket.getaddrinfo(host, port)[0][-1]
 s = socket.socket()
 s.connect(addr)
 s.send(bytes('GET /%s HTTP/1.0¥r¥nHost: %s¥r¥nx-ACCESKEY:keyxxxxxxxx¥r¥n¥r¥n' % (path, host), 'utf8'))

 

どこがアクセスキーかと言うと最後の行
 s.sendの文字列
  x-ACCESKEY:keyxxxxxxxx
   の所です。

 

サーバー側で取り出す時

 

 my $key = $ENV{"HTTP_X_ACCESKEY"};
 print "key = $key";

 

実行結果

 

 key = keyxxxxxxxx

 

キー名がクライアントとサーバーでは勝手に変えられてしまうみたいです。
 ルールですね。一応法則さえわかれば大丈夫ですが。
 
 クライアントでは「x-ACCESKEY」
  ですが、
 サーバーでは「HTTP_X_ACCESKEY」
  となります。
 
ユーザ独自のキーはx-始まりになります。

 

perlサーバーで取得時は「x-」部分が「HTTP_X_」に変わっています。

 

今回はアクセス制限の話なのでクライアントにアクセスキーを
 持たせてサーバー側で取得して確認って事でした。

 

ちなみにperlのCGI.pmとCarp.pmの機能ですが。
 use CGI::Carp qw(warningsToBrowser fatalsToBrowser);
  と書くとあら不思議、プログラムのエラー発生時に画面上表示してくれちゃいます。
   便利ですねー

 

RaspberryPI Zero WでWEBサーバ+perlのCGI

 

最近気づいたんですが、
 うちのインターネットの接続環境ですが、
  プロバイダーへ経由で接続する普通のアクセスと
   クロスパスっていうちょっと特殊な経路のがあって、
  両方機能しているみたいなんです。
 
 NTT----1段めルータ----2段めルータ-----各部屋へ引き込み
  ってなってます。
 
 1段目のルーターはNTTが光電話のために置いてったやつ。
 2段めのルーターはNECのやつ。
 
 元々は1段めルーターだけで使ってて。
 2段めにクロスパス対応のルーターを追加したわけです。
 1段めのNTTのにはプロバイダーへの接続設定がそのまま残ってました。
  だれも使ってなかったけど、生きてたんですね。
 
 クロスパスの方は外部からのアクセスに対応していなかったようなので
  MyDNS契約を残しているものの使っていない状況になっていました。
 
 今回、1段め生きていることが判明したため、MyDNS用にサーバーを設置してみたいと
  記事を書いてみました。

 

OSをインストール


 ラズパイのページからOSをダウンロード
  https://www.raspberrypi.com/software/operating-systems/
  
  一番上の
   Raspberry Pi OS with desktopをダウンロード
    Raspberry Pi OS with desktop
    Release date: November 19th 2024
    System: 32-bit
    Kernel version: 6.6
    Debian version: 12 (bookworm)
    Size: 1,177MB
    Show SHA256 file integrity hash:
    Release notes
  
  解凍して
   2024-11-19-raspios-bookworm-armhf.img
    を取得
  
  WIN32DiskImagerでmicroSDに書き込み
    https://win32diskimager.download/download-win32-disk-imager/
  
microSDをセットして起動。初期セットアップ

 

 USBハブを使ってキーボートとマウスを接続する
 ディスプレーを接続する
 電源はUSBポートではなく、専用電源3A以上を推奨。
 microSDを接続
 
 初回起動なのでCountry、Language、TimeZoneを聞いてくるので指定する
 CountryにJapanをセットするとLanguage、TimeZoneも自動でセットされる。

 Create User
  ユーザIDとパスワードを入力する 
   username:miha
   password:pass
 
 最寄りのWIFIのアクセスポイントの一覧が表示されるのでどれかを選択
  wifiのパスワードを入力
 
 デフォルトのブラウザーを選択
  お好みで選んでください
   自分は Chromium を選択してNext
 
 Update Software画面でNextを選択
  2時間かかります。
  System is up to date まで進んだらOKをクリック
 
 Setup Complete画面でRestart
 
 再起動する事を確認

 

SSHサーバを起動

 sudo raspi-config
 
  Interface Options
    SSH
     Would you like the SSH server to be enabled?
     Caution: Default and weak passwords are a security risk 
     when SSH is enabled!
      <はい>
      The SSH server is enabled
      <了解>
 
 IPアドレスを調べる
  
  ifconfig
  
   今回の場合は 192.168.1.107
 
 teratermでIPアドレス指定して接続できる

 

apache2をインストール

 

 sudo apt-get install apache2

 

 終わったらhttp://192.168.1.107をブラウザで表示

 以下のように出ればOK
 
 
 
 
ページの中身書き換え
 
 webサーバーのファイルは上記に書いてるけど以下に存在する。

  /var/www/html/index.html
  
 cd /var/www/html
 cat index.html
 
 なんか、cssがいっぱい使われててテキスト表示するだけなのに
 長げー・・・・

 無駄なバイト数は送るなーって教わらなかったのかな?みたいな。
 2000年問題以前にコンピューターを学んだ人間は1バイトでももったいない。
 で、これを書き換える。
 
 vi index.html
 
  <!DOCTYPE html>
  <html>
  <head>
  <title>miha-home</title>
  <meta charset="utf-8">
  </head>
  <body>
  <a href="bbs/bbs.cgi"<h1>[BBS]</h1></a>
  </body>
  </html>
 
  最初のメニューページなので、掲示板へ飛ばす為のLINKのために
   <a href=>を書いておくページ

 

perlでCGI動作環境作成
 
 apache2の設定ファイル変更
 
 sudo vi /etc/apache2/conf-available/cgi-enabled.conf
 
  <Directory "/var/www/html">
      Options +ExecCGI
      AddHandler cgi-script .cgi .pl
  </Directory>
  
 sudo vi /etc/apache2/conf-available/serve-cgi-bin.conf
  
  <IfModule mod_alias.c>
          <IfModule mod_cgi.c>
                  Define ENABLE_USR_LIB_CGI_BIN
          </IfModule>
  
          <IfModule mod_cgid.c>
                  Define ENABLE_USR_LIB_CGI_BIN
          </IfModule>
  
          <IfModule mod_cgi.c>
                  Define ENABLE_USR_LIB_CGI_BIN
          </IfModule>
  
  #       <IfModule mod_cgid.c>
  #               Define ENABLE_USR_LIB_CGI_BIN
  #       </IfModule>
  #
  #       <IfDefine ENABLE_USR_LIB_CGI_BIN>
  #               ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
  #               <Directory "/usr/lib/cgi-bin">
  #                       AllowOverride None
  #                       Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
  #                       Require all granted
  #               </Directory>
  #       </IfDefine>
  </IfModule>
 
 ライブラリーをインストール(use CGIが使えるようにする)
  sudo apt install libcgi-session-perl
 
 設定の反映
 
  sudo a2enconf cgi-enabled
  sudo a2enmod cgi
  sudo systemctl restart apache2

 

CGIを設置
 
  mkdir /var/www/html/bbs
  vi bbs.cgi
   
   #!/usr/bin/perl
  
   print "Content-type: text/plain¥n¥n";
   
   use strict;
   use CGI;
   
   my $q = new CGI;
   my $id = $q->param('id');
   my $url =$q->url( -relative => 1, -path => 1, -query => 1 );
   my $rel =$q->url( -relative => 1 );
   
   print "$id"."¥n";
   print "$url"."¥n";
   print "$rel"."¥n";
   
   print "hello"."¥n";

 

  とりあえず、コマンドラインから実行
  
  perl bbs.cgi
  
   エラーにならなければOK
   
  ブラウザーで表示
  
   http://192.168.1.107/bbs/bbs.cgi?abc=a&id=oh%20id
   
   oh id
   bbs.cgi?abc=a;id=oh%20id
   bbs.cgi
   hello
  
ページ掲示板プログラム
 
  vi bbs.cgi
  
  #!/usr/bin/perl
  
  print "Content-type: text/html; charset=utf-8¥n¥n";
  
  use strict;
  use CGI;
  
  #パラメーターを取得しておく
  my $q = new CGI;
  my $message = $q->param('message');
  
  #
  if ($message ne "") {
    #HTMLエスケープ
    $message=$q->escapeHTML($message);
    #ファイルに書き込む
    open(OUT, "> /var/www/html/bbs/bbs.txt");
    print OUT $message;
    close(OUT);
  }
  
  #ページ表示
  print <<EOL;
  <html>
  <body>
  <h2>一枚掲示板</h2>
  <form method="post" action="bbs.cgi">
  <textarea name="message" rows="10" cols="80">
  EOL
  
  open(IN, "/var/www/html/bbs/bbs.txt");
  while (my $line = <IN>){
    chomp($line);
    print "$line";
  }
  
  print <<EOL;
  </textarea>
  <input type="submit" value="送信">
  </form>
  <hr>
  <a href='bbs.cgi'>再表示</a>
  EOL
 


 メモ帳的に枠内を書き換えて送信を押せば書き換わるという。

 自分専用のメモ的な感じで使いたい掲示板

 クーロンタブの設定でnanoからviに変更
 
  一度nanoを設定した後にviに戻したい場合はselect-editor
  
  ex...
   miha@raspberrypi:~$ select-editor
   Select an editor.  To change later, run 'select-editor'.
     1. /bin/nano        <---- easiest
     2. /usr/bin/vim.tiny
     3. /bin/ed
   
    Choose 1-3 [1]:1

2SC3355で作るアンテナ用プリアンプ

 

FMラジオの音質がイマイチだなーと思っていたり
 さしすせその発音が若干ざじずぜぞに聞こえたり
  これって電波が弱いのか?とか思ったり

 

TVのブースターが故障したり
 ブースター本体ではなく、電源を供給する装置のほうが
  壊れていたり

 

そんなこんなで、
 電波環境悪い事、無いですか?

 

それなら、と高周波増幅器を試してみたいを思っていたので、
 高周波用のトランジスタ2SC3355をゲットしました。


参考回路
 https://xn--p8jqu4215bemxd.com/archives/14953#gallery-13
参考回路の左上部分を活用させてもらいます。

 

アンテナとの間に挟む。2SC3356・・・。
 あ、間違えて2SC3355を仕入れてしまった。ガーン。
  ま、しかしデータシートを見ると
    https://akizukidenshi.com/goodsaffix/2sc3355(NEC).pdf
    VCBO、VCEO、VEBO、ICなどなど同じですね。
     2SC3356の方が若干利得が高いみたいですが、
      兄弟製品みたいです。


  周波数的にも
   順方向伝達利得 VCE10V、Ic20mA、f=1.0Ghzで9.5dB
   利得帯域幅積=fT=6.5Ghz
    となっているので、
     大体の周波数は大丈夫かなーって感じだったので
      良しとしました。


  受信する想定の周波数は
   FM 70Mhz~108Mhz
   地上波 470~710MHz
   BS 1032MHz~1489MHz
   CS 1595MHz~2071MHz
  ってところですが、
     2Ghzでも7dBの利得となっているみたいなので
      たぶん大丈夫でしょ。てきとーモード

 

回路図
  
 
 
制作時のハマりポイント
 
 ブレッドボード基盤に組んだんですが、うまく増幅しませんね。
  と思ってデータシートをよく見ると、
   いつものトランジスタとピン配置と異なります。
 トランジスタのピン配置は正面から見て左から
  「えくぼ」=ECBってなっていると思い込んで作っていったら、
   
  トランジスター 2SC3355L-T92-K
   

    
  なんと、
   「ベエコ」でした。コレクタが真ん中でさえなし。
 
 電圧が低くて壊れなかったのでラッキーでしたけど。
  やばかったですよね。

 

効果
 効果を測定するにあたり、
  先日の「パソコンをSDRラジオにする」
   https://miha.jugem.cc/?eid=401
 の記事で使ったソフト、AIRSPYを活用します。
  「増幅なし」
  
  
  
  「増幅あり」
  
    
 表示しているのはFMの周波数帯ですが、
  帯域全体にわたり、20dB上がっております。
  
 SNR=(Signal-to-Noise Ratio)=信号対雑音比
  も若干上がっておりますので聞きやすくなっているはず。
 
 ただし、体感ですけど
  音が良くなったかは今のところわかんないですね。
 
 先日作成したSDRとAIRSPYですが、
  電波の強度計として使えるので結構重宝するかもです。

 

ユニバーサル基板に組みました。

 

 

 

パソコンをSDRラジオにする

 

ここで言っているSDRとは、

 Software Defined Radio

  ラジオ電波を受信して、ソフトウェアで音声に変換して聞くことが出来るラジオと言う事です。

   パソコンの性能が良くなって、出来るようになった。

 

環境
 Windows11 Home
 ワンセグチューナー : DS-DT310BK

 

DS-DT310BK
 チューナーチップセット:FC0013
 復調用:Realtek社RTL2832U

 50MHz~1100MHz位のバンド幅で受信できるらしい


 https://www.amazon.co.jp/dp/B008H8JA9O
 まだ中古で売られてた。

 
 自分のは昔々購入した手持ちです。
  被災時にパソコンのンバッテリーが切れるまで
   テレビが見れたら良いなーと持っているものです。

 

 参考 

  https://blog.goo.ne.jp/jf1vxb/e/aef31c0ae062cfa6f3cf2bbd61e2752b
 上記記事を参考にしてインストールしていく

 

必要なものは
 ドライバー
 SDRの受信再生ソフト

 

 参考にしたページによるとSDRの受信再生ソフトを
  何回も入れているように見えるんですよね。
  とりあえず、基本ということで。
   下のほうに最初にやった手順として記録に残します。
  それと、あっちこっちから調べた結果になってますので
   参考ページとはだいぶ違うかもです。
 
2025年2月版として参考になればと思います。

 

■ 手順まとめ ■ たぶん、これで行けるはず。

 

ワンセグチーナーを接続する
 デバイスマネージャーで確認すると
  「ほかのデバイス」にRTL2832Uが表示される
   すでにほかのドライバー(TV用とか)入っている場合は
    「ほかのデバイス」ではない所に格納されいると思います。
      その場合はデバイスマネージャーで削除しておいたほうが良いと思われます。
  
  
  
ドライバーをインストール
 Zadig DriverでRTL2832Uのドライバーをインストール
  https://sourceforge.net/projects/libwdi/files/zadig/
  zadig_v2.0.1.160.7zをダウンロード
  展開するとzadig.exeが現れるので実行
  「Options」⇒「List all devices」
  画面上部のリストからRTL2832Uを選択
  
  
  
  
  InstallDriverをクリック

  
  
  
  
 デバイスマネージャーで確認
  ユニバーサルシリアルバスにRTL2832Uが表示される
  
  
  
 ここまででZadigは閉じて良い


SDRの受信再生ソフトのインストール

 ダウンロード
  https://sdrchile.cl/en/
   右上のDownload Latestをクリック
   
   
   
 SDRSharp-installerがダウンロードされるので
  実行 普通に進める(I Agree→Next→Install→Finish)

  

  

  


 デスクトップに起動用と、録音用アイコンが作成されるが使わない
  削除する。


インストールバッチを起動
 
 C:¥SDRSharp¥binにファイルが作成されているので
 install-rtlsdr.bat を起動。
  ※中身は
   以下URLから最新のrtlsdr.dllを持ってくる
     http://github.com/rtlsdrblog/rtl-sdr-blog/releases/latest/download/Release.zip tmp¥Release.zip
  さらに以下URLから最新のzadigを持ってくる
    httpget http://github.com/pbatard/libwdi/releases/download/%zadig_url% zadig.exe

 

起動と調整

 C:¥SDRSharp¥binにファイルが作成されているので
  SDRSharp.dotnet9.exeを起動
   起動すると、
    .netランタイムがインストールされていない場合はインストールされる
     その場合はもう一度起動
 
 左上の三→Source→RTL-SDR USBを選択
  
  
  
 そして復調方式をWFMにして(FMラジオの場合)
  ▶をクリックしてスタート
  
  
  
  
 好きなチャンネルに合わせる
  画面中央上のところでマウスをくりくりします。

  

  

  

 

以上です。おしまい。

 

以下は参考資料になります。

 


■■■■■■■■■■■■■■■■■■■

基本的には
 ドライバーインストール
  と
 C:¥SDRSharpの中にファイルを入れていきます。
 
ただし、インストーラーが走るので、
 WindowsのSystem32配下とかにファイルを
  入れている場合もあるかもしれません。

上の手順でうまくいかない場合は以下の手順も参考にしてください。

■■■■以下は最初にやった手順■■■■

ワンセグチーナーを接続する
 デバイスマネージャーで確認すると
  「ほかのデバイス」にRTL2832Uが表示される
  
  
  
ドライバーをインストール
 Zadig DriverでRTL2832Uのドライバーをインストール
  https://sourceforge.net/projects/libwdi/files/zadig/
  zadig_v2.0.1.160.7zをダウンロード
  展開するとzadig.exeが現れるので実行
  「Options」⇒「List all devices」
  画面上部のリストからRTL2832Uを選択
  
  
  
  
  InstallDriverをクリック
  
  
  
 デバイスマネージャーで確認
  ユニバーサルシリアルバスにRTL2832Uが表示される
  
  
  
 ここまででZadigは閉じて良い

SDRの受信再生ソフトのインストール

 ダウンロード
  https://sdrchile.cl/en/
   右上のDownload Latestをクリック

  

  

  
 SDRSharp-installerがダウンロードされるので
  実行 普通に進める(I Agree→Next→Install→Finish)
 
  
 
 デスクトップに起動用アイコンが表示される
  SDRSharp Recordings
 
 この段階ではきちんと起動できないっぽい
 
プラグイン(RTL2832U)を入れる
 ダウンロード
  https://ftp.osmocom.org/binaries/windows/rtl-sdr/
   
   
   
  64bitの最新日付
   rtl-sdr-64bit-20250202.zipをダウンロード
  展開したものを
   C:¥SDRSharp¥binにコピー
    この時上書きするか聞かれるので上書きしない
  
  
.netのランタイムをインストール
 SDRSharp.dotnet8
 SDRSharp.dotnet9
 
SDRの受信再生ソフトのインストール
 https://airspy.com/download/
  SDR# x64をDownload
   sdrsharp-x64.zip

   

   

   
 展開したものを
  C:¥SDRSharp¥binにコピー
    この時上書きするか聞かれるので上書きする

インストールバッチの実行
 install-rtlsdr.batの実行

起動と調整

 SDRSharp.dotnet9.exeを起動
 
 左上の三→Source→RTL-SDR USBを選択

 
 
 

冷たくなった電気あんか(ソフト)

 

冷たくなったシリーズ
 電気アンカ
  https://miha.jugem.cc/?eid=249
 電気毛布
  https://miha.jugem.cc/?eid=250

 

冷たくなったシリーズ第3弾

 冷たくなったソフト電気あんかです。
  2021年11月に購入したものです。
   コイズミ ソフト電気あんか 省エネ エコ 節電 
    電気湯たんぽ チェック柄 KSA-03213
   https://amzn.to/4j7rzEv
   
   写真

   

 

ある日急に冷たくなってしまった電気あんか
 前も、その前も 冬でした。
 直前には電気コタツが
  急に冷たくなり。こちらは記事にしませんでしたが

   スイッチ付きのケーブル交換で修理しました。

    https://amzn.to/4h2EIN3

   いつも寒い時に壊れます。
    使っているからっていうのもありますけど。
     正月の最中とか止めてほしい限りです。
 
今回もソフト電気あんかが急に冷たくなりました。
 
いつもの温度ヒューズだろうと開けてみて、
 温度ヒューズって書いてある所を直結するとあったかくなったので楽勝ですね。
 
 写真

 
 
温度ヒューズはこのシリーズで10本まとめて買っていたので
 部品箱にありますしね。
 
左が壊れた温度ヒューズ左で、右が部品庫にあった温度ヒューズ
 
 写真

 
 
はんだ付けで直したんですけど・・・
 治りません。温度ヒューズがはんだごての熱で切れてしまうからですね。
 仕方がないのでリングスリーブ小で接続しました。
 https://amzn.to/4fLlGJW

 写真

 
 
元通りに組み立てて、完成
 写真

 
 
元々くっついていた温度ヒューズが115℃のやつなので、
 もしも、サーモスタットが壊れて反応しない場合は
  電気あんかが115℃を超えてくる可能性がある。
   なので、念の為テスト。


 毛布で断熱しながら時々手を突っ込んでみるが、
  適温です。
 
 サーモスタットの動作確認のため
  ecoワットを使って時々電気が切れているか確認した所、
   10分ぐらいで切れてくれたので、サーモスタットは異常なし。
  
手を突っ込むと異常無いんですけど。
 ESP32とDHT22で作った温度計で中の温度を計測すると、70℃を超えてくるのは
  何でだろう?って感じでした。
   たまたま50Hzで同期周波数が合ってしまう部品があったりするんでしょうか?

    ESP32のWIFIアンテナが熱くなっているのか?みたいな感じですね。
 
 温度は体感で問題ないので良いとしますけど。
  相性悪いんかなー
   これはこれで別課題としておきます。