Помогите срочно. зависает плата и запись на sd

Тема в разделе "Arduino & Shields", создана пользователем lengast, 28 ноя 2020.

Метки:
  1. lengast

    lengast Нуб

    Добрый день.
    Плата должна включать/отключать нагреватель в зависимости от температуры. А также параллельно записывать ЛОГ файл на СД карту.
    Проблема - спустя 1,5-2 часа работы плата полностью встает, либо начинает записывать какую то ерунду на СД карту. В чем может быть проблема.
    Код прикладываю.

    Код (C++):
    #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);
        }
    }
    Господа, заранее спасибо!
     
  2. Asper Daffy

    Asper Daffy Иксперд

    Насколько срочно?