夏休みプログラミングチャレンジ サンプル いろんなセンサーで環境計測

夏休みプログラミングチャレンジ サンプル いろんなセンサーで環境計測

涵養塾の観葉植物の植木鉢の上で、いろんなセンサーを使った環境観測を開始しました。
あなたも、夏休みの研究にチャレンジしませんか?
並んでいるセンサーは、次の4種類
1.土壌湿度センサー(Analog)
  植木鉢の土の乾き具合を観察します
2.BME280 温湿度 気圧 センサー(I2C)
  お天気の基本的な情報、を調べて天気予報もできるかも
3.APDS9660 カラー(光)センサー(I2C)
  空の色も調べられます、「あさやけ」と「ゆうやけ」の色は同じか?
4.CCS811 空気品質センサー(I2C)
  だれかがオナラをしてもわかっちゃいます

これらのセンサーをブレッドボードの上で、ESP-WROOM-32に接続し、ArduinoIDEでプログラミングし、ネット経由でAmbientのIoTデーターの可視化サービスを利用して、データをグラフ化してみました。

グラフはここをご覧ください。
https://ambidata.io/ch/channel.html?id=4285

Arduinoのソースコードは、こんな感じです。

/***************ここから
 * ESP_WROOM_32とBME280,apds9660,ccs-811をI2C接続し、温度、湿度、気圧,光、空気を測定しプリントアプトする
#1:tempreture
#2:humidity
#3:pressure
#4:soil moisture(ad14)
#5:R
#6:G
#7:B
#8:TVOC
 */
#define PERIOD 300 //sec

#include "Adafruit_CCS811.h"
Adafruit_CCS811 ccs;
#define SoilMoist_pin A0  //analogRead(SoilMoist_pin);
#include "Ambient.h"
#include
#include "BME280.h"
BME280 bme280;

#include
SparkFun_APDS9960 apds = SparkFun_APDS9960();

uint8_t proximity_data = 0;
uint16_t ambient_light = 0;
uint16_t red_light = 0;
uint16_t green_light = 0;
uint16_t blue_light = 0;

#include

//************** wifi config ************************************************
//* Set these to your desired credentials. */
const char* ssid = "**************";
const char* password = "--------------";
WiFiClient client;

//************** Ambient config ************************************************
unsigned int channelId = xxxxx; //channel ID
const char* writeKey = "???????????????"; //ライトキー
Ambient ambient;

void setup(){
  WiFi.mode(WIFI_OFF);

  Wire.begin(); // I2Cの初期化
  Serial.begin(115200);
  //*************** wifi connecting
  Serial.print("Wifi Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  // Wait for connection
  while ( WiFi.status() != WL_CONNECTED ) {
    delay ( 500 );
    Serial.print ( "." );
  }

  Serial.println("Connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  delay(1000);

  // チャネルIDとライトキーを指定してAmbientの初期化
  ambient.begin(channelId, writeKey, &client);
  Serial.println("Ambient start.");

  bme280.begin(); // BME280の初期化
  Serial.println("BME280 start");
   
  //***************** APDS-9960 proximity
  // Initialize APDS-9960 (configure I2C and initial values)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9960 init!"));
  }

  // Adjust the Proximity sensor gain
  if ( !apds.setProximityGain(PGAIN_2X) ) {
    Serial.println(F("Something went wrong trying to set PGAIN"));
  }

  // Start running the APDS-9960 proximity sensor (no interrupts)
  if ( apds.enableProximitySensor(false) ) {
    Serial.println(F("Proximity sensor is now running"));
  } else {
    Serial.println(F("Something went wrong during sensor init!"));
  }

  // Start running the APDS-9960 light sensor (no interrupts)
  if ( apds.enableLightSensor(false) ) {
    Serial.println(F("Light sensor is now running"));
  } else {
    Serial.println(F("Something went wrong during light sensor init!"));
  }

  if(!ccs.begin()){
    Serial.println("Failed to start sensor! Please check your wiring.");
    while(1);
  }

  //calibrate temperature sensor
  while(!ccs.available());
  float temp = ccs.calculateTemperature();
  ccs.setTempOffset(temp - 25.0);

}

void loop() {
/*
#1:tempreture
#2:humidity
#3:pressure
#4:soil moisture
#5:R
#6:G
#7:B
#8:TVOC
 */
    float temp, humid, pressure;

    // BME280で温度、湿度、気圧を測定する
    temp = (float)bme280.readTemperature();
    humid = (float)bme280.readHumidity();
    pressure = (float)bme280.readPressure();
    ambient.set(1, temp);
    ambient.set(2, humid);
    ambient.set(3, pressure);
    Serial.print("temp: ");
    Serial.print(temp);
    Serial.print(", humid: ");
    Serial.print(humid);
    Serial.print(", pressure: ");
    Serial.print(pressure);

//    humid = analogRead(SoilMoist_pin);
    humid = analogRead(SoilMoist_pin);
    ambient.set(4, humid);
    Serial.print(", Soil Moisture ADC: ");
    Serial.println(humid);

  // Read the proximity value
  if ( !apds.readProximity(proximity_data) ) {
    Serial.println("Error reading proximity value");
  } else {
    Serial.print("Proximity: ");
    Serial.println(proximity_data);
  }
  // Read the light levels (ambient, red, green, blue)
  if (  !apds.readAmbientLight(ambient_light) ||
        !apds.readRedLight(red_light) ||
        !apds.readGreenLight(green_light) ||
        !apds.readBlueLight(blue_light) ) {
    Serial.println("Error reading light values");
  } else {
    ambient.set(5, red_light);
    ambient.set(6, green_light);
    ambient.set(7, blue_light);   
    Serial.print("Ambient: ");
    Serial.print(ambient_light);
    Serial.print(" Red: ");
    Serial.print(red_light);
    Serial.print(" Green: ");
    Serial.print(green_light);
    Serial.print(" Blue: ");
    Serial.println(blue_light);
  }

  if(ccs.available()){
    float temp = ccs.calculateTemperature();
    int CO2 = ccs.geteCO2();
    int TVOC = ccs.getTVOC();
    ambient.set(8, TVOC);
    if(!ccs.readData()){
      Serial.print("CO2: ");
      Serial.print(CO2);
      Serial.print("ppm, TVOC: ");
      Serial.print(TVOC);
      Serial.print("ppb   Temp:");
      Serial.println(temp);
    }
    else{
      Serial.println("ERROR!");
      while(1);
    }
  }
    Serial.print("Ambient send =");
    Serial.println(ambient.send());
   
    delay(PERIOD * 1000);
}