void loop() перестает работать примерно через час

Итак, у меня есть программа, которая измеряет температуру и влажность с течением времени. Вот код, который я использую:

#include <SD.h>
#include <SPI.h>
#include <DHT.h>
#include <Wire.h> 
#include "RTClib.h"

#define DHTPIN 2 
#define DHTTYPE 22
const int chipSelect = 10; 


DHT dht(DHTPIN, DHTTYPE);
RTC_DS3231 rtc;


void setup() {
  // поместите сюда код установки для однократного запуска:
  Serial.begin(9600);
  Serial.println("DHT22 sensor reading");

  if(! rtc.begin()) {
    Serial.println("Could not find RTC");
    while(1);
  }

  if (rtc.lostPower()) {
    Serial.println("RTC lost power, lets set the time!");
    // следующая строка устанавливает RTC на дату & время составления этого скетча
    rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
  }
}


void loop() {

  //измерения температуры
  float hum = dht.readHumidity();
  float temp = dht.readTemperature();

  if( isnan(temp) || isnan(hum )) {
    Serial.println("Failed to read from DHT22 sensor!");
    return;
  }

  Serial.print("Humidity: ");
  Serial.print(hum);
  Serial.print(" %\t");
  Serial.print("Temperature: ");
  Serial.print(temp);
  Serial.println(" *C");

  //определение даты
  DateTime now = rtc.now();

  int dayy;
  int monthh;
  int yearr;

  int hours;
  int minutes;
  int seconds;

  String date;
  dayy = now.day();
  monthh = now.month();
  yearr = now.year();
  date = String(dayy) + String(monthh) + String(yearr);

  int seconds_passed; // сколько секунд прошло с начала дня: используется для графика данных
  hours = now.hour();
  minutes = now.minute();
  seconds = now.second();
  seconds_passed = ((hours * 60) + minutes)* 60 + seconds;




  //запись на SD-карту

  if(SD.begin(chipSelect)) {
    Serial.println("Card is initialized! Ready to go!");
  }
  else {
    Serial.println("Error with initializing the card!");
    return;
  }
  Serial.println("Opening file...");
  String FileName;
  FileName = date + ".dat";

  File dataFile = SD.open(FileName, FILE_WRITE);

  if (dataFile) {
    dataFile.print(temp);
    dataFile.print(",");
    dataFile.print(hum);
    dataFile.print(",");
    dataFile.println(seconds_passed);
    dataFile.close();

    Serial.println("Written data to file and closed it");
    Serial.println(" ");
    Serial.print("Seconds passed: ");
    Serial.println(seconds_passed);
    Serial.println(" ");
  }
  else {
    Serial.println("Error with opening the file, trying again"); 
  }


 delay(1000);
}

Он работает как шарм, но из-за того, что он перестает работать через час, может быть, 1,5 часа.

Кажется, что сброс платы работает, но я, очевидно, не могу сидеть и сбрасывать плату все время. Я использую Arduino Due. Я запрограммировал что-то не так, что что-то переполняется, или мне нужно добавить еще немного кода?

, 👍1

Обсуждение

date = String(dayy) + String(monthh) + String(yearr);... тьфу... Эта бедная куча..., @Majenko

Действительно ли скетч создает новый файл каждую секунду?, @Mikael Patel

Он создает его только тогда, когда он еще не существует, в противном случае он открывает его. Маженко, что ты имеешь в виду?, @imRobert7

@imRobert7 Я имею в виду, прочитайте это: https://majenko.co.uk/blog/evils-arduino-strings, @Majenko

@Majenko спасибо! Я прочитал это, но я все еще не могу заставить это работать. Преобразование целых чисел в char на самом деле не хочет работать. Итак, я сделал [это] (https://pastebin.com/sDHWyqmw), но получил странный результат, @imRobert7

почему вы вызываете SD.begin в цикле ()? это должно быть в настройках (), @Juraj

char fn[15]; sprintf(fn, "%02d-%02d-%02d.CSV", год, месяц, день);, @Juraj

Спасибо @Юрай! Собираюсь реализовать обе ваши реакции, @imRobert7


1 ответ


-1

Год назад у меня была такая же проблема, кажется, ошибка в библиотеке String. Я рекомендовал вам это:

1- Просто: используйте библиотеку String при разработке, но для "выпуска" изменить все, чтобы использовать собственные строки C (имя символа [SIZE])

2- Сложный (и еще хуже в моей работе): установите прерывание каждые полчаса (или всякий раз с запасом до сбоя), которое активирует выход, подключенный к контакту сброса Arduino. Я видел это в Интернете, но не смог заставить это работать.

Ссылка на ветку форума Arduino

,