ブログだいちゃん

ブログだいちゃん

趣味のブログ

ブログだいちゃん

室内のCO2濃度と温度/湿度/気圧をBlynkで表示する

Blynkローカルサーバーを立ち上げてBlynk legacy が使い放題になったので、外気温に限らず各部屋の温度も表示させたりしています。

Raspberry Pi Pico を使用したCO2モニターを作成しましたが、今回は ESP8266 を使用してBlynkでうまく表示出来るかやってみます。

Rspberry Pi Pico を使用してCO2モニターを作成した記事。

blogdaichan.hatenablog.com
 

 

どの様な仕様にするか

 
1. 1.3インチのOLEDにCO2濃度を表示させる。
2. Blynkで表示させるために作成した温度/湿度/気圧計からデータを取得する。
3. Blynkのスマフォ画面には温度・湿度・気圧・CO2濃度・時刻・リセットボタン・キャリブレーションボタン などを表示する。
4. CO2濃度に対応するLED点滅表示も行う、4段階表示。
5. 以前作成したCO2モニターのケースを修正して組み込む。

※ このプロジェクトはBlynk_legacy用です、Blynk_Local_Server を運用して動作させています、新バージョンでは試しておりません。

 

参考サイト

 
Blynk関連の記事が多くあるサイトです、MH-Z19Bを使用した記事があり参考になりました。

intellectualcuriosity.hatenablog.com
 

使用パーツ

 

CO2 センサーは MH-Z19E を使用します

Pico W を使用して作成したCO2モニターにはMH-Z19Cを使用しましたが、CとEのデーターの比較も行いたいと思います。

electronicwork.shop

降圧モジュール

電源電圧が5.24Vと高いのでCO2モジュールの許容範囲に下げるため使用しました。

 

その他

3mm LED 4色、 2KΩ抵抗、USB-Cメス電源コネクター、ユニバーサル基板 など。
 

以前作成した温度/湿度/気圧計

Blynkで表示させるために作成した温度計のAUTH_TOKEN を、CO2モニターのプロジェクトAUTH_TOKENに変更してCO2プロジェクトで温度・湿度・気圧データーを表示させるようにします。

blogdaichan.hatenablog.com
 

ケースは以前作成した物を一部修正して使用します。

裏蓋の固定には3mmのインサートナットを使用しました。

ケースのSTLファイルです。 Download STL file
 

プログラム

 

CO2 Monitor のスケッチです

参考サイトのスケッチにOLED表示・LED表示とリセットを追加しています、セルフキャリブレーションはオフにしています。

回路図は単純なので載せません、スケッチを見て判断して下さい。

リセットボタンを設定したのは電源を入れたとき、リセットしないと正常に表示されない場合があったためです。

