char serialBuffer[40];
char i=0,j=0;
char R,H,M,S,D,n,h,m,s,d;
char I;
char num[]={1,1,1,1};
char dias[]={1,1};
char riego1[]={8,0,0,8,10,0,10,0,0,10,10,0,16,0,0,16,10,0,20,0,0,20,10,0};
char num2[]={1,1,1,1};
char dias2[]={1,1};
char riego2[]={8,12,0,8,22,0,10,12,0,10,22,0,16,12,0,16,22,0,20,12,0,20,22,0};
char Reloj[]={16,1,0,1};
//char Reloj[5];
char flag, flag2=0;
//char diassemana1;
char diassemana1=0b0101010;
//char diassemana;
char diassemana=0b1111111;
char DR=0b0000010;
long anterior;
void setup() {
Serial.begin(9600);
Serial.println(" Control de riego por temporización y monitoreo de plagas");
Serial.println(" Rx dx nx Hxx Mxx Sxx hxx mxx sxx" );
Serial.println(" Válvulas de riego, Rxx->1,2,3" );
Serial.println(" Hxx Mx Sxx H-> Hora on M -> Minuto on S-> Segundo on");
Serial.println(" hxx mx sxx h-> hora off m -> minuto off s-> segundo off");
Serial.println(" d1 Lunes Martes Viernes ");
Serial.println(" d2 Lunes a Domingo");
Serial.println(" n1 Numero 1 del riego en el dia");
Serial.println(" n2 Numero 2 del riego en el dia");
Serial.println(" I1 R1 -> Imprime parámetros de Riego 1");
Serial.println(" I2 R2 -> Imprime parámetros de Riego 2");
Serial.println(" I3 R3 -> Imprime parámetros de Reloj");
// R1 d1 n1 H8 M0 h8 m10
// R3 H8 M3 d0
}
void loop() {
interprete();
if( millis()-anterior >1000) {
Salidas();
anterior=millis();
}
} //CIERRA VOID LOOP
void interprete(){
if(Serial.available()> 0){//mandar se;ales por medio del monitor serial del arduino
char c=Serial.read();
Serial.print(c);
serialBuffer[i++]=c; //
if(c=='\r'|| c=='\n' ) {
Serial.println();
serialBuffer[i]=0; // al final del buffer se coloca un cero
processCommand(); // se llama al interprete
i=0;
} //CIERRA ARREGLO BUFFER
} //CIERRA SERIAL AVALIABLE
} // CIERRA VOID INTERPRETE
float parseNumber(char code,float val) {
char valor;
char *ptr=serialBuffer; // inicio del arreglo
while(*ptr) { // final del arreglo
if(*ptr==code) { // si el codigo es igual al valor que tiene *ptr
valor=atoi(ptr+1);
if(code=='H' || code=='h'){
if(valor <=23 && valor >=0) return(valor);
else {
Serial.println ("HORA NO PERMITIDA");
return(-1);
}
}
if(code=='M' || code=='m'){
if(valor <=59 && valor >=0) return(valor);
else {
Serial.println ("HORA NO PERMITIDA");
return(-1);
}
}
if(code=='S' || code=='s'){
if(valor <=59 && valor >=0) return(valor);
else {
Serial.println ("HORA NO PERMITIDA");
return(-1);
}
}
if(code=='n'){
if(valor <=2 && valor >=0) return(valor);
else {
Serial.println ("NUMERO DE RIEGO NO ENCONTRADO");
return(-1);
}
}
if(code=='R'){
if(valor <=3 && valor >=0) return(valor);
else {
Serial.println ("RIEGO NI HORA ENCONTRADA");
return(-1);
}
}
if(code=='d'){
if(valor <=2 && valor >=0) return(valor);
else {
Serial.println ("DIAS NO ENCONTRADOS");
return(-1);
}
}
return atoi(ptr+1); // convierte el digito a decimal
} // CIERRA ARREGLO PTR
ptr=strchr(ptr,' ')+1; //
} // CIERRA CICLO WHILE
return val; //
} // CIERRA FUNCION FLOAT
void processCommand() {
R = parseNumber('R',-1);
switch(R) {
case 1: // Riego valvula 1
d = parseNumber('d',-1); //
switch(d) {
case 1: // dia lunes martes viernes
dias[0]=1;
diassemana1=0b0101010;
n = parseNumber('n',-1);
switch(n){
case 1:
memoria1(0);
num[0]=1;
break;
case 2:
memoria1(6);
num[1]=1;
break;
}
break; // dia lunes martes miercoles
case 2: // Lunes a domingo
dias[1]=1;
diassemana=0b1111111;
n = parseNumber('n',-1);
switch(n){
case 1:
memoria1(12);
num[2]=1;
// EN ESTAS DOS LINEAS LE PONEMOS LO VALORES DE LOS DIFERENTES CASOS SIENDO EN EL MISMO DIA DE DONDE A DONDE VA
break;
case 2:
memoria1(18);
num[3]=1;
break;
}
break; // Lunes a domingo
}
break; // Riego valvula 1
case 2: // Riego valvula 2
d = parseNumber('d',-1); //
switch(d) {
case 1: // dia lunes martes viernes
dias2[0]=1;
diassemana1=0b0101010;
n = parseNumber('n',-1);
switch(n){
case 1:
memoria2(0);
num2[0]=1;
break;
case 2:
memoria2(6);
num2[1]=1;
break;
}
break; // dia lunes martes miercoles
case 2: // Lunes a domingo
dias2[1]=1;
diassemana=0b1111111;
n = parseNumber('n',-1);
switch(n){
case 1:
memoria2(12);
num2[2]=1;
break;
case 2:
memoria2(18);
num2[3]=1;
break;
}
break; // Lunes a domingo
}
break; // Riego valvula 2
case 3:
memoria3(); //RELOJ
break;
}
I = parseNumber('I',-1);
switch(I) {
case 1:
if (dias[0]==1)
{
if (num[0]==1){
Serial.println("Riego 1 on LMM DIARIO 1"); //CUANDO ES EL NUMERO QUEREMOS IMPRIMIR HORA DE ENCENIDO LOS PARAMTROS QUE INDICAN EN SU NUMERO
for (j=0; j<3;j++){
Serial.print( riego1[j],DEC);
if (j<2) Serial.print (":"); }
Serial.println();
Serial.println("Riego 1 off LMM DIARIO 1"); //CUANDO ES EL NUMERO QUEREMOS IMPRIMIR LOS PARAMTROS QUE INDICAN EN SU NUMERO
for (j=3; j<6;j++){
Serial.print( riego1[j],DEC);
if (j<5) Serial.print (":"); }
}
if (num[1]==1){
Serial.println("Riego 1 on LMM DIARIO 2"); //CUANDO ES EL NUMERO QUEREMOS IMPRIMIR HORA DE ENCENDIDO LOS PARAMTROS QUE INDICAN EN SU NUMERO
for (j=6; j<9;j++){
Serial.print( riego1[j],DEC);
if (j<8) Serial.print (":"); }
Serial.println();
Serial.println("Riego 1 off LMM DIARIO 2"); //CUANDO ES EL NUMERO QUEREMOS IMPRIMIR LA HORA LOS PARAMTROS QUE INDICAN EN SU NUMERO
for (j=9; j<12;j++){
Serial.print( riego1[j],DEC);
if (j<11) Serial.print (":"); }
}
} // CIERRA IF R1 D1
//Para el dia dos
if (dias[1]==1)
{
if (num[2]==1){
Serial.println("Riego 1 on LUNES A DOMINGO DIARIO 1"); //CUANDO ES EL NUMERO QUEREMOS IMPRIMIR HORA DE ENCENDIDO LOS PARAMTROS QUE INDICAN EN SU NUMERO
for (j=12; j<15;j++){
Serial.print( riego1[j],DEC);
if (j<14) Serial.print (":"); }
Serial.println();
Serial.println("Riego 1 off LUNES A DOMINGO DIARIO 1"); //CUANDO ES EL NUMERO QUEREMOS IMPRIMIR HORA DE APAGADO LOS PARAMTROS QUE INDICAN EN SU NUMERO
for (j=15; j<18;j++){
Serial.print( riego1[j],DEC);
if (j<17) Serial.print (":"); }
}
if (num[3]==1){
Serial.println("Riego 1 on LUNES A DOMINGO DIARIO 2"); //CUANDO ES EL NUMERO QUEREMOS IMPRIMIR HORA DE ENCENCIDO LOS PARAMTROS QUE INDICAN EN SU NUMERO
for (j=18; j<21;j++){
Serial.print( riego1[j],DEC);
if (j<20) Serial.print (":"); }
Serial.println();
Serial.println("Riego 1 off LUNES A DOMINGO DIARIO 2"); //CUANDO ES EL NUMERO QUEREMOS IMPRIMIR HORA DE APAGADO LOS PARAMTROS QUE INDICAN EN SU NUMERO
for (j=21; j<24;j++){
Serial.print( riego1[j],DEC);
if (j<23) Serial.print (":"); }
}
} // CIERRA IF R1 D2
Serial.println("()");
if (flag>=1) Serial.println("RIEGO ON");
else Serial.println("RIEGO APAGADO :( )");
break;
case 2:
if (dias2[0]==1)
{
if (num2[0]==1){
Serial.println("Riego 2 on LMM DIARIO 1"); //CUANDO ES EL NUMERO QUEREMOS IMPRIMIR HORA DE ENCENIDO LOS PARAMTROS QUE INDICAN EN SU NUMERO
for (j=0; j<3;j++){
Serial.print( riego2[j],DEC);
if (j<2) Serial.print (":"); }
Serial.println();
Serial.println("Riego 2 off LMM DIARIO 1"); //CUANDO ES EL NUMERO QUEREMOS IMPRIMIR LOS PARAMTROS QUE INDICAN EN SU NUMERO
for (j=3; j<6;j++){
Serial.print( riego2[j],DEC);
if (j<5) Serial.print (":"); }
}
if (num2[1]==1){
Serial.println("Riego 2 on LMM DIARIO 2"); //CUANDO ES EL NUMERO QUEREMOS IMPRIMIR HORA DE ENCENDIDO LOS PARAMTROS QUE INDICAN EN SU NUMERO
for (j=6; j<9;j++){
Serial.print( riego2[j],DEC);
if (j<8) Serial.print (":"); }
Serial.println();
Serial.println("Riego 2 off LMM DIARIO 2"); //CUANDO ES EL NUMERO QUEREMOS IMPRIMIR LA HORA LOS PARAMTROS QUE INDICAN EN SU NUMERO
for (j=9; j<12;j++){
Serial.print( riego2[j],DEC);
if (j<11) Serial.print (":"); }
}
} // CIERRA IF R2 D1
//Para el dia dos (Riego dos)
if (dias2[1]==1)
{
if (num2[2]==1){
Serial.println("Riego 2 on LUNES A DOMINGO DIARIO 1"); //CUANDO ES EL NUMERO QUEREMOS IMPRIMIR HORA DE ENCENDIDO LOS PARAMTROS QUE INDICAN EN SU NUMERO
for (j=12; j<15;j++){
Serial.print( riego2[j],DEC);
if (j<14) Serial.print (":"); }
Serial.println();
Serial.println("Riego 2 off LUNES A DOMINGO DIARIO 1"); //CUANDO ES EL NUMERO QUEREMOS IMPRIMIR HORA DE APAGADO LOS PARAMTROS QUE INDICAN EN SU NUMERO
for (j=15; j<18;j++){
Serial.print( riego2[j],DEC);
if (j<17) Serial.print (":"); }
}
if (num2[3]==1){
Serial.println("Riego 2 on LUNES A DOMINGO DIARIO 2"); //CUANDO ES EL NUMERO QUEREMOS IMPRIMIR HORA DE ENCENCIDO LOS PARAMTROS QUE INDICAN EN SU NUMERO
for (j=18; j<21;j++){
Serial.print( riego2[j],DEC);
if (j<20) Serial.print (":"); }
Serial.println();
Serial.println("Riego 2 off LUNES A DOMINGO DIARIO 2"); //CUANDO ES EL NUMERO QUEREMOS IMPRIMIR HORA DE APAGADO LOS PARAMTROS QUE INDICAN EN SU NUMERO
for (j=21; j<24;j++){
Serial.print( riego2[j],DEC);
if (j<23) Serial.print (":"); }
}
} // CIERRA IF R2 D2
Serial.println("()");
if (flag2>=1) Serial.println("RIEGO ON");
else Serial.println("RIEGO APAGADO :( )");
break;
case 3:
Serial.println("HORA RELOJ");
Serial.print(Reloj[0],DEC);
Serial.print (":");
Serial.print(Reloj[1],DEC); //EN ESTE CASO 3 ESTEBLECEMOS QUE IMPRIMA LOS VALORES DE LA CONFIGURACION DEL RELOJ
Serial.print (":");
Serial.println(Reloj[2],DEC);
Serial.print("DIA ");
switch(Reloj[3]) {
case 0:
Serial.println("DOMINGO");
Serial.println("HORA ASIGNADA");
DR=0;
break;
case 1:
Serial.println("LUNES");
Serial.println("HORA ASIGNADA");
DR=0b0000010;
break;
case 2:
Serial.println("MARTES");
Serial.println("HORA ASIGNADA");
DR=0;
break;
case 3:
Serial.println("MIERCOLES");
Serial.println("HORA ASIGNADA");
DR=0b0001000;
break;
case 4:
Serial.println("JUEVES");
Serial.println("HORA ASIGNADA");
DR=0;
break;
case 5:
Serial.println("VIERNES");
Serial.println("HORA ASIGNADA");
DR=0b0100000;
break;
case 6:
Serial.println("SABADO");
Serial.println("HORA ASIGNADA");
DR=0;
break;
} // CIERRA SWITCH RELOJ
break;
} // CIERRA SWITCH I
} // CIERRA PROCESSCOMAND
void memoria1 (char dato){
// d1 d2
H=parseNumber('H',-1); // n1 n2 n1 n2
if (H!=-1) {riego1[0+dato]=H; // 0 6 12 18
}
M=parseNumber('M',-1);
if (M!=-1) { riego1[1+dato]=M; // 1 7 13 19
}
S=parseNumber('S',-1);
if (S!=-1) { riego1[2+dato]=S; // 2 8 14 20
}
h=parseNumber('h',-1);
if (h!=-1) { riego1[3+dato]=h; // 3 9 15 21
}
m=parseNumber('m',-1);
if (m!=-1) { riego1[4+dato]=m; //4 10 16 22
}
s=parseNumber('s',-1);
if (s!=-1) { riego1[5+dato]=s; //5 11 17 23
}
} // CIERRA MEMORIA 1
void memoria2 (char dato){
// d1 d2
H=parseNumber('H',-1); // n1 n2 n1 n2
if (H!=-1) {riego2[0+dato]=H; // 0 6 12 18
}
M=parseNumber('M',-1);
if (M!=-1) { riego2[1+dato]=M; // 1 7 13 19
}
S=parseNumber('S',-1);
if (S!=-1) { riego2[2+dato]=S; // 2 8 14 20
}
h=parseNumber('h',-1);
if (h!=-1) { riego2[3+dato]=h; // 3 9 15 21
}
m=parseNumber('m',-1);
if (m!=-1) { riego2[4+dato]=m; //4 10 16 22
}
s=parseNumber('s',-1);
if (s!=-1) { riego2[5+dato]=s; //5 11 17 23
}
} // CIERRA MEMORIA 2
void memoria3(){
H=parseNumber('H',-1); // n1 n2 n1 n2
if (H!=-1) {Reloj[0]=H; // 0 6 12 18
}
M=parseNumber('M',-1);
if (M!=-1) { Reloj[1]=M; // 1 7 13 19 DAMOS VALORES AL RELOJ PARA PODER CONFIGURAR LA HORA DEL RELOJ
}
S=parseNumber('S',-1);
if (S!=-1) { Reloj[2]=S; // 2 8 14 20
}
d=parseNumber('d',-1);
if (d!=-1) { Reloj[3]=d; // 2 8 14 20
}
} // CIERA MEMORIA 3
void Salidas (){
flag=0;
flag2=0;
/*
if(Reloj[0]==riego1[0]&& //HORA
(Reloj[1]>=riego1[1]&& Reloj[1]<=riego1[4])&& //MINUTOS
(Reloj[2]>=riego1[2]&& Reloj[2]<=riego1[5])) flag=flag+1; //SEGUNDOS
if(Reloj[0]==riego2[0]&& //HORA
Reloj[1]>=riego2[1]&& Reloj[1]<=riego2[4]&& //MINUTOS
Reloj[2]>=riego2[2]&& Reloj[2]<=riego2[5])flag2=flag2+1; //SEGUNDOS
*/
for (char i=12;i<24;i=i+6){
if(Reloj[0]==riego1[i]&& //HORA
Reloj[1]>=riego1[i+1]&& Reloj[1]<=riego1[i+4]&& //MINUTOS
Reloj[2]>=riego1[i+2]&& Reloj[2]<=riego1[i+5]) flag=flag+1; //SEGUNDOS
if(Reloj[0]==riego2[i]&& //HORA
Reloj[1]>=riego2[i+1]&& Reloj[1]<=riego2[i+4]&& //MINUTOS
Reloj[2]>=riego2[i+2]&& Reloj[2]<=riego2[i+5])flag2=flag2+1; //SEGUNDOS
// } //RIEGO 1
}
if((diassemana1&DR)>1){ //De lunes Martes y Miercoles
for ( char k=0;k<12;k=k+6){
if(Reloj[0]==riego1[k]&& //HORA
Reloj[1]>=riego1[k+1]&& Reloj[1]<=riego1[k+4]&& //MINUTOS
Reloj[2]>=riego1[k+2]&& Reloj[2]<=riego1[k+5]) flag=flag+1; //SEGUNDOS
if(Reloj[0]==riego2[k]&& //HORA
Reloj[1]>=riego2[k+1]&& Reloj[1]<=riego2[k+4]&& //MINUTOS
Reloj[2]>=riego2[k+2]&& Reloj[2]<=riego2[k+5]) flag2=flag2+1; //SEGUNDOS
}
}
//RIEGO 1
}