2026年4月29日水曜日

ESP32スマートチェッカー

 

 

//2026.4.29

#include <WiFi.h>

#include <WebServer.h>

#include <WebSocketsServer.h> // 「WebSockets」ライブラリをインストールしてください


// WiFi設定

const char* ssid = "OPPO Reno5 A";

const char* password = "x676eixd";


WebServer server(80);

WebSocketsServer webSocket = WebSocketsServer(81);


const int ledPin = 2; // 内蔵LEDピン

unsigned long targetTime = 0; // 点灯予定時刻

bool isWaiting = false;       // 点灯待機フラグ


// スマートフォンに配信するHTMLファイル

const char index_html[] PROGMEM = R"rawliteral(

<!DOCTYPE html>

<html>

<head>

  <meta charset="UTF-8" name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">


  <style>

    body, html { margin: 0; padding: 0; width: 100%; height: 100%; overflow: hidden; position: fixed; font-family: sans-serif; background: #f0f2f5; }

    .container { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100vh; }

    input { font-size: 24px; padding: 15px; width: 70%; text-align: center; border: 2px solid #ddd; border-radius: 10px; margin-bottom: 20px; }

    .btn { font-size: 20px; padding: 15px 40px; color: white; border: none; border-radius: 10px; cursor: pointer; width: 60%; margin: 10px; }

    #onBtn { background: #28a745; }

    #offBtn { background: #dc3545; }

  </style>

</head>

<body>

  <div class="container">

    <h2>LED Controller</h2>

    <input type="number" id="secInput" placeholder="点灯までの秒数">

    <button id="onBtn" class="btn" onclick="send('ON')">ON (タイマー)</button>

    <button id="offBtn" class="btn" onclick="send('OFF')">OFF (即時消灯)</button>

    <p id="status">接続待機中...</p>

  </div>

  <script>

    // ブラウザからESP32のIPに対してWebSocket接続

    const socket = new WebSocket('ws://' + location.hostname + ':81');

    socket.onopen = () => { document.getElementById('status').innerText = '接続済み (Secure)'; };

    

    function send(cmd) {

      const sec = document.getElementById('secInput').value || 0;

      // 「コマンド,秒数」の形式で送信

      socket.send(cmd + ',' + sec);

      document.getElementById('status').innerText = cmd === 'ON' ? sec + '秒後に点灯します' : '消灯しました';

    }

    // スクロール防止

    document.addEventListener('touchmove', (e) => e.preventDefault(), { passive: false });

  </script>

</body>

</html>

)rawliteral";


void handleRoot() {

  server.send(200, "text/html", index_html);

}


void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) {

  if (type == WStype_TEXT) {

    String msg = String((char*)payload);

    int commaIndex = msg.indexOf(',');

    String cmd = msg.substring(0, commaIndex);

    int seconds = msg.substring(commaIndex + 1).toInt();


    if (cmd == "ON") {

      targetTime = millis() + (seconds * 1000);

      isWaiting = true;

      Serial.printf("%d秒後の点灯を予約しました\n", seconds);

    } else if (cmd == "OFF") {

      isWaiting = false;

      targetTime = 0;

      digitalWrite(ledPin, LOW);

      Serial.println("即時消灯");

    }

  }

}


void setup() {

  Serial.begin(115200);

  pinMode(ledPin, OUTPUT);

  digitalWrite(ledPin, LOW);


  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); }


  server.on("/", handleRoot);

  server.begin();


  webSocket.begin();

  webSocket.onEvent(webSocketEvent);


  Serial.println("\nサーバー開始");

  Serial.print("接続先IP: "); Serial.println(WiFi.localIP());

}


void loop() {

  server.handleClient();

  webSocket.loop();


  // タイマー管理:待機フラグが立っており、予定時刻を過ぎたら点灯

  if (isWaiting && millis() >= targetTime) {

    digitalWrite(ledPin, HIGH);

    isWaiting = false;

    Serial.println("点灯します。");

  }

}

2025年1月20日月曜日

 やりたいことリスト

・Tiny10をヤフオク落札PCにインストール。ライセンスはWebで購入

https://archive.org/details/tiny-10-23-h2

https://jp.minitool.com/news/tiny10-23h2.html


・OBDアダプタとラズパイでダッシュモニター作成。arduino+nextion lcdでも可

・電球ソケットからAC100と電球両方を取れる二股ソケットで照明工作

・職場用ファイルサーバー構築

https://note.com/rcat999/n/ndc8a59b43502

2024年8月28日水曜日

Google Earth Proでツアー動画を作る

旅行先の思い出動画を残そうとGoogleEarthのツアー機能を使って動画を作ろうとしたが、手順がわからず、先に進めないでいたが、下記のサイトを発見して大きく前進出来た。

https://www.cloud9works.net/movie/basic-tutorial-google-earth-pro/#dong_huano_shimarino_wei_zhiya_kuo_da_luwo_juemeru

2024年4月21日日曜日

2023年12月28日木曜日

GoogleDriveファイルのホスティング

下記のページを参考にした。 

https://lpeg.info/webworks/google_drive_hosting.html#m2

結果

https://i4hfcktuddcma1f6izefzq.on.drv.tw/central-kyushu-works/

の後に.htmlのファイル名を続ければGoogleDriveの◯◯フォルダに保管したファイルを表示(ホスティング)出来る。簡単!すごい!

2023年12月9日土曜日

ffmpegでテキストオーバーレイ

 twitter掲載用にffmpegで動画を圧縮しつつ、文字も挿入。

下記の例ではテキストオーバーレイ以外にも色々やってますが、日本語で書くと

・音声のみファイルと映像のみファイルを入力
・画像をトリミング(クロップ)
・サイズを変換
・フォント指定
・文字位置指定
・文字背景指定 box=1
・文字背景色(透過30%)指定 boxcolor=black@0.3
・crf 32は圧縮率高い(画質低い)指定

等々

ffmpeg.exe -y -i input.mp3 -i input.mp4 -vf "crop=1080:600:50:60,scale=500:-1,drawtext=text=挿入文字日本語可:fontfile=/Windows/Fonts/BIZ-UDGothicR.ttc:fontsize=20:fontcolor=orange:x=350:y=250:box=1:boxcolor=black@0.3" -crf 32 -preset veryslow -c:a copy output.mp4

2023年11月17日金曜日

Android TV Box 購入からRecovery Mode 起動まで

 aliexpressで  DQ08 という soc:RK3528 ram:4GB storage:32GB を購入。
11月11日の独身の日割引だったのか1,900円弱とお安かった。到着まで1週間の表示だったが、金曜に注文して5日後のお昼に自宅で受領。

早速Recovery Mode での起動にトライ。「AV」の穴(HDMIコネクタの隣)に精密ドライバー等の細長い棒を突っ込んで(写真①)押し込むとクリック感があるので、押し込んだ状態で電源プラグを挿入すると見事Recovery Mode で起動出来た。(写真②)

その時DQ08本体のディスプレイには「boot」と表示された。(写真③)

写真①

写真②

写真③

次はmultitoolか何かのlinuxディストリビューションを準備してSDからブートを試みる。

2023年11月11日土曜日

Android TV Boxで監視カメラシステムを作る - Project TVboxlinux -

 少し前にH96max(CPU:RK3318)でトライして中断していたが再始動。

プロジェクト名を”TVboxlinux" と呼ぶことにする。データ保管場所は白HDDの\Projects\TVboxlinuxにする。

今回用のハードにDQ08というCPUがRK3528のTV box を新たに購入。
インストールするOSはひとまずarmbianとする。以下のサイトにディストリビューションが沢山あるが、今のところRK3528用は無いようだ。
https://armbian.hosthatch.com/archive/

こちらのページで同じ問題が議論されていて、こちらのgithubに解決策があるようだ。githubの使い方が分からんので、そこから勉強する必要がある。
同ページの jpegqs氏の Posted November 3 の投稿ではインストールできたとのこと。
同じくepost.deb氏の Posted November 3 の投稿ではシリアル通信でDebianをインストール出来たとのこと。ただ、こちらはハードルが高いな。
ページ最下部のjpegqs氏のPosted Monday at 08:27 AM の投稿では何らかのパッチを公開したとのことだが、ついていけん。少しずつチャレンジしよう。

2022年11月17日木曜日

シェルスクリプト備忘録 - 複数ファイルのファイル名一括変換 xargs

例えば、誤って

ZRAD_MyFriend.mp3   ZRAD_きっと忘れない.mp3

