Simpele datalogger (arduino)

Goedemiddag,

Ben op het moment bezig met het programmeren van een arduino logger.
Heb een SD kaart module en een DS3231 module gekoppeld aan een arduino mini pro(3.3, 8mhz).

Nu heb ik de sd kaart module getest, deze werkt. Maar de DS3231 module werkt nog niet.

Voor dit project gebruik ik de code van deze site:
https://howtomechatronics.com/tutorials/arduino/arduino-sd-card-data-l…

code die ik gebruik(van de site)

code:


/*
 *  Arduino Temperature Data Logging
 *  
 *  by Dejan Nedelkovski, www.HowToMechatronics.com
 */
#include <SD.h>
#include <SPI.h>
#include <DS3231.h>
File myFile;
DS3231  rtc(SDA, SCL);
int pinCS = 10; // Pin 10 on Arduino Uno
void setup() {
    
  Serial.begin(9600);
  pinMode(pinCS, OUTPUT);
  
  // SD Card Initialization
  if (SD.begin())
  {
    Serial.println("SD card is ready to use.");
  } else
  {
    Serial.println("SD card initialization failed");
    return;
  }
  rtc.begin();    
}
void loop() {
  Serial.print(rtc.getTimeStr());
  Serial.print(",");
  Serial.println(int(rtc.getTemp()));
 
  myFile = SD.open("test.txt", FILE_WRITE);
  if (myFile) {    
    myFile.print(rtc.getTimeStr());
    myFile.print(",");    
    myFile.println(int(rtc.getTemp()));
    myFile.close(); // close the file
  }
  // if the file didn't open, print an error:
  else {
    Serial.println("error opening test.txt");
  }
  delay(3000);
}

En ik krijg de volgende foutmelding:

no matching function for call to 'DS3231::DS3231(const uint8_t&, const uint8_t&)'

Weet iemand waar dit aan kan liggen?

groeten,

Sven (zie bijlage)

Heb je de nodige bibliotheken gedownload en geïnstalleerd?

