LM335Z madness

This whole circuit is supposed to analyse the temperature with the two sensors (one for the fridge, one for the freezer), calculate trends and sound the piezo while flashing the screen if temperature is outside limits. The code is messy, I intend to clean it up once I have solved this sensor issue. Note I am a beginner, I got my Arduino a few weeks ago and I don't know much about electronics.

I really can't understand what's going on with the sensors here.

I have two LM335Z. Connected to A4 and A2. the first pin, ADJ, is unconnected. The second pin is connected to +5V (+4.87V actually) using a 220? resistor and to the Analog pin of the Arduino. And the last pin is connected to GND.

Yet when I read the sensors they both return 1020 analog so that works out to be +212ºC. The room temp is around 25º. Nowhere close. I checked with the multimeter between legs 2 and 3 and I measured 4.87V.

It seems the LM335 is not doing anything, just passing the current through. I have three brand new sensors, they are all doing the same. Can anyone see what I am missing??

Also, should I have more capacitors for noise filters or separate ground lines? Feel free to comment regarding the wiring as I am totally new to electronics.

#include <LiquidCrystal.h>
#include <math.h>

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

const int backlightPin = 6;
      int brightness = 0;
const int fadeLen = 768;     // Duration of the fade in/out. Has to be a multiple
                             // of 256.
const int fridgeTempPin = A4;
const int freezerTempPin = A2;
const int piezoPin = 3;
const int timeFactor = 10;   // realtime factor for debug. 1 means normal loop time.
const int switchPin = 2;

const int trendDelta = 1;  // ºC difference until a trend change is decreted

int storedCnt = 0;

float avgFridgeTemp, prevAvgFridgeTemp, avgFreezerTemp, prevAvgFreezerTemp, sumAvgFridgeTemp, sumAvgFreezerTemp;
float storedFridgeTemp[12];
float storedFreezerTemp[12];

unsigned long loopMillis, lastStoreTempMillis, lastCalcTrendMillis;

//used to know what alarm is triggered
const int NO_ALARM = 0;
const int LOW_TEMP = 1;
const int HIGH_TEMP = 2;
const int CRITICAL_TEMP = 3;
int currFridgeAlarm = NO_ALARM;
int currFreezerAlarm = NO_ALARM;
int prevFridgeAlarm = NO_ALARM;
int prevFreezerAlarm = NO_ALARM;
byte fridgeAlarmChanged, freezerAlarmChanged, alarmAck;


// some custom smileys and symbols for the LCD
const int charDegree = 1;
byte degree[8] = {
  4,10,10,4,0,14,0,0};

const int charTrendUp = 2;
byte rising[8] = {
  0,0,4,14,31,0,0,0};

const int charTrendSteady = 3;
byte steady[8] = {
  0,8,12,14,12,8,0,0};

const int charTrendDown = 4;
byte falling[8] = {
  0,0,31,14,4,0,0,0};

const int charHappy = 5;
byte happy[8] = {
  10,10,0,0,17,17,14,0};

const int charSad = 6;
byte sad[8] = {
  10,10,0,0,14,17,17,0};

const int charCritical = 7;
byte critical[8] = {
  17,10,17,0,14,17,17,14};
  
const int charNA = 8;
byte na[8] = {
  31,17,14,4,10,21,31,0};
  //0,14,21,23,17,14,0,0};
  //9,13,11,9,6,9,15,9};
  
const int charClock0 = 9;
byte clock0[8] = {
  0,14,21,23,17,14,0,0};
  
  const int charClock1 = 10;
byte clock1[8] = {
  0,14,21,23,17,14,0,0};
  
  const int charClock2 = 11;
byte clock2[8] = {
  0,14,21,23,17,14,0,0};
  
  const int charClock3 = 12;
byte clock3[8] = {
  0,14,21,23,17,14,0,0};
  
  const int charClock4 = 13;
byte clock4[8] = {
  0,14,21,23,17,14,0,0};
  
  const int charClock5 = 14;
byte clock5[8] = {
  0,14,21,23,17,14,0,0};
  
  const int charClock6 = 15;
byte clock6[8] = {
  0,14,21,23,17,14,0,0};


