One wire digital temperature sensor read EPPROM

Hi,

I am using MAX 31826 i can read the temperature unfortunately fail read the EPPROM by using command (F0h).But it fail to read the EPPROM data. what is the correct way to read EPPROM data, temperature is succesful to read.

Code program as below:

#include <OneWire.h>
 

OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)
 
void setup(void) {
  Serial.begin(9600);
}
 
void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[9];
  byte addr[8];
  float celsius, fahrenheit;
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }
 
  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
 
      case 0x3B:
      Serial.println(" T Chip");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  }
 
  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad
 
  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();
 
  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
 
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xF0);         
  Serial.print("  epprom data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
 
  for ( i = 0; i < 127; i++) {           // we need read 127 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  } 
}`Use code tags to format code for the forum`

Hello, do yourself a favour and please read How to get the best out of this forum and post accordingly (including code with code tags and necessary documentation for your ask like your exact circuit and power supply, links to components etc).

mistake this is my first time using this forum.

what output do you see with this code? (serial monitor at 115200 bauds)

#include <OneWire.h>
const byte ONE_WIRE_BUS = 10;       // Pin connected to 1-Wire bus, add a 4.7K resistor as per datasheet
const byte EEPROM_READ_CMD = 0xF0;  // Command to read from EEPROM

OneWire onewire(ONE_WIRE_BUS); 

void setup() {
  Serial.begin(115200);

  byte data[32]; // Array to store EEPROM data
  byte addr[8]; // Array to store sensor address

  // Search for 1-Wire devices on the bus
  if (!onewire.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    onewire.reset_search();
    delay(250);
    return;
  }

  // Print the address of the detected sensor
  Serial.print("Sensor Address: ");
  for (byte i = 0; i < 8; i++) {
    Serial.print(addr[i], HEX);
    Serial.print(" ");
  }
  Serial.println();

  // Reset the OneWire bus and select the sensor
  onewire.reset();
  onewire.select(addr);

  // Send command to read EEPROM data
  onewire.write(EEPROM_READ_CMD);

  // Read data from EEPROM (32 bytes)
  Serial.print("EEPROM Data: ");
  for (byte i = 0; i < 32; i++) {
    data[i] = onewire.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.println();

}

void loop() {}


The EPPROM data seem like discrepancy with what i had burning.


will this causing the read process problem? datasheet as below

what did you expect and how did you get it there?

Thanks Jackson for the respond.

Because there’s one device develop by 3rd party…. From there we know the reading data is wrong...

1.

In the above, there is no mention of the starting address of EEPROM from which data read to begin!

2.
You may try the following untested sketch which attempts to put (0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89) into MAX31286's EEPROM stattinng at location 0x00. The sketch reads back the data and shows them on Serial Monitor. Please, report the result. (I have no device/sensor to test.)

(1) Make the following connections:

UNO        MAX31286
5V         VDD (Pin-1)
GND        GND (Pin-4), AD0-AD3 (Pin-5 to 8)
DPin-10    DQ (Pin-2)
           Pin-3 is open

(2) Upload the following sketch in Arduino UNO (Compiled not tested)

#include<OneWire.h>
OneWire ds(10);
byte romCode[8];  //64-bit (8-byte daddress)
byte recData[128];

byte eepromData[] =
{
  0x12, 0x23, 0x34, 0x45,
  0x56, 0x67, 0x78, 0x89
};

void setup() 
{
  Serial.begin(9600);

  //---- get device address
  ds.reset();
  ds.search(romCode);

  //----Write 8-byte data in Scratchpad 2 ((EE)---
  ds.reset();
  ds.select(romCode);
  ds.write(0x0F);   //Scratchpad 2 write command
  ds.write(0x00);   //target EEPROM address (Page-0)
  ds.write_bytes(eepromData, 8);
  //--- copy Scratchpad 2 data into EEPROM
  ds.write(0x55);  //copy command
  ds.write(0xA5);  //programming enable command
  delay(25);  //max write time delay tWR = 25 ms

  //---reading EEPROM-----
  ds.write(0xF0);   //EEPROM read command
  ds.write(0x00);    //address of ist location of EEPROM
  ds.read_bytes(recData, 128); //all 128 bytes are raed
  //---- display first 8 locations---
  for(int i = 0; i < 7; i++)
  {
    Serial.print(recData[i], HEX);
    Serial.print(' ');
  }
  ds.reset();   //bring device in idle mode
}

void loop() {}

(3) Press RESET Button of Arduino UNO
(4) The Serial Monitor should show:

12 23 34 45 56 67 78 89

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.