#include <avr/io.h>
#include <avr/wdt.h>
#include <math.h>
#include "SimpleTimer.h"
#include <SoftwareSerial.h>
#include "GSM_Shield_mega.h"
#include <EEPROM.h>
#define IS_GSM
#define Reset_AVR() wdt_enable(WDTO_1S); while(1) {}
void (*reset)(void) = 0;
#define CONFIG_VERSION "ls1"
#define CONFIG_START 32
//#define TENSIONI
//#define N 4
#define AREF 5.030
#define R0 1000.0
#define A 3.90802e-3
#define B -5.802e-7
#define MAXANALOG 1023
#define SWITCH 7
int sensorPin[16];
char stato, blk;
int sensorValue;
long int prova[16];
long int i,j;
int conta;
int numero_campioni;
float tensione;
float resistenza;
float temperatura;
float sommatens[16];
float correzione_tensione[16];
float resistenza_fili[16];
float I_PT1000[16];
float I[16]={0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001,
0.001,0.001,0.001,0.001,0.001,0.001,0.001,0.001};
SimpleTimer timer;
BoundTimer Btimer;
int reset_timer;
int error_timer;
int bound_timer[16];
GSM gsm;
struct Settaggi {
char canali;
bool sms;
char tel[14];
bool isSup[16];
bool isInf[16];
float Sup[16];
float Inf[16];
} settaggi = {
16,
0,
"+393333333333",
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
};
void error_callback()
{
Serial.println("ERRORE");
#if defined(IS_GSM)
if(settaggi.sms) {
char testo[] = "TempLog ha smesso di funzionare.\nLa centralina si è disconnessa dal computer.";
gsm.SendSMS(settaggi.tel, testo);
gsm.SendSMS("+393333333333", testo);
gsm.SendSMS("+393333333333", testo);
gsm.SendSMS("+393333333333", testo);
delay(2000);
}
#endif
inizializza();
Serial.end();
reset_callback();
}
void bound_callback(char c, bool sup )
{
/*#if defined(IS_GSM)
if(settaggi.sms) {
char testo[50];
sprintf(testo, "La sonda %i ha superato la soglia %s", c, (sup ? "superiore" : "inferiore"));
gsm.SendSMS(settaggi.tel, testo);
}
#endif*/
}
void reset_callback()
{
Reset_AVR();
}
void inizializza()
{
stato=-1;
blk=0;
caricaSettaggi();
//salvaSettaggi();
caricaCorrenti();
//salvaCorrenti();
pinMode(13, OUTPUT);
pinMode(SWITCH, INPUT);
sensorPin[0]=A0;
sensorPin[1]=A1;
sensorPin[2]=A2;
sensorPin[3]=A3;
sensorPin[4]=A4;
sensorPin[5]=A5;
sensorPin[6]=A6;
sensorPin[7]=A7;
sensorPin[8]=A8;
sensorPin[9]=A9;
sensorPin[10]=A10;
sensorPin[11]=A11;
sensorPin[12]=A12;
sensorPin[13]=A13;
sensorPin[14]=A14;
sensorPin[15]=A15;
conta=0;
numero_campioni=2000;
for(i=0;i<15;i++) {
sommatens[i]=0.0;
}
error_timer = timer.setTimeout(30000, error_callback);
timer.disable(error_timer);
reset_timer = timer.setInterval(259200000, reset_callback);
//reset_timer = timer.setInterval(60000, reset_callback);
}
void setup()
{
Serial.begin(9600);
digitalWrite(13,1);
inizializza();
#if defined(IS_GSM)
Serial.println("Init GSM module");
gsm.TurnOn(9600); //module power on
gsm.InitParam(PARAM_SET_1);//configure the module
gsm.Echo(0); //enable AT echo
#endif
Serial.println("READY");
//Serial.println(UCSR0C, BIN);
//delay(5000);
//error_callback();
}
void caricaSettaggi() {
for(int i=0; i< sizeof(settaggi); i++)
*((char*)&settaggi + i) = EEPROM.read(CONFIG_START+i);
}
void salvaSettaggi() {
for(int i=0; i< sizeof(settaggi); i++)
EEPROM.write(CONFIG_START+i, *((char*)&settaggi + i));
}
void caricaCorrenti() {
for(int i=0; i<sizeof(float[16]); i++)
*((char*)&I + i) = EEPROM.read(CONFIG_START + sizeof(settaggi) + i);
}
void salvaCorrenti() {
for(int i=0; i<sizeof(float[16]); i++)
EEPROM.write(CONFIG_START+i+sizeof(settaggi), *((char*)&I + i));
}