Sari la conținut
ELFORUM - Forumul electronistilor

Logger temperatura


Marele Savant

Postări Recomandate

  va cer si eu ajutorul pentru creera unui logger de temperatura. In esenta citeste temperatura printr-un DS18B20, o afiseaza pe un LCD 1602 impreuna cu data si ora. Asta o face bine. De asemenea ar trebui sa inregistreze aceste informatii pe un SD card, modulul SPI pentru arduino. Asta nu o mai face, detecteaza prezenta cardului dar nu scrie nimic pe acesta. Initial ar trebui sa creeze un fisier denumit cu data zilei in care se face inregistrarea, pentru asta exista si un DS1307.  Monitorul serial afisaza:  

 

22:26:35.899 -> Error opening data file
22:26:37.687 -> Temperature: 28.75 C, Date: 28/6/2023 22:26
22:26:37.687 -> Error opening data file
22:26:39.475 -> Temperature: 28.75 C, Date: 28/6/2023 22:26
22:26:39.522 -> Error opening data file
22:26:41.284 -> Temperature: 28.75 C, Date: 28/6/2023 22:26
22:26:41.284 -> Error opening data file

 

un alt .ino pentru testarea SD card functioneaza perfect, cu aceleasi conexiouni electrice, creeaza un fisier si scrie in el. Codul pentru logger este:

 

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

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

RTC_DS1307 rtc;
OneWire oneWire(2);
DallasTemperature sensors(&oneWire);

bool sdCardPresent = false;
const int chipSelectPin = 10;

String getFileName(DateTime now);
String leadingZero(int number);

void setup() {
  lcd.begin(16, 2);
  Serial.begin(9600);
  rtc.begin();
  sensors.begin();

  lcd.clear();
  lcd.print("Temperature Logger");
  lcd.setCursor(0, 1);
  lcd.print("Initializing...");

  // Verifică dacă modulul SD card este prezent
  if (SD.begin(chipSelectPin)) {
    sdCardPresent = true;
    lcd.clear();
    lcd.print("SD Card Found");
    Serial.println("SD Card Found");
    delay(2000); // Așteaptă 2 secunde pentru a afișa mesajul "SD Card Found"
  } else {
    lcd.clear();
    lcd.print("SD Card Not Found");
    Serial.println("SD Card Not Found");
    delay(2000); // Așteaptă 2 secunde pentru a afișa mesajul "SD Card Not Found"
  }
}

void loop() {
  DateTime now = rtc.now();
  float temperature = -127; // Valoare implicită în cazul în care citirea temperaturii eșuează

  // Citirea temperaturii
  sensors.requestTemperatures();
  temperature = sensors.getTempCByIndex(0);

  lcd.clear();
  lcd.print("Temp: ");
  lcd.print(temperature);
  lcd.print(" C");

  lcd.setCursor(0, 1);
  // lcd.print("Date: ");
  lcd.print(now.day());
  lcd.print("/");
  lcd.print(now.month());
  lcd.print("/");
  lcd.print(now.year());
  lcd.print(" ");
  lcd.print(now.hour());
  lcd.print(":");
  lcd.print(now.minute());

  // Afișarea valorilor pe Serial Monitor
  Serial.print("Temperature: ");
  Serial.print(temperature);
  Serial.print(" C, Date: ");
  Serial.print(now.day());
  Serial.print("/");
  Serial.print(now.month());
  Serial.print("/");
  Serial.print(now.year());
  Serial.print(" ");
  Serial.print(now.hour());
  Serial.print(":");
  Serial.print(now.minute());
  Serial.println();

  // Scrierea datelor pe SD card
  if (sdCardPresent) {
    String fileName = getFileName(now);
    File dataFile = SD.open(fileName.c_str(), O_WRITE | O_CREAT | O_APPEND);
    if (dataFile) {
      dataFile.print(now.day());
      dataFile.print("/");
      dataFile.print(now.month());
      dataFile.print("/");
      dataFile.print(now.year());
      dataFile.print(" ");
      dataFile.print(now.hour());
      dataFile.print(":");
      dataFile.print(now.minute());
      dataFile.print(",");
      dataFile.println(temperature);
      dataFile.close();
    } else {
      Serial.println("Error opening data file");
    }
  }

  delay(1000);
}

String leadingZero(int number) {
  if (number < 10) {
    return "0" + String(number);
  } else {
    return String(number);
  }
}

String getFileName(DateTime now) {
  String fileName = String(now.year(), DEC);
  fileName += "-";
  fileName += leadingZero(now.month());
  fileName += "-";
  fileName += leadingZero(now.day());
  fileName += ".txt";
  return fileName;
}

 

vede cineva ce este gresit?

Link spre comentariu
  • Răspunsuri 5
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Marele Savant

    4

  • nico_2010

    1

  • merck

    1

Top autori în acest subiect

Adauga aceasta linie de cod:

Serial.println(dataFile);

 

dupa linia ta de cod:

Serial.println("Error opening data file");

 

adica sa ai asa :

Serial.print("Error opening data file. Error code: ");

Serial.println(dataFile);

 

ca sa vedem cum se executa: File dataFile = SD.open(fileName.c_str(), O_WRITE | O_CREAT | O_APPEND);

 

P.S. Tie iti apare mesajul SD Card Found afisat pe LCD si in monitorul serial? Ca ai doua linii 

 

    lcd.print("SD Card Found");
    Serial.println("SD Card Found");

 

si nu vad sa iti apara in monitorul serial: SD Card Found.  Vad ca iti apare doar mesajul:  Error opening data file

Editat de merck
Link spre comentariu

   Multumesc mult pentru ajutor!!! Sper sa ma pot revansa.

 

 Da, mi-a scapat lungimea numelui de fisier, dar  am cunostiinte foare vagi de programare! functioneaza ambele variante de mai sus.

 

Indraznesc sa mai vin cu doua probleme, daca si cind are cineva timp:

 

1. primele 9 minute din ora sint afisate aiurea, adica fara un zero inainte:

29-6-2023 19:58,   Temp: 28.31
29-6-2023 19:59,   Temp: 28.25
29-6-2023 19:59,   Temp: 28.25
29-6-2023 20:0,   Temp: 28.25
29-6-2023 20:0,   Temp: 28.25
29-6-2023 20:0,   Temp: 28.25
29-6-2023 20:1,   Temp: 28.25
29-6-2023 20:1,   Temp: 28.25
29-6-2023 20:1,   Temp: 28.19
29-6-2023 20:2,   Temp: 28.19

 

2. ar mai fi nevoie de o pauza variabila doar la scrierea pe SD card. Adica pe lcd sau serial monitor sa fie afisata continuu, dar pe card inregistrarile sa fie mai rare, la 20-30-60 de secunde. Am incercat eu ceva, dar intirzierea respectiva apare la toate afisarile, deci si la lcd sau serial mon.

Editat de Marele Savant
Link spre comentariu

Multumesc din nou pentru ajutor. Este aproape OK, chestia cu minutele nu mi-a iesit, dar nu este inca urgent!

 

Caut si pe net poate gasesc ceva gata facut!

Editat de Marele Savant
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări