Программирование Arduino UNO DS2436

Я пытаюсь программировать свой чип DS2436 с помощью Arduino UNO. Честно говоря, я пытаюсь изменить код DS18B20 (тот, который есть где угодно в Интернете) для работы с DS2436. Мне просто сложнее понять, как работает вся память и адресация, так как у DS2436 есть эти страницы блоков памяти, в отличие от DS18B20, у которого их только 1. Еще меня останавливает языковой фактор, я не носитель языка.

Я постоянно получаю неправильные данные/температуру/CRC. Может кто-нибудь мне помочь, пожалуйста? Мне нужна эта штука, чтобы показывать напряжение/температуру и циклы.

#include <OneWire.h>
OneWire  ds(10); 

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

void loop(void) {
  byte i; 
  byte addr[8];
  byte data[32];
  byte type_s;
  byte present = 0;
  float celsius, fahrenheit;

  if (!ds.search(addr)) {
    ds.reset_search();
    delay(1000);
    return;
  }

  Serial.print("ROM ="); 
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }
  Serial.print("\n");
  if (OneWire::crc8(addr, 7) != addr[7]) {
    Serial.println("CRC is not valid!");
    return;
    Serial.print("\n");
  }
  if (addr[0] != 0x1B) {
    Serial.print("Device is not a DS2436 family device!");
    Serial.print("\n");
  }
  {
    Serial.print("CRC= "); 
    Serial.print(OneWire::crc8(data, 8), HEX);
  }
  Serial.print("\n");
  ds.reset(); 
  ds.select(addr); 
  ds.write(0xD2, 1);
  delay(1000); 
  present = ds.reset(); 
  ds.select(addr); 
  ds.write(0xB2); 
  Serial.print("  Data = ");
  for (int i = 0; i < 13; i++) {             
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();
  unsigned int raw = (data[1] << 8) | data[0];
  int sig = raw & 0x8000;   
  if (sig) {                               
    raw = (raw ^ 0xffff) + 1;               
  }
  celsius = (float)raw * 0.03125;
  Serial.print("Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius ");
  Serial.print("\n");
  Serial.print("_______________________________________________");
  Serial.print("\n");
}

, 👍1


1 ответ


0

Да, некролог, но имея собственный пример DS2436, на котором можно опробовать это, и писать для него код, а больше ничего не делать, кажется, что микросхема на самом деле не знает, что послать вам при чтении шине после отправки команды чтения регистра.

Согласно таблице данных, 0xFF — это данные, которые микросхема отправляет, когда мастер шины достигает конца страницы или зарезервированного адреса. Добавление ds.write(0x60); перед выполнением циклов чтения исправляет большую часть этой проблемы.

Я не вдавался в подробности, но похоже, что с вашей арифметикой происходит что-то не совсем правильное, чтобы превратить ваш двоичный файл в температуру. Даже если мое исправление выдает на выходе что-то работоспособное, я получаю 1024,00 Цельсия.

,

По поводу «_есть что-то не так с вашей арифметикой, которая превращает ваш двоичный файл в температуру_»: она действительно сломана. Попробуйте это исправление: int16_t raw = (uint16_t) data[1] << 8 | данные[0]; float celsius = raw * (1.0/256);, @Edgar Bonet