Problemas na gravação módulo SD card

Olá a todos. Tenho 8 sensores de temperatura DS18B20 com encapsulamento a funcionar ao mesmo tempo, um módulo RTC e um módulo micro SD card para gravação dos dados 10 em 10 s. O cartão grava os primeiros resultados, eu diria os primeiros 9 ou 12 resultados, mas depois deixa de gravar, dando erro. Ele já chegou a gravar durante 4 dias seguidos, mas depois disso está sempre a deixar de gravar passado os primeiros dados. Já fiz várias hipóteses, ligado á saída USB do PC, ligado a um carregador de telemóvel USB, mas acontece sempre o mesmo. O cartão está formatado em FAT32. Houve uma atualização na semana passada do Arduino.IDE, não sei se terá a haver com isso. Se quiserem posso colocar aqui o código. Eu ainda tenho pouca experiência, mas em principio tudo deveria estar bem, até porque já funcionou antes. Estou a usar o ARDUINO UNO R3, e está tudo soldado.




Bom dia,
para entendermos melhor seu projeto, poste o esquemático e o código usados nele.
Para postar o código utilize as tags, conforme recomendado. ( click em < code > ).

Poste também as msg de erro que aparecem.

O código consigo, mas o esquemático não sei bem como fazer. Existe algum programa para o fazer, pois apenas o tenho feito á mão.

#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <RTClib.h>
#include <SPI.h>
#include <SD.h>

// Definições dos pinos
#define ONE_WIRE_BUS 2  // Pino dos sensores DS18B20
#define CHIP_SELECT 10  // Pino CS do SD

// Configuração dos sensores
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// Configuração do RTC
RTC_DS3231 rtc;

// Variáveis
File dataFile;

void setup() {
  Serial.begin(9600);

  // Inicializa o SD Card
  if (!SD.begin(CHIP_SELECT)) {
    Serial.println("Falha ao inicializar o SD.");
    return;
  }
  Serial.println("SD Card pronto.");

  // Inicializa os sensores de temperatura
  sensors.begin();

  // Inicializa o RTC
  if (!rtc.begin()) {
    Serial.println("RTC não encontrado.");
    while (1);
  }
}

void loop() {
  // Lê a data e hora atuais
  DateTime agora = rtc.now();
  String dataHora = String(agora.day()) + "/" + String(agora.month()) + "/" + String(agora.year()) + " " +
                    String(agora.hour()) + ":" + String(agora.minute()) + ":" + String(agora.second());

  Serial.print("Data e Hora: ");
  Serial.println(dataHora);

  // Solicita a leitura dos sensores
  sensors.requestTemperatures();

  // Lê e exibe a temperatura de cada sensor
  for (int i = 0; i < 8; i++) {  // Ajusta para o número de sensores ligados
    float temperatureC = sensors.getTempCByIndex(i);
    Serial.print("Sensor ");
    Serial.print(i + 1);
    Serial.print(": ");
    if (temperatureC != DEVICE_DISCONNECTED_C) {
      Serial.print(temperatureC);
      Serial.println(" C");
    } else {
      Serial.println("Erro ao ler o sensor.");
    }
  }

  // Grava os dados no SD Card
  dataFile = SD.open("Dados.txt", FILE_WRITE);
  if (dataFile) {
    dataFile.print(dataHora);
    dataFile.print(" | Temperaturas: ");
    for (int i = 0; i < 8; i++) {
      float temperatureC = sensors.getTempCByIndex(i);
      if (temperatureC != DEVICE_DISCONNECTED_C) {
        dataFile.print("Sensor ");
        dataFile.print(i + 1);
        dataFile.print(": ");
        dataFile.print(temperatureC);
        dataFile.print(" C, ");
      } else {
        dataFile.print("Sensor ");
        dataFile.print(i + 1);
        dataFile.print(": Erro, ");
      }
    }
    dataFile.println();
    dataFile.close();
  } else {
    Serial.println("Erro ao abrir o arquivo no SD.");
  }

  // Aguarda 10 segundos
  delay(10000);
}

Verifique o cartão SD, ele pode estar com defeito. Tem colocar outro cartão SD, se der classe A de marcas conhecidas no mercado.

Olá acag,

Para fazer o esquema, podes usar o Tinkercad. Aqui está um exemplo do que podes fazer com isso.
Além disso, esqueceste-te de nos enviar as mensagens que o Arduino está a enviar pela porta série para o teu computador.

Além disso, devo dizer que verificar o cartão SD no teu computador pode ser um bom começo

