Controlador de rega

Boa tarde,
Eu preciso de implementar um controlador para uma rega gota a gota...
Basicamente preciso que de x em x dias ligue a rega durante x horas, e pensei se o arduino poderia fazer isso visto que tenho aqui um parado.
Por exemplo, basicamente quero que o arduino tenha os dias da semana e que eu possa definir que nas segundas nas quartas e nas sextas ele ligue a rega as 16h e desligue as 18h, por exemplo... acham que da para fazer isso??

Abraço

Sim, dá.

Acho que irás precisar dum RTC para saberes o tempo e um ou outro relé para ligar a rega. Suponho que seja apenas actuar uma válvula, correcto?

O que é um RTC, um "aparelho" que me diz os dias da semana??
Sim, ou uso uma electro valvula, ou simplesmente faz ligar o motor de rega, visto que o motor so serve para a rega.
Mas sim vou precisar de um rele, na parte da electrónica "esquema de ligação" não devo ter qualquer tipo de problema.
Mas tenho algumas duvidas na programação...
Podes-me ajudar mais um pouco nisso??
Tinha também pensado se no futuro conseguia ligar a rega pela net/smartphone, e medir as condições da terra (humidade).
Uma ideia que eu me tinha lembrado também seria no caso da humidade da terra baixar de um certo nível ligava a rega por uma hora.
Sera possível integrar tudo isto num só arduino??

Abraço

O RTC nada é nada mais que um circuito dedicado como "relógio", a grande vantagem dele, ao meu ver, que pode ser alimentado com uma pilha de relógio, e assim, mesmo que ocorra alguma queda de energia, após o retorno, você não vai precisar configurar novamente a data e hora no arduino.
Quanto ao sensor de umidade tem esse artigo. http://www.thalisantunes.com.br/2012/02/19/programando-arduino-sensor-de-humidade-moisture/

Gostei desse sensor, eu ja tinha andado a procurar por sensores, mas esse deve ser o mais barato, apesar de necessitar de um isolamento nas ligaçoes.
Mas me diz, vc acha que da para meter tudo no mesmo arduino??
Pode me dar um exemplo de um RCT?? Eu encontrei isso: Arduino Playground - Time mas não percebi se será para o arduino fazer de RTC ou então se será para usar com um RTC externo.

Obrigado

Bom acho que do RTC um deles deve ser este http://www.gravitech.us/i2crecl.html

Ja encontrei um RTC no ebay com um preço mais agradavel e vou mandar vir. Quando chegar continuo a chatear neste post :smiley:

Abraço e muito obrigado

Boas, finalmente chegou o meu RTC.
Ja consegui meter as horas e a data numérica a funcionar, mas não consigo meter a data por extenso, será que alguém me consegue ajudar??
Precisava também ajuda para fazer com que a certos dias da semana o arduino active uma porta para controlar a valvula.
Aqui vai o codigo que tenho.

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

 
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();
 
    Serial.print(now.year(), DEC);
    Serial.print('/');
    Serial.print(now.month(), DEC);
    Serial.print('/');
    Serial.print(now.day(), DEC);
    Serial.print(' ');
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
 
    Serial.println();
    delay(5000);
}

Desde ja muito obrigado

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.