Pages: [1] 2 3   Go Down
Author Topic: Controlador de rega  (Read 6249 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3323
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Brasil
Offline Offline
Sr. Member
****
Karma: 2
Posts: 316
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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/
Logged

4x Duemilanove (clone)
Uno torrado (clone)
Amiga 1200 40MB
Windows XP


Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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: http://www.arduino.cc/playground/Code/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
Logged

Brasil
Offline Offline
Sr. Member
****
Karma: 2
Posts: 316
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

4x Duemilanove (clone)
Uno torrado (clone)
Amiga 1200 40MB
Windows XP


Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Abraço e muito obrigado
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Code:
#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
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3323
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

Code:
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
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sim, é mesmo isso que quero dizer com extenso.
Não, não consegui com essa expressão, da-me isso:
Code:
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:
Code:
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":
Code:
#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
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3323
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Code:
#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.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3323
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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á.
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Muito obrigado, funciona quase na perfeiçao smiley-grin, tenho um pequeno problema, aparece-me isto:
Code:
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.
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3323
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Muito obrigado, funciona quase na perfeiçao smiley-grin, tenho um pequeno problema, aparece-me isto:
Code:
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:

Code:
#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:

Code:

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);
  }
}
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Pages: [1] 2 3   Go Up
Jump to: