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

lengast
Offline
Зарегистрирован: 17.08.2019

Добрый день.

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

Проблема - спустя 1,5-2 часа работы плата полностью встает, либо начинает записывать какую то ерунду на СД карту. В чем может быть проблема.
Код прикладываю.
И господа, заранее спасибо.
Arduino mega
BME-280
Sd card logger - модель не помню. Сейчас не под рукой

#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);
    }
}

 

rkit
Offline
Зарегистрирован: 23.11.2016

Код вроде норм, так что скорее всего некачественная сборка.

sadman41
Offline
Зарегистрирован: 19.10.2016

Я бы воткнул промер по RAM. Не доверяю этим стрингам ))

lengast
Offline
Зарегистрирован: 17.08.2019

Можете поподробнее пожалуйста)

Bruzzer
Offline
Зарегистрирован: 17.03.2020

А что пишет в Serial, когда "начинает записывать какую то ерунду на СД карту."

 

lengast
Offline
Зарегистрирован: 17.08.2019

Должно быть так:
"127:min::: TemperatureInCamera = 20.37  PressureInCamera = 1002.37  HumidityInCamera = 14.93 "
Прошлые записи за работу все такие.

А последняя (извините за объем):

127:min::: TemperatureInCamera = 20.35  PressureInCamera = 1002.38  Huml`F*h:pfgdfawtq.@1{$ve"813s$ut "Pbe"utgqA"c2o&vg*51q#6:6> Vgms,yt!qdC2mf г&z%r8:)%0о9.2:‹02luEWrx~`PtqK~Зaner`.1l0"4E&ypfr2uvqhnac,bRcdX«q6#
ъь*"Њ1%gd}\z-Gale`a,tqaрbi8!A*crhla'тz>h9( p%Ru|U~eYcq@oaR`S%fr`/l7q!Vrg3sr!`gaqi4x`t-C!92!l0tp1Йt`f®eMH/#awv2!"?$1{&}6h(%hs6x;mpn0zWeT`l"erl5gs!(baW%r/ь2b0+u!) Uqu2gtrdf`qLr" щp3$3";4$ hu},$ct!evC`tx "=K56*(7¤:3040kanў:0xue~{d`!tpqaInRe<tp`2?"346t!а"RddpaqSuhnGami`%"m01a03/>;rlueqlh|}Ehaamd"Qae!1)<?8DU5
03:yQo9::(Depq}`tvz`Iljwk%ru)µP**?59p(x2srq%6eHlCS}wq!$}y3!17n|3C1`цoi$/y;bqa|qsia?aaq$9/ [e€=r8xd)nbX!4eeq wes2e_дNxmb`p%a¦,vq' @raQ%vgq&`w8o>`@%tь0±.x`rhg](Dmh`M>Q`2fr'*>0/m$iMbт0kl<:=@PaxTgDvdj1B1l(2($$f8Ly5 ]PmcqtEeInAb}ra1<0Ў6.84`|5oi$|t}_vbbm$db@=д$;.6 :
17xrmxmъ:zvu1rf@#xevpMlPp}ep1 5%0612*:hrEqau#emoZ`mrkq -`1p#/85< M6o5`йj1™famerbl<v48~x0Do-48:|pl48:zD!sLv5~4vsE6KknuCab7%8"*21d%7dqrUmZ!Eev!,5 1to9$` Hum`dh; #qMRa`wh&!7 8
/2p2hi\~j0 c%peu 65RDH_O!нa{0t} 0. 8 .vsеrcрjel
%d!3W69k22 w`(f('lPubta[xAnSAec`#"4 s4n="*7
0з(pu~rz*!]cmu%pcauR'}жG mЧbh  0r20260&T2axm"#YlGQuopQ>
842.7 7Js}%dhtmMlCRugrІev%4Pn4  130;a.:: "Eiepwp1se ^a@MA0eC'03$/25+P 4q9pfqQlGal%ro0)p_u2#*21PH5.m4+61!br  `pA(ћce6p 'b
. 20vl;v?$T7+6g"b6uveTbuuq#a"y(0w.ux"  {e#s2ak.Osmmnp x`ppУ`8%dbIuoh@(4x4Ymu`u9< 8980 oGqvp6I)z#2cD&/pbzeђ7C!X~`me2!pmоs043ш2Urmg3punIBCu$w|"6=8190Sn(rDwBvm"da|} ~Cu-gvs"m.216{ S
6%І12i@_n2>dd!qL&F4WefSnaa}mcc(6 24.:b @1lssеbr+j2cEtrq%)h2#*81 A9eid(`YEzcAhbc1*< 3),00!
y}kqv3(2 0-9{xdtarзp~Ior4!`9|6aj2.0!@2assurGISclfra ?8іS1s6| hN$=$-t;A<BxцRe*y$59/54&Xp*;mrv6 -2tMttvq1pgc&G!Md|e`x00102t! FsUs}wvdmu1gf4c9 8`:&
142Y0'aDyuaMjki!v8 30?718*
*a25xjf22?e5/%qfa4u"'q`Res53!!=245` Pp2R;1rl>e`}eqAd$8030s$402(tHmdhф(0hC`7erwa4ayy.:!063:zahn|i:`с}"a"0}usBklaam 21 }#&?$10/0Rp1zsurt9fMai!rqB<i01tc.00i J4vM21t9yfZ!$dna$$u0"0uMQrp>(f4:05Nrror1w`D~are`y|03;(*5p08Ru1{T0…1>BCmBr)p]m p-32 lw7)bmV9y&@#afra$u%#x.s  A
aR18-|/!4,<Tmpm"Pqlb4adBa|eRkcu)p1,p"!$`~rs33і tqahdZEd]Xc233<{@!`psi9dйr>jCp*E2#!=b;1(328 A[#w +qd+8{bqqrETe3e]+E)fbys!9Т!n3-G#@xwr%2|/fCY,ikadp)p10sd~0bL
iedx'{r#A}gpa$=!10$%rELqrq5dlb32:d|berctut9frpvEfb`u"r!(6q adbwu`qzi(?7rp8<"q 1)&}t  8фm`idEYk`dh74a(:1;6d2dMM:sr№~e{o*{`&eMP4s;}trg+n #}%qP04y69&u2`аubeseuSgYfEatTPa`0! 13~|3`qp!\i`(|ЩEz3qEbrad)(#r<<bJ yІ:8Uko:#1 PanyaAb<tui.0e3ra!=!z851%0rd3seue(V*e<ut!+z(400?.)0"(4}!ib4}p(C eebu&4`1y&002%*3na=>8r9z<3Зb<r Rad&x0H>Ff%bh0)bt!&(82 tXUCcwp5?bq}xz`4==1r36vl0e0h|matpusp,5d%!e:?00;.<5 )c4°inu}or.r,W!Ixevy162ч!r*a|Wr`pdby*04!` Б`s`rDCkB1 %+q$=(212:Ћ8RV xwoIdi$hOS3]er3$7
1" 4rd] 1#8(}cNX`:`Pw|puguuq%kjCqf44и"= r1*u$&`Erd0a|bIoe3e)rH& $")3%$|qm`dntqi/bcн661.!0!®52("0280H23:!vmMReRvtuт4kvSsН!vI(m r4o)5fd|vesSQawa[Wmmjp$= 1: b*!4`\um{dqtxD:CВoE&g440?&668*A?t>r%ao:06qDFiAevreuv5kz@%-u3a95&:4|>4`bpq%isСagKGpysс$=%82 1.*\a$Hui`EsTxijCaydfU"464 *6(h*min:z
tTalсehgde`gejcA$WP:"5(300mr bqreeuP"fIxCcedrk'41706>80  @]8%at!qhg`MdGrU#;®73"2;(2<3|m~sz etaUqasqdqrLI{b%mg1q9&xshё2%aрsegqv{eMpA`i3c 5eS243"80`(jw=kcMeyMCalUci % /#n40
sadman41
Offline
Зарегистрирован: 19.10.2016

Например, https://github.com/maniacbug/MemoryFree/tree/master/examples/FreeMemory

Если будет видно, что Free memory монотонно уменьшается, то искать где течет.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Готов поспорить, что это выход за пределы какого нибудь массива.

Вот почему переменные в строках 20-22 volatile ? Так было в каком то примере ?

До какого размера у вас "раздувается" логфайл ? Как часто вы в него пишете ?

lengast
Offline
Зарегистрирован: 17.08.2019

Ранее использовалось прерывание. Потом убрал его. Признак volatile остался.
Пишу в файл раз в секунду

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Какого размера получается файл на момент ошибки ?

А 172 строка у вас си превратился в паскаль ? :)

Bruzzer
Offline
Зарегистрирован: 17.03.2020

lengast пишет:

Должно быть так:
"127:min::: TemperatureInCamera = 20.37  PressureInCamera = 1002.37  HumidityInCamera = 14.93 "
Прошлые записи за работу все такие.

А последняя (извините за объем):

Я спрашивал, что пишет в Serial. А вы отвеnили - что пишет на SD.

lengast
Offline
Зарегистрирован: 17.08.2019

 В монитор порта записи не идут.Т к предполагаю,  что плата зависает 

lengast
Offline
Зарегистрирован: 17.08.2019

Примерно 2кб.

А что не так со строкой?
 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Сами не видите ?!

 if (InitSD and InitMeteo)

and - 'это у вас ЧТО ?

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

brokly, так тоже можно писать. And, not, or  задефайнены, сам иногда пользуюсь, для читабельности.

Но там, где нужны именно логические операции, не битовые. В паскале оне, с.ка, не отличаюца. Вирту кол в ж.пу за это. :-)

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

А где они задефайнены ? И самое главное НАКУА !?

От жеж блин, не знал !

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Виима, тот, кто задефайнил, вырос из Turbo Pascal. 

А где, я нинаю. Работает искаропки, спицально ничо подключать не надо. :-)

v258
Offline
Зарегистрирован: 25.05.2020

c:\Program Files (x86)\Arduino\hardware\tools\avr\lib\gcc\avr\7.3.0\include\iso646.h

#ifndef __cplusplus
#define and	&&
#define and_eq	&=
#define bitand	&
#define bitor	|
#define compl	~
#define not	!
#define not_eq	!=
#define or	||
#define or_eq	|=
#define xor	^
#define xor_eq	^=
#endif

#endif

Собственно, этот файл только это и содержит ))

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Фига себе, это еще и стандарт ! Совсем я старый стал :(

nik182
Offline
Зарегистрирован: 04.05.2015

Посмотрел что это такое - принят 25 лет назад - заголовочный файл, являющийся частью стандартной библиотеки языка Си. Вон оно чё! А мужики то и не знают :-( 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ну дык я и говорю... Теперь даже и не знаю, если на собеседовании спросят есть ли в си оператор "and" чего отвечать то ?

sadman41
Offline
Зарегистрирован: 19.10.2016

Отвечай "иногда".

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Теперь придется :)

UPD: Это сделали для тех у кого нет символов & | ^ и других в раскладке. Для китайцев что ли :) ?

lengast
Offline
Зарегистрирован: 17.08.2019

Господа, всем огромное спасибо за ответы. Помогли!
Дело было в volatile переменных. За подсказку огромное спасибо brokly

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

lengast пишет:

Господа, всем огромное спасибо за ответы. Помогли!
Дело было в volatile переменных. За подсказку огромное спасибо brokly

Если честно, то странно :(

lengast
Offline
Зарегистрирован: 17.08.2019

Как только убрал данный тип из кода - все стало стабильно)