ドタバッタンのブログ -2ページ目

ドタバッタンのブログ

DIY、電子工作系

デスクワークする場所の気温が低めで、指先が冷たくなることがあります。使い捨てカイロを使ってもいいのですが、せっかく電源がある場所なので、USBドリンクウォーマーをカイロ代わりに使えます。

 

ただし、熱くなりすぎて、直接皮膚に触れていると、やけどしそうです。

↑こんなスイッチを買ってみたものの、スイッチを「弱」にすると、スイッチが発熱してしまう(たぶん、抵抗器が入っているだけ)ので、危ないなと思い、使うのをやめました。

 

ESP32で、発熱を抑える回路を作ってみました。

機能:

・PWM制御のように、細かくON・OFFを繰り返す。

 例えば、1秒の内、前半0.5秒はON、後半0.5秒はOFF。

・ONの割合は、可変抵抗で調整できる。

・通電しているとき、LEDが光る。1秒のうち、どの程度

 ONになっているか、目で見てわかる。

・1時間経過すると、自動的に切れる。

 つなぎっぱなしでも安全。

・プッシュスイッチを押すと再起動する。

 

回路

 

完成写真

(白いコードは、100円のUSB延長コードを加工したもの。)

(ブレッドボードでは、部品や配線が抜けてしまうことがあるのが難点です。特にフォトリレーが抜けやすいため、フタを閉めるときにフォトリレーを押さえつけるように工夫しています。)

 

プログラム

int pinLED = 32;   //LED点滅 出力端子
int pinRelay = 33;   //リレー 出力端子

const int voutPin = 34;   //アナログリード 入力端子
const int VOLT = 3.3; // 3.3Vを電源とした場合
const int ANALOG_MAX = 4096; // ESP32の場合
//analogRead 読み取り値は0〜1023ではなく0〜4096で、入力電圧の範囲は0〜3.3V。

#include <esp_deep_sleep.h> //ディープスリープのための
unsigned long time_data=0; //プログラムがスタートしてからの時間

void setup() {
  Serial.begin(115200);
  Serial.println("Start");
  pinMode(pinLED, OUTPUT); // モードを出力に
  pinMode(pinRelay, OUTPUT); // モードを出力に

   // GPIO 4 タッチセンサーに反応があったら(抵抗が低いものにふれたら)起動するようセット
  static int threshold = 16;
  pinMode(GPIO_NUM_4, INPUT);
  touchAttachInterrupt(GPIO_NUM_4, callback, threshold);

  // タッチパッドをウェイクアップソースとして有効にする
  esp_sleep_enable_touchpad_wakeup();
}

void on_off(int duty){
  digitalWrite(pinLED, HIGH); // LEDつける
  digitalWrite(pinRelay, HIGH); // リレー ON
  delay(duty * 10);   //例 Dutyが40なら、ONが0.4秒間=400ms。
  
  digitalWrite(pinLED, LOW); // LED消す
  digitalWrite(pinRelay, LOW); // リレー OFF
  delay(1000-duty * 10);
}

void callback(){
}

void sleep1(){
  // ディープスリープ
  Serial.print("ディープスリープに入る.");
  delay(1000);
  esp_deep_sleep_start(); // ディープスリープ
}

void loop() {
  // 可変抵抗の電圧を取得
  int reading = analogRead(voutPin);

  // 値をmVに変換
  float voltage = ((long)reading * VOLT * 1000) / ANALOG_MAX;

  Serial.print(voltage);  //0から3000mVの間の数値
  Serial.println(" mV, ");

  int duty=100-voltage/3000*100;  //0から100の間
  on_off(duty);  //1秒間でどのくらいONにするか指示する

  time_data = millis();   //
  int fun=time_data/1000/60;
  Serial.print(fun);
  Serial.println(" 分, ");
  if (fun>=60){  //切り忘れを気にしないよう。60分経過したらスリープ。。
     sleep1();
  }
}