[Solucionado] Riego automatico y problema con DS1307

Buenas, antes de nada me presento, ya que soy nuevo en el foro. Me llamo fran. soy de barcelona y tengo 28 años. Hace cosa de un mes compre un Arduino starter kit y he empezado a hacer algunos proyectos.

Estoy haciendo el típico sistema de riego que todo el mundo tiene. He introducido un oled para hacerlo todo mas cómodo y programable. Os enseño unas fotos.

Standby:


Menu de configuración:

Hora de riego:

Cambio de hora:

Bueno, hasta aquí todo funciona perfectamente, me desplazo por el menu, cambio todos los parámetros sin problema. etc...

Tengo un ds1307 configurado con la hora del pc, el caso es que después de buscar bastante información sobre el ds1307 no se cómo cambiarle la hora. Se puede 'sincronizar' haciendole un setTime(hr,min,sec,day,month,yr), pero cuando reinicio el Arduino este setTime se esfuma,,, y vuelve a la hora que tiene configurada desde el 1r script que le cargué.

Se que seguramente he pasado algo por alto... haber si alguien puede ayudarme y decirme como cambiarle la hora. Uso las librerías DS1307RTC.h y Time.h

Gracias.

Hola compañero.
Aunque no te pueda ayudar, porque también soy nuevo en este mundillo, si que te agradecería que colgaras el programa y los esquemas.
No solo sera mas fácil ayudarte, sino que también podremos sacar ideas para otros proyectos parecidos.
Para eso se creó Arduino.
Un saludo y felicidades por tu ingenio.
Saludos
Peter.

Aunque no te pueda ayudar, porque también soy nuevo en este mundillo, si que te agradecería que colgaras el programa y los esquemas.

no se a que te refieres con 'los esquemas', pero aqui tienes el codigo,.. esta todo a medias pero bueno, espero ke te inspire :stuck_out_tongue:

#include <Time.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <EEPROM.h> // 170: humedad  171: Hora de riego  172: minuto de riego  173: duracion del riego
#include <DS1307RTC.h>

#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 13
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

int menu, menuSel;
int pulsUp = 2;
int pulsDown = 3;
int pulsEnter = 4;
int humedad = EEPROM.read(170);
int rHora = EEPROM.read(171);
int rMinuto = EEPROM.read(172);
int duracion = EEPROM.read(173);
int setRiegoStage = 1;
long count = 0;
int cCStage, cCHora, cCMinuto, cCDia, cCMes, cCAno;

void setup()   {
  Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC);
  setSyncProvider(RTC.get);

  for (int x = 2; x <= 4; x++) {
    pinMode(x, INPUT);
  }
  //setRiego(rHora, rMinuto, setRiegoStage);
  //setRiegoStage = 1;

  principal(rHora, rMinuto);

  //menuSel = 1;
  //root();

  //clockChange();
}


void loop() {
  if (menu == 0) {
    unsigned long currentMillis = millis();
    if (currentMillis - count > 1000) {
      count = currentMillis;
      principal(rHora, rMinuto);
    }
  }

  buttonWorks();
}



