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. Я запрограммировал что-то не так, что что-то переполняется, или мне нужно добавить еще немного кода?
@imRobert7, 👍1
Обсуждение1 ответ
Год назад у меня была такая же проблема, кажется, ошибка в библиотеке String. Я рекомендовал вам это:
1- Просто: используйте библиотеку String при разработке, но для "выпуска" изменить все, чтобы использовать собственные строки C (имя символа [SIZE])
2- Сложный (и еще хуже в моей работе): установите прерывание каждые полчаса (или всякий раз с запасом до сбоя), которое активирует выход, подключенный к контакту сброса Arduino. Я видел это в Интернете, но не смог заставить это работать.
Ссылка на ветку форума Arduino
- Arduino Due vs Mega 2560
- Точность часов времени Arduino
- Регистры ввода-вывода SAM3X8E (Arduino Due)
- Построение графика на Python с использованием Tkinter Canvas
- Ручная установка Arduino Due
- analogRead всегда 1023 на Arduino Due
- Как выбрать пару SDA/SCL на Arduino Due?
- Как упаковать 16-битное целое число, чтобы отправить его с помощью serial.write?
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