void setup() {
  Serial.begin(115200);
  lcd.begin(20,4);
  lcd.createChar(1, degree);
  lcd.createChar(2, rising);
  lcd.createChar(3, steady);
  lcd.createChar(4, falling);
  lcd.createChar(5, happy);
  lcd.createChar(6, sad);
  lcd.createChar(7, critical);
  lcd.createChar(8, na);
  pinMode(backlightPin, OUTPUT);
  pinMode(piezoPin, OUTPUT);
  Serial.begin(115220);
  attachInterrupt(0, silenceAlarm, LOW); // (dirty ?) way to register silence alarm button presses
  fadeLCD(1,fadeLen); // a backlight fading effect looks cool
  lcd.home();
  lcd.print("  Fridge & Freezer  ");
  lcd.setCursor(0,1);
  lcd.print(" Temperature Monitor");
  lcd.setCursor(0,3);
  lcd.print("   Initialising...");
}

void loop() {
  if ((millis() - loopMillis) > (10000/timeFactor)) {
    if (fridgeAlarmChanged + freezerAlarmChanged > 0) {
      alarmAck = 0;
    };
    Serial.println("***** start loop *****");
    lcd.home();
    lcd.clear();
    lcd.print("Fridge:");
    lcd.setCursor(10,0);
    // averaging the readings for improved accuracy
    avgFridgeTemp = 0.3 * lm335(fridgeTempPin) + 0.7 * avgFridgeTemp;
    lcd.print(avgFridgeTemp);
    lcd.setCursor(16,0);
    lcd.write(1);
    lcd.setCursor(17,0);
    lcd.print("C");
    
    lcd.setCursor(0,2);
    lcd.print("Freezer:");
    lcd.setCursor(10,2);
    // averaging the readings for improved accuracy
    avgFreezerTemp = 0.3 * lm335(freezerTempPin) + 0.7 * avgFreezerTemp;
    lcd.print(avgFreezerTemp);
    lcd.setCursor(16,2);
    lcd.write(1);
    lcd.setCursor(17,2);
    lcd.print("C");
    
    // the temperature gets stored every 5 mins (or less if realtime factor is >1)
    storeTemp();
    // calculate the temperature trend vs the stored samples
    calcTrend(prevAvgFridgeTemp, avgFridgeTemp, 1);
    prevAvgFridgeTemp = avgFridgeTemp;
    calcTrend(prevAvgFreezerTemp, avgFreezerTemp, 2);
    prevAvgFreezerTemp = avgFreezerTemp;
    
    int prevFridgeAlarm2 = currFridgeAlarm;
    int prevFreezerAlarm2 = currFreezerAlarm;
    // checking if an alarm needs to be raised
    checkAlarm(avgFridgeTemp,1);
    checkAlarm(avgFreezerTemp,2);
    
    soundAlarm();
    
    loopMillis = millis();
  }
}


















/**************************************
**
**
**     FUNCTIONS START HERE
**
**
***************************************/








// my function to fade the backlight in or out
// mode 1 = fade in
// mode 2 = fade out
// mode 3 = on without fading (for blinking on alarm)
// mode 4 = off without fading (for blinking on alarm)
void fadeLCD(byte mode, int duration) {
  if (mode == 1) {
    for (brightness = 0; brightness <= 255; brightness++) {
      analogWrite(backlightPin, brightness);
      if (brightness != 255) {
        delay(duration/256);
      }
    }
  }
  if (mode == 0) {
    for (brightness = 255; brightness >= 0; brightness--) {
      analogWrite(backlightPin, brightness);
      if (brightness != 0) {
        delay(duration/256);
      }
    }
  }
  if (mode == 3) {
    digitalWrite(backlightPin, HIGH);
  }
  if (mode == 4) {
    digitalWrite(backlightPin, LOW);
  }
}








// now unused because I replaced the thermistors with LM335s hoping to get
// improved accuracy (hum... not quite there yet)
double tempC(int sensorPin) {
  int analogVal = analogRead(sensorPin);
  double temp;
  temp = log(((10240000/analogVal) - 10000));
  temp = 1 / (0.001129148 + (0.000234125 * temp) + (0.0000000876741 * temp * temp * temp));
  temp = temp - 273.15;
  return temp;
}







