Controlador de rega

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??

Desculpa bubulindo, mas so agora percebi que nao percebi bem o que querias dizer :smiley:
Eu meti o codigo anterior o que nao dava as horas, ficava sempre a 0. Mas so aparecia um mes.
Mas acho que ja descobri o problema, veja isso e me diga se vou ter problemas com isso:

char meses[13][10]= {
                     {'D','e','f', 'a', 'u', 'l', 't', '\0'}, 
                     {'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'},

Acho que faltava o default para o mes "0", tou errado??

Fidel:
Desculpa bubulindo, mas so agora percebi que nao percebi bem o que querias dizer :smiley:
Eu meti o codigo anterior o que nao dava as horas, ficava sempre a 0. Mas so aparecia um mes.
Mas acho que ja descobri o problema, veja isso e me diga se vou ter problemas com isso:

char meses[13][10]= {

{'D','e','f', 'a', 'u', 'l', 't', '\0'},
                    {'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'},




Acho que faltava o default para o mes "0", tou errado??

Facepalm... :\ LOL

Sim, mas uma maneira mais elegante de resolver isto será apagares o mês default e meteres a matriz com 12 elementos de volta e nesta instrução:

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

Colocares isto:

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

Tudo funcionando heheheheheh.
Sao coisas que acontecem...
Mas olha, tou a tentar meter aquele codigo que tu me disses-te de ativar uma porta, mas nao tou a perceber muito bem...
Mas vou-te explicar melhor o que eu preciso mesmo, eu preciso de ativar a porta dia sim dia nao, durante um certo tempo.
Duas formas que eu tou a pensar que se pode fazer isso:
1º Colocar um codigo que faça ativar a porta dia sim dia nao, independentemente do dia da semana, durante aquele tempo;
2º Colocar um codigo que tenha os dias da semana a que eu quero que funcione, para isto temos um problema, pois como sao 7 dias da semana logo nao bate certo.
Segunda 1
Terça 0
Quarta 1
quinta 0
sexta 1
sabado 0
domingo 1
segunda 0
...
Nao bate certo, a unica forma era escrever duas semanas mas nao sei se da.
Outra coisa que tambem dava jeito era poder mudar as datas da rega com botoes, eu tou a espera de um LCD para poder ver as horas e se desse para escolher os dias a que quero que a rega funcione era melhor.

Muito obrigado

E já tentaste chegar a uma solução para a activação e desactivação da rega?

Se quiseres configurar, se calhar o melhor é fazeres um plano de rega semanal.

É muito mau regar diariamente, metade do tempo que tinhas estimado para dia sim, dia não?

O problema é que para a plantação que eu vou utilizar isto, prefere regas longas do que curtas, logo é melhor que seja 1 rega longa dia sim dia nao.

Nao da para fazer um plano de rega mensal?? em vez de ser semanal??
em vez de escolher o dia da semana(segunda, terça....) que rega, escolho por dia mensal(1,3,5,7,9,11...)
Axas que assim da??
Mais uma pergunta este relogio sabe que meses tem 30 dias e os que tem 31??

Obrigado

Sim, o relógio sabe os meses com 30 e 31 dias e sabe os anos bissextos.

Dá para fazer como preferires... o melhor é especificares bem como queres e começares a fazer apartir daí.

Axo k sera mais facil se eu meter os dias todos do mes, e nem é muito dificil de meter por exemplo por um ano, vc nao acha??

Pode me dar um exemplo que eu completo??
E que vc axa de poder mudar esse esquema sem utilizar o PC, so com botoes nos arduino??

Abraço e muito obrigada :smiley:

Meter os dias do ano em que vais querer regar é muito pouco user friendly. Estás a imaginar-te a clicar botões e mais botões para meteres os dias todos do ano? O ideal é que apenas tenhas de definir a periodicidade da rega (dois em dois dias, três em três) e poderes ajustar a hora a que regas por causa da variacão da luz solar.

A "dificuldade" em fazer dia sim, dia não está no facto que existem meses com 31 dias, semanas com 7 dias e até o ano não colabora com 365. Senão para saber se o dia era de rega seria tão simples como:

if (dia%2 == 1) //dia de rega. //2 é a periodicidade que poderia ser ajustada, para qualquer valor ajustando assim o intervalo entre regas em dias.

Uma hipótese será definires uma flag que roda de dia para dia, tipo:

unsigned char diaDeRega = 0;
unsigned char diaAnterior = now.day();
...

if (diaAnterior != now.dia()) {
   //mudamos o dia
   if (diaDeRega == 1) diaDeRega = 0;
   else diaDeRega = 1; 
   diaAnterior = now.dia();
}

...

if (diaDeRega == 1) {
if (hora da rega == TRUE) //comecar rega.

E assim regavas dia sim, dia não. O problema, nos meus olhos, é que isto não é uma solucão elegante. Mas funciona. Outra ideia seria com intervalos de horas... mas isso ainda é mais confuso creio. :\

Meter um LCD ao barulho é talvez o ideal para esta aplicacão (até porque podes mais tarde fazer uma plaquinha individual para teres todo o controlador num sítio), por isso tenta ver as bibliotecas que existem para isso, existem umas para teclas e para lcd, logo não será muito difícil de conseguir implementar algo.

Nota que isto é algo que tem de ser bem testado antes que possas deixar isto a funcionar e ir de férias. :stuck_out_tongue:

Claro, eu sei que tenho de testar isso muito bem testadinho :smiley:
Eu sei que se der para definir que quero uma rega de 2 em 2 dias ou de 3 em 3, sera muito melhor para mim :D, a minha duvida esta se sera que consigo fazer isso no arduino.
Tou a tentar perceber o codigo que vc meteu.
Este codigo defini a periodicidade?

if (dia%2 == 1)

Aquele "2" é para definir que é de 2 em dois dias"?

Sim... o % é o operador de resto. Podes Experimentar no google

1%2 = 1
2%2 = 0
3%2 = 1
4%2 = 0

com 3

1%3 = 1
2%3 = 2
3%3 = 0
...

Assim é mais simples de definir periodicidade, ou limitar valores dentro dum intervalo. Basta fazer %limite.

Imagina por exemplo que numa aplicacão o utilizador pode entrar um número qualquer para um ângulo, mas as tuas funcões só aceitam angulos de 0 a 360 graus.

Bastaria fazer angulo%360 e o angulo passaria a estar no intervalo de 0-360.

Experimenta por exemplo com 450 (360 + 90), 810 e 1170. Como vês assim está sempre dentro do intervalo e o angulo é exactamente o mesmo.

Uma solucão mais "bonita" será implementar um contador de dias, ou seja, quando um dia passa incrementas uma variável e usas essa variável para definir se é dia de rega ou não com este truque do resto. Assim apenas defines a periodicidade da rega e a hora de inicio e fim da rega. Estás a ver a ideia?

Os botões também são interessantes para acertar a hora... :wink:

Procura isso da biblioteca do LCD e dos botões e tenta fazer um esboco do que pretendes.

Tive a testar no google o operador de resto e reparei num problema,
31%2=1
1%2=1

Fidel:
Tive a testar no google o operador de resto e reparei num problema,
31%2=1
1%2=1

Era a isso que me referia quando disse:

bubulindo:
A "dificuldade" em fazer dia sim, dia não está no facto que existem meses com 31 dias, semanas com 7 dias e até o ano não colabora com 365.

Daí que ter um contador de dias a rolar e fazer essa conta nesse contador será mais simples.

unsigned int contador=0; 
unsigned char diaAnterior = now.day();
...

if (diaAnterior != now.dia()) {
   //mudamos o dia 
   if (contador++ == 32000) contador = 1; //passar de par para impar 
   diaAnterior = now.day();
}

if (contador%periodicidade == 0) {//Vamos regar as coives... 
   if (hora de inicio de rega == TRUE) {
      inicia_rega(); 
   }
   if (fim de rega == TRUE) {
      finaliza_rega();
   }
}

Depois o teu LCD daria a possibilidade de escolher o inicio da rega, duração/fim da rega e periodicidade em dias. :slight_smile: