JUGEMテーマ:電子工作

 

arduino互換とDHT11での保温箱と保温コントローラー

 

温度を制御するための汎用的なコントローラーと保温箱を作成してみました。

 

■全体構成

 

 

■回路図

 

 

 

ATMEGAは8MHz動作の内臓クロック使用です。
 電源電圧は5Vとなります。
 関連記事 https://ameblo.jp/fc2miha/entry-12833772883.html

 

 

今回は温度センサーは手持ちで余っていたDHT11を使用します。
スイッチの代わりにロータリーエンコーダーを使用します。
表示装置として手持ちがあったAQM1602Y-NLW-FBWを使用します。
100Vの熱源にも対応したかったので、SSRの30Aタイプを使用しました。

 使用した熱源の抵抗が20Ωで、30VのACアダプタをかませて15Wで運用します。
保温するための熱源としては、壊れてしまった電気毛布の電熱線を再利用しました。


 上の段の[]が設定温度で、下の段が測定結果の温度と湿度です。

 

■機能


 冷やす機能はないです。熱源を切ってただ冷えるのを待ちます。
 設定した温度を記憶しておき、
 温度センサーで測定した温度と比較
 状況に応じて電熱線をON/OFFします。

 

■温度センサー


 温度センサーはDHT11を使用します。
 温度と湿度を測定できますが、
  温度は1°C単位、湿度は1%単位の分解能なので、
  30℃の次は31℃となります。
 DHT21とかDHT22なら0.1℃単位、0.1%単位が可能ですが、
 実用的には0.1℃の差とか気にならないと思います。

 

■納豆

 


 
 実は納豆作成のため開発しています。

 

■保温箱

 


 

 台所から拝借してきた、バット?のまわりに、
 電気毛布からとってきた電熱線をくぐグル巻いています。

 
■コントローラー中身
 いつも適当です。
 
 
 
 右上のがSSRですね。

  基盤とかLCDはホットボンドでくっつけています。

   固まると十分な強度ですし、

    後で剥がすのも比較的簡単です。

 

■実用性とか

 納豆なら問題ないですね。納豆は40℃~45℃ぐらいです。

 お湯を沸かそうとすると、パワーが足りないので、

  コンロ用のヒーターとか使わないとですね。

  あと、防水のDHT11の入手が必要です。

 今回の組み合わせだと最大で50℃でした。

  温泉卵作るのには足りないですね。

 

■プログラム

 

#include "EEPROM.h"
#include "ST7032_asukiaaa.h"
ST7032_asukiaaa lcd;

#include <DHT.h>
#define DHTPIN 2  
#define DHTTYPE DHT11   // DHT11
//#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
//#define DHTTYPE DHT21   // DHT 21 (AM2301)
DHT dht(DHTPIN, DHTTYPE);

#define LOGO "Ho-ON!R2"
int ondo;
int situdo;
int settei_ondo;
int old_settei_ondo;
long lastTm;
long old = -1;

//
// address  2=設定温度
//
void save_EEPROM(int address, int v)
{
  int address_h = address*2;
  int address_l = address*2+1;
  EEPROM.write(address_h, v/256);
  EEPROM.write(address_l, v%256);
  
  Serial.println("save");
  Serial.println(address_h);
  Serial.println(address_l);
  Serial.println(v/256);
  Serial.println(v%256);
}

int load_EEPROM(int address)
{
  int address_h = address*2;
  int address_l = address*2+1;
  int h = EEPROM.read(address_h);
  int l = EEPROM.read(address_l);
//Serial.print("h=");
//Serial.println(h);
//Serial.print("l=");
//Serial.println(l);
  int r = h * 256 + l;
  Serial.print("r=");
  Serial.println(r);
  if(h==255 && l==255){
    return -1;
  }
  return r;
}

