Quantcast
Channel: Arduino Forum - Latest topics
Viewing all articles
Browse latest Browse all 15855

Connecting 6 Sensirion SFM3013 Sensors to Arduino Mega

$
0
0

Hello! I am trying to connect two SFM-3013-300-CL's to an Arduino via a TCA9548A multiplexer to collect flow and temperature data. I am using the 'exampleusage.ino' file from this github ( arduino-i2c-sfm-sf06/examples/exampleUsage at master · Sensirion/arduino-i2c-sfm-sf06 · GitHub) and have set the I2C multiplexer as specified. However I keep receiving the following error: Error trying to execute readMeasurementData(): Not enough data received.

Here is how I connected them to the Arduino Mega->

This is my code:

#include <SensirionI2cSfmSf06.h>

#include <Arduino.h>
#include <SensirionI2cSfmSf06.h>
#include <Wire.h>

#define TCAADDR 0x70

SensirionI2cSfmSf06 sensor;
SensirionI2cSfmSf06 sensor2;

static char errorMessage[64];
static int16_t error;
//String myCmd;



void print_byte_array(uint8_t* array, uint16_t len) {
    uint16_t i = 0;
    Serial.print("0x");
    for (; i < len; i++) {
        Serial.print(array[i], HEX);
    }
}

void tcaselect(uint8_t i) {
  if (i > 7) return;

  Wire.beginTransmission(TCAADDR);
  Wire.write(1 << i);
  Wire.endTransmission();
}

void setup() {

    Serial.begin(115200);
    while (!Serial) {
        delay(100);
    }
    Wire.begin();
    tcaselect(0);
    sensor.begin(Wire, SFM3013_I2C_ADDR_2F);
    

    tcaselect(0);
    sensor.stopContinuousMeasurement();
    delay(100);
    //uint32_t productIdentifier = 0;
    //uint8_t serialNumber[8] = {0};
    //error = sensor.readProductIdentifier(productIdentifier, serialNumber, 8);
    if (error != NO_ERROR) {
        Serial.print("Error trying to execute readProductIdentifier(): ");
        errorToString(error, errorMessage, sizeof errorMessage);
        Serial.println(errorMessage);
        return;
    }
    
    tcaselect(0);
    error = sensor.startO2ContinuousMeasurement();
    if (error != NO_ERROR) {
        Serial.print(
            "Error trying to execute startO2ContinuousMeasurement(): ");
        errorToString(error, errorMessage, sizeof errorMessage);
        Serial.println(errorMessage);
        return;
    }

    tcaselect(1);
    sensor2.begin(Wire, SFM3013_I2C_ADDR_2F);

    tcaselect(1);
    sensor2.stopContinuousMeasurement();
    delay(100);

    tcaselect(1);
    error = sensor2.startO2ContinuousMeasurement();
    if (error != NO_ERROR) {
        Serial.print(
            "Error trying to execute startO2ContinuousMeasurement(): ");
        errorToString(error, errorMessage, sizeof errorMessage);
        Serial.println(errorMessage);
        return;
    }

void loop() {

    float aFlow = 0.0;
    float aTemperature = 0.0;
    uint16_t aStatusWord = 0u;
    tcaselect(0);
    error = sensor.readMeasurementData(aFlow, aTemperature, aStatusWord);
    if (error != NO_ERROR) {
        Serial.print("Error trying to execute readMeasurementData(): ");
        errorToString(error, errorMessage, sizeof errorMessage);
        Serial.println(errorMessage);
        return;
    }

    float aFlow2 = 0.0;
    float aTemperature2 = 0.0;
    uint16_t aStatusWord2 = 0u;
    tcaselect(2);
    error = sensor2.readMeasurementData(aFlow2, aTemperature2, aStatusWord2);
    if (error != NO_ERROR) {
        Serial.print("Error trying to execute readMeasurementData(): ");
        errorToString(error, errorMessage, sizeof errorMessage);
        Serial.println(errorMessage);
        return;
    }


    Serial.print(aTemperature);
    Serial.print(",");
    Serial.print(aTemperature2);
    Serial.print(",");
    Serial.println(aFlow);
    Serial.print(",");
    Serial.print(aFlow2);
    
}

My main problem here is that this code and the exact same set up works fine with an Arduino UNO but when connecting it to the Mega it shows me this error:

I am also running this multiplexer code to check whether the Mega recognizes that the multiplexer ports are being used and the output shows that it recognizes them with address 2F (which is what I am using in my code above)

**
 * TCA9548 I2CScanner.ino -- I2C bus scanner for Arduino
 *
 * Based on https://playground.arduino.cc/Main/I2cScanner/
 *
 */

#include "Wire.h"

#define TCAADDR 0x70

void tcaselect(uint8_t i) {
  if (i > 7) return;
 
  Wire.beginTransmission(TCAADDR);
  Wire.write(1 << i);
  Wire.endTransmission();  
}


// standard Arduino setup()
void setup()
{
    while (!Serial);
    delay(1000);

    Wire.begin();
    
    Serial.begin(115200);
    Serial.println("\nTCAScanner ready!");
    
    for (uint8_t t=0; t<8; t++) {
      tcaselect(t);
      Serial.print("TCA Port #"); Serial.println(t);

      for (uint8_t addr = 0; addr<=127; addr++) {
        if (addr == TCAADDR) continue;

        Wire.beginTransmission(addr);
        if (!Wire.endTransmission()) {
          Serial.print("Found I2C 0x");  Serial.println(addr,HEX);
        }
      }
    }
    Serial.println("\ndone");
}

void loop() 
{
}

Any help will be much appreciated! :slight_smile:

2 posts - 2 participants

Read full topic


Viewing all articles
Browse latest Browse all 15855

Latest Images

Trending Articles



Latest Images