Термохрон-логгер температуры на nano 18b20 с часами ds3231 и записью на sd

проверьте

скомпиллировалось- спасибо!

Странно, у меня в менеджере библиотек стоит метка Installed, но при компиляции выдает ошибку, что файл SD.h не найден

А мы человека не путаем?
Разве приведённый выше дефайн для FILE_WRITE не подразумевает, что он уже включает в себя режим append? Я так понимаю, что с таким набором оно создаст файл если его нет и будет дописывать, если он есть.
По симптомам-то конечно сильно похоже на то, что файл перезаписывается каждый раз.
Но и в библиотечных примерах он же используется (Datalogger).
Надо видимо внутри смотреть, что там реально делается.

Я про это в #6 написал. Но проблема в том, что якобы штатная библиотека SD у меня не компилируется, так что не уверен, что это так в реале ))

В той библиотеке, что нашел на гитхабе, FILE_APPEND как раз и не определено.

ЗЫ: по идее myFile.println() как бы намекает, что запись должна идти в конец, но…

ЗЫЫ: @ЖукИванов, а точно в файле именно последняя запись, а не просто единственная? Может она вообще только один раз записалась, и более не пишется?

то есть приведенная в №16 цитата не убеждает?

Вообще FILE_WRITE это не ардуиновский дефайн, а стандартный спецификатор режима открытия файла, применяемый во многих файловых системах. И его значение давно определено. Если библиотека трактует его как-то иначе - то это скорее косяк в библиотеке. Однако, судя по жалобам клиента, в данном случае атрибут FILE_WRITE работает именно так, как описано в справке из поста 16

1 лайк

может это проблемы новых библиотек? в 21 году в архиве обсуждений исходников 1 человек проект повторил и у него проблем не возникло.
append не стандартная для моей библиотеки sd комманда идет в связке с библиотекой SPIFFS. для есп32. не думаю что смогу корректно вставить все это в скетч. сейчас сделаю передых и вечером продолжу.

Повторю вопрос

И попутно - а в каком месте вы текущее время получаете?

Да, мужики, похоже что вы правы, а я нет:

В стандартной библиотеке Sd режим FILE_WRITE уже включает append.
Выбор между write и append должен делать сам юзер, смещая позицию записи в файл командой seek()
Вот пример

File outputFile = SD.open(LOG_FILE, FILE_WRITE);
outputFile.seek(EOF);
outputFile.println("Appended to the EOF");

так что @v258 правильно написал

Цитаты разные бывают:

Parameters

  • filepath: the name of the file to open, which can include directories (delimited by forward-slashes, /).
  • mode (optional): the mode in which to open the file. Mode can be FILE_READ (open the file for reading, starting at the beginning of the file) or FILE_WRITE (open the file for reading and writing, starting at the end of the file).

SD - open() - Arduino Reference

А этим заканчивается Open:

    if ((mode & (O_APPEND | O_WRITE)) == (O_APPEND | O_WRITE)) {
      file.seekSet(file.fileSize());
    }

В примерах к библиотеке есть Datalogger.ino, т.е. по определению здесь данные должны дописываться, однако в коде тоже имеем

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
    // print to the serial port too:
    Serial.println(dataString);
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  }

Стало быть проблема все-таки в чем-то другом

1 лайк

ок, зря значит воду замутил

Надо всё сначала проверять по частям. Раз сейчас и температура не работает - её первую и выкинуть! Пусть только время на карточку пишет. Будет писать?
Дальше в отдельном скетче добиться работы датчика температуры. И добавлять в схему и скетч уже заведомо рабочий вариант.

Может припаять ардуинку?

2 лайка

Ардуину тоже можно, хотя они обычно в таких шилдах хорошо держатся. А вот что точно надо - проверить все дюпонные перемычки - в них очень вероятно контакт плавает

А я один не увидел задержку между
t.requestTemperatures(); и
Serial.println(temp = t.getTempCByIndex(0));
Вроде как бы надо по даташиту…

Там далласовская библиотека, она сама задержку делает. Хотя… ))

У меня как раз на ней вылезали глюки при использовании трех датчиков. Один периодически выдавал -127. Увеличил задержку до 1сек (некритично в том проекте) и все нормально стало.

Так и должно быть - преобразование при максимальном разрешении занимает почти секунду. А у него в коде задержка в 5 секунд (строка 40)

Но по хорошему после 40 строки нужно бы вставить

t.requestTemperaturesByIndex(0);

В библиотеке Dallas при беглом просмотре задержка в зависимости от битности ds18b20 вроде поддерживается. Для 12 бит - 750мс, как по даташиту.
Но у меня в свое время именно это сработало. Теперь везде где некритично, ставлю секунду и все.