

Arduinoで二酸化炭素センサーと色感センサーを用いてフルカラーLEDを点灯させたいです。  
具体的には、色感センサーで読み取った色と同じ色にフルカラーLEDを光らせながら同時に、二酸化炭素センサーで読み取った二酸化炭素濃度の値が350〜999ppmのときフルカラーLEDを30個、二酸化炭素濃度の値が1000〜2499ppmのときにフルカラーLEDを20個、二酸化炭素濃度の値が2500ppm以上のときフルカラーLEDを10個点灯できるようにしたいです。

  * [二酸化炭素センサーのデータシート](https://akizukidenshi.com/download/ds/winsen/mg812.pdf)
  * [色感センサー](https://akizukidenshi.com/catalog/g/gM-08220/)
  * [フルカラーLEDのデータシート](https://akizukidenshi.com/download/ds/optosupply/OSTA5131A-RPGB.pdf)

二酸化炭素センサーは以下のプログラムで動作確認できました。

[code]

    #include "CO2Sensor.h"
    CO2Sensor co2Sensor(A0, 0.99, 100);
    void setup() {
     Serial.begin(9600);
     Serial.println("=== Initialized ===");
     co2Sensor.calibrate();
    }
    void loop() {
     double val = co2Sensor.read();
     Serial.print("CO2 value: ");
    Serial.println(val);
     delay(1000);
    }
    
[/code]

以下のプログラムでフルカラーLEDを30個赤色に点灯することができました。

[code]

    /*
     * 74HC595
     * SER : 2
     * OE : GND
     * RCLK : 3
     * SRCLK : 4
     * SRCLR : 5
     */
    
    int const SER = 2;
    int const RCLK = 3;
    int const SRCLK = 4;
    int const SRCLR = 5;
    
    void setup() {
      
      pinMode(SER, OUTPUT);
      pinMode(RCLK, OUTPUT);
      pinMode(SRCLK, OUTPUT);
      pinMode(SRCLR, OUTPUT);  
    
      digitalWrite(SRCLR, LOW);
      digitalWrite(SRCLR, HIGH);
      
    }
    boolean led[] = {0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1};
    
    void loop() {
    
    //for (int j = 0; j < 30; j++) {
          digitalWrite(RCLK, LOW);
          for(int j =0 ; j < 30 ; j++){
            digitalWrite(SER,1);
            digitalWrite(SRCLK,1);
            digitalWrite(SRCLK,0);
          }
    //      shiftOut(SER, SRCLK, LSBFIRST, 1<<j);
          digitalWrite(RCLK, HIGH);
          delay(250);
    //  }
    }
    
[/code]

以下のプログラムで二酸化炭素センサーと色感センサー、フルカラーLED をそれぞれ 1
個ずつ用いました。色感センサーにかざした色と同じ色にフルカラーLEDが点灯し、二酸化炭素センサーに息を吹きかけると二酸化炭素濃度の値が出てくることを確認しました。

[code]

    #include<Wire.h>
    #include "Adafruit_TCS34725.h"
    #include "CO2Sensor.h"
    #define redpin 3
    #define greenpin 5
    #define bluepin 6
    #define commonAnode false
    byte gammatable[256];
    Adafruit_TCS34725 tcs = 
    Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS,TCS34725_GAIN_4X);
    CO2Sensor co2Sensor(A0, 0.99, 100);
    void setup(){
    Serial.begin(9600);
    Serial.println("=== Initialized ===");
    co2Sensor.calibrate();
    Serial.println("Color view Test!");
    if (tcs.begin()){
     Serial.println("Found sensor");
    }else {
    Serial.println("No TCS34725 found ... check your connections");
     while(1); // halt!
    }
    pinMode(redpin, OUTPUT);
    pinMode(greenpin, OUTPUT);
    pinMode(bluepin, OUTPUT);
    for (int i=0; i<256; i++){
     float x = i;
     x /= 255;
     x = pow(x, 2.5);
     x *= 255;
     if (commonAnode) {
     gammatable[i] = 255 - x;
     } else {
     gammatable[i] = x;
     }
    }
    }
    void loop(){
     float val = co2Sensor.read();
     Serial.print("CO2 value: ");
     Serial.println(val);
     
     uint16_t clear,red,green,blue;
     tcs.setInterrupt(false); 
     delay(60);
     tcs.getRawData(&red, &green, &blue, &clear);
     tcs.setInterrupt(true);
     Serial.print("C:\t"); Serial.print(clear);
     Serial.print("\tR:\t"); Serial.print(red);
     Serial.print("\tG:\t"); Serial.print(green);
     Serial.print("\tB:\t"); Serial.print(blue);
     uint32_t sum = clear;
     float r,g,b;
     r = red; r /= sum;
     g = green; g /= sum;
     b = blue; b /= sum;
     r *= 256; g *= 256; b *= 256;
     Serial.print("\t");
     Serial.print((int)r, HEX); Serial.print((int)g, HEX);Serial.print((int)b, HEX);
     Serial.println();
    //Serial.print((int)r); Serial.print(" "); Serial.print((int)g); Serial.println((int)b );
     analogWrite(redpin, gammatable[(int)r]);
     analogWrite(greenpin, gammatable[(int)g]);
     analogWrite(bluepin, gammatable[(int)b]);
    }
    
[/code]

二酸化炭素センサーと色感センサーを連動させ、フルカラーLEDを制御することができません。教えていただけると嬉しいです。よろしくお願い致します。


CC BY-SA 4.0
2022-10-12T15:38:46.617
91569
2022-10-17T02:44:35.003
2022-10-13T00:38:24.723
3060
54811
question
arduino
Arduino でセンサーを２つ使ってLEDを制御したい

[code]

    float val = co2Sensor.read();
    
[/code]

とあり、`val`がCO2センサの値ですから、  
`val`の値に応じてLEDの出力をどうするか決めればいいです。

[code]

    float val = co2Sensor.read();
    if(val >= 2500){
        10個つける
    }else if(val >= 1000){
        20個つける
    }
    else{ // 質問文から350以下のときが不明だが、全灯と同じ扱いとしている
        全部つける
    }
    
    
    
    LEDの色を制御する
    
    
[/code]

* * *

ソフトウェアの話かと思っていましたが  
ひょっとしたらハードウェアも含んだ質問だったかもしれないので一応解説します

各LEDごとに色は共通で、個別に点灯/消灯は制御したいということですから、  
フルカラーLEDのR,G,B端子はそれぞれ色ごとに全LED共通で接続します。  
これをPWM出力で制御するわけですが、LEDを30個もArduinoのピンから駆動したら可哀想なので、何かしらドライバをかましたほうがいいでしょう。

コモン端子については全LEDそれぞれ独立にデジタル出力につなぎます。  
Arduinoではピン数が足らないでしょうからこちらはシフトレジスタかなにかにつなぎます。

[![画像の説明をここに入力](https://i.stack.imgur.com/wZtLZ.png)](https://i.stack.imgur.com/wZtLZ.png)  
※ 抵抗などは省略しています


CC BY-SA 4.0
2022-10-13T23:37:27.007
91582
2022-10-17T02:44:35.003
2022-10-17T02:44:35.003
13127
13127
91569
answer