Controlador de rega

Quando dizes data por extenso referes-te a:

Sábado, 25 de Abril de 1974?

Ou 25/04/1974??

Se vires o datasheet do DS1307, existe um campo chamado DAY na memória que pode ser acedida.
Aqui o truque é definir um dia como 1 e depois é simples de saber qual o dia da semana em que estás. Se por exemplo definires o 1 como o Domingo, o 4 será a quarta feira.

Pelo que encontrei no github, se usares a expressão:

unsigned char diaDaSemana; 
DateTime now = RTC.now();
diaDaSemana = now.dayOfWeek(); //Sábado é dia 6, domingo 7 e segunda 1.

Experimenta e vê se bate certo.

Fontes:

Datasheet -> http://datasheets.maxim-ic.com/en/ds/DS1307.pdf
https://github.com/adafruit/RTClib/blob/master/RTClib.cpp

Sim, é mesmo isso que quero dizer com extenso.
Não, não consegui com essa expressão, da-me isso:

sketch_apr04a:5: error: 'RTC' was not declared in this scope
sketch_apr04a:6: error: expected constructor, destructor, or type conversion before '=' token

Eu ja encontrei outro "codigo" que consigo por os dias da semana, mas tem um problema, o relogio ta sempre a 0, nao começa a contar, ja tentei varias expressoes que encontrei pela net e nada.
É assim que aparecem as horas:

Sao:    0:0:0   Domingo dia 0 de Janeiro de 0
Sao:    0:0:0   Domingo dia 0 de Janeiro de 0
Sao:    0:0:0   Domingo dia 0 de Janeiro de 0
Sao:    0:0:0   Domingo dia 0 de Janeiro de 0

Vou meter o codigo para vc ver onde pode estar o "problema":

#include <Wire.h>


#define HORAS 2   
#define MINUTOS 1
#define SEGUNDOS 0   
#define DIASEMANA 3  
#define DIAMES 4  
#define MES 5 
#define ANO 6 

void setup(){
  Serial.begin(9600); 
  Wire.begin();   
     
}

void loop(){
  printData();
  delay(1000);
  
  
}

void printData(){
  int rtc[7];

  Serial.print("Sao:    ");
  Serial.print(rtc[HORAS],DEC); 
  Serial.print(":");  
  Serial.print(rtc[MINUTOS],DEC); 
  Serial.print(":"); 
  Serial.print(rtc[SEGUNDOS],DEC); 
 
  switch(rtc[DIASEMANA]){
    case 0:Serial.print("   Domingo"); break;    
    case 1:Serial.print("   Segunda-feira"); break;
    case 2:Serial.print("   Ter?a-feira"); break;
    case 3:Serial.print("   Quarta-feira"); break;
    case 4:Serial.print("   Quinta-feira"); break;
    case 5:Serial.print("   Sexta-feira"); break;
    case 6:Serial.print("   Sabado"); break;
    default:Serial.print("   DiaDeSaoNunca-feira"); 
  }
  Serial.print(" dia ");
  Serial.print(rtc[DIAMES]); 
  Serial.print(" de");
    switch(rtc[MES]){
    case 0:Serial.print(" Janeiro"); break;      
    case 1:Serial.print(" Fevereiro"); break;
    case 2:Serial.print(" Marco"); break;
    case 3:Serial.print(" Abril"); break;
    case 4:Serial.print(" Maio"); break;
    case 5:Serial.print(" Junho"); break;
    case 6:Serial.print(" Julho"); break;
    case 7:Serial.print(" Agosto"); break;
    case 8:Serial.print(" Setembro"); break;
    case 9:Serial.print(" Outubro"); break;
    case 10:Serial.print(" Novembro"); break;
    case 11:Serial.print(" Dezembro"); break;
    default:Serial.print(" Oufevulhosto");
  }
  Serial.print(" de ");
  Serial.println(rtc[ANO],DEC);
}

Obrigado

Este código que colocaste não tem nenhum relógio para contar tempo... Apenas faz a construcão da data por extenso. Tens de adaptar os dois códigos que postaste aqui.

Outra coisa, o código que coloquei não compila sem mais nada... é apenas para demonstrar como usar o dayOfWeek no meio do programa que tinhas.

#include <Wire.h>
#include "RTClib.h"

//A[3][4] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } };

char meses[12][10]= {{'J','a','n', 'e', 'i', 'r', 'o', '\0'}, 
                              {'F', 'e', 'v', 'e', 'r', 'e', 'i', 'r', 'o','\0'},
                              {'M', 'a', 'r', 'c', 'o', '\0'},
//Faltam os restantes meses, mas é só completar da mesma forma que eu escrevi em cima... 
};

 
RTC_DS1307 RTC;
 