のように複数のファイルがあり、ファイル名を一括して変換したい時、xargs による並列処理を使うことで以下のように書ける。

 for i in ZRAD*; do echo $i ${i/ZRAD/ZARD} | xargs -n 2 mv; done

 

わかりやすくするため xargs の無い以下を実行すると

for i in ZRAD*; do echo $i ${i/ZRAD/ZARD};done 

ZRAD_MyFriend.mp3   ZARD_きっと忘れない.mp3 ZRAD_MyFriend.mp3   ZARD_きっと忘れない.mp3

と変換前、変換後のファイル名が合計4つ表示される。これを最初のように xargs のオプション n 2 によって2つずつ mv に渡してやることにより

mv ZRAD_MyFriend.mp3   ZARD_きっと忘れない.mp3

mv ZRAD_MyFriend.mp3   ZARD_きっと忘れない.mp3

を実行することになる。

ただし mv を使うとファイルを削除する恐れがあるので、慣れないスクリプトを作るときは注意。

 

2022年11月14日月曜日

MSYS2 - Windows10でBashを使う

 かつではCygwinを使っていたが、改めて何にしようかと迷ったが、MSYS2を使うことにした。

https://www.msys2.org/


こちらを参考にさせて頂いた。

https://m-lab-tech.com/windows-cool-bash/


 

 

 


2022年9月18日日曜日

2022年2月14日月曜日

p5.js

 ProcessingのJavascriptバージョンの「p5.js」があった。

色々試そう。

https://p5js.jp/get-started/

2021年12月1日水曜日

カセットテープデジタル化

 カセットテープデジタル化の続き。

アルバム1枚(カセットテープではA面、B面)をデジタル化するとき、これまで曲毎にmp3とflacファイルを作っていたが、今後は

 曲毎:mp3 ビットレート192k サンプリングレート48k
 アルバム全体:opus ビットレート256k サンプリングレート48k

のセットで残すことにする。

アルバムのopusファイルを作るときは、全曲名をmetadataのlyricsに入れておく。


しかし、30年前に録音したカセットテープの音楽が全く劣化していないことに感動。TDKのSAやSONYのCDixテープが良いのか、再生しているONKYOのカセットデッキK-505FXが良いのか。デジタル化するときに品質を落とさないようにしないといけない。。。


■■各種コマンド

■ハードのセッティング
(カセットデッキ)→(DigiFi付録のDDC)→(USB)

■カセットテープの入力を聴く
arecord -c 2 -f S16_LE -r 48000 -D hw:1,0 | aplay

■カセットテープのA面だけをDDCで取り込み。 −d は録音時間の指定(秒)
arecord -c 2 -f S24_3LE -r 48000 -D hw:1,0 -d 1920 /home/nemo/ミュージック/aaa.wav

■wavファイルの結合
□以下のようにコーデックにpcm_s24leを指定しないと、インプットファイルのビットレートが24bitでもアウトプットファイルのビットレートが16bitになってしまう。
ffmpeg -i in1.wav -i in2.wav -filter_complex "concat=n=2:v=0:a=1" -c:a pcm_s24le out.wav

□A面とB面のwavを結合してアルバム全部をopusにまとめる←これまでのflacの代わり
ffmpeg -i A面.wav -i B面.wav -filter_complex "concat=n=2:v=0:a=1" -acodec libopus -metadata artist="aaa" -metadata album="bbb" -metadata genre="JPop" -metadata date="1988" -ab 256k -ar 48000 両面.opus

■ノーマライズのためのvolume確認・・・ノーマライズはAudacityで行う
ffmpeg -i data.wav -af "volumedetect" -f null -

■アルバムのトラックをまとめて変換するスクリプト
bash ./ffmpeg_wav_singles.sh

■1秒の無音wavファイルを作成
ffmpeg -ar 48000 -t 00:00:01 -f s24le -acodec pcm_s24le -ac 2 -i /dev/zero muon.wav

■複数ファイルに無音を挟みながら結合
ffmpeg -i 01*.wav -i muon.wav -i 02*.wav -i muon.wav -i 03*.wav -i muon.wav -i 04*.wav -i muon.wav -i 05*.wav -i muon.wav -i 06*.wav -i muon.wav -i 07*.wav -i muon.wav -i 08*.wav -i muon.wav -i 09*.wav -filter_complex "concat=n=17:v=0:a=1" -c:a pcm_s24le out.wav

