ESP32で部屋のCO2濃度をスマホで確認できるようにしてみた‼(MH-Z19C,MH-Z19D,MH-Z19E編)
こんにちは‼
今回はCO2センサーで測定したCO2濃度を、スマホで見れたら良いな~っと思ったので、
実現させてみたいと思います🔥
★CO2濃度の基準⇩
350~500ppm | 外気 |
500~1000ppm | 一般的な屋内 |
1000~2000ppm |
悪い室内空気環境
|
2000~2500ppm |
眠気を感じてくる人が出てくる
|
2500~3000ppm |
肩こりや頭痛を感じてくる人が出てくる
|
3000ppm~ |
集中力などが低下してくる
|
ちょっと難易度は上がりますが、なるべく分かりやすいようにしますのでよろしくお願いします♪
イメージとしては、
センサー測定 → スマホで取得(ローカル内)
難易度を抑えるために、とりあえずローカル接続で試しましょう!
(ローカル接続は、同じWI-FIで接続された物のみ、やりとりができるようになります)
★初心者向け、ただ単にセンサーを取得して楽しみたい方はこちら⇩
①「部品」
・MH-Z19E (MH-Z19C,Dでも可)
電子工作ステーション 2450円(送料無料)(MH-Z19E)
秋月電子 2480円+送料(MH-Z19C)
・ESP-WROOM-32
電子工作ステーション 1100円(送料無料)(30pinモデル)
秋月電子 1230円+送料(38Pinモデル)
※楽天にて横幅を細くしたバージョンが登場‼
pin番を無くした代わりに細くなっているので、ブレットボードで使いやすくなりました‼
6極ブレットボードではなく定番のブレットボードで使えるようになるのでススメです⇩⇩⇩
・5V出力昇圧DCDCコンバーター
電子工作ステーション 250円(500円以上購入で送料無料)(pinはんだ済み)
秋月電子 300円+送料(pinはんだ未接続)
★追記
ESP32、30pinモデルではVINが5.1V出ていたので、センサーと直接つないで取得することが可能でした。そのためDCDCコンバータは不要です。
ESP32、38pinモデルでは5VPinに繋いでも4.8Vしか出てなかったため、DCDCコンバータが必要になります。(MH-Z19C以降では5V±01V)
既にESP32をお持ちの方は、一度テスターで5V±0.1V出ているか確認しておくと無難です。
※使うPCや、電源などによって変わるかもしれません。
・通信用マイクロUSBケーブルタイプB (家に無ければ)
ESP-WROOM-32とパソコンを繋ぐためのケーブルです。
スマホ用充電専用タイプだと使えないのでご注意ください。
・ブレットボード(6穴版)
6穴版 EIC-3901(秋月電子:280円)
・ジャンパーワイヤー (オス・オス)
電子工作ステーション 1セットで100円(送料500円以上で無料)
(ESP32と5V出力昇圧DCDCコンバーターを繋ぐために使用)
・ジャンパーワイヤー (オス・オス)
電子工作ステーション 1セットで100円(送料500円以上で無料)
(ESP32と5V出力昇圧DCDCコンバーターとMH-Z19を繋ぐために使用)
②「回路図」
センサーの裏に白文字で接続名が書いてあります。
それを参考に下記の図のように配線してください。
※なお、この配線図は秋月電子で販売しておりますDCDCコンバータの使用例です。
秋月電子のDCDCコンバータをご使用の場合は、付属されているpinをコンバータにはんだ付けしましょう。
MH-Z19E | ESP32(接続pin) |
Tx | 4 |
Rx | 5 |
MH-Z19E | 5V出力昇圧DCDCコンバーター(秋月電子) |
V1n | O (OUT) |
GND | G (GND( – )) |
5V出力昇圧DCDCコンバーター(秋月電子) | ESP32(接続pin) |
I (IN(四角いマスの方)) | 5V( + ) |
G (GND( – )) | GND( – ) |
③「開発環境」
・いよいよプログラミングですが、その前にMHZ19をArduinoIDEで使えるようにするため、今回はGitHbuで公開されているライブラリ、
「MHZ19_uart.h」というものを使わせて頂きますので、ArduinoIDEにこちらのライブラリーを入れてください。
手順は簡単で、こちらからライブラリーをダウンロードして解凍します。
・解凍が終わりましたら「mhz19_uart-master」というフォルダーごと
「libraries」(C:\Users\…..\arduino\libraries)に入れるだけです。
後はArduinoIED起動させ、ファイルスケッチ例の中にmhz19_uartがあれば準備完了です。
※ArduinoIDEでESP32を使えるようにしていない方はこちらもしておきましょう➡Arduino IDEでESP-WROOM-32を使えるようにする!
④「プログラミング」
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 |
//MH-Z19で取得した値をブラウザーの送信するプログラム。 #include <WiFi.h> #include <MHZ19_uart.h> //ご自分のルーターのSSIDを""内に入力 const char* ssid = ""; //ご自分のルーターのパスワードを""内に入力 const char* password = ""; boolean Ini_html_on = false;//ブラウザからの初回HTTPレスポンス完了したかどうかのフラグ //MH-Z19に繋ぐピン指定 const int rx_pin = 4; //Serial rx pin no const int tx_pin = 5; //Serial tx pin no int co2ppm; int temp; MHZ19_uart mhz19; WiFiServer server(80); WiFiClient client; void setup() { Serial.begin(115200); mhz19.begin(rx_pin, tx_pin); mhz19.setAutoCalibration(false); // Connect to WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); // Start the server server.begin(); Serial.println("Server started"); // Print the IP address Serial.println(WiFi.localIP()); } //************メインループ******************************** void loop() { co2ppm = mhz19.getPPM(); temp = mhz19.getTemperature(); //CO2濃度出力 Serial.print("co2: "); Serial.println(co2ppm); //気温出力(MH-Z19は温度も取得できます。) Serial.print("temp: "); Serial.println(temp); if (Ini_html_on == false) { Ini_HTTP_Response(); } else if (client.available()) { Serial.print(client.read()); } delay(100); } //初回ブラウザからのGET要求によるHTMLタグ吐き出しHTTPレスポンス void Ini_HTTP_Response() { client = server.available();//クライアント生成 delay(1); String req; while (client) { if (client.available()) { req = client.readStringUntil('\n'); Serial.println(req); if (req.indexOf("GET / HTTP") >= 0 || req.indexOf("GET /favicon") >= 0) { //ブラウザからリクエストを受信したらこの文字列を検知する //Google Chromeの場合faviconリクエストが来るのでそれも検出する Serial.println("-----from Browser FirstTime HTTP Request---------"); Serial.println(req); //ブラウザからのリクエストで空行(\r\nが先頭になる)まで読み込む while (req.indexOf("\r") != 0) { req = client.readStringUntil('\n');//\nまで読み込むが\n自身は文字列に含まれず、捨てられる Serial.println(req); } req = ""; delay(10);//10ms待ってレスポンスをブラウザに送信 //メモリ節約のため、Fマクロで文字列を囲う //普通のHTTPレスポンスヘッダ client.print(F("HTTP/1.1 200 OK\r\n")); client.print(F("Content-Type:text/html\r\n")); client.print(F("Connection:close\r\n\r\n"));//1行空行が必要 //ここからブラウザ表示のためのHTML吐き出し client.println(F("<!DOCTYPE html>")); client.println(F("<html>")); client.println(F("<body>")); client.println(F("<font size=30>")); client.println(co2ppm); client.println(F("ppm")); client.println(F("<br>")); client.println(temp); client.println(F("c")); client.println(F("</font>")); client.println(F("</body>")); client.println(F("</html>")); delay(10);//これが無いと切断できないかもしれない。 client.stop();//一旦ブラウザとコネクション切断する。 delay(10); Serial.println("\nGET HTTP client stop------"); req = ""; Ini_html_on = false; //一回切りの接続にしたい場合、ここをtrueにする。 } } } } |
上記のコードをコピペして貼り付けます。
コードの冒頭にある↓ここ↓の部分のみ、WI-FIのSSIDと、パスワードを入力しましょう‼
1 2 3 4 |
//ご自分のルーターのSSIDを""内に入力 const char* ssid = ""; //ご自分のルーターのパスワードを""内に入力 const char* password = ""; |
※家に万が一Wi-Fiが無い場合は、スマホのテザリング機能でもできるかと思いますのでお試しください。
次にシリアルモニターを開きます。(ツール⇒シリアルモニター)
ビルド(書き込み)が完了ししたら、シリアルモニターにこんな感じにいろいろ表示されます。
※表示されない場合は、シリアルモニターの下の方にあるbpsを115200bpsにしましょう‼
※MH-Z19センサーは正確なCO2測定までに、約1分ほど掛かりますので、CO2の値が変わらなくても、焦らずしばらく待ってみましょう‼
※temo(温度)が正常に取得できてない場合は、接続が間違っているかもしれないので、配線図、回路図を見直しましょう‼
⑤「結果」
シリアルモニターに表示されたIPアドレスをURL欄にコピペしてみましょう‼
エンターを押すと、なんと、
センサーの値が表示されます‼
これで、無事、成功です♪
お疲れ様でした‼
もし、表示されない方は、マイコンと表示する端末が同じローカル内(同じWI-FI内)にあるかを確認しましょう‼
以上、ご閲覧ありがとうございました‼