Cintillo Institucional

////////////////////////////////////
//Firmware del proyecto HAPA      //
//Desarrollado por Ronal Celaya y //
//Carlos Soto. Fundación CENDITEL //


#include "Wire.h"
#include "LiquidCrystal.h"
//#include <avr/io.h>

#define DS1307 0x68  //Dirección del RTC
#define DS1621 0x48  //Dirección del sensor de temperatura
#define PCF85741 0x20 //Direcciones de los expansores de puertos
#define PCF85742 0x21 //Cambia dependiendo del modelo PCF8574A ó PCF8574

//#define d1 0x10
//#define d2 0x20
//#define d3 0x40
//#define d4 0x80

#define comandoTemp 0x03 //Comando para obtener la temperatura del SHT15
#define comandoHume 0x04 //Comando para obtener la humedad del SHT15

#define pinDatos 9
#define pinReloj 8

#define pinSMH 13 /*Aumenta los segundos, minutos y horas de la Alarma o
la Hora*/
#define pinCamb 12 /*Entra en modo de configuración de la Alarma*/
#define pinCH 11 /*Entra en modo de configuración de la Hora*/
#define pinCA 10 //En modo de configuración de la alarma, elige el día
para la alarma. En modo de visión de la alarma, muestra los días
//#define pinRiego 0

int vecDiaC[14]={2,1,2,2,2,3,2,4,2,5,2,6,2,7}, //Vector donde se guardan
los días de configuración de la alarma. Sigue la lógica
{Lun,check,Mar,check...}
    elecc=2;

unsigned int activAlar=0;//La alarma esta activada(1) o desactivada(0)

byte horasT=19,
     minutosT=45,
//segundosT=0,
     horasC=19,
     minutosC=44;

int diaAC=1,
    diaAT=1;
//segundosC=0;

//byte numbcd,
//     decena,
//     unidad,
//     num4par[2]={0,0};

//byte horasD,
//     horasU,
//     minutosD,
//     minutosU;

//byte segundosC=0, minutosC=0, horasC=12,
//     horasCD=0, horasCU=0, minutosCD=0, minutosCU=0;
//
//byte segundosT=0, minutosT=0, horasT=12,
//     horasTD=0, horasTU=0, minutosTD=0, minutosTU=0;


byte graf[8]={B11111,//   #####
              B10101,//   # # #
              B10101,//   # # #
              B10111,//   # ###
              B10001,//   #   #
              B10001,//   #   #
              B10001,//   #   #
              B11111},//  #####
     check[8]={B00000,//
               B00000,//
               B00001,//      #
               B00010,//     #
               B10100,//  # #
               B01000,//   #
               B00000,//
               B00000},//
      borrar[8]={B00000,
                B00000,
                B00000,
                B00000,
                B00000,
                B00000,
                B00000,
                B00000};

LiquidCrystal lcd(7,6,5,4,3,2);//Definición de los pines del LCD

byte decimal2bcd(byte val)
{
  return ( (val/10*16) + (val%10) ); //Conversión decimal a BCD
}

byte bcd2decimal(byte val)
{
  return ( (val/16*10) + (val%16) ); //Conversión BCD a decimal
}

void ajustarRelojInterno(byte segundos, //Función para ajustar el RTC
                         byte minutos,
                         byte horas,
                         byte diaSemana,
                         byte diaMes,
                         byte mes,
                         byte ano)
{
  Wire.beginTransmission(DS1307); //Envía el comando de inicio
  Wire.send(0x00);                //Se ubica en la dirección de memoria 0
  //Wire.send(0x01);
  Wire.send(decimal2bcd(segundos));  //Envía el valor de los segundos,
  Wire.send(decimal2bcd(minutos));   //minutos,
  Wire.send(decimal2bcd(horas));     //horas,
  Wire.send(decimal2bcd(diaSemana)); //día de la semana, 1, 2, 3,..., 7,
  Wire.send(decimal2bcd(diaMes));    //día del mes, 1, 2, 3,..., 28, 29,...,
  Wire.send(decimal2bcd(mes));       //mes del año,
  Wire.send(decimal2bcd(ano));       //año
  Wire.endTransmission();
}

void leerReloj(byte *segundos, //Función para leer el RTC
               byte *minutos,
               byte *horas,
               byte *diaSemana,
               byte *diaMes,
               byte *mes,
               byte *ano)
{
  Wire.beginTransmission(DS1307);
  Wire.send(0x00);                  //Se ubica en la dirección de memoria 0
  //Wire.send(0x01);
  Wire.endTransmission();           //Reiniciar la transmisión
  Wire.requestFrom(DS1307,7);       //Espera por una respuesta de 7 bytes
  *segundos = bcd2decimal(Wire.receive() & 0x7F); //Lee el valor de los
segundos y los enmascara
  *minutos = bcd2decimal(Wire.receive());         //minutos
  *horas = bcd2decimal(Wire.receive() & 0x3F);    //hora y la enmascara
  *diaSemana = bcd2decimal(Wire.receive());
  *diaMes = bcd2decimal(Wire.receive());
  *mes = bcd2decimal(Wire.receive());
  *ano = bcd2decimal(Wire.receive());
}

/*void leerReloj(byte *minutos,
               byte *horas)
{
  Wire.beginTransmission(DS1307);
  Wire.send(0x01);
  Wire.endTransmission();
  Wire.requestFrom(DS1307,7);
  *minutos = bcd2decimal(Wire.receive());
  *horas = bcd2decimal(Wire.receive() & 0x3F);
}*/

void elegirDia(byte dia) //Función para imprimir el nombre del día
{
  switch(dia)
  {
    case 1:
    lcd.print("Lun.");
    break;

    case 2:
    lcd.print("Mar.");
    break;

    case 3:
    lcd.print("Mie.");
    break;

    case 4:
    lcd.print("Jue.");
    break;

    case 5:
    lcd.print("Vie.");
    break;

    case 6:
    lcd.print("Sab.");
    break;

    case 7:
    lcd.print("Dom.");
    break;
  }
}

void iniciarTemperatura() //Función para la inicialización del sensor de
temperatura
{
  Wire.beginTransmission(DS1621); //Comienza la comunicación
  Wire.send(0xAC);
  Wire.send(0x02);
  Wire.beginTransmission(DS1621);
  Wire.send(0xEE);
  Wire.endTransmission();
  delay(15);
}

void leerTemperatura(int *temp)
{
  Wire.beginTransmission(DS1621);
  Wire.send(0xAA);
  Wire.endTransmission();
  Wire.requestFrom(DS1621,1); //Espera por una respuesta de 1 byte
  *temp = Wire.receive();
}

//void escribirI2C(byte direc, byte dec1, byte uni1, byte dec2, byte uni2)
//Escribe, mediante el expansor de puertos indicado, cada digito en el
respectivo display
//{
//  Wire.beginTransmission(direc);
//  Wire.send(dec1 | d1);
//  Wire.send(uni1 | d2);
//  Wire.send(dec2 | d3);
//  Wire.send(uni2 | d4);
//  Wire.endTransmission();
//}
//
//void uniYdec(byte num) //Separa los valores en decenas y unidades y
escribe los valores por individual
//{
//  numbcd = decimal2bcd(num);
//  unidad = numbcd & 0x0F;
//  decena = (numbcd & 0xF0) >> 4;
//  num4par[0] = unidad;
//  num4par[1]= decena;
//}

/*byte leerExpansor()
{
  Wire.beginTransmission(PCF85741);
  Wire.send(0xFF);
  Wire.endTransmission();
  Wire.requestFrom(PCF85741,1);
  return Wire.receive();
}*/

///////////SHT15////////////////////////
//Funciones para la lectura del SHT15///
int leerDatos (int numBits) //Función para leer datos en forma serial.
{
  int deci = 0;

  for (int i=0; i<numBits; i++)
  {
    //digitalWrite(pinReloj,HIGH);
    PORTB|=_BV(PB0);
    deci = (deci<<1) + digitalRead(pinDatos);
    //digitalWrite(pinReloj,LOW);
    PORTB&=~_BV(PB0);
  }
  return deci;
}

void iniciarTrans()//Rutina para iniciar la transmisión
{
  PORTB|=_BV(PB0);/*digitalWrite(pinReloj,HIGH);*/

  DDRB|=_BV(DDB1);/*pinMode(pinDatos,OUTPUT);*/

  PORTB&=~_BV(PB1);/*digitalWrite(pinDatos,LOW);*/

  PORTB&=~_BV(PB0);/*digitalWrite(pinReloj,LOW);*/

  PORTB|=_BV(PB0);/*digitalWrite(pinReloj,HIGH);*/

  PORTB|=_BV(PB1);/*digitalWrite(pinDatos,HIGH);*/

  PORTB&=~_BV(PB0);/*digitalWrite(pinReloj,LOW);*/
}

void enviarComando(int comando)
{
  //shiftOut(pinDatos, pinReloj, MSBFIRST, comando);
  for(int i=0;i<8;i++){
    digitalWrite(pinDatos,!!(comando & (1<<(7-i)))); //Enviar datos en
forma serial. Tomado de la función shiftOut
    PORTB|=_BV(PB0);
    PORTB&=~_BV(PB0);
  }
  PORTB|=_BV(PB0);/*digitalWrite(pinReloj,HIGH);*/
  DDRB&=~_BV(DDB1);/*pinMode(pinDatos,INPUT);*/

  /*if (digitalRead(pinDatos))
    Serial.println("Error del ACK bajo");*/

  PORTB&=~_BV(PB0);/*digitalWrite(pinReloj,LOW);*/

  /*if (!digitalRead(pinDatos))
    Serial.println("Error del ACK alto");*/
}

int recibirDato()
{
  int datos;

  DDRB&=~_BV(DDB1);/*pinMode(pinDatos,INPUT);*/
  // waitForResult();
  while(bit_is_set(PINB,1)/*digitalRead(pinDatos)*/){
  }

  datos = leerDatos(8) << 8;

  DDRB|=_BV(DDB1);/*pinMode(pinDatos,OUTPUT);*/
  PORTB&=~_BV(PB1);/*digitalWrite(pinDatos,LOW);*/
  PORTB|=_BV(PB0);/*digitalWrite(pinReloj,HIGH);*/
  PORTB&=~_BV(PB0);/*digitalWrite(pinReloj,LOW);*/
  DDRB&=~_BV(PB1);/*pinMode(pinDatos,INPUT);*/

  return datos |= leerDatos(8);
}

float tempe()
{
  int dato;
  float medida;
  iniciarTrans();
  enviarComando(comandoTemp);
  dato=recibirDato();
  return medida=-40.1+0.01*dato;
}

float hume()
{
  int dato;
  float medida;
  //  const float c1=-2.0468,
  //              c2=0.0367,
  //              c3=-1.5955e-6;
  iniciarTrans();
  enviarComando(comandoHume);
  dato=recibirDato();
  return medida=-2.0468+0.0367*dato+-1.5955e-6*dato*dato;
}


void setup()
{
  byte segundos, minutos, horas, diaSemana, diaMes, mes ,ano;
  Wire.begin();

  //pinMode(pinReloj,OUTPUT);
  DDRB|=_BV(DDB0);

  Serial.begin(9600);

  DDRB&=~_BV(DDB5);/*pinMode(pinSMH, INPUT);*/
  DDRB&=~_BV(DDB4);/*pinMode(pinCamb, INPUT);*/
  DDRB&=~_BV(DDB3);/*pinMode(pinCH, INPUT);*/
  DDRB&=~_BV(DDB2);/*pinMode(pinCA, INPUT);*/
  DDRC|=_BV(DDC0);

  //pinMode(pinRiego,OUTPUT);

  lcd.begin(16,2);
  lcd.createChar(0,graf);
  lcd.createChar(1,check);
  lcd.createChar(2,borrar);

  segundos = 0;
  minutos = 43;
  horas = 19;
  diaSemana = 4;
  diaMes = 18;
  mes = 8;
  ano = 10;

  ajustarRelojInterno(segundos, minutos, horas, diaSemana, diaMes, mes ,ano);
  iniciarTemperatura();

}

void loop()
{
  byte segundos, minutos, horas, diaSemana, diaMes, mes ,ano;
  int temp,
      i=0,
      acumH=0,
      acumCamb=0,
      acumA=0,
      acumCA=0,
      acumElec=1;
  float temperatura,
        humedad;


  byte lec;
  lcd.noBlink();
  PORTC|=_BV(PC0);

  ////Mostrar hora y fecha////
  while(acumCamb==0 && acumH==0)
  {
    if(bit_is_set(PINB,4))//if(digitalRead(pinCamb))
    {
      delay(200);
      acumCamb=1;
    }
    if(bit_is_set(PINB,3))//if(digitalRead(pinCH))
    {
      delay(200);
      acumH=1;
    }

    leerReloj(&segundos, &minutos, &horas, &diaSemana, &diaMes, &mes, &ano);
    lcd.clear();
    lcd.setCursor(0,0);
    elegirDia(diaSemana);

    lcd.setCursor(8,0);
    if(diaMes<10)
    {
      lcd.print(0);
      lcd.print(diaMes,DEC);
    }
    else
    {
      lcd.print(diaMes,DEC);
    }
    lcd.print("/");
    if(mes<10)
    {
      lcd.print(0);
      lcd.print(mes,DEC);
    }
    else
    {
      lcd.print(mes,DEC);
    }
    lcd.print("/");
    if(ano<10)
    {
      lcd.print(0);
      lcd.print(ano,DEC);
    }
    else
    {
      lcd.print(ano,DEC);
    }
    lcd.setCursor(5,1);

    if(horas<10)
    {
      lcd.print(0);
      lcd.print(horas,DEC);
    }
    else
    {
      lcd.print(horas,DEC);
    }

    lcd.print(":");

    if(minutos<10)
    {
      lcd.print(0);
      lcd.print(minutos,DEC);
    }
    else
    {
      lcd.print(minutos,DEC);
    }

    /*lcd.print(":");

     if(segundos<10)
     {
     lcd.print(0);
     lcd.print(segundos,DEC);
     }
     else
     {
     lcd.print(segundos,DEC);
     }*/
     if(activAlar==1)
     {
       if((horasC==horas) && (minutosC==minutos) &&
(vecDiaC[(diaSemana<<1)-2]==1))
       {
         //digitalWrite(pinRiego,HIGH);
         //Serial.println("Comienzo");
         PORTC&=~_BV(PC0);
       }
       if((horasT==horas) && (minutosT==minutos))
       {
         //digitalWrite(pinRiego,LOW);
         PORTC|=_BV(PC0);
       }

       if(activAlar==1)
       {
         lcd.setCursor(15,1);
         lcd.write(0);
       }
     }
    delay(20);
  }


  ////Mostrar hora y temperatura del DS1307////
  while(acumCamb==1 && acumH==0)
  {
    if(bit_is_set(PINB,4))//if(digitalRead(pinCamb))
    {
      delay(300);
      acumCamb=2;
      i=0;
    }

    leerTemperatura(&temp);
    leerReloj(&segundos, &minutos, &horas, &diaSemana, &diaMes, &mes, &ano);

    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Temp1:");
    lcd.setCursor(9,0);
    lcd.print((float)temp,2);
    lcd.print((char)223);
    lcd.print("C");

    lcd.setCursor(5,1);

    if(horas<10)
    {
      lcd.print(0);
      lcd.print(horas,DEC);
    }
    else
    {
      lcd.print(horas,DEC);
    }

    lcd.print(":");

    if(minutos<10)
    {
      lcd.print(0);
      lcd.print(minutos,DEC);
    }
    else
    {
      lcd.print(minutos,DEC);
    }

    /*lcd.print(":");

     if(segundos<10)
     {
     lcd.print(0);
     lcd.print(segundos,DEC);
     }
     else
     {
     lcd.print(segundos,DEC);
     }*/

    if(activAlar==1)
    {
      lcd.setCursor(15,1);
      lcd.write(0);
    }
    i++;
    if(i==500)
    {
      acumCamb=0;
      i=0;
    }

    delay(20);
  }


  ////Mostrar hora y temperatura del SHT15////
  while(acumCamb==2 && acumH==0)
  {
    if(bit_is_set(PINB,4))//if(digitalRead(pinCamb))
    {
      delay(200);
      acumCamb=3;
      i=0;
    }

    leerReloj(&segundos, &minutos, &horas, &diaSemana, &diaMes, &mes, &ano);

    temperatura=tempe();

    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Temp2:");
    lcd.setCursor(9,0);
    lcd.print(temperatura,2);
    lcd.print((char)223);
    lcd.print("C");

    lcd.setCursor(5,1);

    if(horas<10)
    {
      lcd.print(0);
      lcd.print(horas,DEC);
    }
    else
    {
      lcd.print(horas,DEC);
    }

    lcd.print(":");

    if(minutos<10)
    {
      lcd.print(0);
      lcd.print(minutos,DEC);
    }
    else
    {
      lcd.print(minutos,DEC);
    }

    /*lcd.print(":");

     if(segundos<10)
     {
     lcd.print(0);
     lcd.print(segundos,DEC);
     }
     else
     {
     lcd.print(segundos,DEC);
     }*/

    if(activAlar==1)
    {
      lcd.setCursor(15,1);
      lcd.write(0);
    }
    i++;
    if(i==12)
    {
      acumCamb=0;
      i=0;
    }
    delay(800);
  }


  ////Mostrar hora y humedad////
  while(acumCamb==3 && acumH==0)
  {
    if(bit_is_set(PINB,4))//if(digitalRead(pinCamb))
    {
      delay(200);
      acumCamb=4;
      i=0;
    }

    leerReloj(&segundos, &minutos, &horas, &diaSemana, &diaMes, &mes, &ano);

    humedad=hume();

    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print("Humedad: ");
    lcd.print(humedad,2);
    lcd.setCursor(15,0);
    lcd.print("%");

    lcd.setCursor(5,1);

    if(horas<10)
    {
      lcd.print(0);
      lcd.print(horas,DEC);
    }
    else
    {
      lcd.print(horas,DEC);
    }

    lcd.print(":");

    if(minutos<10)
    {
      lcd.print(0);
      lcd.print(minutos,DEC);
    }
    else
    {
      lcd.print(minutos,DEC);
    }

    /*lcd.print(":");

     if(segundos<10)
     {
     lcd.print(0);
     lcd.print(segundos,DEC);
     }
     else
     {
     lcd.print(segundos,DEC);
     }*/

    if(activAlar==1)
    {
      lcd.setCursor(15,1);
      lcd.write(0);
    }
    i++;
    if(i==12)
    {
      acumCamb=0;
      i=0;
    }
    delay(800);
  }


  ////Ver Riego////
  while(acumCamb==4 && acumH==0)
  {
    if(bit_is_set(PINB,4))//if(digitalRead(pinCamb))
    {
      delay(300);
      acumCamb=5;
      i=0;
    }

    lcd.noBlink();
    lcd.clear();
    lcd.setCursor(2,0);
    lcd.print("Config. del");
    lcd.setCursor(5,1);
    lcd.print("Riego");
    delay(2000);

    while(acumCamb==4)
    {
      if(bit_is_set(PINB,4))//if(digitalRead(pinCamb))
      {
        delay(300);
        acumCamb=5;
        i=0;
      }

      if(bit_is_set(PINB,3))//if(digitalRead(pinCA))
      {
        delay(300);
        acumCA=1;
      }

      lcd.noBlink();
      lcd.clear();
      lcd.setCursor(3,0);
      lcd.print("Comienza:");
      lcd.setCursor(0,1);
      if(horasC<10)
      {
        lcd.print(0);
        lcd.print(horasC,DEC);
      }
      else
      {
        lcd.print(horasC,DEC);
      }
      lcd.print(":");
      if(minutosC<10)
      {
        lcd.print(0);
        lcd.print(minutosC,DEC);
      }
      else
      {
        lcd.print(minutosC,DEC);
      }

      if(activAlar==1)
      {
        lcd.setCursor(5,1);
        lcd.write(0);
      }

      lcd.setCursor(11,1);

      if(bit_is_set(PINB,2))
      {
        delay(300);
        acumElec++;
        if(acumElec>7)
        {
          acumElec=1;
        }
      }

      lcd.write(vecDiaC[(acumElec<<1)-2]);
      elegirDia(vecDiaC[(acumElec<<1)-1]);
//      switch(acumElec)
//      {
//        case 1:
//        lcd.write(vecDia[0]);
//        elegirDia(vecDia[1]);
//        break;
//
//        case 2:
//        lcd.write(vecDia[2]);
//        elegirDia(vecDia[3]);
//        break;
//
//        case 3:
//        lcd.write(vecDia[4]);
//        elegirDia(vecDia[5]);
//        break;
//
//        case 4:
//        lcd.write(vecDia[6]);
//        elegirDia(vecDia[7]);
//        break;
//
//        case 5:
//        lcd.write(vecDia[8]);
//        elegirDia(vecDia[9]);
//        break;
//
//        case 6:
//        lcd.write(vecDia[10]);
//        elegirDia(vecDia[11]);
//        break;
//
//        case 7:
//        lcd.write(vecDia[12]);
//        elegirDia(vecDia[13]);
//        break;
//      }
      while(acumCA==1)
      {
        if(bit_is_set(PINB,3))//if(digitalRead(pinCA))
        {
          delay(300);
          acumCA=2;
        }
        lcd.setCursor(11,1);
        lcd.blink();

        if(bit_is_set(PINB,5))
        {
          delay(300);
          //lcd.print(char(254));
          //lcd.setCursor(12,1);
          diaAC++;
          lcd.write(vecDiaC[(diaAC<<1)-2]);
          if(diaAC>7)
          {
            diaAC=1;
          }
          elegirDia(diaAC);
        }
        if(bit_is_set(PINB,2))
        {
          delay(300);
          elecc++;
          if(elecc>2)
          {
            elecc=1;
          }
          lcd.write(elecc);

          vecDiaC[(diaAC<<1)-2]=elecc;
          vecDiaC[(diaAC<<1)-1]=diaAC;
        }
      }

      while(acumCA==2)
      {
        if(bit_is_set(PINB,3))//if(digitalRead(pinCA))
        {
          delay(300);
          acumCA=3;
        }

        lcd.setCursor(5,1);
        lcd.blink();

        if(bit_is_set(PINB,5))//if(digitalRead(pinSMH))
        {
          delay(300);
          activAlar++;

          if(activAlar==1)
          {
            lcd.write(0);
          }
          else if(activAlar==2)
          {
            lcd.print(char(254));
            activAlar=0;
          }
        }
      }

      while(acumCA==3)
      {
        if(bit_is_set(PINB,3))//if(digitalRead(pinCA))
        {
          delay(300);
          acumCA=4;
        }

        lcd.setCursor(4,1);
        lcd.blink();

        if(bit_is_set(PINB,5))//if(digitalRead(pinSMH))
        {
          delay(200);
          minutosC++;
          lcd.setCursor(3,1);
          if(minutosC>59)
          {
            minutosC=0;
          }
          if(minutosC<10)
          {
            lcd.print(0);
            lcd.print(minutosC,DEC);
          }
          else
          {
            lcd.print(minutosC,DEC);
          }
        }
      }

      while(acumCA==4)
      {
        if(bit_is_set(PINB,3))//if(digitalRead(pinCA))
        {
          delay(300);
          acumCA=0;
        }

        lcd.setCursor(1,1);
        lcd.blink();

        if(bit_is_set(PINB,5))//if(digitalRead(pinSMH))
        {
          delay(200);
          horasC++;
          lcd.setCursor(0,1);
          if(horasC>23)
          {
            horasC=0;
          }
          if(horasC<10)
          {
            lcd.print(0);
            lcd.print(horasC,DEC);
          }
          else
          {
            lcd.print(horasC,DEC);
          }
        }
      }
      i++;
      if(i==500)
      {
        acumCamb=0;
        i=0;
      }
      delay(20);
    }
  }


  while(acumCamb==5 && acumH==0)
  {
    if(bit_is_set(PINB,4))//if(digitalRead(pinCamb))
    {
      delay(300);
      acumCamb=0;
      i=0;
    }

    while(acumCamb==5)
    {
      if(bit_is_set(PINB,4))//if(digitalRead(pinCamb))
      {
        delay(300);
        acumCamb=0;
      }

      if(bit_is_set(PINB,3))//if(digitalRead(pinCA))
      {
        delay(300);
        acumCA=1;
      }

      lcd.noBlink();
      lcd.clear();
      lcd.setCursor(4,0);
      lcd.print("Termina:");
      lcd.setCursor(0,1);
      if(horasT<10)
      {
        lcd.print(0);
        lcd.print(horasT,DEC);
      }
      else
      {
        lcd.print(horasT,DEC);
      }
      lcd.print(":");
      if(minutosT<10)
      {
        lcd.print(0);
        lcd.print(minutosT,DEC);
      }
      else
      {
        lcd.print(minutosT,DEC);
      }

      if(activAlar==1)
      {
        lcd.setCursor(5,1);
        lcd.write(0);
      }

      lcd.setCursor(11,1);
      if(bit_is_set(PINB,2))
      {
        delay(300);
        acumElec++;
        if(acumElec>7)
        {
          acumElec=1;
        }
      }

      lcd.write(vecDiaC[(acumElec<<1)-2]);
      elegirDia(vecDiaC[(acumElec<<1)-1]);

//      while(acumCA==1)
//      {
//        if(bit_is_set(PINB,3))//if(digitalRead(pinCA))
//        {
//          delay(300);
//          acumCA=2;
//        }
//        lcd.setCursor(12,1);
//        lcd.blink();
//
//        if(bit_is_set(PINB,5))
//        {
//          delay(300);
//          diaAT++;
//          lcd.write(vecDiaT[(diaAT<<1)-2]);
//          if(diaAT>7)
//          {
//            diaAT=1;
//          }
//          elegirDia(diaAT);
//        }
//        if(bit_is_set(PINB,2))
//        {
//          delay(300);
//          elecc++;
//          if(elecc>2)
//          {
//            elecc=1;
//          }
//          lcd.write(elecc);
//
//          vecDiaC[(diaAT<<1)-2]=elecc;
//          vecDiaC[(diaAT<<1)-1]=diaAT;
//        }
//      }

      while(acumCA==1)
      {
        if(bit_is_set(PINB,3))//if(digitalRead(pinCA))
        {
          delay(300);
          acumCA=2;
        }

        lcd.setCursor(4,1);
        lcd.blink();

        if(bit_is_set(PINB,5))//if(digitalRead(pinSMH))
        {
          delay(200);
          minutosT++;

          lcd.setCursor(3,1);

          if(minutosT>59)
          {
            minutosT=0;
          }
          if(minutosT<10)
          {
            lcd.print(0);
            lcd.print(minutosT,DEC);
          }
          else
          {
            lcd.print(minutosT,DEC);
          }
        }
      }

      while(acumCA==2)
      {
        if(bit_is_set(PINB,3))//if(digitalRead(pinCA))
        {
          delay(300);
          acumCA=0;
        }

        lcd.setCursor(1,1);
        lcd.blink();

        if(bit_is_set(PINB,5))//if(digitalRead(pinSMH))
        {
          delay(200);
          horasT++;

          lcd.setCursor(0,1);
          if(horasT>23)
          {
            horasT=0;
          }
          if(horasT<10)
          {
            lcd.print(0);
            lcd.print(horasT,DEC);
          }
          else
          {
            lcd.print(horasT,DEC);
          }
        }
      }
      i++;
      if(i==500)
      {
        acumCamb=0;
        i=0;
      }
      delay(20);
    }
  }


  ////Configuración de la hora////
  while(acumH==1)
  {
    if(bit_is_set(PINB,3))//if(digitalRead(pinCH))
    {
      delay(300);
      Wire.beginTransmission(DS1307);
      Wire.send(0x03);
      Wire.send(decimal2bcd(diaSemana));
      // Wire.send(decimal2bcd(horas));
      Wire.endTransmission();
      acumH=2;
    }
    lcd.setCursor(0,0);
    lcd.blink();
    if(bit_is_set(PINB,5))//if(digitalRead(pinSMH))
    {
      delay(300);
      diaSemana++;
      if(diaSemana>7)
      {
        diaSemana=1;
      }
      elegirDia(diaSemana);
    }
  }


  while(acumH==2)
  {
    unsigned int resto=0;
    if(bit_is_set(PINB,3))//if(digitalRead(pinCH))
    {
      delay(300);
      Wire.beginTransmission(DS1307);
      Wire.send(0x04);
      Wire.send(decimal2bcd(diaMes));
      // Wire.send(decimal2bcd(horas));
      Wire.endTransmission();
      acumH=3;
    }
    lcd.setCursor(9,0);
    lcd.blink();
    if(bit_is_set(PINB,5))//if(digitalRead(pinSMH))
    {
      delay(300);
      diaMes++;
      if(mes==4 || mes==6 || mes==9 || mes==11)
      {
        if(diaMes>30)
        {
          diaMes=1;
        }
      }
      else if(mes==2)
      {
        if(ano%4==0)
        {
          if(diaMes>29)
          {
            diaMes=1;
          }
        }
        else
        {
          if(diaMes>28)
          {
            diaMes=1;
          }
        }
      }
      else
      {
        if(diaMes>31)
        {
          diaMes=1;
        }
      }
      lcd.setCursor(8,0);
      if(diaMes<10)
      {
        lcd.print(0);
        lcd.print(diaMes,DEC);
      }
      else
      {
        lcd.print(diaMes,DEC);
      }
    }
  }


  while(acumH==3)
  {
    if(bit_is_set(PINB,3))//if(digitalRead(pinCH))
    {
      delay(300);
      Wire.beginTransmission(DS1307);
      Wire.send(0x05);
      Wire.send(decimal2bcd(mes));
      // Wire.send(decimal2bcd(horas));
      Wire.endTransmission();
      acumH=4;
    }
    lcd.setCursor(12,0);
    lcd.blink();
    if(bit_is_set(PINB,5))//if(digitalRead(pinSMH))
    {
      delay(300);
      mes++;
      if(mes>12)
      {
        mes=1;
      }
      lcd.setCursor(11,0);
      if(mes<10)
      {
        lcd.print(0);
        lcd.print(mes,DEC);
      }
      else
      {
        lcd.print(mes,DEC);
      }
    }
  }

  while(acumH==4)
  {
    if(bit_is_set(PINB,3))//if(digitalRead(pinCH))
    {
      delay(300);
      Wire.beginTransmission(DS1307);
      Wire.send(0x06);
      Wire.send(decimal2bcd(ano));
      // Wire.send(decimal2bcd(horas));
      Wire.endTransmission();
      acumH=5;
    }
    lcd.setCursor(15,0);
    lcd.blink();
    if(bit_is_set(PINB,5))//if(digitalRead(pinSMH))
    {
      delay(300);
      ano++;
      if(ano>99)
      {
        ano=1;
      }
      lcd.setCursor(14,0);
      if(ano<10)
      {
        lcd.print(0);
        lcd.print(ano,DEC);
      }
      else
      {
        lcd.print(ano,DEC);
      }
    }
  }

  while(acumH==5)
  {
    if(bit_is_set(PINB,3))//if(digitalRead(pinCH))
    {
      delay(300);
      Wire.beginTransmission(DS1307);
      Wire.send(0x00);
      Wire.send(0);
      Wire.send(decimal2bcd(minutos));
      // Wire.send(decimal2bcd(horas));
      Wire.endTransmission();
      acumH=6;
    }
    lcd.setCursor(9,1);
    lcd.blink();
    if(bit_is_set(PINB,5))//if(digitalRead(pinSMH))
    {
      delay(300);
      minutos++;
      if(minutos>59)
      {
        minutos=0;
        //horas++;
      }
      //      Wire.beginTransmission(DS1307);
      //      Wire.send(0x01);
      //      Wire.send(decimal2bcd(minutos));
      //     // Wire.send(decimal2bcd(horas));
      //      Wire.endTransmission();
      // leerReloj(&minutos, &horas);
      lcd.setCursor(8,1);

      //      if(horas<10)
      //      {
      //        lcd.print(0);
      //        lcd.print(horas,DEC);
      //      }
      //      else
      //      {
      //        lcd.print(horas,DEC);
      //      }
      //      lcd.print(":");

      if(minutos<10)
      {
        lcd.print(0);
        lcd.print(minutos,DEC);
      }
      else
      {
        lcd.print(minutos,DEC);
      }

      //      lcd.print(":");
      //
      //      if(segundos<10)
      //      {
      //        lcd.print(0);
      //        lcd.print(segundos,DEC);
      //      }
      //      else
      //      {
      //        lcd.print(segundos,DEC);
      //      }

      if(activAlar==1)
      {
        lcd.setCursor(15,1);
        lcd.write(0);
      }
    }
  }

  while(acumH==6)
  {
    if(bit_is_set(PINB,3))//if(digitalRead(pinCH))
    {
      delay(300);
      Wire.beginTransmission(DS1307);
      Wire.send(0x00);
      Wire.send(0);
      Wire.beginTransmission(DS1307);
      Wire.send(0x02);
      Wire.send(decimal2bcd(horas));
      Wire.endTransmission();
      acumH=0;
    }
    lcd.setCursor(6,1);
    lcd.blink();
    if(bit_is_set(PINB,5))//if(digitalRead(pinSMH))
    {
      delay(300);
      horas++;
      if(horas>23)
      {
        horas=0;
      }
      //      Wire.beginTransmission(DS1307);
      //      Wire.send(0x02);
      //      Wire.send(decimal2bcd(horas));
      //      Wire.endTransmission();
      //      leerReloj(&minutos, &horas);
      lcd.setCursor(5,1);

      if(horas<10)
      {
        lcd.print(0);
        lcd.print(horas,DEC);
      }
      else
      {
        lcd.print(horas,DEC);
      }
      //      lcd.print(":");
      //
      //      if(minutos<10)
      //      {
      //        lcd.print(0);
      //        lcd.print(minutos,DEC);
      //      }
      //      else
      //      {
      //        lcd.print(minutos,DEC);
      //      }
      //
      //      lcd.print(":");
      //
      //      if(segundos<10)
      //      {
      //        lcd.print(0);
      //        lcd.print(segundos,DEC);
      //      }
      //      else
      //      {
      //        lcd.print(segundos,DEC);
      //      }

      if(activAlar==1)
      {
        lcd.setCursor(15,1);
        lcd.write(0);
      }
    }
  }

  ////Configurar riego////

}

hapa00 (última edición 2011-04-05 16:59:40 efectuada por _desactivada_csoto)