□上記のインプットファイル部分の大部分を下記のスクリプトで作れる
op=""; for j in {01..08}; do op=$op" -i "$j".wav -i muon.wav"; done


■拡張子がmp3のファイルの拡張子以外部分を取り出す→これをffmpegに渡して一括変換に使う
for j in *.mp3 ; do echo ${j%.mp3}; done


■■ffmpeg_wav_singles.shファイルの中身

#!/bin/bash

#ifile01,m_ti01等の変数名を編集し、その値を取り出すところに苦労。 `eval echo '$'"ifile"$track` の部分。配列にしておけばよかった。行頭や変数の区切りに全角スペースはNG

music_path=""

m_ar="artist name"; m_al="album name"; m_da="1990"; m_ge="JPop"

tracks="10"


ss01="00:00:00"; to01="00:04:04"; m_ti01="track 01 name";

ss02="00:04:07.8"; to02="00:09:01"; m_ti02="track 01 name";

ss03="00:09:03.8"; to03="00:13:03"; m_ti03="track 01 name";

ss04="00:13:06"; to04="00:18:26"; m_ti04="track 01 name";

ss05="00:18:29.5"; to05="00:22:28"; m_ti05="track 01 name";

ss06="00:22:31"; to06="00:26:22"; m_ti06="track 01 name";

ss07="00:26:24.7"; to07="00:30:15"; m_ti07="track 01 name";

ss08="00:30:26.8"; to08="00:34:43"; m_ti08="track 01 name";

ss09="00:34:47"; to09="00:38:28"; m_ti09="track 01 name";

ss10="00:38:30"; to10="00:43:05"; m_ti10="track 01 name";


i=1

string_lyrics=""


while [ $i -le $tracks ]

do

  track=`printf "%02d" $i`

  #インプットファイル名、タイトル名取り出し

#  string_ifile=`eval echo '$'"ifile"$track`

  string_ifile="in.wav"

  string_ss=`eval echo '$'"ss"$track`

  string_to=`eval echo '$'"to"$track`

  string_title=`eval echo '$'"m_ti"$track`

  #string_lyricsはopusファイルに全曲名を入れるためのメタデータ

  string_lyrics=$string_lyrics$track" "`eval echo '$'"m_ti"$track`" "


  #曲毎mp3変換

  ffmpeg -ss "$string_ss" -to "$string_to" -i "$string_ifile" -acodec libmp3lame -ab 192k -ar 48000 -metadata "artist"="$m_ar" -metadata "album"="$m_al" -metadata "genre"="$m_ge" -metadata "date"="$m_da" -metadata "track"="$i" -metadata "title"="$string_title" "$track"_"$string_title.mp3"


  i=`expr $i + 1`

done


#アルバム全体opus変換

ffmpeg -i "$string_ifile" -acodec libopus -metadata "artist"="$m_ar" -metadata "album"="$m_al" -metadata "genre"="$m_ge" -metadata "date"="$m_da" -metadata "lyrics"="$string_lyrics" -ab 256k -ar 48000 "$m_ar"_"$m_al.opus" 

 

ffmpeg_wav_singles.shここまで



2021年10月24日日曜日

BleachBitをコマンドラインから実行

バッチファイルからBleachBitを実行

--preset はGUI版の設定を使う指示


%パス%bleachbit_console.exe --preset -c

2021年10月14日木曜日

Blender再開

この前Blenderの本を捨てたばかりだが、Blenderいじりを再開。

目標は水族館作成。

2020年11月8日日曜日

Google Cloud Platform

Google Cloud Platform で仮想マシンを作成中 



■参考サイト

https://qiita.com/Brutus/items/22dfd31a681b67837a74



2020年11月3日火曜日

Raspberry Pi OS Lite

 RaspberryPi 2にOSをセットアップ。公式サイトでは名前が変わっていた。


■GUI追加

https://kokensha.xyz/raspberry-pi/install-desktop-to-raspbian-stretch-lite/

■セキュリティ

https://qiita.com/nokonoko_1203/items/94a888444d5019f23a11#root%E3%81%AE%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E8%A8%AD%E5%AE%9A

■日本語化

https://tkrel.com/9102

■ユーザー追加 lep*

https://www.gadgets-today.net/?p=5148

https://engetu21.hatenablog.com/entry/2014/11/23/000423

■フォント

https://www.yscjp.com/linux/font_iroiro.html