Программирование 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 ответ
Да, некролог, но имея собственный пример DS2436, на котором можно опробовать это, и писать для него код, а больше ничего не делать, кажется, что микросхема на самом деле не знает, что послать вам при чтении шине после отправки команды чтения регистра.
Согласно таблице данных, 0xFF — это данные, которые микросхема отправляет, когда мастер шины достигает конца страницы или зарезервированного адреса. Добавление ds.write(0x60);
перед выполнением циклов чтения исправляет большую часть этой проблемы.
Я не вдавался в подробности, но похоже, что с вашей арифметикой происходит что-то не совсем правильное, чтобы превратить ваш двоичный файл в температуру. Даже если мое исправление выдает на выходе что-то работоспособное, я получаю 1024,00 Цельсия.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
По поводу «_есть что-то не так с вашей арифметикой, которая превращает ваш двоичный файл в температуру_»: она действительно сломана. Попробуйте это исправление:
int16_t raw = (uint16_t) data[1] << 8 | данные[0]; float celsius = raw * (1.0/256);
, @Edgar Bonet