Já usei 3 cartões diferente de marcas conhecidas (scandisk, Kingston, etc) Formatados a FAT32. Os cartões garanto que estão bons.

Mensagens:
por vezes - Falha ao inicializar o SD
Após umas horas de gravação - Erro ao abrir o arquivo no SD

O que acontece mais vezes é este último, após já ter gravado vários dados sem problemas.

O esquema irei fazer no ThinkerCad como aconselhado.
O cartão está óptimo, aliás já usei vários.

Qualquer aplicativo ou soft de esquematico é um pouco, (ou muito ), complicado e requer um aprendizado que consumirá algum tempo.
Eu uso o Easy EDA online.
Mas se voce não tem grandes necessidades de desenhar esquematicos, faça a mão livre mesmo, fotografe e poste aqui a foto.

Qual a msg de erro?

Não sei se exatamente isto pode estar causando o problema, mas voce cria strings o tempo todo, pois cria estas strings no loop().

DateTime agora = rtc.now();
  String dataHora = String(agora.day()) + "/" + String(agora.month()) + "/" + String(agora.year()) + " " +
                    String(agora.hour()) + ":" + String(agora.minute()) + ":" + String(agora.second());

Defina estas strings como global e só atualiza os seu valores no loop,
ou crie uma funcão em que elas seja criadas dentro desta função e chame a função a cada vez que quiser o horario, assim ao sair da função elas são destruidas.

Yes I recommand this also. This is a very good software usable online and offline, that can do many thinkgs

ruilviana tem razão
Usar a classe String pode rapidamente tornar o código muito instável — sobretudo se for mal utilizada e em execução prolongada.
Pode ser que isso não seja a causa do problema, mas por precaução, substitui isto:

String dataHora = String(agora.day()) + "/" + String(agora.month()) + "/" + String(agora.year()) + " " +
                    String(agora.hour()) + ":" + String(agora.minute()) + ":" + String(agora.second());

Por isto:

char dataHora[25]; 
  sprintf(dataHora, "%02d/%02d/%04d %02d:%02d:%02d",
          agora.day(), agora.month(), agora.year(),
          agora.hour(), agora.minute(), agora.second());

Caso não compreendas este código, diz-me por favor.

Se o teu código não compilar por causa da linha dataFile.print(dataHora) (o que duvido muito), muda para dataFile.print(dataHora.c_str())

1 Like

Ainda não fiz as mudanças sugeridas por todos (falta de tempo, pelo que agradeço a compreensão). No entanto, após algumas tentativas a ligar e desligar de uma tomada de carregador de telemóvel de 5V e 2000ma, acabou por acionar a luz Rx que pisca 10 em 10 s. Pelo que segundo entendo está a ler as temperaturas, não sei ainda se está a gravar no cartão. Irei ver amanhã, pois necessito de muitas leituras para poder comparar os 8 sensores uns com os outros nas mesmas condições ambientais. Irei entretanto tentar efetuar o desenho.

Afinal gravou apenas cerca de 1 hora de leituras, 20 em 20 s. Depois não gravou mais nada. Não aparece nenhuma info no cartão após a linha das gravações.

Não mudaste nada ao código então...

Ainda não amigo. Mudei de PC e agora estou com problemas nas portas usb que não estão a ser reconhecidas pois uso o Arduino CH340 que sempre me criou problemas. Vou ver se arranjo o arduino original, o problema é que só tem uma saída de 5V e eu necessito 2 saídas.

Obrigado amigo.

Onde poderei comprar aqui na Europa?

…............................................................... .

A. Carlos Galhano

Técnico Superior | Departamento de Ciências da Terra

M.Sc. Rochas e Minerais Industriais
Telefone : (+351) 212 948 573 | ramal : 10215 / 10219
Carro : (+351) 927 367 235 / (+351) 919 036 437

ESCOLA DE CIÊNCIAS E TECNOLOGIA DA NOVA | FCT NOVA

Universidade NOVA de Lisboa

Campus de Caparica | 2829-516 Caparica | Portugal

(+351) 21 294 8300

www.fct.unl.pt

Procurei no site de algumas lojas físicas como a PTRobotics e não achei. Uma alternativa é buscar lojas virtuais como Amazon e Aliexpress.

Essa aqui é uma que aparentemente opera em Portugal:
https://www.etsy.com/pt/listing/1333156495/dupont-y-cable-splitter-jumper-wire?ref=hp_active-mission-recs-rv-1-1

Mas talvez haja outras alternativas com relação ao seu circuito.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.