【放射線】ガイガーカウンターをHACK!してみた。【面倒？】

## 何故今更、ガイガーカウンター？
2011年の福島原子力災害によって、ガイガーカウンターがにわかに注目を浴びた。
しかし日本人の性か、しばらくしてマスメディアに取り上げられなくなると一気に見向きもされなくなった。
そんな中、某国営放送にて国内メーカーが開発・販売した民生用ガイガーカウンターの[「黒歴史」](https://www.nhk.jp/p/ts/XL1JYWZLNZ/episode/te/NZVVX62MJ8/)が放映される。
折しも福島原子力発電所の汚染水が貯蔵限界を超え様々な問題が発生したため、ALPS処理システムによる処理水を海洋放出することが検討されていた時期でもあった…

秋葉原ロボット部の河野総統とこの件について情報交換をしたのは…
以前とあるツアーへ参加し、そこへ持参していくために河野総統へ中国製ガイガーカウンターの購入を打診したことが縁となったからである。
その時のツアーレポがこちらである。noteのほうは事情により追記が延期されているのは申し訳なく思う。
[福島第一原発　視察レポート](https://qiita.com/busyoucow/items/54c7ff3aa1b5814d3af6)

レポート内でも説明されているが、~~日本郵便の陰謀により~~ 諸事情が重なり現地へガイガーカウンターを持参することは叶わなかった。しかしそれがかえって
**「正義なんかじゃないが、真実を知りたい」**
という想いを膨らませることになった。

その後、河野総統がウクライナ戦争でのザポリージャ原子力発電所の危険性を認識し放射線計測ポストの配置を考えていたため、私も一枚かむことになった。

## とりあえず測るも、図らず…儚い結果に
その後無事に福島第一原子力発電所より帰還した私のもとにガイガーカウンターレンタル機が届き、暫くして購入機が届く。性能は必要十分であった。しかし…

ひとまず毎日人力で…計測値をGoogleSpreadSheetに書き込んでいたのだが、毎日コツコツと行うのは意外と大変であった。世の中の…データを収集する方々の苦労が偲ばれる。
２か月ほどでデータは飛び飛びとなっていく。そんな私を怠け者と思うのは勝手だが、技術はヒトに労苦を押し付けるためのものではない。**ヒトの作ったものならば人を助けるのが筋**ではないか。
ちなみに私が住む横浜市では放射線量の大きな変化はなかった。

## 今どきの解決策、それがIoT化
かねてから河野総統が提唱していた、「ESP32マイコンによるガイガーカウンターのIoT化」により**放射線計測ポストの配置**を進めていくことになった。

[ESP32](https://ja.wikipedia.org/wiki/ESP32)とはWifiやBluetoothを搭載したチップセットでありこれを搭載した**マイコンボードは無線によりWifiルータやスマートフォン等に接続してインターネットとデータのやり取りができる**。
そういった**データのやり取りを活用してヒトの役に立てようとする**のがInternet of Things すなわちIoTである。

IoTなんてただ流行っているだけで何に使えばよいかよくわからず評価されにくいものとされているが、こういった**ヒトの営みを助けるもの**こそがIoTの使い道であると私は考える。

インターネットに接続した後には、GoogleSpreadSheetへ**計測値を書き込むことで人力による書き込みを代替する**ものとする。ストレッチゴールとして**計測地のマッピング化**（ただし配置場所は個人情報のため不審者の襲撃や攻撃目的飛翔体の誘導を避けるため意図的に大きな誤差を発生させる）も計画中である。

## 河野総統の技術情報
先日幾多の障害を越え、私のもとに技術情報が届いた。

まず…河野総統の記事
[安価な中華ガイガーカウンターをIoT化(放射線測定マップの作成 Ⅰ)](https://qiita.com/nanbuwks/items/7ee0bf85be3ff3730405)
[OpenStreetMap ベースのガイガーカウンター測定マップを umap で考える(放射線測定マップの作成 Ⅱ)](https://qiita.com/nanbuwks/items/d971341f824bb2cc96ef)
[GitHub Actions を触ってみた(放射線測定マップの作成 Ⅲ)](https://qiita.com/nanbuwks/items/440a0f34a7ee583d0cae)
[ESP32 から Google Sheet に放射線量をアップ(放射線測定マップの作成 Ⅴ)](https://qiita.com/nanbuwks/items/058f2bb240e7a0e2b51d)
[安価な中華ガイガーカウンターをもうちょっと改良(放射線測定マップの作成 Ⅶ)](https://qiita.com/nanbuwks/items/4ba460f63ed85b1a136a)
を参考にして作成する事とする。

::: note info
これらを読んでIoTガイガーカウンターをGoogleSpreadsheetの設定も含めて作成できるのであれば、ここから先を読む必要はありません。お読みいただきありがとうございました。
::: 
## できねぇよ！という人向けに。
ここからは、私も含め前項の記事を読んでもIoTガイガーカウンターを作成できなかった方向けに記事を書こうと思う。
最初に、[安価な中華ガイガーカウンターをIoT化(放射線測定マップの作成 Ⅰ)](https://qiita.com/nanbuwks/items/7ee0bf85be3ff3730405)で解説されている
> まず、ESP32DevKitV1 の ENスイッチを基板ごと削り取ります。
> 注意、プルアップ抵抗は温存しておく必要があります。

これは出来ない方が多いと感じるため、河野総統にはその旨上申させていただいた。それを受けて改造済みのガイガーカウンターを頒布するとの回答を得ることになった。
改造ベースとなったガイガーカウンターと同様、改造済みのガイガーカウンターも[ここ](https://iotlt.myshopify.com/collections/all)で頒布されている。（受注生産？）

該当のガイガーカウンターを持っている方はESP32Devkitを接続すれば機能は実現できるのだが、長期設置や計測地に持ち出すことを考えたらちゃんとしたケースに入っていることは必須であろう。

次に、プログラムコードであるが一定時間ごとにGoogleSpreadsheetへ計測データを送信する統合されたコードが掲載されてない（プログラム知識のある方向けの記事であるため）ので、手っ取り早く動作させたい方向けに統合コードをこちらへ掲載する。
もちろん、ArduinoIDEで最低限プログラムを動作させることのできる知識と環境は必要ではあるが。

~~~c:radioration
#include <WiFi.h>
#include <WiFiClient.h>
#include <WebServer.h>
#include <HTTPClient.h>
#include <SPIFFS.h>
#include <FS.h>

const int WiFiSetPin = 16; // GPIO16  push with boot : AP mode on
const char* settings = "/wifi_settings.txt";
// AP mode WiFi Setting
// const char* defaultWifiMode = "APMode";
const char* defaultSsid = "ORION";
const char* defaultEssKey = "11111111";
String wifiMode;
String ssid;
String essKey;
String channel;
String AppScriptURL="https://script.google.com/macros/s/AKfycbxH4x0_VaVEa3z0ZZOc_0cSby7YuinGx3ri4imtVRkKUIuHo_7oc_raZ1o6F9YMVVbH/exec";
char *sensorModeStr;
int WiFiSet = 0;  // 0 ... normal operation / 1 ... WiFi Setting Mode
int count;
int beforecpm,cpm;
float microSvph;

WebServer server(80);

void handleRoot(){
  char temp[500];
  snprintf ( temp, 500,
"<html>\
<head>\
<title>Geiger Demo</title>\
<style>\
body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
</style>\
</head>\
<body>\
<h1> %f uSv/h (%d cpm )</h1>\
<br>%d :geiger count in %d sec.\
<hr> \
<a href=\"\/wifiInput\">wifi settings</a> \
</body>\
</html>",microSvph,cpm,count,millis()/1000);
  server.send ( 200, "text/html", temp );
}

void wifiInput() {
  String html = "";
  html += "<h1>WiFi Settings</h1>";
  html += "<form method='post' action='/wifiSet'>";
  html += "  <br>";
  html += "  <input type='text' name='essid' >ESSID<br>";
  html += "  <input type='text' name='key' >KEY(pass)<br>";
  html += "  <br>";
  html += "  <input type='submit'><br>";
  html += "</form>";
  server.send(200, "text/html", html);
}

void wifiSet() {
  String wifiMode = "clientMode";
  String setSsid = server.arg("essid");
  String setKey = server.arg("key");
  String setChannel = server.arg("0");

  File f = SPIFFS.open(settings, "w");
  f.println(wifiMode);
  f.println(setSsid);
  f.println(setKey);
  f.println(channel);
  f.close();

  String html = "";
  html += "<h1>WiFi Settings</h1>";
  html += "ESSID:" + setSsid + "<br>";
  html += "key(pass):" + setKey + "<br>";
  html += "<hr>";
  html += "<h1>Please Reset!</h1>";

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

void handleNotFound(){
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  server.send(404, "text/plain", message);
}
void googleSheet(){
    HTTPClient http;
    String URL = AppScriptURL;
    URL += "?";
    URL += "value=";
    URL += microSvph;

    Serial.println("HTTP access to:");
    Serial.println(URL);
    http.begin(URL);
    int httpCode = http.GET();
    if(httpCode > 0) {
        Serial.println(httpCode);
        if(httpCode == HTTP_CODE_OK) {
            String payload = http.getString();
            Serial.println(payload);
        }
    } else {
        Serial.println(http.errorToString(httpCode).c_str());
    }
}

void setup(void){

  pinMode(27, INPUT);
    
  Serial.begin(115200);
  Serial.println("");
  Serial.println("ESXAR Program Start");

  delay(1000);
  Serial.println();
  Serial.print("waiting...");
  // BR-9B splash pass
  for( int i=7 ; i>0 ; i--){
    Serial.print(i);
    Serial.print(" ");
    delay(1000);
  }
  pinMode(26, OUTPUT);
  digitalWrite(26,LOW);
  delay(2000);
  pinMode(26, INPUT);
  Serial.println("start");
  
  // M Key push emurator
  // pinMode(27, INPUT);
  delay(1000);
  Serial.println();
  Serial.print("waiting...");
  // BR-9B splash pass
  for( int i=7 ; i>0 ; i--){
    Serial.print(i);
    Serial.print(" ");
    delay(1000);
  }
  pinMode(26, OUTPUT);
  digitalWrite(26,LOW);
  delay(2000);
  pinMode(26, INPUT);
  Serial.println("start");
  
  ssid=defaultSsid;
  essKey=defaultEssKey;
  Serial.print("ssid:");
  Serial.println(ssid);
  Serial.print("essKey:");
  Serial.println(essKey);
// WiFi client mode
  WiFi.begin(ssid.c_str(), essKey.c_str());
      Serial.println("");
// Wait for connection
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
    }
      Serial.println("");
      Serial.print("Connected to ");
      Serial.println(ssid);
      Serial.print("IP address: ");
      Serial.println(WiFi.localIP());
 

  server.on("/",     handleRoot);
  server.on("/wifiInput",  wifiInput);
  server.on("/wifiSet", wifiSet);
  server.onNotFound(handleNotFound);
  server.begin();
  Serial.println("HTTP server started");  
}

void loop() {
   int check=digitalRead(27);
   int beforemillis=millis();
   int counter=0;
   int timecounter=millis()-beforemillis;
   while ( 60000 > (millis()-beforemillis) ){
     int check=digitalRead(27);
     if ( 0 == check ) {
       count=count+1;
       cpm=cpm+1;
       Serial.println(count);
       delayMicroseconds(200);
      }
   }
   
   beforemillis=millis();
   beforecpm=cpm;
   microSvph = cpm / 150.0;
   Serial.print("count:");
   Serial.print(count);
   Serial.print("cpm:");
   Serial.print(cpm);
   Serial.print("microSvph:");
   Serial.print(microSvph);
   cpm=0;
   googleSheet();
   // Handle incoming connections 
   server.handleClient();   
}
~~~

上記のコード内でこの部分
~~~
const char* defaultSsid = "ORION";
const char* defaultEssKey = "11111111";
~~~
ORION → 接続したいWi-fiのSSID
11111111 → 接続したいWi-fiの接続パスワード
に置き換えて使用する必要がある。

また、このコードは河野総統のコード改良によってバージョンアップする。
こちらも随時追いかけるが、タイムラグが発生することを許して欲しい。

## 最後に
今回は中国メーカーのガイガーカウンターで自動計測・特定地点計測値記録を行った。
東日本大震災当時は日本メーカーのガイガーカウンターも入手しやすかったが、現在は中国メーカーより購入する事の方が現実的となってしまった。
時代の流れもあるが、残念に思う。

しかし、それでも精度が高くなくても近隣で定期的に放射線値を計測することに大きな意義があると考える。
日本は災害も多いうえに、不測の事態により原子力施設への攻撃・原子力兵器による攻撃が起こるリスクがある。公的機関や企業による計測だけでなく市民の側からもデータを提供できれば最適な対応を行う手助けになると信じてやまない。