// used to check if 5 minutes have passed since the last storage.
// if so, store a new value and print a '+' on the LCD to show when the
// value is stored
void storeTemp() {
  if (millis() - lastStoreTempMillis > 300000/timeFactor) {   // store a sample every 5 min
    storedFridgeTemp[storedCnt] = avgFridgeTemp;
    lcd.setCursor(19,1);
    lcd.print("+");
    Serial.print("storeTemp() avgFridgeTemp: ");
    Serial.println(avgFridgeTemp);
    
    storedFreezerTemp[storedCnt] = avgFreezerTemp;
    lcd.setCursor(19,3);
    lcd.print("+");
    Serial.print("storeTemp() avgFreezerTemp: ");
    Serial.println(avgFreezerTemp);
    
    // I want to stop at 12 because I am averaging and trending only over
    // the last 60 mins, overwriting the oldest value in the arrays
    if (storedCnt > 12) {
      storedCnt = 0;
    } else {
      storedCnt++;
    }
    
    lastStoreTempMillis = millis();
  }
}

(code continued because of maximum message length limit)

// function to calculate the trend of the current temperature vs the average of the temperatures
// over the last 60 minutes. If the Arduino has been on less than 60 minutes then a nice hourglass
// is displayed instead of the up/steady/down trend arrow.
// case 1 = fridge sensor
// case 2 = freezer sensor
void calcTrend(float prevAvg, float currAvg, int sensorNum) {
  if (millis() < 3600000/timeFactor) {
    lcd.setCursor(19,0);
    lcd.write(charNA);
    lcd.setCursor(19,2);
    lcd.write(charNA);
  } else {
  //if (millis() - lastCalcTrendMillis > 3600000/timeFactor) {        //calc trend every hour
    switch (sensorNum) {
      case 1:
        sumAvgFridgeTemp = 0;
        for (int i=0; i <= 11; i++) {
          sumAvgFridgeTemp += storedFridgeTemp[i];
          Serial.print("calcTrend() sumAvgFridgeTemp: ");
          Serial.println(sumAvgFridgeTemp);
        }
        sumAvgFridgeTemp /= 12;
        Serial.print("calcTrend() sumAvgFridgeTemp/12= ");
        Serial.println(sumAvgFridgeTemp);
        if (currAvg > (sumAvgFridgeTemp + trendDelta)) {
          lcd.setCursor(19,0);
          lcd.write(2);
          return;
        }
        if ((currAvg <= (sumAvgFridgeTemp + trendDelta)) && ((currAvg >= sumAvgFridgeTemp - trendDelta))) {
          lcd.setCursor(19,0);
          lcd.write(3);
          return;
        }
        if (currAvg < (sumAvgFridgeTemp - trendDelta)) {
          lcd.setCursor(19,0);
          lcd.write(4);
          return;
        }
      case 2:
        sumAvgFreezerTemp = 0;
        for (int i=0; i <= 11; i++) {
          sumAvgFreezerTemp += storedFreezerTemp[i];
          Serial.print("calcTrend() sumAvgFreezerTemp: ");
          Serial.println(sumAvgFreezerTemp);
        }
        sumAvgFreezerTemp /= 12;
        Serial.print("calcTrend() sumAvgFreezerTemp/12= ");
        Serial.println(sumAvgFreezerTemp);
        if (currAvg > (sumAvgFreezerTemp + trendDelta)) {
          lcd.setCursor(19,2);
          lcd.write(2);
          return;
        }
        if ((currAvg <= (sumAvgFreezerTemp + trendDelta)) && ((currAvg >= sumAvgFreezerTemp - trendDelta))) {
          lcd.setCursor(19,2);
          lcd.write(3);
          return;
        }
        if (currAvg < (sumAvgFreezerTemp - trendDelta)) {
          lcd.setCursor(19,2);
          lcd.write(4);
          return;
        }
    }
  }
  lastCalcTrendMillis = millis();
}








// function to check if an alarm needs to be raised. the function is also signaling if the alarm
// raised is the same type as in the previous loop or not. this is in turned used for the silence
// button interrupt result parsing. I want to keep the piezo quiet if the silence alarm button was
// pressed before and the alarm type hasn't changed, but I want the piezo to sound if the alarm
// has been silenced before but its type has changed (i.e. went from HIGH_TEMP to CRITICAL_TEMP or
// from HIGH_TEMP to NO_ALARM to LOW_TEMP.
// case 1 = fridge sensor
// case 2 = freezer sensor
int checkAlarm(float currAvg,int sensorNum) {
  switch (sensorNum) {
    case 1:
      if (currAvg >= 0 && currAvg <= 3) {
        lcd.setCursor(2,1);
        lcd.print("LOW TEMP");
        lcd.setCursor(0,1);
        lcd.write(6);  // sad smiley
        currFridgeAlarm = LOW_TEMP;
        if (currFridgeAlarm != prevFridgeAlarm) {
        fridgeAlarmChanged = 1;
        } else {
          fridgeAlarmChanged = 0;
        }
        prevFridgeAlarm = currFridgeAlarm;
        return currFridgeAlarm;
      }
      if (currAvg > 3 && currAvg <= 5) {
        lcd.setCursor(2,1);
        lcd.print("OK");
        lcd.setCursor(0,1);
        lcd.write(5);  // happy smiley
        currFridgeAlarm = NO_ALARM;
        if (currFridgeAlarm != prevFridgeAlarm) {
        fridgeAlarmChanged = 1;
        } else {
          fridgeAlarmChanged = 0;
        }
        prevFridgeAlarm = currFridgeAlarm;
        return currFridgeAlarm;
      }
      if (currAvg > 5 && currAvg <= 10) {
        lcd.setCursor(2,1);
        lcd.print("HIGH TEMP");
        lcd.setCursor(0,1);
        lcd.write(6); // sad smiley
        currFridgeAlarm = HIGH_TEMP;
        if (currFridgeAlarm != prevFridgeAlarm) {
        fridgeAlarmChanged = 1;
        } else {
          fridgeAlarmChanged = 0;
        }
        prevFridgeAlarm = currFridgeAlarm;
        return currFridgeAlarm;
      }
      if (currAvg < 0 || currAvg > 10) {
        lcd.setCursor(2,1);
        lcd.print("CRITICAL TEMP");
        lcd.setCursor(0,1);
        lcd.write(7); // critical smiley
        currFridgeAlarm = CRITICAL_TEMP;
        if (currFridgeAlarm != prevFridgeAlarm) {
        fridgeAlarmChanged = 1;
        } else {
          fridgeAlarmChanged = 0;
        }
        prevFridgeAlarm = currFridgeAlarm;
      }
      
    case 2:
      if (currAvg >= -30 && currAvg <= -21) {
        lcd.setCursor(2,1);
        lcd.print("WARNING: low temp");
        lcd.setCursor(0,1);
        lcd.write(6);  // sad smiley
        currFreezerAlarm = LOW_TEMP;
        if (currFreezerAlarm != prevFreezerAlarm) {
        freezerAlarmChanged = 1;
        } else {
          freezerAlarmChanged = 0;
        }
        prevFreezerAlarm = currFreezerAlarm;
        return currFreezerAlarm;
      }
      if (currAvg > -21 && currAvg <= -15) {
        lcd.setCursor(2,3);
        lcd.print("OK");
        lcd.setCursor(0,3);
        lcd.write(5);  // happy smiley
        currFreezerAlarm = NO_ALARM;
        if (currFreezerAlarm != prevFreezerAlarm) {
        freezerAlarmChanged = 1;
        } else {
          freezerAlarmChanged = 0;
        }
        prevFreezerAlarm = currFreezerAlarm;
        return currFreezerAlarm;
      }
      if (currAvg > -15 && currAvg <= -5) {
        lcd.setCursor(2,3);
        lcd.print("WARNING: high temp");
        lcd.setCursor(0,3);
        lcd.write(6); // sad smiley
        currFreezerAlarm = HIGH_TEMP;
        if (currFreezerAlarm != prevFreezerAlarm) {
        freezerAlarmChanged = 1;
        } else {
          freezerAlarmChanged = 0;
        }
        prevFreezerAlarm = currFreezerAlarm;
        return currFreezerAlarm;
      }
      if (currAvg < -30 || currAvg > -5) {
        lcd.setCursor(2,3);
        lcd.print("CRITICAL TEMP");
        lcd.setCursor(0,3);
        lcd.write(7); // critical smiley
        currFreezerAlarm = CRITICAL_TEMP;
        if (currFreezerAlarm != prevFreezerAlarm) {
        freezerAlarmChanged = 1;
        } else {
          freezerAlarmChanged = 0;
        }
        prevFreezerAlarm = currFreezerAlarm;
      }
      return currFreezerAlarm;
  }
}





// quite straight forward
void silenceAlarm() {
  alarmAck = 1;
}






// function to sound the alarm, depending on its type. also checks if the piezo has been silenced
// and flashes the backlight.
void soundAlarm() {
  if (currFridgeAlarm == LOW_TEMP || currFreezerAlarm == LOW_TEMP) {
    if (alarmAck == 0) {
      analogWrite(piezoPin, 100);
      fadeLCD(4,0);
      delay(100);
      analogWrite(piezoPin, 0);
      fadeLCD(4,0);
      delay(50);
      analogWrite(piezoPin, 100);
      fadeLCD(4,0);
      delay(100);
      analogWrite(piezoPin, 0);
      fadeLCD(4,0);
    }
    if (alarmAck == 1) {
      fadeLCD(4,0);
      delay(100);
      fadeLCD(4,0);
      delay(50);
      fadeLCD(4,0);
      delay(100);
      fadeLCD(4,0);
    }
  }
  if (currFridgeAlarm == HIGH_TEMP || currFreezerAlarm == HIGH_TEMP) {
    if (alarmAck == 0) {
      analogWrite(piezoPin, 100);
      fadeLCD(4,0);
      delay(100);
      analogWrite(piezoPin, 0);
      fadeLCD(4,0);
    }
    if (alarmAck == 1) {
      fadeLCD(4,0);
      delay(100);
      fadeLCD(4,0);
    }
  }
  if (currFridgeAlarm == CRITICAL_TEMP || currFreezerAlarm == CRITICAL_TEMP) {
    if (alarmAck == 0) {
      analogWrite(piezoPin, 10);
      fadeLCD(3,0);
      delay(100);
      analogWrite(piezoPin, 0);
      fadeLCD(4,0);
      delay(50);
      analogWrite(piezoPin, 100);
      fadeLCD(3,0);
      delay(100);
      analogWrite(piezoPin, 0);
      fadeLCD(4,0);
      delay(50);
      analogWrite(piezoPin, 1000);
      fadeLCD(3,0);
      delay(100);
      analogWrite(piezoPin, 0);
      fadeLCD(4,0);
    }
    if (alarmAck == 1) {
    fadeLCD(3,0);
    delay(100);
    fadeLCD(4,0);
    delay(50);
    fadeLCD(3,0);
    delay(100);
    fadeLCD(4,0);
    delay(50);
    fadeLCD(3,0);
    delay(100);
    fadeLCD(4,0);
    }
  }
}


// calculates the LM335 output in ºC
float lm335(int sensorPin) {
  int analogVal = analogRead(sensorPin);
  float temp;
  temp = analogVal / 1024.0 * 4.87; // 4.87V is what I mesured on the +5V pin as I'm getting
  temp = (temp * 100) - 273.15;     // power via the USB port.
  Serial.println(analogVal);
  return temp;
}

Fritzing schematics (note I am using a 20x4 LCD but Fritzing only has 16x2 LCD):

I check the LM335 datasheet. You Resistor connected to the two LM335 is WAY LOW Man... A 220 ohms, I bet the inside must be very warm. That might explain the high reading. Can you change it to a 2.2 K ohms ? That will put the reverse current below 1 mA. The LM335 is a variable Zener diode. A zener doide will begin to conduct in the wrong way at a certain voltage. In the case of the LM335, it ia about 3 V. So you limit below 1 mA, you do the Resistor Limiting Formula :

( V in - V diode ) / The limit current = The Limiting Resistor

Try it, and see what happen.

Thanks. With a 2.2k, both sensors read 195ºC and won't budge if I warm them up. Did I damage the sensors?

This sensor give temp in KELVIN, you need convert to celsus.

DESCRIPTION
The LM135, LM235, LM335 are precision temperature sensors which can be easily calibrated. They
operate as a 2-terminal Zener and the breakdown
voltage is directly proportional to the absolute temperature at 10mV/K

mmoscz:
This sensor give temp in KELVIN, you need convert to celsus.

DESCRIPTION
The LM135, LM235, LM335 are precision temperature sensors which can be easily calibrated. They
operate as a 2-terminal Zener and the breakdown
voltage is directly proportional to the absolute temperature at 10mV/K

