Nano logger shield kezelése

 

2020-06-29

Már jó ideje az labor asztalomon akklimatilázódott ez a kis panel. A napokban belevágtam a felélesztésébe. Arduino környezetben az ilyen rádugható paneleket shield-nek (pajzs) hívják. Ez egy data logger, azaz adatnaplózó panel. Van rajta egy mikro SD kártya foglalat, ide írhatunk mindenfélét fel, és egy önálló elemmel és kvartzzal megtámogatott DS1307 óra, ha elmenne az táp, akkor se felejtsük el hol is tartunk. Kapunk 4 furatot felerősítéshez, és a zöld csatikon keresztül adnánk neki tápot, van egy kis stabilizátor is rajta.

Alulnézetből. Szépen feliratozott korrekt panel. 3-4 USD-ért be lehet rendelni.

Így néz ki összedugva. Nem néztem alaposabban utána, de szerintem áramkörileg megegyezik a korábban bemutatott DS1307 panellel. A DS1307 a TWI (I2C) portra csatlakozik, as SD kártya pedig egy szintillesztőn keresztül az SPI portra. Most kikerültem a korábbi pofont, pénzt nem sajnálva rögtön vettem bele egy gombelemet 150 HUF-ért.

Maga a program nem hosszú, csak szokásomhoz híven nem voltam elégedetta gyári RTC library-val, ezért a program első felében az általam írt RTC kezelő objektumot találjátok. Lehet, hogy egyszer írok egy új SdFat-ot is, de ez egyenlőre jó :). A setup()-ban inicializálásra és ellenőrzésre kerülnek az egyes részegységek. Megjegyzésként bent hagytam az óra kezdeti beállítását is. A napló file-t "datalog.csv"-re kereszteltem, a beleírt adatokat pontosvesszővel választottam el, így LibreOffice Calc (ne adj' isten MS Excel) rögtön be tudja szívni.

A loop()-ban történik a naplózás, ebben a programban csak a DS1307-et kiolvassa, és beírja a dátumot és az időt a file-ba. Ez után kellene írni, amit tulajdonképen rögzíteni kellene. Vár 5 másodpercet, azután kezdődik minden előlről.


/******************************************************************************
*   Author       -  Kiraly Tibor
*                   http://www.tkiraaly.hu
*   Date         -  2020.06.29.
*   Chip         -  Ardiono NANO, NANO Data Logger
*   Compiler     -  Arduino IDE 1.8.12
*
*   DS1307 ora IC és SD kartya kezelese
*   
*******************************************************************************/

#include <SPI.h>
#include <SdFat.h>                               // https://github.com/greiman/SdFat/
#include <Wire.h>


#define DS1307_ADDRESS      0x68


class kt_ds1307
{
   public:
   byte years;                                   // 0..99
   byte months;                                  // 1..12
   byte days;                                    // 1..31
   byte days_of_week;                            // 1..7
   byte hours;                                   // 0..23
   byte minutes;                                 // 0..59
   byte seconds;                                 // 0..59

   kt_ds1307( void) { Wire.begin();};
   byte not_ready( void);                        // chip not ready
   void now( void);                              // read date + time
   void set( void);                              // set date + time

   private:
   byte bin2bcd( byte n) { return  ((n/ 10) << 4)+ ( n % 10);};
   byte bcd2bin( byte n) { return ((n & 0B11110000) >> 4)* 10+ ( n & 0B00001111);};
};


void kt_ds1307::now( void)
{
   Wire.beginTransmission( DS1307_ADDRESS);
   Wire.write( (uint8_t)0);
   Wire.endTransmission();
   Wire.requestFrom( DS1307_ADDRESS, 7);
   seconds= bcd2bin( Wire.read());
   minutes= bcd2bin( Wire.read());
   hours=   bcd2bin( Wire.read());                                   
   days_of_week=     Wire.read();
   days=    bcd2bin( Wire.read());                                   
   months=  bcd2bin( Wire.read());                                   
   years=   bcd2bin( Wire.read());                                   
   Wire.endTransmission();
}


void kt_ds1307::set( void)
{
   if( seconds > 59) seconds= 0;                 // limits
   if( minutes > 59) minutes= 0;
   if( hours > 23) hours= 0;
   if( days_of_week > 7 || days_of_week < 1) days_of_week= 1;
   if( days > 31 || days < 1) days= 1;
   if( months > 12 || months < 1) months= 1;
   if( years > 99) years= 0;
   Wire.beginTransmission( DS1307_ADDRESS);
   Wire.write( (byte)0);                         // start at location 0
   Wire.write( bin2bcd( seconds));
   Wire.write( bin2bcd( minutes));
   Wire.write( bin2bcd( hours));                 // implicit set 24 hours mode
   Wire.write( days_of_week);
   Wire.write( bin2bcd( days));
   Wire.write( bin2bcd( months));
   Wire.write( bin2bcd( years));
   Wire.write( 0);                               // controll register
   Wire.endTransmission();
}


byte kt_ds1307::not_ready( void)
{
   Wire.beginTransmission( DS1307_ADDRESS);
   return Wire.endTransmission();
}


kt_ds1307 rtc= kt_ds1307();
char time_string[] = "2000/00/00; 00:00:00; ";


#define MOSIpin 11                               // for SD card
#define MISOpin 12                               // for SD card
const int CS= 10;                                // for SD card CS pin
SdFat SD;                                        // SdFat object


void setup()
{  
   Serial.begin( 9600);
   while ( !Serial);                             // wait for serial port to connect
   Serial.println( "Nano DataLogger");
   if( rtc.not_ready())
   {
      Serial.println( "RTC fail");   
      while( 1);
   }
/*                                               // set date + time
   rtc.years=        20;
   rtc.months=        6;
   rtc.days=         29;
   rtc.days_of_week=  1;
   rtc.hours=        23;
   rtc.minutes=      10;
   rtc.seconds=       0;
   rtc.set();
*/   
   if ( !SD.begin( CS))
   {
      Serial.println( "SD card fail");
      while( 1);
   }
   Serial.println();     
   File log_file= SD.open( "datalog.csv", FILE_WRITE);
   if( log_file) log_file.close();                         
   else
   {
      Serial.println( "File error");
      while( 1);
   }
}


void loop() 
{
   rtc.now();
   sprintf( time_string, "20%02d/%02d/%02d; %02d:%02d:%02d; ", rtc.years, rtc.months, rtc.days, rtc.hours, rtc.minutes, rtc.seconds);
   Serial.println( time_string);
   File log_file= SD.open( "datalog.csv", FILE_WRITE);
   log_file.println( time_string);
   log_file.flush();                             // wait for write data complete
   log_file.close();
   delay( 5000);
}

Ennyi az egész, itt a vége, fuss el véle.