void buttonWorks(){
  if (digitalRead(pulsEnter) == HIGH) { // BOTON ENTER EN EL MENU PRIONCIPAL
    if (menu == 0) {
      menuSel = 1;
      root();
      delay(500);
      goto paro;
    }
    if (menu == 1) {         //BOTONES TRABAJANDO EN EL MENU 1
      if (menuSel == 1) {
        //cCHora = hour(); cCMinuto = minute(); cCDia = day(); cCMes = month(); cCAno = year();
        clockChange();
        delay(100);
        goto paro;
      }
      if (menuSel == 2) {
        setRiego(rHora, rMinuto, setRiegoStage);
        setRiegoStage = 1;
        delay(250);
        goto paro;
      }
      if (menuSel == 3) {
        setHumedad(humedad);
        delay(250);
        goto paro;

      }
      if (menuSel == 4) {



      }
      if (menuSel == 5) {
        menuSel == 1;
        menu == 0;
        principal(rHora, rMinuto);
        delay(500);
        goto paro;
      }
    }

    if (menu == 4) {
      EEPROM.write(170, humedad);
      menuSel = 3;
      root();
      delay(500);
      goto paro;
    }
    if (menu == 3) {
      if (setRiegoStage == 1) {
        EEPROM.write(171, rHora);
        setRiegoStage = 2;
        setRiego(rHora, rMinuto, setRiegoStage);
        delay(150);
        goto paro;
      }
      if (setRiegoStage == 2) {
        EEPROM.write(172, rMinuto);
        setRiegoStage = 1;
        menuSel = 2;
        root();
        delay(500);
        goto paro;
      }
    }
  }

  if (digitalRead(pulsDown) == HIGH) {  // MOVER EL CURSOR  ABAJO 
    if (menu == 1) {
      if (menuSel == 5) { 
        menuSel = 1; 
        root(); 
        delay(250); 
        goto paro; 
      }
      if (menuSel < 5) {
        menuSel = menuSel + 1;
        root();
        delay(250);
        goto paro;
      }
    }
    if (menu == 4) {
      humedad--;
      if (humedad < 0) { 
        humedad = 100; 
      }
      setHumedad(humedad);
      delay(150);
      goto paro;
    }
    if (menu == 3) {
      if (setRiegoStage == 1) {
        rHora--;
        if (rHora < 0) { 
          rHora = 23; 
        }
        setRiego(rHora, rMinuto, setRiegoStage);
        delay(150);
        goto paro;
      }
      if (setRiegoStage == 2) {
        rMinuto--;
        if (rMinuto < 0) { 
          rMinuto = 59; 
        }
        setRiego(rHora, rMinuto, setRiegoStage);
        delay(150);
        goto paro;
      }
    }
  }

  if (digitalRead(pulsUp) == HIGH) {   // CURSR ARRIBA
    if (menu == 1) {
      if (menuSel == 1) { 
        menuSel = 5; 
        root(); 
        delay(250); 
        goto paro; 
      }
      if (menuSel > 1) {
        menuSel = menuSel - 1;
        root();
        delay(250);
        goto paro;
      }
    }
    if (menu == 3) {
      if (setRiegoStage == 1) {
        rHora++;
        if (rHora >= 24) { 
          rHora = 0; 
        }
        setRiego(rHora, rMinuto, setRiegoStage);
        delay(150);
        goto paro;
      }
      if (setRiegoStage == 2) {
        rMinuto++;
        if (rMinuto >= 60) { 
          rMinuto = 0; 
        }
        setRiego(rHora, rMinuto, setRiegoStage);
        delay(150);
        goto paro;
      }
    }
    if (menu == 4) {
      humedad++;
      if (humedad > 100) { 
        humedad = 0; 
      }
      setHumedad(humedad);
      delay(150);
      goto paro;
    }
  }

paro:;
}

void setDurada(){

}

void setHumedad(int hume) {
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(60 ,15);
  display.write(30);
  display.setTextSize(3);
  display.setCursor(38, 25);
  display.print(hume);
  display.println("%");
  display.setTextSize(1);
  display.setCursor(60, 49);
  display.write(31);
  display.display();
  menu = 4;
}
void setRiego(int rHora, int rMinuto, int setRiegoStage) {
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  if (setRiegoStage == 1) { 
    display.setCursor(40, 15); 
  }
  if (setRiegoStage == 2) { 
    display.setCursor(88, 15); 
  }
  display.write(30);
  display.setTextSize(3);
  display.setCursor(18, 25);
  if (rHora < 10) { 
    display.print("0"); 
  }
  display.print(rHora);
  display.print(":");
  if (rMinuto < 10) { 
    display.print("0"); 
  }
  display.print(rMinuto);
  display.setTextSize(1);
  if (setRiegoStage == 1) { 
    display.setCursor(40, 49); 
  }
  if (setRiegoStage == 2) { 
    display.setCursor(88, 49); 
  }
  display.write(31);

  display.display();
  menu = 3;
}

void clockChange(){
  cCHora = hour(); cCMinuto = minute(); cCDia = day(); cCMes = month(); cCAno = year(); cCStage = 1;
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  if (cCStage == 1) {
    display.setCursor(20, 0); 
    display.write(30);
    display.setCursor(20, 27); 
    display.write(31);
  }
  display.setCursor(12, 10);
  display.setTextSize(2);
  if (hour() < 10) { 
    display.print("0"); 
  }
  display.print(cCHora);
  display.print(":");
  if (minute() < 10) { 
    display.print("0"); 
  }
  display.print(cCMinuto);
  display.setCursor(90, 10);
  if (day() < 10) { 
    display.print("0"); 
  }
  display.print(day());
  display.setCursor(5, 40);
  mes(cCMes);
  display.print(cCAno);
  display.display();
  menu = 2;
}

void root(){
  display.clearDisplay();
  display.setCursor(0,0);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.println("Config:");
  display.setCursor(0, 25);
  display.setTextSize(1);
  if (menuSel == 1) { 
    display.write(16); 
  }
  display.println(" Reloj");
  if (menuSel == 2) { 
    display.write(16); 
  }
  display.println(" Hora de riego");
  if (menuSel == 3) { 
    display.write(16); 
  }
  display.println(" Offset humedad");
  if (menuSel == 4) { 
    display.write(16); 
  }
  display.println(" Durada riego");
  if (menuSel == 5) { 
    display.write(16); 
  }
  display.println(" Salir");  
  display.display();
  menu = 1;
}

void principal(int rHora, int rMinuto) {
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.print("Temp: 12 ");
  if (12 < 10) {
    display.setCursor(41, -2);
    display.write(9);
    display.setCursor(46,0);
    display.print("C - Hum: 68%");
  }
  else {
    display.setCursor(47, -2);
    display.write(9);
    display.setCursor(52,0);
    display.print("C - Hum: 68%");
  }
  display.setTextSize(4);
  display.setCursor(6, 18);
  if (hour() < 10) { 
    display.print("0"); 
  } 
  display.print(hour());
  if (second() & 0x01) { 
    display.setTextColor(BLACK);
    display.print(":");
  }
  else {
    display.setTextColor(WHITE);
    display.print(":");
  }

  display.setTextColor(WHITE);
  if (minute() < 10) { 
    display.print("0"); 
  } 
  display.print(minute());
  display.setTextSize(1);
  //display.setCursor(58, 39);
  //display.println("25");
  display.setCursor(0, 57);
  if (rHora < 10) { 
    display.print("0"); 
  }
  display.print(rHora);
  display.print(":");
  if (rMinuto < 10) { 
    display.print("0"); 
  }
  display.print(rMinuto);
  display.print("     "); 
  display.print(day());
  mes(month());
  display.print(year());
  display.display();
  menu = 0;
}

void mes(int x) {
  switch(x){
  case 1:
    display.print(" ene "); 
    break;
  case 2:
    display.print(" feb "); 
    break;
  case 3:
    display.print(" mar "); 
    break;
  case 4:
    display.print(" abr "); 
    break;
  case 5:
    display.print(" may "); 
    break;
  case 6:
    display.print(" jun "); 
    break;
  case 7:
    display.print(" jul "); 
    break;
  case 8:
    display.print(" ago "); 
    break;
  case 9:
    display.print(" sep "); 
    break;
  case 10:
    display.print(" oct "); 
    break;
  case 11:
    display.print(" nov "); 
    break;
  case 12:
    display.print(" dic "); 
    break;
  }
}

la funcion de poner el RTC en hora debes eliminarla una vez ya esta en hora. es decir, subes el sketch con la linea para que se actualice la hora, compruebas que tiene la hora correcta, eliminas la linea de configurar la hora en el sketch, vuelves a subir el sketch.

Gracias por comentar.
Supongo que no me expliké bien, ahora ya lo tengo solucionado. Lo que no sabia hacer era una vez el reloj funcionando desde el mismo programa modificarle la hora sin necesidad de cargar ningún sketch.