temp = analogVal / 1024.0 * 4.87; // 4.87V is what I mesured on the +5V pin as I'm getting
  temp = (temp * 100) - 273.15;     // power via the USB port.

Your formula is correct.

I don't know why you have 4.87 V in the formula. It is better be the Voltage at the V ref pin.

If that is the voltage being taken at the cathode of the LM335, and ( hopefully ) connected your circuit properly, Anode of the LM335 to gnd, and the rest of the circuit, I got the feeling the LM336 may have an open - or damage. ( hope not )

One thing is sure. the analog pin see a open voltage - Full Vcc, if you Vcc is 4.87 V.

My opinion

I'm using 4.87V because this is what I mesured between +5V feed on Arduino's pin and GND and I'm guessing this is what will be used as the AREF by the Atmega

Are they in the wrong way round...?

@hfp777

Usualy, I measred the V ref and place that value into my code if I need a better read from the analog pins.

But you do have an open at the analog pin or it is connected ( by mistake ) to the + Vcc.

Connected the wrong way. Hum... A zener diode connect the wrong way will measure about 0.6 V - a standard diode voltage in a foward mode.

Like : + 5 ---- resistor ---- V analog -- anode -- cathode --- gnd = V analog = 0.6 V

The proper way to connect a zener :

+5 ----- resistor ---- V analog --- cathode --- anode --- gnd = V analog = 3.0 if the zener is a 3 V type.

Can you take a picture of your setup ? and post it. It may help.

My guess is : the LM335 is bad or a bad wiring somewhere to cause the "open".

Here is a picture. I hope it's not too messy for you to see what's going on. Note the piezo is disconnected because the constant beeping due to the 212ºC reading is annoying.

The LM335Z is not a zener diode, not even remotely. Its a complex integrated circuit involving a callibrated pn-junction to measure thermodynamic temperature and an op-amp to boost this signal and provide an output voltage controlled by the sensor. It cleverly arranges that this output voltage is also the chips supply voltage.

The datasheet says you can think of it as a zener, but that's sloppy language. It performs much better than a zener diode in fact to load changes. The datasheet also shows the 16 transistor circuit schematic of the chip - you tell me how that's going to behave if you swap v- and adj!!

If you've reversed it then any behaviour might result. You photo isn't good enough to be sure but it certainly looks like you have them backwards - check the pinout carefully.

The picture is fine. I just download from the site where the picture is and ZOOM it. Al least, the picture is clear.

It look and connect fine, beside the wires mess. I did not see if you connect to A2 and A4 and the resistor at the LM335 is 2.2 K. Look more Brown - Brown - Brown. Just double check on that.

Beside the mess and the connections, it look fine. I am a bit lost. :~

Here I will do :

  • Remove the whole circuit.
  • Just wired the LM335 , the limiting resistor of 2.2 K , +Vcc, GND, and connect to an analog pin.
  • Measured the voltage at the analog pin point / cathode of the LM335. <-- I hope you do have a Digital Multi Meter
    ---> If measured close to the Vcc or GND.... Bad News : LM335 is Bad. The voltage should reflect your room temperature.
  • Do a simple code that read the value - voltage - temp calculation and display toward the serial monitor. <-- No DMM available

Multimeter says the voltage is the same as the input voltage... It looks like I killed the two of them :frowning:
I might have inverted the pins when first assembling the circuit or when looking at possibilities, could that have fried the LM335?

Right, I've zoomed in to the full-res version of that photo and its clear they are all plugged in the wrong way round.

Go to the datasheet, look at the pin out.

If you don't understand what "bottom view" means that could be an issue...

MarkT:
Right, I've zoomed in to the full-res version of that photo and its clear they are all plugged in the wrong way round.

Go to the datasheet, look at the pin out.

If you don't understand what "bottom view" means that could be an issue...

Indeed, I got confused with the pin out and the bottom view schematic. I changed the GND pin and readouts are closer to reality now.

No need to be sarcastic though, we are not all electronics engineers.

OK, perhaps that was a bit strong - but I'd given you the same advice for the third time and I needed to emphasise I meant it...

@MarkT

Opps... I miss that little detail.... "Bottom View" :.

@hfp777

I am glad everything work out. I am sorry that I did not notice in the datasheet about "Bottom View" so I can be more helpfull. In some datasheets, they are comfusing and you have to read them "many" times until you "get it".