Skocz do zawartości

Brak odczytu wartości z detektorów VEML7700, gdy ich liczba przekracza 4


Pomocna odpowiedź

Napisano

Hej, mam pewien problem podczas programowania mojego DFRduino V4.0. Mianowicie, gdy podłączam (zmieniam w kodzie tylko wartość NUM_VEML) 4 detektory VEML7700 poprzez multiplekser TCA9548A to normalnie dostaje odczyt ze wszystkich w monitorze portu szeregowego, ale po podłączeniu 5 widzę tylko odczyt VEML3 a po dodaniu ostatniego 6 już nic się nie pokazuje. Czego to może być przyczyna? Załączam niżej mój kod.

#include <Wire.h>
#include <Adafruit_VEML7700.h>

#define TCA_ADDR 0x70

// --- VEML7700 ---
#define NUM_VEML 4
Adafruit_VEML7700 veml[NUM_VEML];

void tcaSelect(uint8_t channel) {
  Wire.beginTransmission(TCA_ADDR);
  Wire.write(0); // deselect all
  Wire.endTransmission();
  delay(2);

  Wire.beginTransmission(TCA_ADDR);
  Wire.write(1 << channel);
  Wire.endTransmission();
  delay(20); // settle
}

void setup() {
  Serial.begin(9600); // UART to Uno
  Wire.begin();
  delay(500);

  // Initialize VEML7700 sensors
  for (uint8_t i = 0; i < NUM_VEML; i++) {
    tcaSelect(i);
    if (!veml[i].begin()) {
      Serial.print("VEML not found on channel ");
      Serial.println(i);
      while (1);
    }
    veml[i].setGain(VEML7700_GAIN_1);
    veml[i].setIntegrationTime(VEML7700_IT_100MS);
    veml[i].enable(true);
    delay(50);
  }
}

void loop() {
  String dataLine = "";

  // Read VEML sensors
  for (uint8_t i = 0; i < NUM_VEML; i++) {
    tcaSelect(i);
    float lux = veml[i].readLux();
    dataLine += "VEML" + String(i) + ":" + String(lux, 2) + ";";
  }

  Serial.println(dataLine);
  delay(1000);
}

Też żeby była jasność, tak wygląda odczyt przy 4 detektorach:

VEML0:10.77;VEML1:20.79;VEML2:102.93;VEML3:2.13;
VEML0:10.94;VEML1:20.85;VEML2:102.36;VEML3:2.19;
VEML0:10.71;VEML1:20.45;VEML2:102.47;VEML3:2.13;
VEML0:10.66;VEML1:20.68;VEML2:101.89;VEML3:2.13;
VEML0:10.60;VEML1:20.51;VEML2:102.41;VEML3:2.13;
VEML0:10.60;VEML1:20.56;VEML2:101.72;VEML3:2.13;
VEML0:10.31;VEML1:33.87;VEML2:104.77;VEML3:2.02;
VEML0:10.94;VEML1:20.51;VEML2:101.03;VEML3:2.13;
VEML0:23.79;VEML1:45.68;VEML2:89.91;VEML3:3.17;
VEML0:22.23;VEML1:45.04;VEML2:99.99;VEML3:2.42;
VEML0:22.12;VEML1:45.10;VEML2:99.53;VEML3:2.53;

 

tak, przy 5:

VEML3:2.36;
VEML3:2.36;
VEML3:2.36;
VEML3:2.30;

 

no i przy 6 ju nie ma nic.

 

Dziękuję, za jakąkolwiek pomoc!

 

@orb777 Wygląda to jakbym miał jakiś problem podczas inicjalizacji. Gdy drukuję informację o wykryciu detektorów wpada w taką pętlę, jakby się nano resetował:

VEML7700 ready on channel 0
VEML7700 ready on channel 1
VEML7700 ready on channel 2
VEML7700 ready on channel 3
Initializing VEML7700
VEML7700 ready on channel 0
VEML7700 ready on channel 1
VEML7700 ready on channel 2
VEML7700 ready on channel 3

i tak w kółko, chcociaż coś się poprawiło, bo mam odczyt dla 5 detektorów, problem pojawia się przy 6

@Victor_Smith, zajrzyj tu, odpal skaner i2c i zobacz co powie. Chyba nie musisz dla jednego multiplexera wyłączać wszystkich kanałów za każdym razem w tcaSelect(). Temat całkiem ciekawy, sam bym sprawdził, niestety nie posiadam tego sprzętu co ty.

@orb777 Po bardzo długim procesie debugowania, okazało się, że pamięć SRAM mojego nano nie wyrabia z taką liczbą detektorów z kodem w takiej postaci w jakim był. Po dłuższym kombinowaniu udało się tak to zrobić, że nie brakuje mu już pamięci podczas odczytów/inicjalizacji

#include <Wire.h>

#define TCA_ADDR 0x70
#define VEML_ADDR 0x10
#define NUM_SENSORS 6

uint16_t sensorValues[NUM_SENSORS];

void tcaSelect(uint8_t channel) {
  Wire.beginTransmission(TCA_ADDR);
  Wire.write(1 << channel);
  Wire.endTransmission();
  delay(5);
}

// Configure VEML7700 ALS
void configureVEML7700() {
  Wire.beginTransmission(VEML_ADDR);
  Wire.write(0x00); // ALS_CONF register
  Wire.write(0x10); // LSB: default
  Wire.write(0x00); // MSB: 0x00 for default gain & integration, ALS enabled
  Wire.endTransmission();
  delay(10); // give sensor time to wake
}

// Read ALS raw data
uint16_t readVEML7700() {
  Wire.beginTransmission(VEML_ADDR);
  Wire.write(0x04); // ALS data register
  Wire.endTransmission(false); // repeated start

  Wire.requestFrom((uint8_t)VEML_ADDR, (uint8_t)2);
  if (Wire.available() < 2) return 0xFFFF;

  uint8_t lsb = Wire.read();
  uint8_t msb = Wire.read();
  return ((uint16_t)msb << 8) | lsb;
}

void setup() {
  Serial.begin(9600);
  Wire.begin();
  delay(2000);

  Serial.println("Starting VEML7700 raw read...");

  for (uint8_t i = 0; i < NUM_SENSORS; i++) {
    tcaSelect(i);
    configureVEML7700();
    Serial.print("Configured sensor ");
    Serial.println(i);
  }
}

void loop() {
  for (uint8_t i = 0; i < NUM_SENSORS; i++) {
    tcaSelect(i);
    delay(5);
    sensorValues[i] = readVEML7700();

    if (sensorValues[i] == 0xFFFF) {
      Serial.print("Sensor ");
      Serial.print(i);
      Serial.println(" read error!");
    } else {
      Serial.print("Sensor ");
      Serial.print(i);
      Serial.print(": raw ALS = ");
      Serial.println(sensorValues[i] * 0.0576); // covert ALS to lux
    }

    delay(50);
  }

  Serial.println("All sensors read, waiting 2 seconds...");
  delay(200);
}

Tutaj zamiast definiować wszystkie detektory w setup wybrałem opcję, żeby pojedyńczo wywoływać je w pętli, co nie powoduje zużycie zbyt dużej ilości pamięci i resetu nano. Jak próbowałem, aby detektor przeliczał wartość ALS na lux to też brakowało mu pamięci, stąd mnożenie przez tą stałą:

Serial.println(sensorValues[i] * 0.0576); // covert ALS to lux


 

  • Lubię! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...