CO2濃度計の改修計画 04【新旧ボード対応】

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

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

 ため、改修を計画しています

買い替える部品を決めました

       

  1月30日追記:CO2センサーをデジキーから入手しました

   

 

ESP32開発ボードを38Pinから30Pinに変更

換えた理由は、技術的には問題がないものの、安価に入手できたためです

  1月30日追記:アリエクで特価品(送料無料)がありました。私は380円で買いました

   


過去の開発記録がないので、Notionにまとめながら作業を進めてみます

配線は下記のようになります

   

 

ソースコードは下記のようになります
#include <Wire.h>
#include <SPI.h>
#include "Ucglib.h"

 

//define OLED SSD1331 pin
/*
//ESP32 30pin
#define cs 17 // CS Slave Select(Chip select)
#define dc 16 // DC Data/Command
#define rst 4 // RES Reset
#define mosi 23 // SDA Master In Slave Out
#define sclk 18 // SCL Serial Clock
//#define 3v3
//#define gnd
*/

 

//ESP32 38pin
#define cs 15 // CS Slave Select(Chip select)
#define dc 16 // DC Data/Command
#define rst 4 // RES Reset
#define mosi 13 // SDA Master In Slave Out
#define sclk 14 // SCL Serial Clock
//#define 3v3
//#define gnd
Ucglib_SSD1331_18x96x64_UNIVISION_SWSPI disply(sclk, mosi, dc, cs, rst);

 

// oled font procedures
//#define UCG_FONT_MODE_TRANSPARENT ucg_draw_transparent_glyph
//#define UCG_FONT_MODE_SOLID ucg_draw_solid_glyph
//#define UCG_FONT_MODE_NONE (ucg_font_mode_fnptr)0)

 

void setup() {
disply.begin(UCG_FONT_MODE_NONE); //star Ucglib(SSD1331 OLED)
Wire.begin(); // join i2c bus (address optional for master)
Serial.begin(9600); // start serial communication at 9600bps
disply.clearScreen();
disply.setColor(190, 190, 190);
}

 

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

 

void loop() {
disply.setFont(ucg_font_helvB12_tr);
//ucg.setFont(ucg_font_ncenR12_tr);

 

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

 

delay(5); //max 15ms

 

// 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.setColor(20, 20, 30);
disply.drawBox(0, 4, 94, 19);
disply.setColor(190, 190, 190);
disply.setPrintPos(0, 20); // print OLED
disply.print(" CO2:");
disply.setPrintPos(50, 20);
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.setColor(20, 20, 40);
disply.drawBox(0, 30, 94, 19);
disply.setColor(190, 190, 190);
disply.setPrintPos(0, 45); // print OLED
disply.print("temp:");
disply.setPrintPos(50, 45);
disply.print((temp / 100), 1);
}
//for debug
Serial.print((temp / 100), 1); // print Serial
Serial.println(" C");
}

 

delay(5000); // wait a bit since people have to read the output :)
}
動作確認用実機は下記のようになります

       

1月31日追記:OLEDの信号を確認してみました

 信号を確認するために、ロジックアナライザを購入しました

 ソフトはWindows版のPulseViewを使用しました。インストール後、USB機器が認識されませんでしたが、下記マニュアルに従ってZadigを導入したところ、正常に認識されました

 

 使っている様子を画面コピーしまいた

        

部品交換のためソケット化

 OLED画面やCO2センサーは消耗品であるため、交換が可能なようにソケット接続にしたいと考えています。また、予備品を購入してストックしておきたいです

 ケースは簡単に分解できる構造にしたいと考えています。(1月31日追記)ハンダでの接続をデュポンワイヤーに変更しようと思っています。ただし、スプライスポイントをどうするかまだ決めきれていません

 ソースコード 新旧対応 2月15日追記

 前回(38Pin版)を作ったときは付け焼き刃だったため、ソースコードを失念してしまいました。今回作成している30Pin版には、忘れないように追加しておきます

 

 回路としては、ESP32のPin変更のみです。回路図とソースは以下のとおりです

 <30 Pin>

   

  <38Pin>

   

 <ソース>

//define OLED SSD1331 pin
/*
//ESP32 30pin
#define cs 17 // CS Slave Select(Chip select)
#define dc 16 // DC Data/Command
#define rst 4 // RES Reset
#define mosi 23 // SDA Master In Slave Out
#define sclk 18 // SCL Serial Clock
//#define 3v3
//#define gnd
*/

//ESP32 38pin
#define cs 15 // CS Slave Select(Chip select)
#define dc 16 // DC Data/Command
#define rst 4 // RES Reset
#define mosi 13 // SDA Master In Slave Out
#define sclk 14 // SCL Serial Clock
//#define 3v3
//#define gnd

Ucglib_SSD1331_18x96x64_UNIVISION_SWSPI disply(sclk, mosi, dc, cs, rst);

次回予告

   

    • 回路作成中です、詳細は次回報告しま

       

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

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

`