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())
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
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.





