#include <SoftwareSerial.h>
SoftwareSerial mySerial(7, 8);
#include <Time.h>
#include <TimeLib.h>
#include <TimeAlarms.h>
#include "RTClib.h"
//------------ gsm
char incoming_char=0;
String smsRecibo;
int largo;
String mensaje;
String buffer;
String mensajeRecibido;
int automatico;
int notificaciones;
String nroDetectado;
int myReleeA = 13; //releA
int myReleeB = 6; //releB
int myReleeC;
int myReleeD;
int rele2;
//-programar Alarmas
RTC_DS1307 rtc;
AlarmID_t alarmaA1Onn;
AlarmID_t alarmaA1Off;
AlarmID_t alarmaA1Onn8;
AlarmID_t alarmaA1Off8;
int hora;
int minuto;
String horaDetectada;
String salida;
String dia;
String HoraEnviada;
String diaSemana;
String accionSalida;
int tiempoEnv;
int diaEnviado;
String tiempoEnviado;
String programRecibido;
int horaApagado;
int minutoApagado;
int resto;
int resta;
int divide;
String estadoAlarmaA1;
String estadoAlarmaA2;
void setup()
{
Serial.begin(9600);
Alarm.delay(3000);
alarmaA1Onn = Alarm.alarmRepeat(hora,minuto,0, enciendeReleA1);
alarmaA1Off = Alarm.alarmRepeat(horaApagado,minutoApagado,0, apagaReleA1);
powerUpOrDown(); //enciende sim900
mySerial.begin(19200); // for GSMshield
Alarm.delay(1000);
mySerial.print("AT+CMGF=1\r"); // set SMS mode to text
Alarm.delay(1000);
mySerial.print("AT+CNMI=2,2,0,0,0\r");
Alarm.delay(100);
pinMode(13, OUTPUT);
pinMode(myReleeA, OUTPUT);
pinMode(myReleeB, OUTPUT);
digitalWrite(myReleeA, LOW);
digitalWrite(myReleeB, HIGH);
buffer = "";
automatico=0;
notificaciones = 0;
if (! rtc.begin()) {
Serial.println("No hay un módulo RTC");
while (1);
}
DateTime now = rtc.now();
setTime(now.hour(), now.minute(), now.second(), now.month(), now.day(), now.year());
Serial.println(now.day(), DEC);
Serial.println(now.month(), DEC);
Serial.println(now.year(),DEC);
}
void loop()
{
char SerialInByte;
if(mySerial.available() >0)
{
Serial.println("disponible");
buffer = "";
readSIM900A();
//Habilita las notificaciones por SMS
int elenotion = buffer.indexOf("NOTI-ON"); //para encender notificaciones
if (elenotion>=0)
{
notificaciones = 1; //habilita notificaciones
mensaje = "NOTIF ON";
mensaje_sms(mensaje);
}
int elementoNotiOf = buffer.indexOf("NOTI-OFF"); //para encender notificaciones
if (elementoNotiOf>=0)
{
mensaje = F("NOTIF OFF");
mensaje_sms(mensaje);
notificaciones = 0; //deshabilita notificaciones
}
int elementoTiempo = buffer.indexOf("IA1");
if (elementoTiempo>=0)
{
capturaEvento();
mensaje= programRecibido;
mensaje_sms(mensaje);
armoHoras();
setAlarmaIA1();
}
int elementoTiempoA2 = buffer.indexOf("IA2");
if (elementoTiempoA2>=0)
{
estadoAlarmaA2="";
capturaEvento();
mensaje= programRecibido;
mensaje_sms(mensaje);
armoHoras();
setAlarmaIA2();
}
//consultas estado
int elementoConsultaA1 = buffer.indexOf("CA1");
if (elementoConsultaA1>=0)
{
Serial.println(buffer);
mensaje= estadoAlarmaA1; mensaje_sms(mensaje);
}
}
}
//lee los characteres del mensaje y los mete en un buffer
String readSIM900A()
{
buffer = "";
while (mySerial.available())
{
char c = mySerial.read();
buffer.concat(c);
Alarm.delay(10);
}
mensajeRecibido = buffer;
return buffer;
}
void enciendeReleA1()
{
Serial.println("Enciende rele A1-------------------------------");
digitalWrite(myReleeA, HIGH);
setEstadoAlarmaA1();
}
void enciendeReleA2()
{
Serial.println("Enciende rele A1--------------por alarma 2-----------------");
digitalWrite(myReleeA, HIGH);
setEstadoAlarmaA2();
}
// Apaga Reles ----
void apagaReleA1()
{
Serial.println("Apaga rele A1 ++++++++++++++++++++++++++++++");
digitalWrite(myReleeA, LOW);
duermeEstadoAlarmaA1();
}
void apagaReleA2()
{
Serial.println("apaga rele A1--------------por alarma 2-----------------");
digitalWrite(myReleeA, LOW);
//duermeEstadoAlarmaA2();
//duermeEstadoAlarmaB2();
}
void mensaje_sms(String mensaje)
{
capturaNroEnviado();
String nroEnvio2 = "AT+CMGS=\"+" + String(nroDetectado);
nroEnvio2.concat("\"");
if (notificaciones == 1)
{
Serial.println("Enviando SMS...");
mySerial.print("AT+CMGF=1\r"); //Configura el modo texto para enviar o recibir mensajes
Alarm.delay(1000);
//mySerial.println("AT+CMGS=\"+11111111111\""); //Numero al que vamos a enviar el mensaje
mySerial.println(nroEnvio2); //Numero al que vamos a enviar el mensaje
Alarm.delay(1000);
mySerial.println(mensaje); // Texto del SMS
Alarm.delay(100);
mySerial.println((char)26); //Comando de finalización ^Z
Alarm.delay(100);
mySerial.println();
Alarm.delay(5000); // Esperamos un tiempo para que envíe el SMS
}
}
void capturaNroEnviado()
{
int elementoComilla = mensajeRecibido.indexOf('5');
int elementoSegundaComilla = mensajeRecibido.indexOf('"',elementoComilla);
nroDetectado = mensajeRecibido.substring(elementoComilla,21);
Alarm.delay(100);
}
void powerUpOrDown()
{
pinMode(9, OUTPUT);
digitalWrite(9,LOW);
Alarm.delay(1000);
digitalWrite(9,HIGH);
Alarm.delay(5000); //era 5000
digitalWrite(9,LOW);
Alarm.delay(3000);
}
void capturaEvento()
{
//int elementoAsterisco = mensajeRecibido.indexOf('#');
accionSalida = mensajeRecibido.substring(49,53);
diaSemana = mensajeRecibido.substring(54,55);
HoraEnviada = mensajeRecibido.substring(56,60);
tiempoEnviado = mensajeRecibido.substring(61,63);
programRecibido = "#S"+accionSalida+"#D"+diaSemana+"#H"+HoraEnviada+"#T"+tiempoEnviado;
}
void armoHoras(){
hora = HoraEnviada.substring(0,2).toInt();
minuto = HoraEnviada.substring(2,4).toInt();
tiempoEnv = tiempoEnviado.toInt();
diaEnviado = diaSemana.toInt();
if (diaEnviado >=0 and diaEnviado <=9){
// Serial.println("dia entre 1 y 7");
resta = 60 - tiempoEnv;
if (resta < 60){
Serial.println("resta menor de 60");
horaApagado = HoraEnviada.substring(0,2).toInt();
minutoApagado = HoraEnviada.substring(2,4).toInt()+tiempoEnv;
}
if (tiempoEnv >= 60 and tiempoEnv <=900){
Serial.println("tiempo enviado mayor de 60");
resto = tiempoEnv % 60;
divide = tiempoEnv / 60;
horaApagado = HoraEnviada.substring(0,2).toInt() + divide;
minutoApagado = HoraEnviada.substring(2,4).toInt()+ resto;
if (horaApagado = 23 and minutoApagado >59){
minutoApagado = 59;
}
if (horaApagado > 24){
horaApagado = 24;
minutoApagado = 0;
}
}
}
}
void setAlarmaIA1(){ //Salida 1 : Alarma1
//guardo valores: hora,minuto y hora minuto apagado
//guard dia
Serial.println("-----------");
Serial.println(horaApagado);
Serial.println(minutoApagado);
Serial.println("-----------");
if (diaEnviado == 0){
Serial.println("Cerooooo");
Alarm.disable(alarmaA1Onn);
Alarm.free(alarmaA1Onn);
Alarm.disable(alarmaA1Off);
Alarm.free(alarmaA1Off);
alarmaA1Onn = Alarm.alarmRepeat(hora,minuto,0, enciendeReleA1);
alarmaA1Off = Alarm.alarmRepeat(horaApagado,minutoApagado,0, apagaReleA1);
}
}
void setEstadoAlarmaA1(){
estadoAlarmaA1 = "#S"+accionSalida+"#D"+diaSemana+"#H"+HoraEnviada+"#T"+tiempoEnviado;
}
void duermeEstadoAlarmaA1(){
estadoAlarmaA1 = "Espera "+accionSalida+ "/" + diaSemana +"/"+ HoraEnviada +"/"+ tiempoEnviado;
}
void liberarAlarmas(){
}