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

добрый день товарисчи! вопрос у меня. взял за основу термологгер с сайта рлсрадио и скетч многоуважаемого товарисча liman28 (ссылька)rcl-radio.ru/?p=51693
версия студии 1.6.12 при проверке скетч ругается что мало памяти, изначальный скетч не компилировался из за команды clock, сделал с большой буквы, скомпилировался. залил в ардуино и начались фокусы:
фигура первая, не писал на флешку файл, поменял очередность myFile sd open, файл записался(флешка чистая форматированная),
потом температура, -127, я и пины менял(и в скетче и физически, но ставил только на логические порты А) и резистор 4,7кОм припаял. не измеряет. ладно только это,
фокус фигура вторая - в записываемом файле не идет цикл- монитор порта исправно меряет -127, массив копится, а на флешку пишеться только 1 цикл- то есть одно измерение.
я уже не знаю что не так, по отдельности скетчи примеров все работают- запись чтение флешки, модуль часов даже температуру меряет, далласовский термометр блит с цифрового пина d7 температуру считает, а все вместе-никак. кому не трудно- ткните пальцем- где косяк у меня?
код прикладываю

 
//  CD       MOSI D11, MISO D12, CLK D13, CS D4, VCC +5V
//  18B20    OUT A1, +5V VCC
//  DS3231   SDA A4, SCL A5, VCC +5V
 
#include <SPI.h>
#include <SD.h>
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>
#include <DS3231.h>
OneWire oneWire(A1);
DallasTemperature t(&oneWire);
DS3231 Clock;
RTCDateTime DateTime;

File myFile; 
float temp;
long nomer;
 
void setup() {
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  if (!SD.begin(4)) {Serial.println(" Error!!!"); return;}
  else{Serial.println(" OK");}// проверка подключения
 
  t.begin(); 
  t.setResolution(12);// 12 bit 18b20
  Clock.begin();
  //Clock.setDateTime(2024, 4, 8, 10, 37, 51);//
}
 
void loop() {
  
  myFile = SD.open("temp.txt", FILE_WRITE);// открываем файл для записи, если файла нет, то создае егоDateTime = Clock.getDateTime();
  
  Serial.print(Clock.dateFormat("d-m-Y H:i:s", DateTime));
  Serial.print(" ");
  t.requestTemperatures();
  Serial.println(temp = t.getTempCByIndex(0));//считываем температуру
  delay(5000);// записывать данные на CD каждые 5 сек
  nomer++;
    
   myFile.print(nomer);// запись
   myFile.print(" ");// запись
   myFile.print(Clock.dateFormat("d-m-Y H:i:s", DateTime));// запись
   myFile.print(" ");// запись
   myFile.println(temp);// запись
   myFile.close();// закрываем файл
}

А почему Вы пришли сюда, вместо того, чтобы спросить совета у

?

там довольно старая тема, я не уверен что он еще за ней следит, тут народ физически больше, может кто тоже заинтересуется и подскажет

Вот тут проблема, скорее всего - файл открывается на запись, его содержимое перезаписывается новыми данными

спасибо. буду думать.
то есть где то должна быть переменная которая продолжает запись или сама эта команда должна быть другой?

#define FILE_WRITE (O_READ | O_WRITE | O_CREAT | O_APPEND)

т.е. ЧТЕНИЕ | ЗАПИСЬ | СОЗДАНИЕ | ДОЗАПИСЬ В КОНЕЦ ФАЙЛА

/** The file offset shall be set to the end of the file prior to each write. */
uint8_t const O_APPEND = 0X04;

Говоря по русски, перед добавлением новых данных вам нужно сместиться на конец файла. А для этого нужно знать текущий размер файла.

Смещение

myFile.seek(pos);

где pos - размер файла в байтах.

1 лайк

уух. а более простого варианта переменной, типа nex write x+1 нет?
а то я не знаю как посчитать размер файла если он будет каждую секунду записываться? или вариант создавать при каждом измерения новый файл? не перезаписывая старый?

Ссылку на библиотеку SD.h приведите

sd у меня из стандартных через менджер библиотек , версия 1.08 built in bi arduino sparkfan
обновил сейчас до 1,24 -попробую, вдруг взлетит)

температура -127 - это неверное подключение.
Нарисуйте схему, как у вас подключено, а то из ваших слов какая-то грустная картина вырисовывается - что вы пытались подключить датчик к аналоговым пинам и без резистора, а уж только потом, когда не заработала - попытались резистор приладить…
Такое впечатление, что понимания как это работает - у вас нет совсем…

по моему, ты ошибаешься.
Режим открытия файла APPEND -уже подразумевает, что запись будет производится в конец, вычислять размер и вручную смещатся seek() не нужно.

Хотя может и путаю, надо исходник смотреть.
В любом случае тут у ТС ошибка:

Режим открытия FILE_WRITE в его случае не подходит.


схема взята оригинальная, на датчике 18в20 согласно гугления между контактом data(out) и +5 резистор 4,7 кОм, датчик герметичный на шнуре 1 метр.
у всех кого смотрел по логгерам в скетчах стоит обычно как раз file write вот примеры

ну и я не знаю других переменных которые бы еще как то что то писали на флешку

я просил ВАШУ СХЕМУ, а не автора. Мы же обсуждаем, почему У ВАС не работает, а не у него, верно?
Так все-таки, есть у вас резистор на термодатчике? Если есть - где он на схеме?

юмор в том что я пытался пересадить 18в20 на линию цифровых пинов d, но скетч выдает ошибки, видимо там какие то заморочки по синтаксису, которых я не знаю

у меня на ноге А1, в схеме он не нарисован, на самом термодатчике вроде бы нет, по крайней мере пробный скетч из примеров с запаянным резистором работает

Читаю текст автора в первом примере

Давайте создадим файл и запишем информацию в него. Код будит не очень сильно измене.

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

Если “все примеры используют FILE_WRITE” - значит все они ошибаются.

Вот вам четкое обьяснение, чем отличаются режимы write и append

Difference between Append and Write Mode

Write (w) mode and Append (a) mode, while opening a file are almost the same. Both are used to write in a file. In both the modes, new file is created if it does not already exist. The only difference they have is, when you open a file in the write mode, the file is reset, resulting in deletion of any data already present in the file. While in append mode this will not happen. Append mode is used to append or add data to the existing data of file, if any. Hence, when you open a file in Append (a) mode, the cursor is positioned at the end of the present data in the file.

Я выделил в тексте фразу, пояняющую, почему у вас в файле всегда только одна запись

если вы продолжите в том же духе, я ухожу из темы.
Спорить с вами о FILE_WRITE и умолять вас выложить правильную схему я не собираюсь.
Если вы все знаете сами - почему вы задаете вопросы в форуме??

спасибо, попробую переписать через apend, добавляю фото устройства в макете


вопрос, а как быть с пересадкой датчика с аналогового пина [quote=“ЖукИванов, post:1, topic:13729”]

#include <DS3231.h>
OneWire oneWire(A1);
DallasTemperature t(&oneWire);

[/quote]

на цифровой пин? все мои попытки натыкаются на ошибки скетча

в виде
‘D1’ was not declared in this scope

цифровые пины обозначаются просто цифрами, без буквы D
Однако учтите, что пины 0 и 1 использовать нельзя.

Добавка - в том что пин А1 аналоговый - ничего страшного нет. Он может быть и аналоговым и цифровым. В вашем случае пересаживать датчик с А1 на цифровой пин нет никакого смысла.

то есть это будет выглядеть примерно так?