Multichannel Gas Sensor not working on Wio GPS Board

Grove is a modulated, ready-to-use tool set.
Much like Lego, it takes a building block approach to assembling electronics.

Moderators: lily.li, violet, jeremy882, crail.lyu969

Post Reply
r0b0tn1k
Pre-kindergarten
Pre-kindergarten
Posts: 5
Joined: Fri Apr 27, 2018 3:13 am

Multichannel Gas Sensor not working on Wio GPS Board

Post by r0b0tn1k » Tue Dec 18, 2018 9:36 pm

I just bought the WIO GPS Board v1.4 05/15/2017.

I also have the Multichannel Gas Sensor v1.0, with a software update to the latest version.

When I used the multi channel gas sensor on the Groove board it worked with no issues.

Now I plug it to the Wio board, and it does not work.

It all fails on this command:

Code: Select all

  gas.begin(0x04);//the default I2C address of the slave is 0x04
  gas.powerOn();
It seems that normal Serial is not working with this board, you have to use SerialUSB. But I tried replacing all of the Serial.print with SerialUSB print in the multichannel.cpp but that did not fix it.

Please help me get this sensor working.

This is the entire code:

Code: Select all

#include <Wire.h>
// Read Data from Grove - Multichannel Gas Sensor
#include "MutichannelGasSensor.h"
#include <SoftwareSerial.h>
#include "MC20_Common.h"
#include "MC20_Arduino_Interface.h"
#include "MC20_GNSS.h"
#define GrovePowerPin   12

SoftwareSerial s_serial(2, 3);      // TX, RX
#define sensor s_serial
#define GrovePowerPin   12

const float VRefer = 3.3;       // voltage of adc reference
const int pinAdc   = A0;

const unsigned char cmd_get_sensor[] =
{
    0xff, 0x01, 0x86, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x79
};

unsigned char dataRevice[9];
int temperature;
int CO2PPM;


void setup(){
  SerialUSB.begin(115200);
  pinMode(GrovePowerPin, OUTPUT);
  // write high to grove power pin to enable all the Grove ports,
  // or only Grove D2 port is usable. 
  digitalWrite(GrovePowerPin, HIGH);   
  SerialUSB.println("Power On");
  sensor.begin(9600);
  gas.begin(0x04);//the default I2C address of the slave is 0x04
  gas.powerOn();


}

void loop(){
   float Vout =0;
    
    Vout = readO2Vout();
    SerialUSB.print(Vout);
    SerialUSB.print(" V, Concentration of O2 is ");
    SerialUSB.println(readConcentration());



  
    if(dataRecieve())
    {
        SerialUSB.print("Temperature: ");
        SerialUSB.print(temperature);
        SerialUSB.print("  CO2: ");
        SerialUSB.print(CO2PPM);
        SerialUSB.println("");
    }


    float c;

    c = gas.measure_NH3();
    SerialUSB.print("The concentration of NH3 is ");
    if(c>=0) SerialUSB.print(c);
    else SerialUSB.print("invalid");
    SerialUSB.println(" ppm");

    c = gas.measure_CO();
    SerialUSB.print("The concentration of CO is ");
    if(c>=0) SerialUSB.print(c);
    else SerialUSB.print("invalid");
    SerialUSB.println(" ppm");

    c = gas.measure_NO2();
    SerialUSB.print("The concentration of NO2 is ");
    if(c>=0) SerialUSB.print(c);
    else SerialUSB.print("invalid");
    SerialUSB.println(" ppm");

    c = gas.measure_C3H8();
    SerialUSB.print("The concentration of C3H8 is ");
    if(c>=0) SerialUSB.print(c);
    else SerialUSB.print("invalid");
    SerialUSB.println(" ppm");

    c = gas.measure_C4H10();
    SerialUSB.print("The concentration of C4H10 is ");
    if(c>=0) SerialUSB.print(c);
    else SerialUSB.print("invalid");
    SerialUSB.println(" ppm");

    c = gas.measure_CH4();
    SerialUSB.print("The concentration of CH4 is ");
    if(c>=0) SerialUSB.print(c);
    else SerialUSB.print("invalid");
    SerialUSB.println(" ppm");

    c = gas.measure_H2();
    SerialUSB.print("The concentration of H2 is ");
    if(c>=0) SerialUSB.print(c);
    else SerialUSB.print("invalid");
    SerialUSB.println(" ppm");

    c = gas.measure_C2H5OH();
    SerialUSB.print("The concentration of C2H5OH is ");
    if(c>=0) SerialUSB.print(c);
    else SerialUSB.print("invalid");
    SerialUSB.println(" ppm");
    
    delay(1000);

  
}

bool dataRecieve(void)
{
    byte data[9];
    int i = 0;

    //transmit command data
    for(i=0; i<sizeof(cmd_get_sensor); i++)
    {
        sensor.write(cmd_get_sensor[i]);
    }
    delay(10);
    //begin reveiceing data
    if(sensor.available())
    {
        while(sensor.available())
        {
            for(int i=0;i<9; i++)
            {
                data[i] = sensor.read();
            }
        }
    }

    for(int j=0; j<9; j++)
    {
        SerialUSB.print(data[j]);
        SerialUSB.print(" ");
    }
    SerialUSB.println("");

    if((i != 9) || (1 + (0xFF ^ (byte)(data[1] + data[2] + data[3] + data[4] + data[5] + data[6] + data[7]))) != data[8])
    {
        return false;
    }

    CO2PPM = (int)data[2] * 256 + (int)data[3];
    temperature = (int)data[4] - 40;

    return true;
}

float readO2Vout()
{
    long sum = 0;
    for(int i=0; i<32; i++)
    {
        sum += analogRead(pinAdc);
    }

    sum >>= 5;

    float MeasuredVout = sum * (VRefer / 1023.0);
    return MeasuredVout;
}

float readConcentration()
{
    // Vout samples are with reference to 3.3V
    float MeasuredVout = readO2Vout();

    //float Concentration = FmultiMap(MeasuredVout, VoutArray,O2ConArray, 6);
    //when its output voltage is 2.0V,
    float Concentration = MeasuredVout * 0.21 / 2.0;
    float Concentration_Percentage=Concentration*100;
    return Concentration_Percentage;
}


Post Reply