/* CO2-Monitor
 * CO2センサーMH-Z19E
 * OLED1.3inch SH1106 driver
 * 参考サイト:https://intellectualcuriosity.hatenablog.com/entry/2020/01/02/221905
*/
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space
#include <BlynkSimpleEsp8266.h>
#include <SoftwareSerial.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
/*OLED設定*/
#define i2c_Address 0x3c
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1   //   QT-PY / XIAO
Adafruit_SH1106G display = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
/*LED_pin*/
int LED_Blue = 1 ;
int LED_Green = 3 ;
int LED_Yellow = 14 ;
int LED_Red = 16 ;
/* Blynk Auth Token and WiFi credentials */
#define AUTH_TOKEN "Your AUTH_TOKEN"
#define WIFI_SSID  "Your SSID"
#define WIFI_PASS  "Your Pass"
/* Define ESP8266 TX RX pin */
#define ESP8266_TX 12
#define ESP8266_RX 13
/* MH-Z19 Commands */
byte cmd_read_co2[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79};
byte cmd_calibrate_zero[9] = {0xFF,0x01,0x87,0x00,0x00,0x00,0x00,0x00,0x78};
byte cmd_Self_calibration_off[9] = {0xFF,0x01,0x79,0x00,0x00,0x00,0x00,0x00,0x86}; // Self-calibration OFF
byte cmd_Self_calibration_on[9] = {0xFF,0x01,0x79,0xA0,0x00,0x00,0x00,0x00,0xE6};  // Self-calibration ON
byte cmd_detection_range_2000[9] = {0xFF,0x01,0x99,0x00,0x00,0x00,0x07,0xD0,0x8F}; // 0~2000ppm
byte cmd_detection_range_5000[9] = {0xFF,0x01,0x99,0x00,0x00,0x00,0x13,0x88,0xCB}; // 0~5000ppm 
/* Global Objects */
SoftwareSerial co2Serial (ESP8266_RX, ESP8266_TX) ;
BlynkTimer timer;
/* Calibration Button*/
BLYNK_WRITE(V2) {
  if (param.asInt()) {
    co2Serial.write(cmd_calibrate_zero, 9);
  }
}
/* Soft reset Button*/
BLYNK_WRITE(V6) {
  if (param.asInt()) {
    ESP.restart();
  }
}
void sendSensor() {
  unsigned char response[9];        // for answer
    co2Serial.write(cmd_read_co2, 9); // request PPM CO2
    co2Serial.readBytes(response, 9);
    unsigned int responseHigh = (unsigned int) response[2];
    unsigned int responseLow = (unsigned int) response[3];
    int ppm = (256 * responseHigh) + responseLow;
    Blynk.virtualWrite(V1, ppm);
    display.clearDisplay();
    display.setTextColor(SH110X_WHITE); 
    display.setTextSize(1);  
    display.setCursor(15, 10);
    display.println("CO2-Monitor(PPM)");    
    display.setTextSize(2);  
    display.setCursor(15, 35);
    display.println("CO2: ");
    display.setCursor(65, 35);
    display.println(ppm);   
    display.display();      
/* LED表示 */
    if (ppm >= 3000) {
    digitalWrite(LED_Red, HIGH); 
    digitalWrite(LED_Yellow, HIGH); 
    digitalWrite(LED_Green, HIGH); 
    digitalWrite(LED_Blue, HIGH); 
    delay(1000);    
    digitalWrite(LED_Red, LOW); 
    delay(1000);    
   }
      else if (ppm > 2000) {
      digitalWrite(LED_Red, LOW); 
      digitalWrite(LED_Yellow, HIGH); 
      digitalWrite(LED_Green, HIGH); 
      digitalWrite(LED_Blue, HIGH); 
      delay(1000);    
      digitalWrite((LED_Yellow, LOW); 
      delay(1000);    
     }
        else if (ppm > 1000) {
        digitalWrite(LED_Red, LOW); 
        digitalWrite(LED_Yellow, LOW); 
        digitalWrite(LED_Green, HIGH); 
        digitalWrite(LED_Blue, HIGH);
        delay(1000);    
        digitalWrite((LED_Green, LOW); 
        delay(1000);    
       }
       else {
       digitalWrite(LED_Red, LOW); 
       digitalWrite(LED_Yellow, LOW); 
       digitalWrite(LED_Green, LOW); 
       digitalWrite(LED_, HIGH); 
       delay(1000);    
       digitalWrite((LED_Blue, LOW); 
       delay(1000); 
   }
}
void setup() {
  Serial.begin(74880); 
  co2Serial.begin(9600);
  display.begin(i2c_Address, true);
  display.clearDisplay(); 
  display.display();
  /*LED設定*/
  pinMode(LED_Blue, OUTPUT);
  pinMode(LED_Green, OUTPUT);  
  pinMode(LED_Yellow, OUTPUT);
  pinMode(LED_Red, OUTPUT);   
  /* Initialize MH-Z19 */
/* co2Serial.write(cmd_Self_calibration_on, 9);  // 自己校正機能は使わない */
   co2Serial.write(cmd_detection_range_5000, 9); 
  /* Initialize Blynk */
  Blynk.begin(AUTH_TOKEN, WIFI_SSID, WIFI_PASS, IPAddress(192, 168, 0, 100 ), 8080);  //Blynk Local Server のIPアドレスを設定する
  /* Initialize BlynkTimer */
  timer.setInterval(2000, sendSensor); // every 2 seconds
}
void loop() {
  Blynk.run();
  timer.run(); 
}

 

Blynk 側の設定

 

温度/湿度/気圧のデーター取得

CO2Monitorの新しいプロジェクトを作成したときに得たAUTH_TOKEN に 温度/湿度/気圧計スケッチのAUTH_TOKENを書き換える。

このときCO2Monitorの (V番号)が重複しないよう調整する、これでCO2Monitorのプロジェクトに温度計のデーターを表示出来るようになる。
温度計で作成したプロジェクトは使用出来なくなるので削除する。

Blynkに各ウィジェットを配置する

リセットボタンとキャリブレーションボタンは通常は使わないので画面をスクロールしないと表示されない位置に配置した。

 

完成したCO2 Monitor

OLED及びCo2センサーはホットグルーでケースに固定しました。
ケース内の画像はZ19Cですが、前に作成したCO2モニターと入れ替えてデーターに変化があるか確認した時の物です。

 

MH-Z19C と MH-Z19E のデーター比較

 
正確なCO2の値は解らないのでどちらが正確なのかは判断できませんが、双方のデーターの比較は下記のようになりました。

キャリブレーションは屋外で2台並べて行いました。

・ 1000PPM位までは50PPM以内の差でモジュールの誤差範囲内で推移しました。
・ 2000PPMまではZ19Eの方が200PPMほど上昇します。
・ 2000PPMを超えるとだんだん差が開き3000PPMを超えた時点で500PPMほどZ19Eの濃度が高く表示されます。
・ 比較的にZ19CよりZ19EのほうがCO2に敏感に反応する感じがします。
 

SwitchBotを作成しファンヒーターをBlynkで操作する

以前、WebServer版のSwitchBotの様な物を作成し、ファンヒーターの電源ONと延長設定を行いましたがある程度時間が経過するとServerDownが発生し使い物になりませんでした。

Blynk LocalServer を作成し稼働しているので、SwitchBotの様な物をBlynkで操作出来るようにし ファンヒーターに取り付けたいと思います。
 

 

回路図

 
回路図の電池は18350の並列接続です、電源表示用LEDは直径3mmを使用しています。
サーボ:回路図ではSG90Sになっていますが使用した物はMG90Sです。


 

スケッチ

 
サーボは保持したままだと電池消費が激しいので操作後にサーボを無効にしています。

/*************************************************************
  スイッチボットのようなものを作成Blynkで操作し
 ファンヒーターの電源投入 延長設定 をしてみる。
 Blynk Local_Server & ESP8266 
 *************************************************************/

#define BLYNK_AUTH_TOKEN "Your TOKEN"
#define BLYNK_PRINT Serial
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <Servo.h>
// WiFi設定
char ssid[] = "YourSSID";
char pass[] = "YourPASS";
//サーボ設定
Servo servo;
int power = 120;    //電源投入 要調整
int angle = 75;     //水平位置 要調整
int extension = 35; //延長設定 要調整
//V3ボタンは電源ON/OFFを行う
BLYNK_WRITE(V3)
{
  if (param.asInt()) {
  servo.attach(4, 500, 2400);
  servo.write(power);
  delay(500);
  servo.write(angle);
  delay(1000);
  servo.detach();
  }
}
//V4ボタンは延長の設定
BLYNK_WRITE(V4)
{
  if (param.asInt()) {  
  servo.attach(4, 500, 2400);
  servo.write(extension);
  delay(500);
  servo.write(angle);
  delay(1000);
  servo.detach();
  }
}
void setup()
{
  Serial.begin(115200);
  Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass, IPAddress(192,168,0,100), 8080); //Blynk LocalServerのIPアドレスを設定
  servo.attach(4, 500, 2400); //サーボの接続GPIO 4
  servo.write(angle); //サーボを水平にする
  delay(500);
  servo.detach(); //電池消費を少なくするためサーボを無効にする
}
void loop()
{
  Blynk.run();
}

 

ケース作成

 
ケースは3Dプリンターで作成しました、大きさは 70×60×40 mm 電池の大きさがネックですね、リチウムポリマー電池を使用すると小型化できそうです。

 
ファンヒーターに取り付けた画像

 
Blynk側スマフォの画像

 

動作動画

 
以前に作成したWebServer版の動画ですが形は同じですので流用しています。


www.youtube.com
 

関連記事

 
blogdaichan.hatenablog.com

Blynk Local Server を Raspberry Pi にインストールして屋外温度を表示させる

もうかれこれ5年以上前になりますが、外の気温を知りたくて屋外に温度計を設置しBlynkを使用してスマフォで見ていました。

blogdaichan.hatenablog.com

2022年12月31日でBlynk_legacyが終了してしまい使えなくなり Blynkは諦め、昨年の5月頃 Raspberry Pi Pico W を使用して屋外温度計を作成しました。
しかし、これはPC版の使用に特化しておりスマフォでは見にくいものでした。

blogdaichan.hatenablog.com

Blynk の使用は諦めていましたが、 Blynkローカル サーバーを稼働させてBlynkを使用しているブログ記事を拝見し、同じような記事を検索して見た結果自分でも出来そうなのでやってみようと思います、もっと早く気付けば良かった。
 

 

参考記事

 

Blynk ローカルサーバーについて書かれています。

rainbowgoblinss.blogspot.com
androgundan.blue

こちらはWindows版Blynkローカルサーバーについて書かれています。

intellectualcuriosity.hatenablog.com

Blynkローカルサーバーをダウンロード出来るGithubです。

github.com

スマフォのBlynk legacy 版 apk をダウンロード出来ます。

https://apkcombo.com/ja/blynk-legacy/cc.blynk/download/phone-2.27.34-apk
 

Raspberry Pi を使用して構築する

 

Blynkローカルサーバーは古いラズパイでも可能らしい。

このサーバーは軽くて非力なラズパイでも運用できるらしいので、手持ちのRspberry Pi 3B を使用して構築することにします。
最近はラズパイも高騰してますね、SDメモリは16GBを使用します必要な物はこれだけです。

 

構築手順

 
詳細は参考記事をお読み下さい解りやすく書かれています、ここではインストールした順序だけ書きます。

1. ラズパイに最新のRspberry Pi OS をインストールします。

 ・ インストールにはRaspberry Pi Imager を使用すると簡単です。
 ・ WiFiの設定後OS のアップデートを行い、SSH VNC を有効にします。
 ・ PC側にもVNCをインストールします、私は Real VNC Viewer を使用しました。
 ・ ラズパイを固定IPアドレスに設定します。

以上でラズパイの初期設定は終了。

2. Blynkローカルサーバーのインストール

 ・ PCからVNCで接続して設定をしました。
 ・ ラズパイにJava 11 をインストールします。
 ・ Githubからblynk-server 最新版をダウンロードしインストールします。
 ・ blynk-server 自動起動の設定・mail.properties・server.propertiesの設定をします。
 ・ Blynkローカルサーバー管理画面へのアクセスは、設定したサーバーの固定IPアドレス:設定したポート/admin
  例 192.168.0.10:9443/admin
   ID:admin@blynk.cc
  Pass:最初にBlynkローカルサーバーを起動したときに表示されるPassword
  でログインする。

3. 外部からアクセスしたい場合(セキュリティーの問題あり)

 ・ ルーターの設定で ポート9443 を解放する。
 ・ IPV6を使用している場合は開けるポートが限定されますので使用出来るポートに変更します。
   server.properties を開き ポート9443をIPV6で使用出来るポートに設定し、ルーターも同じポートを開放します。
 ・外部からスマフォでアクセスするには、自宅のインターネット側IPアドレスと設定したポートでアクセスする。
 

使ってみる

 
Blink ローカルサーバーが起動出来たので屋外温度計を作成してBlynkで表示させます。

新しいユーザーを設定する

 ・ ラズパイの /home/pi/Blynkフォルダーを開き、admin@blynk.cc.Blynk.user ファイルをコピーします。
 ・ 自分が使用したいメールアドレス.Blynk.user にリネームして、テキストエディターでファイルを開きadmin@blynk.cc の所を自分の使用したいメールアドレスに変更します、また "isSuperAdmin":truefalseにし同じフォルダーに置きます。
 ・ サーバーの管理画面でパスワードなどの変更が出来ます。

Blynkローカルサーバーにアクセスするように設定する。

 ・ 以前作成した屋外温度計のスケッチを修正して使用します。
 ・Projectを作成したときに発行されるAUTH_TOKENを設定。
 ・温度計のスケッチを開きBlynk.begin(auth, ssid, pass, IPAddress(192.168.***.*** ), 8080); のようにサーバーのアドレスに設定。

屋外温度計は新たにESP-Wroom02とBME280 を使用して作成しました。

WEP-Wroom02 を久しぶりに使用しましたので、プルアップとプルダウンの抵抗を入れるのを忘れ動かなくてハマりました。


スマフォの画面です、やはりBlynkは見やすいですね。


Blynkで前のように屋外温度が見れるようになりました、今朝は風が強く寒かった。(*^o^*)

ATTiny85 で動くレトロゲーム機を作ってみた

若かりし頃インベーダーゲームをカフェに置いてあったゲーム機でよく遊んでいた記憶があります。
あの頃とは違い、今はボケ防止のため指先の運動でもしてみよう的な思惑でゲームをしてみます、月日が経つのは早い物です。(*^▽^*)

よく見るのは0.96インチの小さなOLEDを使用した小型のゲーム機ですが、目が遠くなった私には見づらいのでちょっと大きめなディスプレイを使用して作成します。
 

 

参考記事

 

ゲームモジュールをカセット式にしている動画

www.youtube.com

回路図

 

ATTiny85ゲーム機の一般的な回路図です、これに充電モジュールを追加しました。

回路図はUncle in Yokohama さんの動画からの転載です。

5ポジションスイッチのピン配置図です

 

ケース作成

 

縦55mm×横85mm×厚さ23mm 肉厚3mmで作成

OLED、スイッチ類など全てケースにホットグルーで固定しました、裏蓋の固定用にインサートナットを使用します。

STLファイルを必要な方は Download して下さい。
 

配線・組み込み

 
OLED、スイッチ類、電源・充電表示用3mmLEDはリード線をハンダ付けしてからケースにホットグルーで固定します。
裏蓋にあるユニバーサル基板取付用突起の寸法は12.5×15mmです、2.5mmピッチの基板の穴に合うようにしました。
リポ電池は裏蓋にベルクロで貼り付けました。

ATTINY85を載せたカセット式の小さな基板です。

スイッチを入れると電源表示用青色LEDが点灯します、充電時は赤色LEDが点灯(充電モジュールから配線)します。


外観です


1.54インチのOLEDは見やすくていいですね、このディスプレイドライバーがSH1116となっていてドライバーファイルがどこを探しても見つからず、SH1106のドライバーを使用しても正常に表示されなくて悩んでいましたが、SSD1306ドライバーを使用したところ正常に表示されました紛らわしいですね。

Raspberry Pi Pico と MH-Z19Cを使用し CO2濃度測定器を作成してみました

寒い日が続き室内で窓を閉め切りファンヒーターなどを付けていると、CO2濃度もどんどん上昇していると思いますが、実際どの位の濃度になっているのか見当が付きません。

最近またコロナの感染者が増えてきました、室内の空気を入れ換え感染症の予防も必要です、換気の目安を知るためCO2センサーを使って二酸化炭素濃度測定器を作成してみようと思います。
 

 

参考サイト

 

CO2測定について書かれている記事です

plaza.rakuten.co.jp
 

SH1106 DriverのGithub です、Thonnyのパッケージ管理からではインストール出来ないので。

github.com
 

Micropython 用 日本語フォント、OLEDに日本語で表示させるため。

github.com
 

回路図

 

OLEDにCO2濃度を表示し濃度を4段階に分けLEDで表示します。

OLED端子のGNDとVCCが入れ替わっているモジュールがあります注意が必要です。
回路図のCO2センサーはMH-Z19Bですが使用したのはMH-Z19Cです。


 

ソフトウエアのインストール

 

Picoへのインストールには Thonny を使用しました

Rspberry Pi Pico へのMicropython farmwareのインストール、Thonny の使用方法については省きます。

1. OLEDのドライバーをGithubからダウンロードしてインストールします。

2. 日本語フォントをGithubからダウンロードして解凍したファイルの中のmfontフォルダーをPicoにアップロードします。
 ※ 日本語フォントは u_16x16.fnt と u_24x24.fnt だけを使用しますのでそれ以外のフォントは削除してからアップロードしないとメモリーオーバーになります。

3. LEDが点滅するCO2濃度の基準値は次のようにしました。
 青色LED:~1000PPM
 緑色LED:1001~2000PPM
 黄色LED:2001~3000PPM
 赤色LED:3001~

4. プログラムについてはド素人ですので間違いがあるとは思いますが、一応動いたので載せておきますご指摘がありましたらコメント下さい。

※ 2024/03/09 OLED表示部分のプログラムを一部修正しました。

##########################################################
# SH1106 OLED Display I2C Driver for Raspberry Pi Pico
# https://github.com/robert-hh/SH1106
# 日本語フォントを使用する
# https://github.com/Tamakichi/pico_MicroPython_Multifont
##########################################################
from machine import Pin, I2C
from sh1106 import SH1106_I2C
import utime
from micropython import const
from mfont import mfont
#----LED設定-----
led_red = Pin(16,Pin.OUT)
led_orange = Pin(17,Pin.OUT)
led_green = Pin(18,Pin.OUT)
led_blue = Pin(19,Pin.OUT)
# 定数(デフォルトは、Seeed XIAO RP2040用)
I2C_ID       = const(1)       # I2C ID
I2C_FREQ     = const(400_000) # I2C バス速度
OLED_WIDTH   = const(128)     # OLEDの横ドット数
OLED_HEIGHT  = const(64)      # OLEDの縦ドット数
OLED_ADDR    = const(0x3c)    # OLEDのI2Cアドレス
OLED_SCL     = const(15)       # OLEDのSCLピン
OLED_SDA     = const(14)       # OLEDのSDAピン
# OLEDディスプレイのインスタンスの生成
i2c = I2C(I2C_ID, scl=Pin(OLED_SCL), sda=Pin(OLED_SDA), freq=I2C_FREQ)
oled = SH1106_I2C(OLED_WIDTH, OLED_HEIGHT, i2c, addr=OLED_ADDR, rotate=180)
oled.contrast(255)
oled.invert(False)
# フォントの表示
def drawFont(self, font, x, y, w, h, flg=False):
    bn = (w+7)>>3
    py = y
    for i in range(0, len(font), bn):
        px = x
        for j in range(bn):
            for k in range(8 if (j+1)*8 <=w else w % 8):
                self.pixel(px+k,py, 1 if font[i+j] & 0x80>>k else 0) 
            px+=8
        py+=1
    if flg:
        self.show()    
# テキストの表示
def drawText(self, text, x, y, fs, wt=0):
    self.x = x
    self.y = y    
    # フォントの設定
    self.mf = mfont(fs)
    self.mf.begin()
    # テキスト表示
    for c in text:
        code = ord(c) 
        font = self.mf.getFont(code)
        self.drawFont(font, self.x, self.y, self.mf.getWidth(), self.mf.getHeight(), True)
        if wt:
            utime.sleep_ms(wt)
        self.x+=self.mf.getWidth()
    self.mf.end()   
# SH1106_I2Cに漢字表示インスタンス・メソッドの追加
SH1106_I2C.drawText = drawText
SH1106_I2C.drawFont = drawFont
#----タイトル表示----
txt = "CO2 濃度測定"
fsize = 16
oled.fill(0)
oled.drawText(txt,15,0,fsize,50)
oled.show()
#----CO2数値の表示---
mhz19c=machine.UART(1,baudrate=9600) # UART
while True:
    for gx in range(98):
        data=bytearray([0xff, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79])
        mhz19c.write(data)
        mhz19c.readinto(data,len(data))
        co2=data[2]*256+data[3]
        print(str(co2)+'ppm')
        fsize = 24
        txt = str(co2)
        oled.drawText(txt+"  ",15,35,fsize,50)
        oled.drawText("PPM",87,35,fsize,50)
        oled.show()
        #----LED表示----
        if (co2 > 3000):
           led_red.value(1)
           led_orange.value(1)
           led_green.value(1)
           led_blue.value(1)
           utime.sleep(3)
           led_red.value(0)           
        elif (co2 > 2000):
            led_red.value(0)
            led_orange.value(1)            
            led_green.value(1)
            led_blue.value(1)
            utime.sleep(3)
            led_orange.value(0)
        elif (co2 > 1000):
            led_red.value(0)
            led_orange.value(0)
            led_green.value(1)
            led_blue.value(1)
            utime.sleep(3)
            led_green.value(0)
        elif (co2 <= 1000):
            led_red.value(0)
            led_orange.value(0)
            led_green.value(0)
            led_blue.value(1)
            utime.sleep(3)
            led_blue.value(0)

 #==================================

 

ブレッドボードに配線して動かしてみました

 

ブレッドボードに配線しました

タイトルは16×16ドット、CO2測定値は24×24ドットで表示しています。
CO2センサーのキャリブレーションはマニュアルの通り屋外で設定しました。


CO2とLEDの表示について

CO2の表示は約3秒ごとに更新されます。
LEDの表示は前述の基準に達しているLEDが点滅し、それ以下のLEDは点灯します。


www.youtube.com
 
画像と動画ではディスプレイが180度回転していますが、プログラムでは修正してあります。

なんとか表示出来たのでケースを作成し組み込んでみようと思います。
 

2月5日追記

 

ケースに組み込み完成させました

Rspberry pi pico でレトロゲーム機を作ってみる

購入しておいた Rspberry pi pico が何個かあるので、python ではなく Arduino の farmware を使用してレトロゲーム機を作成してみようと思います。

0.96インチのOLEDを使用した小さなレトロゲーム機が主流ですが、老眼の私にはよく見えないのでちょっと大きめなディスプレイを使用します。
 

 

参考サイト

 

picoを使用したレトロゲームGithub

github.com
 
Github の元になったサイトWemosD1 Mini などを使用しています。

www.tinyjoypad.com
 

回路図

 
Github からダウンロードしたファイルの中のReadMeテキストを開くと配線について書いてありますが、これを元に回路図を作成してみました。


 

インストールして動作確認

 

Pico にArduino farmware を入れてレトロゲームをインストールする。

Arduino farmware インストールなどについては下記の記事が参考になります。

logikara.blog

ブレッドボード上に配線して動作確認しました。

パーツの数が少ないので配線も簡単です。
スケッチの中に16種類のゲームが入っておりメニューから選択できます。

動作が確認出来たのでケースを作成し完成させたいと思います。

最初に作成したMiniWebRadioもV2にして ケースを小型化する

MiniWebRadioV2 がストレスなく動作するので、最初に作成したMiniWebRadioもV2化してケースも小型にしてみます。

最初に作成したMiniWebRadio

blogdaichan.hatenablog.com
 

 

使用パーツ

 
使用パーツは最初に作成した物でまかないます、ただしESP32は ESP32-WROVER-E に変更します。

アンプはスイッチ付きボリュームが無いものを使用

MiniWebRadioV2 の使用パーツは前の記事を参考にして下さい。

blogdaichan.hatenablog.com
 

ユニバーサル基板は最初の物を流用

 

基板への配線

回路はV2になり多少の変更がありますので配線を全部取り外して再度配線し直しました。

ユニバーサル基板はLCDのピンヘッダーにピンソケットで差し込み固定しています、今回はスイッチ付きのアンプは使用せず VS1053 の背面に両面テープでアンプを固定しました、したがって音量調節はリモコンまたはタッチパネルで行います。


 

ケースの作成

 
ケースの両横にスピーカーを取り付けようとしましたがLCDの背面に基板があり支障するので諦めました。
横長にはしたくなかったのこの様な形になりました。
大きさは 縦110×横110×奥行き70mm でPLA使用 インフル20% 厚さ3mm で印刷しました。

作成した外観です

 

ケースへの組込

 

ネジ止めはプラスチックネジを使用、そのほか両面テープホットボンドなどを使用しました。

 

以前作成した物との比較