PitMQDL - PitMqDataLogger

PitMQDL, data loggerer per il monitoraggio di inquinanti e gas con i sensori della serie MQ.

 

Il funzionamento di PitMQDL (PitMqDataLogger) è una applicazione e adattamento del RTC_datalogger ta una mail di allarme. Il codice è un semplice adattamento del dcondice di PitSDMicroModuleRTC al quale si rimanda per gli aspetti di maggior dettaglio).

Il dati vengono salvati sulla scheda SD e possono essere facilmenti rielaborati per fare dei grafici e controllare l'andamento del dato nel tempo.

Codice sorgente:



/*
 
 ----------------------------------------------------------------------------------------
  PitMqDataLogger

  Zappoco          - PitMqDataLogger_19_09_01   15/09/2019 -- adattamento del codice SD datalogger e del codice RTC by zappoco 2019
 
 SD card datalogger

 This example shows how to log data from three analog sensors
 to an SD card using the SD library.

 The circuit:
 * analog sensors on analog ins 0, 1, and 2
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK -  pin 13
 ** CS - pin 4 (for MKRZero SD: SDCARD_SS_PIN)

 created  24 Nov 2010
 modified 9 Apr 2012
 by Tom Igoe

 This example code is in the public domain.

 -----------------------------------
 Date and time functions using a DS1307 RTC connected via I2C and Wire lib
 ** SDA - pin A4 
 ** SCL - pin A5


 */

#include "SPI.h"
#include "SD.h"
#include "RTClib.h"


// SD
const int chipSelect = 4;

// RTC
#if defined(ARDUINO_ARCH_SAMD)  // for Zero, output on USB Serial console, remove line below if using programming port to program the Zero!
   #define Serial SerialUSB
#endif

RTC_DS1307 rtc;

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

int analogPinMin = 0;
int analogPinMax = 0;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  delay (1000);

  //
  // SD
  //
  Serial.print("Initializing SD card...");

  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");

  //
  // RTC
  //


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

  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));
     // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
  //rtc.adjust(DateTime(2019, 2, 9, 19, 52, 0));
  //SD.remove("datalog.txt");

  File dataFile = SD.open("datalog.txt", FILE_WRITE);
  dataFile.println("Inizio scrittura");
  dataFile.close();
}

void loop() {
  // make a string for assembling the data to log:
  String dataString = "";

  // lettura RTC
  DateTime now = rtc.now();
  
  dataString += String(now.year()) ;
  dataString += "/";
  if (now.month() < 10) {
    dataString += "0";
  }
  dataString += String(now.month());
  dataString += "/";
  if (now.day() < 10) {
    dataString += "0";
  }
  dataString += String(now.day());
  dataString += " , ";
  
  dataString += String(daysOfTheWeek[now.dayOfTheWeek()]);
  
  dataString += " , ";

  //sprintf(buf, "Hello!%d", n);

  if (now.hour() < 10) {
    dataString += "0";
  }
  dataString += String(now.hour());
  dataString += ":";
  if (now.minute() < 10) {
    dataString += "0";
  }
  dataString += String(now.minute());
  dataString += ":";
  if (now.second() < 10) {
    dataString += "0";
  }
  dataString += String(now.second());

  dataString += " , ";

  // read sensors and append to the string:

  for (int analogPin = analogPinMin; analogPin < analogPinMax+1; analogPin++) {
	double sensorValue = 0;
	for (int x = 0 ; x < 50 ; x++) //Start for loop
	{
	  sensorValue = sensorValue + analogRead(A0); //Add analog values of sensor 500 times
	}
    //int sensor = analogRead(analogPin);
	int sensor = int(sensorValue / 50);
    dataString += String(sensor);  
    if (analogPin < analogPinMax) {
      dataString += ",";
    }
  }
  
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
    // print to the serial port too:
    Serial.println(dataString);
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  }
  delay (60000); // attende un minuto
}

Cosa serve:

  • Arduino
  • Modulo RTC
  • Modulo SD
  • Sensore della serie MQ - in questo caso MQ04

Scarica tutto quello che serve: