「昔作ったガイガーカウンターをESP8266とBlynkでIoT化する」でIoT化できたのですが、ガイガーミュラー管を動作させるための400V昇圧回路に写ルンです改造基板を使っていたことから、電源が2つ必要になっていました。
何とかできないものかとずっと思っていて、時々グーグル先生に相談していたら、ある日「昇圧チョッパ」という回路を見つけました。
Wikiによると、昇圧チョッパとは電流のON-OFFを繰り返すことによって発生するスパイク電流を用いて、入力電圧より上げる制御のことだそうです。
昇圧チョッパの回路図を調べると、スイッチング用MOSFETの制御にPWMコントローラーを使っているものが多かったのですが、ESP8266もPWM出力ができるのでESP8266でやってみることにしました。(これが後に2週間ほど完成を遅らせる遠因となります...)
IoTガイガーカウンターV2
自作回路と写ルンです改造基板の電圧比較
Blynk側も1秒間のカウントを表示するように刷新
デモンストレーションビデオ
改良用部品
昇圧チョッパ回路
- NchMOSFET 2SK2698 (500V15A) --- 秋月電子(税込150円)
※2017/12/29 結構個体差があるようです。10個中4個が250V以下しか出ませんでした。 - 汎用整流用ダイオード 1000V1A 1N4007-B --- 秋月電子(税込10円)
- ドラム型RFチョークコイル TR300MH --- マルツ(税抜380円)
- セラミックコンデンサー 2200pF 高耐圧、ディスク型 --- マルツ(税抜75円)
- 抵抗100Ω --- 手持ち ※2017/12/21追加 書き忘れていました!
電源周り
- スイッチングACアダプター 9V 1.3A --- 秋月電子(税込580円)
- ブレッドボード用DCジャックDIP化キット --- 秋月電子(税込100円)
- 低損失CMOS三端子レギュレーター 5V500mA --- 秋月電子(税込50円)
回路図 ※2017/12/21更新
昇圧チョッパ回路に使用した部品は、それぞれ数種類入手して1週間ぐらい実験した結果選んだものです。 しかし、昇圧チョッパ単体では400V出るのに、以前から使用していた3.3Vのレギュレーターを使って1電源にした実回路にすると電圧が100V以上下がる現象が発生しました。
この原因がさっぱりわからず2週間ぐらい費やした後、どうもESP8266ボード(回路図ではWeMos D1 mini)の3.3V入力ではなく5V入力を使うと電圧が下がらないということがわかり、レギュレーターを3.3Vから5Vのものに変更しました。
Blynk設定
新たに追加した1秒間のカウントレベル(Level H)と通知制御用ボタン(Button)の設定。
1分間のカウント数(Value Deisplay)と1時間平均カウント数(Value Display)の設定。
グラフ(SuperChart)と通知(Notification)の設定。
スケッチ
PWM出力はセットアップで次のように設定しています。周波数が840Hzでデューティ比を80%にすると、上記の回路で約400Vを出力することができました。
analogWriteFreq(840);
analogWriteRange(100);
analogWrite(PWM_PIN, 80);
1秒間のカウントも表示させるようにしたため、sendSecDataというファンクションと対応するtimer.setIntervalを追加しています。また、画面にボタンを用意して通知をON/OFFできるようにしました。
※2017/12/13ソースコード修正
※2020年1月19日追加 ボードマネージャーでインストールするESP8266のバージョンを2.5.xにすると割込みが動かないみたいです。バージョンを2.4.2にすると正常に動作するようになります。
/*
* Geiger Counter V2
* December 13, 2017
* By Hiroyuki ITO
* http://intellectualcuriosity.hatenablog.com/
* MIT Licensed.
*/
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#define WIFI_SSID "YourNetworkName"
#define WIFI_PASS "YourPassword"
#define BLYNK_AUTH "YourAuthToken"
#define NOTIFY_LIMIT 10 // 10 spm
#define NOTIFY_TEXT "WARNINIG! The device detected more than 10 spm."
#define SIGNAL_PIN 12 // WeMos D1 mini D6 Pin
#define PWM_PIN 14 // WeMos D1 mini D5 Pin
/*
* Global Variable
*/
volatile int sec_count;
volatile int min_count;
volatile int hour_count;
int times;
int notification_status;
BlynkTimer timer;
/*
* Interrupt Function
*/
void interrupted() {
sec_count++;
min_count++;
hour_count++;
}
/*
* Receive Data from Blynk at connected
*/
BLYNK_CONNECTED() {
Blynk.syncVirtual(V3);
}
/*
* Send Data to Blynk
* min_count
* hour_count
*/
void sendMinData() {
Blynk.virtualWrite(V5, min_count);
BLYNK_LOG("Minutes: %04d", min_count);
min_count = 0;
times++;
// 1 hour
if (times > 60-1) {
Blynk.virtualWrite(V6, hour_count / 60);
BLYNK_LOG("Hours: %04d", hour_count / 60);
hour_count = 0;
times = 0;
}
}
/*
* Send Data to Blynk
* sec_count
*/
void sendSecData() {
Blynk.virtualWrite(V4, sec_count);
BLYNK_LOG("sec count: %04d", sec_count);
// Push Notification
if (notification_status == 1 && sec_count > NOTIFY_LIMIT-1) {
Blynk.notify(NOTIFY_TEXT);
}
sec_count = 0;
}
/*
* Receive Data from Blynk
*/
BLYNK_WRITE(V3)
{
notification_status = param.asInt();
}
/*
* Setup
*/
void setup() {
delay(10);
Serial.begin(74880);
BLYNK_LOG2("Reset Reason: ", ESP.getResetReason());
pinMode(SIGNAL_PIN, INPUT);
// Make high voltage
pinMode(PWM_PIN, OUTPUT);
analogWriteFreq(840);
analogWriteRange(100);
analogWrite(PWM_PIN, 80);
attachInterrupt(SIGNAL_PIN, interrupted, FALLING);
Blynk.begin(BLYNK_AUTH, WIFI_SSID, WIFI_PASS);
Blynk.notify(String("Reset Reason: ") + ESP.getResetReason());
// Setup a function to be called every second
timer.setInterval(60000L, sendMinData); // 1 min
timer.setInterval(1000L, sendSecData); // 1 sec
times = 0;
sec_count = 0;
min_count = 0;
hour_count = 0;
notification_status = 0;
}
/*
* Loop
*/
void loop() {
Blynk.run();
timer.run();
}
温湿度計と一体化 (2017/12/13追加)
ガイガーカウンター用のESP8266のGPIOピンが空いていたので、隣に設置していた温湿度計と一体化させました。
温湿度計用に1個、ガイガーカウンター用に2個、全部で3個設置していたUSB ACアダプタが、9VのACアダプタ1個になりかなりすっきりしました!
おしまい