int on_flag = 0;
void displaySet()
{
    char Do[2];
    Do[0] = 0xdf;
    Do[1] = 0x00;
  
    lcd.setCursor(0, 0);
    lcd.print(LOGO);
    lcd.print(" [");
    lcd.print(settei_ondo);
    lcd.print(Do);
    lcd.print("C] ");

    lcd.setCursor(0, 1);
    lcd.print(" ");
    lcd.print(ondo);
    lcd.print(Do);
    lcd.print("C ");
    lcd.print(situdo);
    lcd.print("% ");

    if(on_flag){
      lcd.print("ON   ");
    }
    else{
      lcd.print("OFF  ");
    }
}

void setup()
{
  pinMode(13, OUTPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  
  dht.begin();
  
  lcd.begin(16, 2);
  lcd.setContrast(10);
  //displaySet();

  Serial.begin(9600);
  Serial.println(LOGO);

  settei_ondo = load_EEPROM(2);
  if(settei_ondo < 1 || 100 <= settei_ondo){
    settei_ondo = 43;
  }

  Serial.print("settei_ondo = ");
  Serial.println(settei_ondo);
  old_settei_ondo = settei_ondo;
  lastTm = millis();
  
}

int old_on_flag = 0;


int old5=1;
void loop()
{
  float t = dht.readTemperature();
  float h = dht.readHumidity();
  ondo = t;
  situdo = h;
  //Serial.print(int(t));
  //Serial.print("゚C, ");
  //Serial.print(int(h));
  //Serial.print("% ");
  //Serial.println("");

  if(ondo==settei_ondo){
    if(old_on_flag==1){
      digitalWrite(13, LOW);
      on_flag = 0;
    }
    if(old_on_flag==0){
      digitalWrite(13, HIGH);
      on_flag = 1;
    }
  }
  if(ondo<settei_ondo){
    digitalWrite(13, HIGH);
    old_on_flag = 1;
    on_flag = 1;
  }
  if(ondo>settei_ondo){
    digitalWrite(13, LOW);
    old_on_flag = 0;
    on_flag = 0;
  }

  int val5 = digitalRead(5);  //くるぐる
  int val6 = digitalRead(6);  //ぐるぐる
  if(old5!=val5){
    if(val5==0){
      Serial.print("val5 = ");
      Serial.println(val5);
      Serial.print("val6 = ");
      Serial.println(val6);
      if(val6==1){
        settei_ondo = settei_ondo + 1;
        if(settei_ondo>=100){
          settei_ondo = 99;
        }
        lastTm = millis();
      }
      else{
        settei_ondo = settei_ondo - 1;
        if(settei_ondo<=1){
          settei_ondo = 1;
        }
        lastTm = millis();
      }
    }
  }
  displaySet();
  old5=val5;

  long now = millis();
  if((now-lastTm)>10000){
    if(old_settei_ondo!=settei_ondo){
      old_settei_ondo = settei_ondo;
      save_EEPROM(2, settei_ondo);
    }
  }
  if(now-old>5000 || old == -1){
    old = now;
    Serial.print(ondo);
    Serial.print("゚C, ");
    Serial.print(situdo);
    Serial.print("% ");
    Serial.println("");
  }
}

VA-10Jのサーバーがすでに死んでいるけど、なんとか動くようにした。
 
VAIOというお名前のスマホ。
2015年3月に発売された模様。
yodobasiのページによると47,280円(当時)
 

 
■スペック
 
 OS種類:Android 5.0
 CPUコア数:クアッドコア
 内蔵メモリ(ROM):16GB
 内蔵メモリ(RAM):2GB
 バッテリー容量:2500mAh
 画面サイズ:5インチ
 画面解像度:1280x720
 カメラ: 背面1300万画素、前面500万画素
 
 
今となっては古いものですが、なんといっても腐ってもVAIOと思い
貰ってきました。
普通に初期化すれば使えると思い、
 設定から、データの初期化を選んで初期化しました。
その後起動してきたものの、いろいろと動かない・・・・・
いつもの罠にはまったのか?
 
■症状・・・
 ・gメールで送受信はできるもののハンバーガーマーク(左上の三)を
  押すと、googleplayの画面(クーポンコードを入れるやつ)になる。
 ・Playストアを起動すると上と同じ画面になる。
 ・googleMAPがアプリで起動できなく、ブラウザでは現在位置ボタンが
  動かない。
 ・youtubeアプリが起動できなく、ブラウザも表示できない。
 ・システムアップデートをするとサーバーに接続中から先に進まない。
 ・他にも不具合があったかもですが、確認できたのはこんな感じ。
 ・そのほかのカメラとか、電卓とか、ブラウザとか、FMラジオは動いている。
 
■調査
 
 WEBでいろいろ見てみると、
 ・何かサーバにつながらない、というようなエラーが出て、
  バージョンアップができませんでした。
 ・Google Play が VAIO VA-10J Phone で動作しないのはなぜですか?
 ・アンドロイドバージョン5.0でyoutubeやプレイストアやプレイゲームが
  開かない。
 色々と不穏なことが書いてますが、
  Android5がだいぶ古いので、サイトやサービスによってはサポート終了しているみたい。
 
■問題解析
 
 AndroidのOSバージョンは5.0.2が入っている。
 ビルド番号は VA-10J-user 5.0.2 LRX22G-2035.20150910.110622 と書いてある。
 こちらのページによるとこれ以上には更新できず。これが最新。
  https://www.bmobile.ne.jp/info/vaio_update.html
 20150910←これって、2015年9月10日の事で、もう8年前になり、セキュリティー面では不安ですよね。
 サポート切れてる時点でセキュリティー面を気にする人はもう使わないほうが良いです。
 

 
■問題解決2
 上記の症状を見ると、google Playが古くてだめで、
  自動アップデートはサーバがすでに死んでいるのでアップデートできない。
   みたいな状況かなと考えた。
  
  GooglePlayだけ最新化すればいいと考え、
   Google Play 対応デバイス
   https://support.google.com/googleplay/answer/1727131?hl=ja&sjid=18302024554506088478-AP
   を調べたところ、対応一覧に入っていました。
  それならと、google playをAPKからインストールすれば大丈夫なのでは?
   と考えAPKを適当なサイトからダウンロードしてみました。
      https://apk.cafeとかhttps://jp.apkpac.comとか
 
 

 
・途中に広告がやたらと入っているのでスクロールして下へ下へ。
 

 
・やっとみつけた。APKダウンロード
・APKのダウンロードが終わったら、通知が来るので、起動してインストール。
・インストールの前に設定→セキュリティー→「提供元不明のアプリのインストールを許可」をしてください。
 
■問題解決3
 
 そうしましたら、あら不思議、いろいろと動き始めました。
  アプリを起動する時に更新しますか?となり、「更新」を選び、
   インストールされるとちゃんと動いてくれます。
 ・gメールはハンバーガーマーク(右上の三)を押してメニュが見れる。
 ・Playストアを起動するとPlayのアプリ一覧の画面が開く。
 ・googleMAPがアプリで起動して、ブラウザでは現在位置ボタンが動作する。
 ・youtubeアプリが起動できないのは変わらないが、ブラウザでは開ける。
 
 youtubeがアプリで動かないのは少し不満だけど、ブラウザから見ればいいし、
  普通に音声検索機能とか使えるので、
   リビングに置いて検索目的で使うには十分なところまで持っていけました。
 
■問題解決4
 続編です。途中。
 
 Youtubeアプリが動かなかったんですが、
 Android5の最後のバージョン16.37を入れてみたところ、うまくインストールできました。
  https://youtube.jp.uptodown.com/android/download/3950248
 インストールできない場合はroot化してください。
  自分はsuperuserというソフトを入れてみました。 
   一般設定を使うにチェックしてrootをタップしましたが、
   意味はよくわかってません。もしかしたら関係ないかもです。
 で、うまくいったと思ったんですが、インストール後に開くで起動すると起動するんですが、
 メニューから起動すると、「Youtube.comに切り替えてください」となります。なんででしょう???
 
 
 

 

PanasoncのSX3にCentOS7.9をインストールしたんだけど、スピーカーから音が出なかったので
いろいろやってみました。

 

■症状

 

インストール後、Firefoxでyoutubeを開いて動画再生。
 音が出ないぞ。となり、
  ヘッドホン端子からヘッドホンに音が聴ける。
内蔵スピーカーからは音が出ない。
という感じ。

 

■これまでの流れ

 

普通にCentOSのページからダウンロード
 たぶん。これ
  http://ftp.riken.jp/Linux/centos/7.9.2009/isos/x86_64/
    の
  CentOS-7-x86_64-DVD-2207-02.iso
    と思う。
このisoをDVDに焼いてインストールしました。

 

■さて、調査。

 

https://ichinotes.seesaa.net/article/471672329.html

 

こちらの方、alsamixerで設定を変更していますが、
「Headphoneとなっている部分が、スピーカーの部分の設定」と言っております。

 

さて、当方でもやってみますと、あっさりスピーカーから音が出ました。

まず、起動したらF6を押して音声出力先デバイスを選んでいきます。
 HDMIとPCHとがあるが、HDMIではないので、PCHを選択してEnter。

 

 


で、左から2番目の所がヘッドホンとなっていますので、矢印キー←→にて移動して<Headphone>赤字にして、
矢印キー↑↓にて、ボリュームを上げる。
そして、mを押してMMの部分を00にしていく。
これで設定終わりなのでESCで抜ける。

 

 

 

Firefoxでyoutubeを開いて動画再生。

 

内蔵スピーカーから音でてます。
おー。めでたしめでたし。なんですけど、

 

毎回この設定をするのも面倒だなーとおもいますので、
なんか楽な方法を考える。

 

そしていろいろやってみましたが、

上のページの方はGUIツールにて出来ているっぽいんですけど。

 

当方は同じGUIツールがなくて出来ぬ。

 

・要は設定を設定ファイルに保存

 

alsactl store --file=/home/miha/.alsaconfig/alsa.config

 

・次回起動時そのファイルを読み込ませる

 

/usr/sbin/alsactl restore --file=/home/miha/.alsaconfig/alsa.config

 

なんですけど。

 

コマンド実行でこれでできているので、これをどこに入れるのか?

 

なんですけど。

 

/etc/rc.d/rc.local
~/.bashrc
~/.bash_profile
~/.profile


等々・・・ 試してみたけど、どれも、駄目でした。

 

ちなみに、~/.bashrcはデスクトップからターミナルを起動すると音が出てくれる。
なんだけどねー

 

タイミングかなんかの問題なのかもですね。

 

それでですね。
しょうがないので、デスクトップにショートカットを作成する方法を編み出した。

 

ターミナルのアイコンをデスクトップにコピー
で、右クリック→プロパティー
コマンドに「gnome-terminal  -- /usr/sbin/alsactl restore --file=/home/miha/.alsaconfig/alsa.config」
を入れる。×で閉じる。

 

 

 

 

デスクトップにログインするたびにこのアイコンを起動する
です。
もっといい方法ありそうですけどここまでです。

キャプチャーボード】 USB3.0 & HDMI 変換アダプタ

 

こちら、ゲームの実況中継で使用可能なビデオキャプチャーボードになります。

前から画面に出力するのをそのまま録画できれば便利なのにーと思いつつ、
Windowsのソフトでも可能なので、そんなに不便することもなかったんですけどねー。

保存防止の観点からか、配信側で録画防止機能とか、
 いろいろ施すもので、Windowsの機能では録画できなかったり。

配信側で配信停止されちゃうとみれなくなるじゃないですか。

個人用に録画するのは普通にできて当たり前なのになーと思いつつ。
 今回こちら購入してみました。

 

初回の録画までに色々設定した事とか記録に残しておきたいと思います。

 

■接続

 

PC本体----<HDMI>----キャプチャボード----<USB>----ノートPC----<HDMI>----外付けディスプレー

PC本体からHDMI出力した画像をノートPCのHDDへ記録します。
外付けディスプレーは必須ではないですが、有れば使いやすいです。

 

 

■PC本体設定(再生側)

 

HDMIに音声を流していきます。

 

 

 

■ノートPC設定(録画側)

 

説明書によるとOBS Studioというソフトを入れる。
となっておりますので、「https://obsproject.com/ja/download」からダウントードしていきます。

インストールして起動。

 


「ソースが選択されていません。」なるメッセージが出ているので、
下のソースという子画面から「+」をクリックしてソースを追加していく。

 

 

画像キャプチャデバイスを選択

 

名前をHDTV+にして、OK

 

 

デバイスをUSB3.0 captureを選択
下にスクロールする

 


下の方は変更なし。
OK

 

 

 

音声ミキサーからギヤのマークをクリック

HDTV+の他にデスクトップとマイクが現れたので、

HDTV+だけ 鳴るようにしておく。

ギヤマークをクリック。

 

 

HDTV+の音声モニタリングを「モニタと出力」を選択 他は「モニターオフ」を選択して。閉じる

 


画面映っているところで右クリック

 

 

全画面プロジェクター(プレビュー)→VL244SSWxxxxを選択

 (この操作でノートに接続されている補助ディスプレー全画面表示される)

 

 

コントロールから設定

 

 

出力から録画フォーマットでMPEG-4を選択 OK

 

 

コントロールから録画開始

 

viメモ 文字コードに関して

 

指定した文字コードで表示しなおす
 :e ++enc=cp932
 :e ++enc=utf-8
現在の文字コード表示
 :set enc?
出力ファイルの文字コードを指定する
 :set fenc=cp932
 :set fenc=utf-8
出力ファイルの文字コードを表示
 :set fenc?
 
あとは、

 


 vi -c ":e ++enc=cp932" ファイル名
とすると、SJISで開く


 

CDとかDVDを太陽光発電に使うという発想。嘘か本当かわかんない。失敗
 
最近見つけたyoutube動画で思わずブックマークに登録しておいたものですが、
 https://www.youtube.com/watch?v=kTLvERQMu1k
 
なんと、CDとかDVDに中心の穴から電線を巻き付けて、
それを太陽光に照らすと、電線に電力が発生するという!!
ビックリする動画が多数上がっておる。
 
これが本当ならなぜ、そう言った商品がわんさか出てこないのだろうか?
と思いつつ、一度興味を持つと人間は好奇心が止められなく、
しかも、有るもので実験が出来るとあっては、やるしかないっという事で、
やってみました。
 
沢山でやると、失敗したときのダメージが大きいので、一枚だけね。
 
表の写真
 

 
裏の写真
 

 
まー20巻ぐらいですかね。
で、結果
 

 
電圧出てねーなー。
 
 
 
今回はこんな結果でした。
 
使ったディスクはDVDのRで、TDKのDR47PWC10PB-BCデータ用でした。
条件変えてやれば結果も変わるかもですので、
 今回は思ったような結果出ませんでしたが、
  作ったものは大事に取っておくことにします。
 
ソースのyoutube動画がどこか外国だったし、緯度経度とか、
 近くにピラミッド的なものが有ったりとか。
  UFOの母船の近くでないと動かないとか色々ありそうなので、
   条件を変えて何か思いついたらやってみたいと思います。
 

 

M376S-8X2P-USBメモリ読み書きモジュール
 
arduinoとかESP32からUSBメモリへ書き込みを行おうとすると、
急に敷居が高くなって、その手段が見当たらなくなってしまう。
SDカードなら直接接続して書き込めるんですが、
USBが間に入るせいでUSBの制御をしなければならなくなる様です。
 

        M376S-8X2P
で、知り合いがこのaitendoとかamazonで売っているモジュールに目を付けたんですが、
うまく動かなかったみたいなところがあり、
自分の方で挑戦することになりました。
 
■知り合いが送ってきた情報
 □チップの説明書
  https://www.mpja.com/download/ch376ds1.pdf
 □この基板(モジュール)の説明書
  https://www.javanelec.com/CustomAjax/GetAppDocument/660b1a06-34f0-4ad5-8374-c8b8a3673536
 □Arduino用のライブラリ
  https://github.com/djuseeq/Ch376msc
 
■説明とか見てわかること。
 arduino等から接続して、USBメモリへの読み書き制御が出来る。
 信号は3.3V系で電源は5V
 USBのホストとかの制御はチップにお任せで、SPIまたはuartでコマンドを送ればいい。
 FAT32に対応しているがNTFSには対応していない
 
■実装
 上記Arduino用のライブラリと、3VのArduinoを組み合わせて、
 ライブラリの情報にある通り接続するとあっさり動作。
 USBメモリはBuffaloの古いもので、スケルトンの中の刻印を見ると
 RUF-C/U2 2GBと書いていました。 2004年ぐらいの品らしいです。
 フォーマットはWindows10の標準機能でFAT32のアロケーションユニットサイズを1024バイトにして
 うまく行きました。
 
■回路図
 
 上のライブラリの説明に書いてある通りに接続すると動くぞ

 この図のM376Sって書いている所は、モジュールのコネクタH2になります。
 コネクタH1はその上のSPIって書いている部分の図の赤の様にジャンパーしてください。
 今回のプログラムではARDUINOとの接続はSPIにしています。
 
■ファームウェアバージョン
 ライブラリの説明にファームウェアバージョンによってWindowsで対応できないパターンとか
 載っておりましたけど、うちに届いたのは44だったようです。
 Libのドキュメントでは記述が42と43だったので1上がっていました。
 int v = flashDrive.getChipVer();
 Serial.print("getChipVer()=");
 Serial.println(v);
 
■注意事項
 試行錯誤しましたが、ファイル名に使える文字に制限があります。
 半角大文字は大丈夫ですが、小文字はダメです。半角数字は大丈夫です。
 例えばlog1.logはダメでLOG1.LOGは大丈夫。
 少し癖ありますが癖の範囲という事で直さず使うことにしています。
 
■性能試験
 100バイトのデータを1000回連続で書き込みすると、
  14.44秒でしたので、1回に付き14.5ミリ秒
  USBメモリの性能にもよると思いますが。
  まあまあの速度と思います。
 
■考察 ロガーとして使用する場合
 もし、IoT機器のロガーとして使用する場合、
 ログローテーションが必要になると思うが、
 このライブラリーにリネーム系のコマンドが用意されていないことから、
 LOGyyyymmdd.log等の日付付きのファイル名で記録を残しつつ、古いものを削除するなどの
 対処が必要になると思われます。
 日付の変更のタイミングでlistDir()で取得して、一定期間以上前の日付のものを削除とかですね。
 
■プログラム

 


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

 


 
 

LEDキャンドル風点滅駆動IC(ローソクIC) OSCDIC6441
秋月で見つけたLEDをローソク(蝋燭)のように光らせるというICです。
3端子ですね。
 
初めて使うので簡単な回路でどんな風に光るのか試しています。
ぴかぴかというか、炎が風で揺れるがごとく光ってくれますね。
 

 

 

5mmウォームホワイトキャンドルLED 乳白色ボディ・キャンドル形 OS2MDK58K2B

 
秋月で見つけたローソク(蝋燭)のように光るというLEDです。
 
初めて使うので簡単な回路でどんな風に光るのか試しています。
 
ぴかぴかというか、炎が風で揺れるがごとく光ってくれるLEDですね。
 
動画
 https://youtube.com/shorts/RKgSZjABpdc

 

 

 
回路