@lengast

Почему можем зависать ARDUINO и SD?

Добрый день.

Плата должна включать/отключать нагреватель в зависимости от температуры. А также параллельно записывать ЛОГ файл на СД карту.

Проблема - спустя 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);
    }
}
  • Вопрос задан
  • 151 просмотр
Пригласить эксперта
Ответы на вопрос 3
BasiC2k
@BasiC2k
.NET developer (open to job offers)
Такое может быть, если идёт переполнение какой то переменной. Проверяйте код.
Ответ написан
Комментировать
@lonelymyp
Хочу вылезти из минуса по карме.
Чем включаешь? Могут быть помехи если стоит реле и не позаботился о качественном питании контроллера.
Ответ написан
Комментировать
@VT100
Embedded hardware & software.
+1 lonelymyp. Какая схема установки, мощность и напряжение нагревателя, чем он включается и т.п.?
Wire.h - это i2c через "ногодрыг" или аппаратный? Если первое - шерстить его код на предмет устойчивости к помехам. Для начала - можно попробовать снизить сопротивления "подтяжек" до возможного минимума (по допустимому втекающему току BMP). Если ситуация улучшится - плохой код.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы