no hay narices a que ejecute una funcion segun la hora.... una ayudita, porfa!

3 Abr 2012
686
Beniaján
Provincia
Murcia
aqui tengo este codigo, no creo que este bien mas que los ejemplos que he medio adaptao.... pero bueno...
os cuento como va:
pretendo controlar un acuario de 20 litros (dulce, esto es un ensayo para el marino) donde voy a monitorizar hora, temperatura del agua, temperatura de la pantalla, dimeo luz de luna (dos led guarros de 5mm con resistencias directos a una patilla pwm del arduino) y dimeo luz de dia (se supone que primero arranco la fuente y luego con un tip141 hago el dimeo...).

La pantalla es una 20x4 lcd con mochila i2c, un reloj rtc ds1307, dos sondas ds18b20, una placa de dos reles y un boton... el tip y los leds de luna aun no los he puesto ya que esta todo en una breadboard para dejarlo todo probado...

y ahora viene cuando la matan... ¿que narices hago y como para que se dispare el dimeo cuando yo quiero/necesito?

de igual forma si veis cosas que haya obviado o que no necesite.... osea... esto como si fuera vuestro!


Código:
#include <EEPROM.h>//incluyo un byte en la eeprom por seguridad, si se va la luz el arduino sabe que luz esta encendida.
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <Time.h>
#include <DS1307RTC.h>


#define ONE_WIRE_BUS 12 //sondas al pin 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x3f,20,4);
boolean rele1status;//estado del rele que activa la fuente de los leds
byte tempsonda = 12;
float temp;
byte dim1 = 0;
byte dim2 = 0;
byte rele1 = 8;//pin rele fuente leds
byte rele2 = 9;//segundo rele (aun sin funcion)
byte boton = 7;
byte luzLcd =  11; 
byte estadoBoton = 0;
byte dimeoPantalla = 6;
byte dimeoLuna = 5;
byte hora = 0;
byte minutos = 0;
byte segundos = 0;
int direccion = 1;
byte controlLuz = 0;



void setup() {
lcd.begin(20,4);
lcd.backlight();
Serial.begin(9600);
 pinMode(rele1, OUTPUT);
 pinMode(rele2, OUTPUT);
 digitalWrite(rele1, HIGH);
 digitalWrite(rele2, HIGH);
 pinMode(tempsonda, INPUT);
 rele1status = false;
 pinMode(luzLcd, OUTPUT);
 pinMode(boton, INPUT);
 pinMode(dimeoPantalla, OUTPUT);
 pinMode(dimeoLuna, OUTPUT);


}

void loop() {
  
 tmElements_t tm;//contenedor de la hora
 RTC.read(tm);//leemos la hora
 estadoBoton = digitalRead(boton);//leemos el estado del boton
 hora = (tm.Hour);
 minutos = (tm.Minute);
 segundos = (tm.Second);
 
  if (estadoBoton == HIGH){//para no tener la pantalla siempre encendida vamos a hacer que cietros procesos y la luz de la pantalla solo se muestren cuando presionamos un boton.
      lcd.init();//limpiamos la pantalla      
      for (int i=0; i<=255; i++)// encendemos la luz del lcd mediante pwm.
      {
        analogWrite(luzLcd,i);
        delay(10);
      }
      lcd.print("Jacinto's Sluts Club");
      delay(2000);
      lcd.init();
      for (int a=0; a<=15; a++)//tiempo que va a estar la pantalla encendida y mostrando info.
      {
        peluco();//mostramos la hora
        luz();//indicamos si esta la luz de dia o la de luna
        temperatura1();//mostramos la temperatura del agua
        temperatura2();//mostramos la temperatura de la pantalla
      }
      for (int i=255; i>=0; i--) //apagamos la luz del lcd
      {
      analogWrite(luzLcd,i);
      delay(10);
      }
      lcd.init();//limpiamos la pantalla
    
    }else {
      if ((hora, DEC) == 0){
      
        if( (minutos, DEC) == 53){
          
             EEPROM.write(direccion,1);
             dimeoAmanecer();
          
        }
      }
      if ((hora, DEC) == 0 && (minutos, DEC) == 55){
          EEPROM.write(direccion,2);
          dimeoAnochecer();
      }
      if((hora, DEC) == 0 && (minutos, DEC) == 57){
        EEPROM.write(direccion,3);
        dimeoLunaInicio();
        }
      if((hora, DEC) == 0 && (minutos, DEC) == 59){
        EEPROM.write(direccion,4);
        dimeoLunaFin();
        }
    }
    switch (EEPROM.read(direccion)){
      case '1':
        digitalWrite(dimeoPantalla, HIGH);
      break;
      case '2':
        digitalWrite(dimeoPantalla, LOW);
        digitalWrite(dimeoLuna, LOW);
      break;
      case '3':
        digitalWrite(dimeoLuna, HIGH);
      break;
      case '4':
        digitalWrite(dimeoPantalla, LOW);
        digitalWrite(dimeoLuna, LOW);
      break;
    }
      
 }

 


void print2digits(int number) {
  if (number >= 0 && number < 10) {
    lcd.write('0');
  }
  lcd.print(number);
}
void temperatura1()
{
  
   sensors.requestTemperatures();
   delay(50);
   temp = sensors.getTempCByIndex(0);
   lcd.setCursor(0,2);
   lcd.print("T.Agua:");
   lcd.print(temp);   
  
}
void temperatura2()
{
  
   sensors.requestTemperatures();
   delay(50);
   temp = sensors.getTempCByIndex(1);
   lcd.setCursor(0,3);
   lcd.print("T. Pantalla:");
   lcd.print(temp);        
  
}
void peluco(){
  tmElements_t tm;
  if (RTC.read(tm)) {
    lcd.setCursor(0,0);
    print2digits(tm.Hour);
    lcd.write(':');
    print2digits(tm.Minute);
    lcd.write(':');
    print2digits(tm.Second);
    lcd.write(' ');
    lcd.print(tm.Day);
    lcd.write('/');
    lcd.print(tm.Month);
    lcd.write('/');
    lcd.print(tmYearToCalendar(tm.Year));

    
  } else {
    if (RTC.chipPresent()) {
      lcd.setCursor(0,1);
      lcd.println("Kawendioleeeeeeeee!!!");
      lcd.println("pon el pijo este en hora copon! que se le ha jodio la pila!");
    } else {
      lcd.println("Acho, esto no furrula....");
    }
  }
}
void luz(){
  if (rele1status == true){
      lcd.setCursor(0,1);
      lcd.print("Luz diurna activa");
      
      
    }else{
    lcd.setCursor(0,1);
    lcd.print("Luz noche activa");
    
    }
}
void dimeoAmanecer(){//encendemos la luz dia 
    digitalWrite(rele1, LOW);//activamos el rele que enciende la fuente de los led de dia (en mi caso llevandolo a un valor bajo)
    rele1status = true;//para la comprobacion del mensaje que se imprimira en pantalla al pulsar el boton
    
    for (int i=0; i<=255; i++)
  {
   analogWrite(dimeoPantalla,i);
   delay(100);
  }
  
}
void dimeoAnochecer(){//apagamos la luz dia, primero dimeo y luego la fuente de forma fisica
    for (int i=255; i>=0; i--) 
    {
    analogWrite(dimeoPantalla,i);
    delay(100);
    }
     digitalWrite(rele1, HIGH);//primero hacemos un dimeo hasta 0 y luego apagamos la fuente de los leds de dia (es una tonteria que trabaje en vacio)
   rele1status = false;//para la comprobacion del mensaje que se imprimira en pantalla al pulsar el boton
  
}
void dimeoLunaInicio(){//encendemos la luz de luna
  
    for (int i=0; i<=255; i++)
  {
   analogWrite(dimeoLuna,i);
   delay(100);
  }
  
 }
void dimeoLunaFin(){//apagamos la luz de luna
   for (int i=255; i>=0; i--) 
    {
    analogWrite(dimeoLuna,i);
    delay(100);
    }
    
}

un saludo y gracias de antemano!
 
3 Abr 2012
686
Beniaján
Provincia
Murcia
ea! pos ya hay narices!!! solo he tenido que cambiar de libreria para el rtc e hincharme a ejecutar y praticar con ejemplos, pero ya lo tengo...

decir que para un nano va de coña, solo habria que añadirle un boton mas (unido a una boya...) para usar el segundo rele (que yo no uso puesto que los leds de luna los alimento desde el arduino, ya que solo son 4....) como relleno....

el que lo quiera usar, que lo use, el que lo quiera corregir, que lo corrija (y me lo diga, que asi aprendo mas) y to eso....
solo habria que modificar los valores de dimeo a los que considereis oportunos, los de hora de inicio y fin de cada ciclo lo mismo... y yo que se! si ni se de esto ni na!


eso si, con esto estoy mas cerca de montar el cubo... esto es un codigo de prueba que voy a usar en dos 20 litros dulces... el del nano va a ser parecido al atreef cbox de jmcadsl, que me ha dao mucha envidia... (a ver si me atrevo a ponerle un tft tactil ejejejeje) pero me ha servido para aprender a manejarme con el arduino, que es mu cabronias y se deja poco....


Código:
#include <EEPROM.h>//incluyo un byte en la eeprom por seguridad, si se va la luz el arduino sabe que luz debe estar encendida, si la de dia o la de luna.
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <Time.h>
#include <RTClib.h>


#define ONE_WIRE_BUS 12 //sondas al pin 12
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x3f,20,4);
boolean rele1status;//estado del rele que activa la fuente de los leds
byte tempsonda = 12;
float temp;
byte dim1 = 0;
byte dim2 = 0;
byte rele1 = 8;//pin rele fuente leds
byte rele2 = 9;//segundo rele (aun sin funcion)
byte boton = 7;
byte luzLcd =  11; 
byte estadoBoton = 0;
byte dimeoPantalla = 6;
byte dimeoLuna = 5;
int direccion = 1;
byte controlLuz = 0;
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};



void setup() {
lcd.begin(20,4);
lcd.backlight();
rtc.begin();
Serial.begin(57600);
 pinMode(rele1, OUTPUT);
 pinMode(rele2, OUTPUT);
 digitalWrite(rele1, HIGH);
 digitalWrite(rele2, HIGH);
 pinMode(tempsonda, INPUT);
 rele1status = false;
 pinMode(luzLcd, OUTPUT);
 pinMode(boton, INPUT);
 pinMode(dimeoPantalla, OUTPUT);
 pinMode(dimeoLuna, OUTPUT);
switch (EEPROM.read(direccion)){
      case '1':
        digitalWrite(dimeoPantalla, HIGH);
      break;
      case '2':
        digitalWrite(dimeoPantalla, LOW);
        digitalWrite(dimeoLuna, LOW);
      break;
      case '3':
        digitalWrite(dimeoLuna, HIGH);
      break;
      case '4':
        digitalWrite(dimeoPantalla, LOW);
        digitalWrite(dimeoLuna, LOW);
      break;
    }

}

void loop() {
  
 estadoBoton = digitalRead(boton);//leemos el estado del boton
 
 
  if (estadoBoton == HIGH){//para no tener la pantalla siempre encendida vamos a hacer que cietros procesos y la luz de la pantalla solo se muestren cuando presionamos un boton.
      lcd.init();//limpiamos la pantalla      
      for (int i=0; i<=255; i++)// encendemos la luz del lcd mediante pwm.
      {
        analogWrite(luzLcd,i);
        delay(5);
      }
      lcd.init();
      for (int a=0; a<=15; a++)//tiempo que va a estar la pantalla encendida y mostrando info.
      {
        peluco();//mostramos la hora
        luz();//indicamos si esta la luz de dia o la de luna
        temperatura1();//mostramos la temperatura del agua
        temperatura2();//mostramos la temperatura de la pantalla
      }
      lcd.init();
      for (int i=255; i>=0; i--) //apagamos la luz del lcd
      {
      analogWrite(luzLcd,i);
      delay(5);
      }
      
    
    }else {
      DateTime now = rtc.now();
      if (now.hour() == 12  && now.minute() == 19){
        EEPROM.write(direccion,1);
        dimeoAmanecer();
      }
      if (now.hour() == 12 && now.minute() == 20){
          EEPROM.write(direccion,2);
          dimeoAnochecer();
      }
      if(now.hour() == 12 && now.minute() == 21){
        EEPROM.write(direccion,3);
        dimeoLunaInicio();
        }
      if(now.hour() == 12 && now.minute() == 22){
        EEPROM.write(direccion,4);
        dimeoLunaFin();
        }
    }
    
    
 }

 

void temperatura1()
{
  
   sensors.requestTemperatures();
   delay(50);
   temp = sensors.getTempCByIndex(0);
   lcd.setCursor(0,2);
   lcd.print("T.Agua:");
   lcd.print(temp);   
  
}
void temperatura2()
{
  
   sensors.requestTemperatures();
   delay(50);
   temp = sensors.getTempCByIndex(1);
   lcd.setCursor(0,3);
   lcd.print("T. Pantalla:");
   lcd.print(temp);        
  
}
void peluco(){
  if ( rtc.isrunning()){
  DateTime now = rtc.now();
  lcd.setCursor(0,0);
  lcd.print(now.hour(), DEC);
  lcd.print(':');
  lcd.print(now.minute(), DEC);
  lcd.print(':');
  lcd.print(now.second(), DEC);
  lcd.print(' ');
  lcd.print(now.day(),DEC);
  lcd.print('/');
  lcd.print(now.month(), DEC);
  lcd.print('/');
  lcd.print(now.year(), DEC);
  
    
  } else {
    if (! rtc.isrunning()) {
      lcd.setCursor(0,1);
      lcd.println("Kawendioleeeeeeeee!!!");
      lcd.println("pon el pijo este en hora copon! que se le ha jodio la pila!");
    } else {
      lcd.println("Acho, esto no furrula....");
    }
  }
}
void luz(){
  if (rele1status == true){
      lcd.setCursor(0,1);
      lcd.print("Luz diurna activa");
      
      
    }else{
    lcd.setCursor(0,1);
    lcd.print("Luz noche activa");
    
    }
}
void dimeoAmanecer(){//encendemos la luz dia 
    digitalWrite(rele1, LOW);//activamos el rele que enciende la fuente de los led de dia (en mi caso llevandolo a un valor bajo)
    rele1status = true;//para la comprobacion del mensaje que se imprimira en pantalla al pulsar el boton
    
    for (int i=0; i<=255; i++)
  {
   analogWrite(dimeoPantalla,i);
   delay(100);
  }
  
}
void dimeoAnochecer(){//apagamos la luz dia, primero dimeo y luego la fuente de forma fisica
    for (int i=255; i>=0; i--) 
    {
    analogWrite(dimeoPantalla,i);
    delay(100);
    }
     digitalWrite(rele1, HIGH);//primero hacemos un dimeo hasta 0 y luego apagamos la fuente de los leds de dia (es una tonteria que trabaje en vacio)
   rele1status = false;//para la comprobacion del mensaje que se imprimira en pantalla al pulsar el boton
  
}
void dimeoLunaInicio(){//encendemos la luz de luna
  
    for (int i=0; i<=255; i++)
  {
   analogWrite(dimeoLuna,i);
   delay(100);
  }
  
 }
void dimeoLunaFin(){//apagamos la luz de luna
   for (int i=255; i>=0; i--) 
    {
    analogWrite(dimeoLuna,i);
    delay(100);
    }
    
}


Edito: Acabo de darme cuenta de una cosa: la estructura switch con la que compruebo el estado del byte de control en la eeprom debe ir en el void setup en vez de en el void loop, ya que lo ejecutas solo si se va la corriente eléctrica...

Un saludo.
 
Última edición:

jmcadsl

Miembro Honorífico
17 Ene 2010
1.023
España
Provincia
Madrid
Enhorabuena!!
No hay como darle unas cuantas vueltas para salir de los problemas ....es así como más se aprende.
Efectivamente el tema de las librerías es algo que puede dar problemas a veces, incluso cuando cambian de versión del IDE de arduino hay librerías que dejan de funcionar.

Mi consejo: Siempre probar el hardware con la librería que especifique el fabricante y probar que todo esta ok con los ejemplos que suelen incluir estas librerías, a partir de aquí podemos incluirlo en nuestro programa.

Un saludo.
 
3 Abr 2012
686
Beniaján
Provincia
Murcia
Cierto!

He tenido que bajar a 1.6.5 porque cuando actualicé a 1.6.6 se me actualizaron varias librerías y por ejemplo el lcd no me mostraba bien el texto a través de i2c...

un saludo.
 
Arriba