Добрый день.
Плата должна включать/отключать нагреватель в зависимости от температуры. А также параллельно записывать ЛОГ файл на СД карту.
Проблема - спустя 1,5-2 часа работы плата полностью встает, либо начинает записывать какую то ерунду на СД карту. В чем может быть проблема.
Код прикладываю.
И господа, заранее спасибо.
Arduino mega
BME-280
MicroSd card adapter.
//#include "logger.h"
#include "pin_map.h"
#include "settings.h"
// библиотека для работы I²C
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <TimerOne.h>
// библиотека для работы с метеосенсором
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
// создаём объект для работы с датчиком в камере
Adafruit_BME280 bme;
// Переменные для хранения метеоданных
volatile float pressure = 0;
volatile float temperature = 0;
volatile float humidity = 0;
unsigned long timestampTelemetryWrite = 0;
//переменные для диода
boolean InitSD;
boolean InitMeteo;
void writeSD(String str)
{
File logFile = SD.open("log1.txt", FILE_WRITE);
// if the file is available, write to it:
if (logFile)
{
logFile.println(String(millis()) + ":::" + " "+ str);
logFile.close();
Serial.println("Write to log1.txt---OK");
InitSD = true;
}
// if the file isn't open, pop up an error:
else
{
Serial.println("error opening log1.txt");
InitSD = false;
}
}
void initMeteoSensor()
{
// печатаем сообщение об успешной инициализации Serial-порта
Serial.println("Meteo begin init...");
writeSD("Meteo begin init...");
// начало работы с датчиком
unsigned status;
status = bme.begin(0x76);
if (!status)
{
Serial.println("Meteo Sensor init FAIL");
writeSD("Meteo Sensor init FAIL");
InitMeteo = false;
}
else
{
Serial.println("Meteo Sensor init OK");
writeSD("Meteo Sensor init OK");
InitMeteo = true;
}
}
void updateSensorData()
{
pressure = bme.readPressure() / 100.0f;
temperature = bme.readTemperature();
humidity = bme.readHumidity();
}
void warmControl()
{
Serial.println("Temperature in camera:" + String(temperature));
writeSD("Temperature in camera:" + String(temperature));
// Если температура ниже минимальной
if (temperature < TEMPERATURE_IN_CAMERA_MIN)
{
// то включаем подогрев
digitalWrite(WARM_CONTROL_PIN, ON);
Serial.println("Warm is ON");
Serial.println("Write WARM_CONTROL_PIN = " + String(ON));
writeSD("Warm is ON");
}
// Если больше максимальной
else if (temperature > TEMPERATURE_IN_CAMERA_MAX)
{
// То выключаем подогрев
digitalWrite(WARM_CONTROL_PIN, OFF);
Serial.println("Warm is OFF");
Serial.println("Write WARM_CONTROL_PIN = " + String(OFF));
writeSD("Warm is OFF");
}
else
{
/* code */
}
if (millis() - timestampTelemetryWrite > TELEMETRY_DELAY_MS)
{
Serial.println("Telemetry Write Start");
writeSD("Telemetry Write Start");
String result = "";
result += String(millis()/60000);
result += ":min";
result += ":::";
result += " TemperatureInCamera = " + String(temperature) + " ";
result += " PressureInCamera = " + String(pressure) + " ";
result += " HumidityInCamera = " + String(humidity) + " ";
result += "\n";
Serial.println(result);
File dataFile = SD.open("datalog1.txt", FILE_WRITE);
// if the file is available, write to it:
if (dataFile)
{
dataFile.println(result);
dataFile.close();
Serial.println("Write to datalog1.txt---OK");
}
// if the file isn't open, pop up an error:
else
{
Serial.println("error opening datalog1.txt");
}
timestampTelemetryWrite = millis();
Serial.println("Telemetry Write End");
writeSD("Telemetry Write End");
}
}
void setup()
{
Serial.begin(115200);
// Init Sensor
initMeteoSensor();
if (!SD.begin(SD_CARD_ENABLE_PIN))
{
Serial.println("Card failed, or not present");
// don't do anything more:
}
Serial.println("card initialized.");
// Настройка пина управления подогревателем
pinMode(WARM_CONTROL_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
}
void loop()
{
static unsigned long timestampSensorUpdate = 0;
static unsigned long warmControlTimestamp = 0;
if (millis() - warmControlTimestamp > 1000)
{
// контроль температуры в барокамере
//Serial.println("warmControl");
//writeSD("warmControl");
warmControl();
warmControlTimestamp = millis();
}
if (millis() - timestampSensorUpdate > 1000)
{
updateSensorData();
timestampSensorUpdate = millis();
}
if (InitSD and InitMeteo)
{
digitalWrite(LED_PIN, HIGH);
}
else
{
digitalWrite(LED_PIN, LOW);
}
}