void setup () {
    Serial.begin(9600);
    Wire.begin();
    RTC.begin();
 
  if (! RTC.isrunning()) {
    Serial.println("byFidel");
    RTC.adjust(DateTime(__DATE__, __TIME__));

  }
 
}
 
void loop () {
    DateTime now = RTC.now();
//imprime... 
  Serial.print("Sao:    ");
  Serial.print(now.hour(),DEC); 
  Serial.print(":");  
  Serial.print(now.minute(),DEC); 
  Serial.print(":"); 
  Serial.print(now.second(),DEC); 
 
  switch(now.dayOfWeek()){
    case 7:Serial.print("   Domingo"); break;    
    case 1:Serial.print("   Segunda-feira"); break;
    case 2:Serial.print("   Ter?a-feira"); break;
    case 3:Serial.print("   Quarta-feira"); break;
    case 4:Serial.print("   Quinta-feira"); break;
    case 5:Serial.print("   Sexta-feira"); break;
    case 6:Serial.print("   Sabado"); break;
    default:Serial.print("   DiaDeSaoNunca-feira"); 
  }
  Serial.print(" dia ");
  Serial.print(now.day()); 
  Serial.print(" de");
   

  switch(now.month()){
    case 0:Serial.print(" Janeiro"); break;      
    case 1:Serial.print(" Fevereiro"); break;
    case 2:Serial.print(" Marco"); break;
    case 3:Serial.print(" Abril"); break;
    case 4:Serial.print(" Maio"); break;
    case 5:Serial.print(" Junho"); break;
    case 6:Serial.print(" Julho"); break;
    case 7:Serial.print(" Agosto"); break;
    case 8:Serial.print(" Setembro"); break;
    case 9:Serial.print(" Outubro"); break;
    case 10:Serial.print(" Novembro"); break;
    case 11:Serial.print(" Dezembro"); break;
    default:Serial.print(" Oufevulhosto");
  }

OU//

Serial.print(meses[now.month()]);

  Serial.print(" de ");
  Serial.println(now.year(),DEC); //Aqui és capaz de ter de adicionar 2000 ao ano que o microcontrolador devolve.     

    
    delay(1000);  
}

Vê se isto funciona. Eu nõa compilei o código, por isso deve ter alguns bugs.

não é preciso um rtc para ter um relógio no arduino. na página eles têm uma biblioteca <Time.h> que é excelente e o próprio oscilador do arduino é muito preciso visto que o experimentei durante um mês e o arduino não se atrasou ou adiantou um segundo sequer. é uma biblioteca muito facil de mexer e tem no codigo os dias de semana, eu proprio o utilizei para fazer um alarme semanal dependendo do dia da semana em que estava (nao quero ser incomodado por um despertador aos domingos!!!) a sua desvantagem ao RTC é que não tem pilha, logo se for abaixo o relogio faz reset e começa de novo pelo que precisas de acertar de novo, claro que isto pode ser evitado se puseres uma bateria ligada para apoio caso falte a luz. se precisares ajuda no codigo da biblioteca diz que eu já fritei os neuronios a percebe-la e posso explicar o que aprendi nessa construção

brunojpinho:
não é preciso um rtc para ter um relógio no arduino. na página eles têm uma biblioteca <Time.h> que é excelente e o próprio oscilador do arduino é muito preciso visto que o experimentei durante um mês e o arduino não se atrasou ou adiantou um segundo sequer.

E que mais é que o teu despertador fazia? Um dos problemas com o "relógio" do Arduino é que vais estar dependente do que vais fazer com o Arduino. Basta, por exemplo, usares a Serial de Hardware intensivamente com o Arduino e o relógio vai à vida num instante.
É perfeitamente possível, mas é preciso muito cuidado com o programa. Logo, para algumas aplicacões é preferível ter um RTC.

Nem sequer o preco é proibitivo... por um chip que a Maxim envia de borla para casa, mais um cristal que se encontra em tudo quanto é motherboard deitada fora ou até num relógio Casio, não me parece que valha a pena as dores de cabeca que um relógio com o millis() dá.

Muito obrigado, funciona quase na perfeiçao :D, tenho um pequeno problema, aparece-me isto:

Sao:    13:13:1   Sabado dia 7 de AbrilMaio de 2012
Sao:    13:13:2   Sabado dia 7 de AbrilMaio de 2012
Sao:    13:13:3   Sabado dia 7 de AbrilMaio de 2012
Sao:    13:13:4   Sabado dia 7 de AbrilMaio de 2012
Sao:    13:13:5   Sabado dia 7 de AbrilMaio de 2012
Sao:    13:13:6   Sabado dia 7 de AbrilMaio de 2012
Sao:    13:13:7   Sabado dia 7 de AbrilMaio de 2012

Agora preciso so de conseguir fazer ligar e desligar as portas que eu quero as horas e dias que eu quero.

Muito obrigado por toda a ajuda ate agora.

Fidel:
Muito obrigado, funciona quase na perfeiçao :D, tenho um pequeno problema, aparece-me isto:

Sao:    13:13:1   Sabado dia 7 de AbrilMaio de 2012

Sao:    13:13:2   Sabado dia 7 de AbrilMaio de 2012
Sao:    13:13:3   Sabado dia 7 de AbrilMaio de 2012
Sao:    13:13:4   Sabado dia 7 de AbrilMaio de 2012
Sao:    13:13:5   Sabado dia 7 de AbrilMaio de 2012
Sao:    13:13:6   Sabado dia 7 de AbrilMaio de 2012
Sao:    13:13:7   Sabado dia 7 de AbrilMaio de 2012




Agora preciso so de conseguir fazer ligar e desligar as portas que eu quero as horas e dias que eu quero.

Muito obrigado por toda a ajuda ate agora.

Ahh, lol... pensei que desses com isso. Eu não comentei o código que tinhas para imprimir o mês. Se fizeres assim:

#include <Wire.h>
#include "RTClib.h"

//A[3][4] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } };

char meses[12][10]= {{'J','a','n', 'e', 'i', 'r', 'o', '\0'}, 
                              {'F', 'e', 'v', 'e', 'r', 'e', 'i', 'r', 'o','\0'},
                              {'M', 'a', 'r', 'c', 'o', '\0'},
//Faltam os restantes meses, mas é só completar da mesma forma que eu escrevi em cima... 
};

 
RTC_DS1307 RTC;
 
void setup () {
    Serial.begin(9600);
    Wire.begin();
    RTC.begin();
 
  if (! RTC.isrunning()) {
    Serial.println("byFidel");
    RTC.adjust(DateTime(__DATE__, __TIME__));

  }
 
}
 
void loop () {
    DateTime now = RTC.now();
//imprime... 
  Serial.print("Sao:    ");
  Serial.print(now.hour(),DEC); 
  Serial.print(":");  
  Serial.print(now.minute(),DEC); 
  Serial.print(":"); 
  Serial.print(now.second(),DEC); 
 
  switch(now.dayOfWeek()){
    case 7:Serial.print("   Domingo"); break;    
    case 1:Serial.print("   Segunda-feira"); break;
    case 2:Serial.print("   Ter?a-feira"); break;
    case 3:Serial.print("   Quarta-feira"); break;
    case 4:Serial.print("   Quinta-feira"); break;
    case 5:Serial.print("   Sexta-feira"); break;
    case 6:Serial.print("   Sabado"); break;
    default:Serial.print("   DiaDeSaoNunca-feira"); 
  }
  Serial.print(" dia ");
  Serial.print(now.day()); 
  Serial.print(" de");
   
/* //ADICIONADO
  switch(now.month()){
    case 0:Serial.print(" Janeiro"); break;      
    case 1:Serial.print(" Fevereiro"); break;
    case 2:Serial.print(" Marco"); break;
    case 3:Serial.print(" Abril"); break;
    case 4:Serial.print(" Maio"); break;
    case 5:Serial.print(" Junho"); break;
    case 6:Serial.print(" Julho"); break;
    case 7:Serial.print(" Agosto"); break;
    case 8:Serial.print(" Setembro"); break;
    case 9:Serial.print(" Outubro"); break;
    case 10:Serial.print(" Novembro"); break;
    case 11:Serial.print(" Dezembro"); break;
    default:Serial.print(" Oufevulhosto");
  }

OU//
*/ //FIM DE COMENTARIO
Serial.print(meses[now.month()]);

  Serial.print(" de ");
  Serial.println(now.year(),DEC); //Aqui és capaz de ter de adicionar 2000 ao ano que o microcontrolador devolve.     

    
    delay(1000);  
}

Para ligares e desligares um relé que activa a rega podes fazer algo assim:

unsigned char hora_comeco=17; 
unsigned char minutos_comeco=30;  
unsigned char regando=0;
unsigned char hora_fim=18; 
unsigned char minutos_fim=30; 

... 

if ((now.hour() == hora_comeco) && (now.minute() == minutos_comeco)) {

digitalWrite(rega, HIGH);
regando = 1; 
}