heb enkele bibliotheken van ds3132 geinstalleerd (arduino heeft er zelf ook 1 maar dan moet je #include <Wire.h> toevoegen) ds3132 zit dus blijkbaar in deze library.

Heb op internet ook gekeken maar kan nergens een simpel scriptje vinden om de ds3132 module werkend te krijgen

Deze code om de ds3132 te testen werkt bijvoorbeeld ook niet:

code:


// Date and time functions using a DS1307 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

void setup () {
  while (!Serial); // for Leonardo/Micro/Zero

  Serial.begin(57600);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
}

void loop () {
    DateTime now = rtc.now();
   
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(" (");
    Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
    Serial.print(") ");
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
   
    Serial.print(" since midnight 1/1/1970 = ");
    Serial.print(now.unixtime());
    Serial.print("s = ");
    Serial.print(now.unixtime() / 86400L);
    Serial.println("d");
   
    // calculate a date which is 7 days and 30 seconds into the future
    DateTime future (now + TimeSpan(7,12,30,6));
   
    Serial.print(" now + 7d + 30s: ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();
   
    Serial.println();
    delay(3000);
}

bron: https://forum.arduino.cc/index.php?topic=516684.0

Hij geeft nu rare tekens weer in de serial monitor. (zie bijlage)

zoals op de bijlage te zien is heb ik rtclib als bibliotheek gedownloadt.

Raar, heb de draden nog eens goed gecheckt maar alles is verbonden zoals het moet. Het werkt niet

Er zijn veeeel verschillende librarys voor de DS3132.
Deze meneer gebruikt in zijn voorbeeld de library van www.rinkydinkelectronics.com
Heb jij deze geinstalleerd? of iets uit de "Arduino Library" Manager genomen.

Quote:
For this tutorial I chose to use the Library made by Henning Karlsen which can be found and downloaded from his website, www.rinkydinkelectronics.com.

Met serial.begin(57600) moet je de terminal wel ook op diezelfde snelheid zetten, nu zie ik 9600

DS3231 rtc(SDA, SCL);
moet dat niet zijn:
RTC_DS3231 ...

reading can seriously damage your ignorance

Bedankt mannen,

Het is gelukt. Had even gebladerd naar mijn librarys, er stonden er een paar in met dezelfde naam en verschillende auteurs. Heb deze verwijderd en de link van Rinky-dink gebruikt.

Hij uploadt nu wel (deed ie voorheen niet), maar nu staat er alleen "SD card is ready to use")

Maar hij print nu niet de temperuurwaarde van de ingebouwde temperatuursensor van de DS3231 in de serial monitor. Ook wanneer ik de sd kaart verwijder uit het slot, en deze in mijn pc plug, komt er geen data in het tekst bestand.

Waar zou dit aan kunnen liggen? en hoe bouw ik de code om zodat ik even zeker weet dat de ds3132 de tijd weet? De losse kaartmodule werkt wel en heb ik getest.

Ik werk dus nu vanuit de volgende link:
https://howtomechatronics.com/tutorials/arduino/arduino-sd-card-data-l…

1e stukje code heb ik getest en werkt, 2e stukje code dus niet(is het gedeelte met de clock module)

code:


/*
 *  Arduino Temperature Data Logging
 *  
 *  by Dejan Nedelkovski, www.HowToMechatronics.com
 */
#include <SD.h>
#include <SPI.h>
#include <DS3231.h>
File myFile;
DS3231  rtc(SDA, SCL);
int pinCS = 10; // Pin 10 on Arduino Uno
void setup() {
    
  Serial.begin(9600);
  pinMode(pinCS, OUTPUT);
  
  // SD Card Initialization
  if (SD.begin())
  {
    Serial.println("SD card is ready to use.");
  } else
  {
    Serial.println("SD card initialization failed");
    return;
  }
  rtc.begin();    
}
void loop() {
  Serial.print(rtc.getTimeStr());
  Serial.print(",");
  Serial.println(int(rtc.getTemp()));
 
  myFile = SD.open("test.txt", FILE_WRITE);
  if (myFile) {    
    myFile.print(rtc.getTimeStr());
    myFile.print(",");    
    myFile.println(int(rtc.getTemp()));
    myFile.close(); // close the file
  }
  // if the file didn't open, print an error:
  else {
    Serial.println("error opening test.txt");
  }
  delay(3000);
}

Heb even een serialprint gedaan onder rtc.begin (soort van breakout).

Deze serialprint komt wel binnen. Hij komt dus wel langs rtc.begin maar springt niet in de loop (in de loop staan ook prints die niet zichtbaar zijn in de serial monitor.

Wat kan hiervan het probleem zijn?

Waarschijnlijk is rtc.begin() "blocking". In deze routine wordt er verbinding gelegd met I2C (SDA / SCL) met de module en wordt er antwoord verwacht. Als het antwoord niet komt blijft de afloop hier hangen (vermoed ik). Om zeker te zijn moet je dus in library gaan zoeken naar de afloop van rtc.begin(). Niet zo evident dus.
Eigenlijk hou ik niet van librarys die zelf de I2C afloop bepalen. Je hebt er geen zicht op als het mis gaat. Normaal wordt voor I2C steeds "wire.h" gebruikt.

Er is inderdaad iets mis met de rtc. Ik heb geen pullup weerstanden geplaatst van 10K ohm. Zitten deze niet ingebouwd in de arduino mini pro van mij? kan het hieraan liggen?

(ik meen dat die er wel in zitten)

Ik zal eens koekeloeren in de library en iets vinden waaruit de i2c verbinding met de ds3231 tot stand wordt gebracht. Als jullie iets vinden in de library van rinky-dink wat voor mijn probleem kan zorgen hoor ik het graag.

groeten

Sven

kunnen jullie uit de librarys uitmaken waar de fout ligt? zie er nergens RTC.begin staan.

Mijn arduino pro werkt met 3.3 V. De ds3231 kan dit hebben dus hier ligt niet het probleem.

Dit staat bij de specificaties van de ds3231:
Afmetingen: 3,8 x 2,2 x 1,4cm
Voedingsspanning: 3,3V - 5V
I2C adres: 0x57 (instelbaar met A0/A1/A2)

Misschien dat ik iets met dat i2c adres moet doen? Of dat ik a1/a2/a3 moet doorsolderen?

Help

Mvg

Sven

Begin eens met de i2c bus te scannen met onder staande code of er iets wordt gevonden op de bus, zo niet dan heb je in de hardware iets niet goed.
Zo ja, dan weet je gelijk het i2c adres.

c code:


#include <Wire.h>
 
 
void setup()
{
  Wire.begin();
 
  Serial.begin(9600);
  //while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}
 
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}

In de lib (DS3231.h)staat er al zeker een ander I2C addres :
#define DS3231_ADDR 0x68
Je kan het adres van de module inderdaad veranderen, zie datasheet. Je kan ook eens trachten het adres in lib te veranderen. Welke pennen van arduino zijn SDA/SCL ?

Mannen,

Was weer even bezig met het projectje. Nu werkte de i2c scanner niet. Ik herinnerde me dat er voor i2c meestal a4 en a5 worden gebruikt bij een arduino uno voor het tot stand zetten van de verbinding.

Mijn arduino mini pro heeft dus blijkbaar wel een a4 en a5, deze zaten midden op de printplaat. Heb nu wel een verbinding en ik krijg 2 adressen binnen.

Maar waarom krijg ik eigenlijk 2 adressen binnen? ik gebruik toch maar 1 module?

Nou, heb weeer de oude code geprobeert en hij schrijft nu netjes de waarde van de inwendige temperatuursensor van de DS3231 clock module.

Het invoeren van het i2c adress was ook niet nodig (apart want hoe komt die library erachter dan)

Het project werkt dus nu volledig, dat is mooi (snap alleen niet waarom hij 2 i2c adressen heeft)

Iedereen bedankt!

Op de module zit ook een eeprom ic (at24c32), deze heeft zijn eigen adres. De klok heeft ook zijn adres, daarom scan je 2 adressen. De eeprom chip wordt nu niet gebruikt in de sketch.

aha,

Kan ik met mijn code ook nog regelen dat de datalogger gaat loggen binnen een bepaalde tijd? Dat ik hem dus permanent aan de voeding zet en dat hij bijvoorbeeld tussen 8:00 en 16:00 data gaat loggen?

Heeft iemand hier een voorbeeld voor of stuk code waardoor dit mogelijk is?

gr Sven

Dat is zeker mogelijk. In de sketch zie ik nu dat er in de "loop" een aantal acties worden aangestuurd en daarna staat er een "delay(3000)", dus 3 s wachttijd. Dit moet gewijzigd worden in. Maar ook moet je eerst nog beslissen over het log-interval, wil je elke minuut of elk uur loggen of...
Dus eerst komt de voorwaarde : is de actuele tijd tussen 8.00 h en 16.00h ?
Daarna komt de voorwaarde, is het tijdsinterval al afgelopen ?
Indien ja, éénmaal temp. uitlezen + loggen naar sd.