#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <EEPROM.h>
File myFile;
#define chipSelectSD 53 // Piedino SS per la Scheda SD
#define chipSelectSonda 9 // Piednino SS per La scheda mikrobus 4..20 mA
int sceltafrequenza; // prima variabile per sceglere la frequenza di registrazione
int frequenza ; // seconda variabile per sceglere la frequenza di registrazione
long previousminuti = 0; // variabile per memorizzare i minuti precedenti
float minuti; //variabile per conteggiare i minuti
unsigned long secondi; // variabile per contegiare i secondi
String ubicazione = "Ubicazione non definita" ;
String copyright = " Copyright xxxxxxx" ;
String inputString = "";
int loop_current;
int received_data;
// Valori ottenuti dalla calibrazione
const int ADC_4mA = 817.17;
const int ADC_20mA = 4008;
// Valori di Inizio e fondoscala
const int data_min_range = 0;
const int data_max_range = 1023;
void (*software_reboot )(void) = 0; // riavvia Arduino per permettere la riscrittura delle intestazioni su SD
void setup() {
pinMode (chipSelectSD, OUTPUT);
pinMode (chipSelectSonda, OUTPUT);
//setto e resetto i dua canali SPI
digitalWrite(chipSelectSD, LOW);
delay(100);
digitalWrite(chipSelectSD, HIGH);
delay(100);
digitalWrite(chipSelectSonda, LOW);;
delay(100);
digitalWrite(chipSelectSonda, HIGH);
delay(100);
SPI.begin;
Serial.begin(115200);
setSyncProvider(RTC.get); // funzione per prelevare l'ora da RTC
if (timeStatus() != timeSet)
Serial.println("Impossibilitato a sincronizzarsi con RTC");
else
Serial.println("RTC sincronizzato");
Serial.print("Inizializzazione scheda SD ...");
// verifica se la scheda SD è presente e funzionante
if (!SD.begin(chipSelectSD)) {
Serial.println("Scheda SD non funzionante o non presente");
// se non lo e' ferma tutto
digitalWrite(chipSelectSD, HIGH);
return;
}
Serial.println("Scheda di memoria SD inizializzata");
digitalWrite(chipSelectSD, LOW);
File dataFile = SD.open("datalog.txt", FILE_WRITE); // creo ed apro il file datalog.txt
if (dataFile) {
dataFile.print(ubicazione);
dataFile.print(';');
dataFile.print(';');
dataFile.print(';');
dataFile.print(';');
dataFile.print(copyright);
dataFile.println(';');
dataFile.println(';');
dataFile.print("Giorno");
dataFile.print(';');
dataFile.print("Mese");
dataFile.print(';');
dataFile.print("Anno");
dataFile.print(';');
dataFile.print("Orario");
dataFile.print(';');
dataFile.print("Sensore1");
dataFile.println(';');
dataFile.println('\r');
dataFile.close(); // chiudo il file
digitalWrite(chipSelectSD, HIGH); // disabilito la comunicazione SPI per la SD
}
}
void loop() {
digitalWrite(chipSelectSD, HIGH);
//Inserisco la lettura del canale 4..20mA
delay(1000);
digitalWrite(chipSelectSonda, LOW); // abilito la comunicazione SPI per la Sonda
// read the loop current
loop_current = ReadFrom420mA();
// error checking
if (loop_current == -1)
Serial.println("Errore: Circuito aperto");
if (loop_current == -2)
Serial.println("Errore : Corto Circuito");
// All is OK, erwmapping to initial data range
received_data = map(loop_current, ADC_4mA, ADC_20mA, data_min_range, data_max_range);
Serial.print("Valore letto: ");
Serial.println(received_data);
digitalWrite(chipSelectSonda, HIGH); // disabilito la comunicazione SPI per la Sonda
secondi = (millis() / 1000); //Converto in secondi il tempo passato dall'accensione
minuti = secondi / 60; // Converto i secondi in minuti
// cambio del tempo di registrazione in base alla scelta inviata dal programma fatto con Visual Studio
switch (sceltafrequenza) {
case 1:
frequenza = 1;
break;
case 5:
frequenza = 5;
break;
case 10:
frequenza = 10;
break;
case 15:
frequenza = 15;
break;
case 30:
frequenza = 30;
break;
case 60:
frequenza = 60;
break;
}
if (minuti - previousminuti > frequenza ) {
previousminuti = minuti;//Tiene in memoria l'ultimo valore di tempo
registradati(); // Vado a scrivere le registrazioni sula SD
}
// leggi il file su SD con comando su seriale su interrogazione da programma fatto con Visual Studio
while (Serial.available()) {
char c = (char)Serial.read();
if ((c < 48) || (c > 57)) {
return;
}
if (c == 48) {// il numero 0 equivale a 48 in ascii
delay(100);
digitalWrite(chipSelectSD, LOW); // abilito la comunicazione SPI per la SD
myFile = SD.open("datalog.txt");
while (myFile.available())
{
Serial.write(myFile.read()); // invio su seriale i dati registrati/letti sulla SD
}
myFile.close();
digitalWrite(chipSelectSD, HIGH); // disabilito la comunicazione SPI per la SD
// inputString = "";
return;
}
// altre possibili interrogazooni fatta da programma creato su visual Studio
if (c == 57) {// il numero 9 equivale a 57 in ascii
delay(100);
digitalWrite(chipSelectSD, LOW); // abilito la comunicazione SPI per la SD // COMMENTATO PER PROVARE
SD.remove ("datalog.txt"); // cancello il file scrito su SD
digitalWrite(chipSelectSD, HIGH); // disabilito la comunicazione SPI per la SD
delay(50);
software_reboot(); // riavvio arduino per ricreare le Inteestazioni
}
// da Programma fatto con Visula Studio cambio le frequenza di registrazione
if (c == 49) {// il numero 1 equivale a 49 in ascii
delay(100);
Serial.println ("1 minuto ");
sceltafrequenza = 1;
}
if (c == 50) {// il numero 2 equivale a 50 in ascii
delay(100);
Serial.println ("5 minuti");
sceltafrequenza = 5;
}
if (c == 51) {// il numero 3 equivale a 51 in ascii
delay(100);
Serial.println ("10 minuti");
sceltafrequenza = 10;
}
if (c == 52) {// il numero 4 equivale a 52 in ascii
delay(100);
Serial.println ("15 minuti");
sceltafrequenza = 15;
}
if (c == 53) {// il numero 5 equivale a 53 in ascii
delay(100);
Serial.println ("30 minuti");
sceltafrequenza = 30;
}
if (c == 54) {// il numero 6 equivale a 54 in ascii
delay(100);
Serial.println ("60 minuti");
sceltafrequenza = 60;
}
}
}
void registradati(void)
{
int sensor0 = analogRead(0); // legge il sensore analogico
// scrivi su seriale data, ora e lettura degli ingressi Analogici
digitalWrite(chipSelectSD, LOW); // abilito la comunicazione SPI per la SD
File dataFile = SD.open("datalog.txt", FILE_WRITE); // creo ed apro il file datalog.txt
if (dataFile) {
//se il file esiste lo compilo
dataFile.print(day());
dataFile.print(';');
dataFile.print(month());
dataFile.print(';');
dataFile.print(year());
dataFile.print(';');
dataFile.print(hour());
dataFile.print(':');
dataFile.print(minute());
dataFile.print(':');
dataFile.print(second());
dataFile.print(';');
dataFile.print(received_data); // valore in arrivo dallo scheda di conversione 4..20 mA
dataFile.println(';');
dataFile.println('\r');
dataFile.close(); // chiudo il file
digitalWrite(chipSelectSD, HIGH); // disabilito la comunicazione SPI per la SD
}
}
unsigned int get_ADC(void) {
digitalWrite(chipSelectSD, HIGH);
unsigned int result;
unsigned int first_byte;
unsigned int second_byte;
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE1));
digitalWrite(chipSelectSonda, 0); // abilito la comunicazione SPI per la Sonda
first_byte = SPI.transfer(0);
second_byte = SPI.transfer(0);
digitalWrite(chipSelectSonda, 1); // disabilito la comunicazione SPI per la Sonda
SPI.endTransaction();
result = ((first_byte & 0x1F) << 8) | second_byte;
result = result >> 1;
return result;
}
int ReadFrom420mA(void)
{
digitalWrite(chipSelectSD, HIGH);
int result;
int ADC_result;
float ADC_avrg;
for (int i = 0; i < 100; i++) {
ADC_result = get_ADC();
// Measure every 1ms
delay(1);
ADC_avrg = ADC_avrg + ADC_result;
}
result = (int)(ADC_avrg / 100);
if (result < 750) {
return -1;
}
if (result > 4009) {
return -2;
}
return result;
}