if (regando == 1) {
   if ((now.hour() == hora_fim) && (now.minute() == minutos_fim)) {
   digitalWrite(rega, LOW);
  }
}

Eu reparei, ou acho que reparei, vc ta falando nisso:

char meses[12][10]= {
                     {'J','a','n', 'e', 'i', 'r', 'o', '\0'}, 
                     {'F', 'e', 'v', 'e', 'r', 'e', 'i', 'r', 'o','\0'},
                     {'M', 'a', 'r', 'c', 'o', '\0'},
                     {'A', 'b', 'r' ,'i', 'l', '\0'},
                     {'M', 'a', 'i' ,'o', '\0'},
                     {'J', 'u', 'n' ,'h', 'o', '\0'},
                     {'J', 'u', 'l' ,'h', 'o', '\0'},
                     {'A','g','o', 's', 't', 'o', '\0'},
                     {'S','e','t', 'e', 'm', 'b', 'r', 'o', '\0'},
                     {'O', 'u', 't', 'u', 'b', 'r', 'o', '\0'},
                     {'N', 'o', 'v', 'e', 'm', 'b', 'r', 'o', '\0'},
                     {'D', 'e', 'z', 'e', 'm', 'b', 'r', 'o', '\0'},

Eu fiz isso direitinho como vc tinha escrito la.

Obrigado

Fidel:
Eu reparei, ou acho que reparei, vc ta falando nisso:

char meses[12][10]= {

{'J','a','n', 'e', 'i', 'r', 'o', '\0'},
                     {'F', 'e', 'v', 'e', 'r', 'e', 'i', 'r', 'o','\0'},
                     {'M', 'a', 'r', 'c', 'o', '\0'},
                     {'A', 'b', 'r' ,'i', 'l', '\0'},
                     {'M', 'a', 'i' ,'o', '\0'},
                     {'J', 'u', 'n' ,'h', 'o', '\0'},
                     {'J', 'u', 'l' ,'h', 'o', '\0'},
                     {'A','g','o', 's', 't', 'o', '\0'},
                     {'S','e','t', 'e', 'm', 'b', 'r', 'o', '\0'},
                     {'O', 'u', 't', 'u', 'b', 'r', 'o', '\0'},
                     {'N', 'o', 'v', 'e', 'm', 'b', 'r', 'o', '\0'},
                     {'D', 'e', 'z', 'e', 'm', 'b', 'r', 'o', '\0'},



Eu fiz isso direitinho como vc tinha escrito la.

Obrigado

Estava a falar disto:

/* //ADICIONADO PARA EVITAR IMPRIMIR O MES DUAS VEZES. 
  switch(now.month()){
    case 0:Serial.print(" Janeiro"); break;      
    case 1:Serial.print(" Fevereiro"); break;
    case 2:Serial.print(" Marco"); break;
    case 3:Serial.print(" Abril"); break;
    case 4:Serial.print(" Maio"); break;
    case 5:Serial.print(" Junho"); break;
    case 6:Serial.print(" Julho"); break;
    case 7:Serial.print(" Agosto"); break;
    case 8:Serial.print(" Setembro"); break;
    case 9:Serial.print(" Outubro"); break;
    case 10:Serial.print(" Novembro"); break;
    case 11:Serial.print(" Dezembro"); break;
    default:Serial.print(" Oufevulhosto");
  }

OU//
*/ //FIM DE COMENTARIO
Serial.print(meses[now.month()]);

A última versão que deixei já tinha isto lá.

Mas era para deixar assim, sem fazer efeito??
com os "/*" ?

Sim... isso corrige o problema que tens, logo é para apagar o bocado de código que está comentado. :stuck_out_tongue:

Nao da cara :smiley:
Fica assim:


Sao:    11:18:31   DiaDeSaoNunca-feira dia 8 de Maio de 2012
Sao:    11:18:32   DiaDeSaoNunca-feira dia 8 de Maio de 2012
Sao:    11:18:33   DiaDeSaoNunca-feira dia 8 de Maio de 2012
Sao:    11:18:34   DiaDeSaoNunca-feira dia 8 de Maio de 2012
Sao:    11:18:35   DiaDeSaoNunca-feira dia 8 de Maio de 2012
Sao:    11:18:36   DiaDeSaoNunca-feira dia 8 de Maio de 2012

Como se nao chega-se estar o mes errado, agora ate o dia.... heheheheheh
ta complicado isso.

Fidel:
Nao da cara :smiley:
Fica assim:


Sao:    11:18:31   DiaDeSaoNunca-feira dia 8 de Maio de 2012
Sao:    11:18:32   DiaDeSaoNunca-feira dia 8 de Maio de 2012
Sao:    11:18:33   DiaDeSaoNunca-feira dia 8 de Maio de 2012
Sao:    11:18:34   DiaDeSaoNunca-feira dia 8 de Maio de 2012
Sao:    11:18:35   DiaDeSaoNunca-feira dia 8 de Maio de 2012
Sao:    11:18:36   DiaDeSaoNunca-feira dia 8 de Maio de 2012



Como se nao chega-se estar o mes errado, agora ate o dia.... heheheheheh
ta complicado isso.

Coloca o código que estás a usar aqui para resolver isso.

Ta assim:

#include <Wire.h>
#include "RTClib.h"

//A[3][4] = { { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } };

char meses[12][10]= {
                     {'J','a','n', 'e', 'i', 'r', 'o', '\0'}, 
                     {'F', 'e', 'v', 'e', 'r', 'e', 'i', 'r', 'o','\0'},
                     {'M', 'a', 'r', 'c', 'o', '\0'},
                     {'A', 'b', 'r' ,'i', 'l', '\0'},
                     {'M', 'a', 'i' ,'o', '\0'},
                     {'J', 'u', 'n' ,'h', 'o', '\0'},
                     {'J', 'u', 'l' ,'h', 'o', '\0'},
                     {'A','g','o', 's', 't', 'o', '\0'},
                     {'S','e','t', 'e', 'm', 'b', 'r', 'o', '\0'},
                     {'O', 'u', 't', 'u', 'b', 'r', 'o', '\0'},
                     {'N', 'o', 'v', 'e', 'm', 'b', 'r', 'o', '\0'},
                     {'D', 'e', 'z', 'e', 'm', 'b', 'r', 'o', '\0'},
                     
                     
//Faltam os restantes meses, mas é só completar da mesma forma que eu escrevi em cima... 
};

 
RTC_DS1307 RTC;
 
void setup () {
    Serial.begin(9600);
    Wire.begin();
    RTC.begin();
 
  if (! RTC.isrunning()) {
    Serial.println("byFidel");
    RTC.adjust(DateTime(__DATE__, __TIME__));

  }
 
}
 
void loop () {
    DateTime now = RTC.now();
//imprime... 
  Serial.print("Sao:    ");
  Serial.print(now.hour(),DEC); 
  Serial.print(":");  
  Serial.print(now.minute(),DEC); 
  Serial.print(":"); 
  Serial.print(now.second(),DEC); 
 
  switch(now.dayOfWeek()){
    case 7:Serial.print("   Domingo"); break;    
    case 1:Serial.print("   Segunda-feira"); break;
    case 2:Serial.print("   Ter?a-feira"); break;
    case 3:Serial.print("   Quarta-feira"); break;
    case 4:Serial.print("   Quinta-feira"); break;
    case 5:Serial.print("   Sexta-feira"); break;
    case 6:Serial.print("   Sabado"); break;
    default:Serial.print("   DiaDeSaoNunca-feira"); 
  }
  Serial.print(" dia ");
  Serial.print(now.day()); 
  Serial.print(" de");
   
/* //ADICIONADO
  switch(now.month())
  {
    case 1:Serial.print(" Janeiro"); break;      
    case 2:Serial.print(" Fevereiro"); break;
    case 3:Serial.print(" Marco"); break;
    case 4:Serial.print(" Abril"); break;
    case 5:Serial.print(" Maio"); break;
    case 6:Serial.print(" Junho"); break;
    case 7:Serial.print(" Julho"); break;
    case 8:Serial.print(" Agosto"); break;
    case 9:Serial.print(" Setembro"); break;
    case 10:Serial.print(" Outubro"); break;
    case 11:Serial.print(" Novembro"); break;
    case 12:Serial.print(" Dezembro"); break;
    default:Serial.print(" Oufevulhosto");
  }

OU//
*/ //FIM DE COMENTARIO

Serial.print(meses[now.month()]);

  Serial.print(" de ");
  Serial.println(now.year(),DEC); //Aqui és capaz de ter de adicionar 2000 ao ano que o microcontrolador devolve.     

    
    delay(1000);  
}

O relógio por acaso já funcionou? Isto é, já viste os segundos e minutos a mexer?

Sim, la no post anterior vê-se os segundos a andar.

Coloca esse código anterior a rodar e vê se funciona... Nada como tirar a limpo para ver se o hardware está a funcionar.

Bons dias,
Nada, ate tirei a pilha do RTC para fazer um reset e nada, meti todos os codigos e nada.

Abraço

Então isso é sinal que o código não é o problema...

Entao o que achas que pode ser??