CO2濃度計の改修計画 05【RP2040マイコンに】

 

マイコンをRP2040にしました(2025-2-17作成)

今回の要旨

 ・マイコンをESP32からRP2040 に変更した内容をお知らせします

 ・CO₂センサ(¥8,548)が高いので廉価版ENS160を探しました

  次回は、ENS160をテストします。ただし、中国からで納期がかかるようです

マイコンの選択

 ・従来のマイコンは背景色が青で、新しいRP2040は背景色が黄色です

  特徴は

  1.Raspberry Piで使用されています

  2.BluetoothWiFiは搭載されていません

  3.USBがTypeBからCになりました

  4.CO₂計測用のI2Cと液晶表示用のSPIを備え、最もシンプルなRP2040を選びます

   

部品

 ・マイコン

 ・液晶ディスプレイ

 ・CO₂センサ

     DigiKeyでも購入できます。ただし、少し高いため、廉価版を物色しています

     

     代買え候補(センサーをCCS811からENS160に変更します)

配線方法

 ・配線案を先に決める必要があります。材料は両方揃っているので、

  この際、両方作れそうです

      ピンとコネクターは共立エレショップで購入しました

      

回路図

 ・昨年までは会社でアプリを使用できましたが、

  退職したため、フリーで簡単そうな『水魚堂の回路図エディタ』を使ってみました

    • 下記を参照しながら回路図エディタを使用しています。今回は回路が簡単なため、ネットリストは使用しません。基板を外注せず、プリント基板設計も行いません(できません)

 ・作成途中のものを下記に貼り付けておきます。単純な配線ですが、不格好ですね……

   

 

プログラム

 ・下記を参照しました

    • 開発ソフトのインストールから、I2CとSPIの設定、そしてサンプルソースがあります

 ・実際のソースコードは下記のようになっています

    • #include <SPI.h>
      #include <Wire.h>
      #include <Adafruit_GFX.h>
      #include <Adafruit_SSD1331.h>

      //Font
      #include "/Users/shigu/Library/CloudStorage/Dropbox/Arduino_inDropbox/libraries/Adafruit_GFX_Library/Fonts/FreeSans9pt7b.h"

      //TextColor サンプル (16-bitで指定 5-6-5 Color)
      #define SSD1331_BLACK 0x0000
      // #define SSD1331_BLUE 0xF800
      // #define SSD1331_YELLOW 0x07FF
      #define SSD1331_WHITE 0xFFFF

      // Declaration for SSD1331 display connected using software SPI (default case):
      #define cs D7 //Connect SSD1315 CS ChipSelect SlaveSelect
      #define dc D3 //Connect SSD1315 D/C Data/Command control
      #define rst D2 //Connect SSD1331 RES Reset
      #define mosi D10 //Connect SSD1315 D1 MasterOut SlaveIn
      #define sclk D8 //Connect SSD1315 D0 Serial Clock
      Adafruit_SSD1331 disply( cs, dc, mosi, sclk, rst);

      void setup() {
      // put your setup code here, to run once:
      Wire.begin(); // join i2c bus (address optional for master)
      Serial.begin(115200);
      disply.begin( );
      disply.fillScreen( SSD1331_BLACK );
      disply.setFont( &FreeSans9pt7b );
      }

      int reading = 2222, co2Int = 0;
      float temp = 2623, tempInt = 0;

      void loop() {
      // step 1: wake sensor
      Wire.beginTransmission(byte(0x68)); // transmΩit to device 0x68=104
      Wire.endTransmission(); // stop transmitting

      // put your main code here, to run repeatedly:
      Serial.println("");

      // step 3: instruct sensor to return a particular echo reading
      Wire.beginTransmission(byte(0x68)); // transmit to device #104
      Wire.write(byte(0x06)); // sets register pointer to echo #1 register (0x06)
      Wire.endTransmission(); // stop transmitting

      // step 4: request reading from sensor
      Wire.requestFrom(byte(0x68), 2); // request 2 bytes from slave device #104

      // step 5: receive reading CO2 from sensor
      if (2 <= Wire.available()) { // if two bytes were received
      reading = Wire.read(); // receive high byte (overwrites previous reading)
      reading = reading << 8; // shift high byte to be high 8 bits
      reading |= Wire.read(); // receive low byte as lower 8 bits
      if (co2Int != reading) {
      co2Int = reading;
      disply.fillRoundRect(0, 4, 94, 19, 1, disply.color565(20, 20, 20) );
      disply.setTextSize(1); // Normal 1:1 pixel scale
      disply.setTextColor(disply.color565(200, 200, 120));
      disply.setCursor(0,20); // Start at top-left corner
      disply.print(F(" CO2:") );
      disply.setCursor(50, 20); // print OLED
      disply.print(reading);
      }
      //for debug
      Serial.print(reading); // print Serial
      Serial.println(" CO2");
      }

      // step 6: read temperature
      Wire.beginTransmission(byte(0x68)); // transmit to device
      Wire.write(byte(0x08)); // sets register pointer to echo #1 register (0x08)
      Wire.endTransmission(); // stop transmitting
      Wire.requestFrom(byte(0x68), 2); // request 2 bytes from slave device
      if (2 <= Wire.available()) { // if two bytes were received
      reading = Wire.read(); // receive high byte (overwrites previous reading)
      reading = reading << 8; // shift high byte to be high 8 bits
      reading |= Wire.read(); // receive low byte as lower 8 bits
      temp = reading;
      if (temp != tempInt) {
      tempInt = temp;
      disply.fillRoundRect(0, 33, 94, 19, 1, disply.color565(20, 20, 20) );
      disply.setCursor(3,48); // Start at top-left corner
      disply.print(F("temp:") );
      disply.setCursor(53, 48); // print OLED
      disply.print((temp / 100), 1);
      }
      //for debug
      Serial.print((temp / 100), 1); // print Serial
      Serial.println(" C");
      }
      delay(5000);

      }

はじまり

コロナウイルスが流行していた頃にCO2濃度計を作りました

 この方の情報を参考にしてブレッドボード上に作成しましたが、液晶の色がくすんできた

 ため、改修を計画しています。下記資料を参考にして作成

経歴

1号機 ESP32 38Pin

  <回路図> 上記記事からの引用です。ともふみさん ありがとうございます

   

  <実機> ソフトは2号機と同じです。液晶(OLED)は新品に交換済みです

   

2号機 ESP32 30Pin

  <回路図> 30Pinしたのは安かったからです。技術的な理由はございません

   

  <実機> テストのみ実施しました

   

 

3号機 RP2040

  <回路図> マイコンをXIAO RP2040にしました。アリエクで2個送料込みで2129円

  

  <実機> ブレットボードでのテスト写真

  

 

以上。これからもよろしくお願いします

プライバシーポリシー |ページトップへ

`