как записать данные с ds18b20 в eeprom?

romiras
Offline
Зарегистрирован: 12.07.2015

Подскажите, записать данные с ds18b20 в eeprom? Пытаюсь разобраться, но не получается...

 

#include <EEPROM.h>
#include <OneWire.h>
OneWire ds(7);
unsigned long currentTime;
unsigned long loopTime;
int addr = 0;
int val = 0;
void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() {

  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
  delay(750);
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE);
  data[0] = ds.read();
  data[1] = ds.read();
  int Temp = (data[1] << 8) + data[0];
  Temp = Temp >> 4;
  val = Temp;
  EEPROM.write(addr, val);

  currentTime = millis();
  if (currentTime >= (loopTime + 30000)) {
    digitalWrite(13, HIGH);
    loopTime = currentTime;
  }
  Serial.println(EEPROM.read(val));
}

 

Radjah
Offline
Зарегистрирован: 06.08.2014
void EEPROMClass::write(int address, uint8_t value)

Тебя не смущает, что второй параметр uint8_t размером в 1 байт, а int - 2 байта?

nevkon
Offline
Зарегистрирован: 20.01.2015

Запись в ячейку идет только значения от 0 до 255. Приведите температуру к этой величине. Отсейте "неправильные" значения (-127 если правильно помню), сделайте приращение например на 100. Сохраняйте это значение. При считывании производите обратную операцию.

Radjah
Offline
Зарегистрирован: 06.08.2014

Есть такая либа http://dump.bitcheese.net/files/igigavo/EEPROM2.rar

Там оберки для eeprom_read_byte и eeprom_write_byte с циклами.

romiras
Offline
Зарегистрирован: 12.07.2015

Подскажи, пожалуйста, как правльно температуру загнать еепром, не догоняю я((

nevkon
Offline
Зарегистрирован: 20.01.2015

Строку 7 заменить на "uint8_t val = 0"

Строку 27 заменить на "val = Temp + 100"

Строку 35 заменить на "Serial.println(EEPROM.read(addr)-100)"

Или если нет отрицательных температур, то можно без смещения писать и читать.

romiras
Offline
Зарегистрирован: 12.07.2015

температура то как раз с минусом...

nevkon
Offline
Зарегистрирован: 20.01.2015

Кстати главный вопрос: за какое время вы убьете флеш при условии что в ячейку можно записать всего 100т раз?

romiras
Offline
Зарегистрирован: 12.07.2015

Вопрос хороший, но альтернативного решения запоминания температуры и последующего сравнения её с измененной я не нашел 

nevkon
Offline
Зарегистрирован: 20.01.2015

Запоминайте в другую переменную. И если очень надо (боитесь пропадания напряжения) пишите раз в 10-30 минут. Или возьмите внешний флеш (который будет ежеденвно меняться :).

Или еще вариант: делайте запись при изменении на 2-3 градуса.

romiras
Offline
Зарегистрирован: 12.07.2015

спасибо

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Radjah пишет:

Есть такая либа http://dump.bitcheese.net/files/igigavo/EEPROM2.rar

Там оберки для eeprom_read_byte и eeprom_write_byte с циклами.

А чем плох макрос put в обычной библиотеке EEPROM?

Radjah
Offline
Зарегистрирован: 06.08.2014

ЕвгенийП пишет:

Radjah пишет:

Есть такая либа http://dump.bitcheese.net/files/igigavo/EEPROM2.rar

Там оберки для eeprom_read_byte и eeprom_write_byte с циклами.

А чем плох макрос put в обычной библиотеке EEPROM?

Не вижу в своей версии такого макроса. =\