MCP3428 und Arduino Nano / Werte aus mehreren Registern auslesen

Hi,

ich versuche mit einem Arduino Nano und einem MCP3428 als Slave die Werte von zwei Sensoren auszugeben. An CH3 habe ich einen Temperatursensor und an CH4 einen Lichtsensor. Nun werden die Daten des einen aber immer vom anderen überschrieben...also wenn ich bspw. den Lichtsensor als zweites auslese verändern sich durch das leuchten auf den Sensor auch die Temperaturwerte :confused:
Hat vielleicht jemand eine Idee wie ich beide Werte unabhängig voneinander auslesen kann?

#include <Wire.h>

// Die Adresse des MCP3428 sollte hier eingetragen werden.
const int Addr = 0x68;
const int lightReg = 0x78;
const int tempReg = 0x58;
boolean stop = true;
int lx1light = 0;
int lx2light = 0;
int lx1temp = 0;
int lx2temp = 0;

/*
  @fn setup(): hier werden Einmale Initialisierungen vorgenommen
*/
void setup() {
  Wire.begin();
  Serial.begin(9600);
  
  stp();
  Wire.beginTransmission(Addr);
  Wire.write(0x18);
  Wire.endTransmission();
  
}

/*
  @fn loop():
    Die Inhalte dieser Funktion werden als Endlosschleife dauerhaft wiederholt
*/
void loop() {
  /* http://ww1.microchip.com/downloads/en/DeviceDoc/22226a.pdf */
  Wire.beginTransmission(Addr);
  Wire.write(lightReg);
  Wire.endTransmission();
  delay(500);
  Wire.requestFrom(Addr, 3, stop);
  lx1light = Wire.read();
  lx2light = Wire.read();

  Wire.beginTransmission(Addr);
  Wire.write(tempReg);
  Wire.endTransmission();
  delay(500);
  Wire.requestFrom(Addr, 3, stop);
  lx1temp = Wire.read();
  lx2temp = Wire.read();

  Serial.print("lx1 light: ");
  Serial.println(lx1light);
  Serial.print("lx2 light: ");
  Serial.println(lx2light);
  ser_print_luxmeter(lx1light, lx2light);

  Serial.print("lx1 temp: ");
  Serial.println(lx1temp);
  Serial.print("lx2 temp: ");
  Serial.println(lx2temp);
  ser_print_tempmeter(lx1temp, lx2temp);


  delay(500);
}

void ser_print_luxmeter(int lx1,int lx2){
  lx1=lx1<<8;
  lx2=lx1+lx2;
  lx2 = (((lx2*2.048/32768)*1000)/0.33);
  Serial.print(lx2);
  Serial.println("Lux");
}

void ser_print_tempmeter(int lx1,int lx2){
  lx1=lx1<<8;
  lx2=lx1+lx2;
  lx2 = ((lx2*2.048/32768)*100);
  Serial.print(lx2);
  Serial.println("°C");
}


void stp(){
  long l=113000;
  Wire.begin(); //Keine Adresse, da Master
  //Wire.setClock(l);
  Serial.begin(9600);
  for(int i=5;i<13;i++){
    pinMode(i,OUTPUT);
    digitalWrite(i,HIGH);
    delay(100);
  }
  for(int i=5;i<13;i++){
  
    digitalWrite(i,LOW);
    delay(100);
  }
}

ADC Datasheet.pdf (945 KB)

Meinst Du, dass Du bessere Antworten bekommst, wenn Du das Thema nochmal in einem neuen Thread anfängst?

Gruß Tommy

(deleted)

Hallo,

du kannst nicht einfach so irgendwas auslesen. Das hier halte ich für groben Unsinn. Das wirst du auch in keinem Bsp. so gesehen haben. Du forderst 3 Werte an, liest aber nur 2, inkl. delay mittendrin, danach wiederholst du das. Warum?

Wire.beginTransmission(Addr);
  Wire.write(lightReg);
  Wire.endTransmission();
  delay(500);   
  Wire.requestFrom(Addr, 3, stop);
  lx1light = Wire.read();
  lx2light = Wire.read();

in der einfachsten Form universell für 2 Werte.

void readMCP (int const i2cAdr, int const reg, int &var)
{
  Wire.beginTransmission(i2cAdr);          // Connect
  Wire.write(reg);                         // Anfrage ab/der Register Nummer
  Wire.endTransmission();         
  Wire.requestFrom(i2cAdr, 2);             // 2 Bytes in Folge anfordern/lesen
  if (Wire.available() > 0 )               // sind Daten vorhanden?
  {
    byte msb = Wire.read();
    byte lsb = Wire.read();
    /*
    hier die zwei Bytes verknüpfen/verarbeiten und var zuweisen
    */
  }
}

Oder vielleicht erstmal eine Lib verwenden.
Bspw. GitHub - stevemarple/MCP342x: Arduino library to support Microchip ADC342x analogue to digital converters