Jump to content
PamkY

Arduino - Sistema de Rega

Recommended Posts

PamkY

Boas pessoal,

Sou novata no Arduino e preciso de criar um projecto de Sistema de Rega (com 4 campos diferentes) que pode ser controlado automaticamente via Arduino e manualmente via Android (comunicação bluetooth), preciso também de um Webserver para registar o histórico de actividade.

Alguém poderá dar-me uma ajuda e ideias para a construção deste projecto? Possuo apenas a placa do Arduino e o BT Bee, não tenho Ethernet Shield...

Estou com muitas dificuldades na execução deste projecto e tenho até o final da semana para o entregar... :\

Obrigado a todos pela atenção!

Share this post


Link to post
Share on other sites
bubulindo

Tens um objectivo que é bastante claro... qual é em específico o problema que tens?


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
PamkY

Estou a utilizar o MIT App Inventor:

- receber o estado das portas (que por agora serão leds a representar os 4 campos de rega, se estão a regar o LED acende, senão estará apagado) na app Android;

- alterar os valores predefinidos no Arduino (por exemplo: tempo de rega do campo 1, periodicidade de rega do campo 3, etc);

- criar o histórico de actividade e o webserver (sem ethernet shield)...

Share this post


Link to post
Share on other sites
bubulindo

Continuas a dar objectivos... mas não especificas em concreto que problema estás a ter.

Deixa-me adivinhar, basicamente não sabes nada do que tens para fazer e queres que alguém faca algo por ti?


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
PamkY

Basicamente e como já expliquei acima, estou a começar com o Arduino.

Já fiz pesquisas e tutoriais básicos como por exemplo: controlar um led via bt. Mas não encontro nada de como receber estado de portas do arduino no app inventor, etc.

Se me poderem ajudar apenas peço uma pequena explicação, a forma melhor de o fazer ou um pequeno exemplo!

Não vejo lógica alguma em querer aprender algo com a papinha feita pelos outros! ;)

Share this post


Link to post
Share on other sites
bubulindo

Ok... receber o estado das portas.

Suponho que já estejas a comunicar nos dois sentidos entre o bluetooth e o Arduino.

Para saberes o estado duma porta especifica do Arduino, usas a funcão digitalRead(numero_do_pino).

Se queres receber duma vez só o estado dum porto (ou seja, um conjunto no máximo de 8 portas), basta acederes a PINX onde X pode ser A, B, C, D... Para usares isto convém veres a equivalência entre os pinos do Arduino e os portos do AVR.

Pesquisa no google por Arduino pin mapping e vês o que quero dizer.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
PamkY

e para enviar o resultado do digitalread para o MIT?

Eu já montei os blocos com bluetooth.receivetext para preencher as labels, agora a minha cena é como referir a que variavel pertence esse mesmo dado.

Tipo, ao iniciar a app e apos a ligação bt o android irá receber variados valores (estado das portas, tempo de rega dos 4 campos e periodicidade dos 4 campos).

É suficiente e seguro se for pela mesma ordem de envio do arduino para a app? Ou há forma de estipular variaveis iguais em ambos e saber que variavel está a receber valores?

Share this post


Link to post
Share on other sites
bubulindo

Não... é para isso que existe uma coisa chamada protocolos de comunicacão...

Ou o Arduino diz o que está a enviar quando envia... ou o Android pede dados ao Arduino e o arduino responde. Mandares dados só por mandar, vai dar barraca da grossa eventualmente.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
PamkY

E como faço isso? É nessa parte que estou bloqueada, e provavelmente é uma coisa bem mas bem simples!

Podes dar-me um exemplo?

Share this post


Link to post
Share on other sites
bubulindo

Imagina que queres saber o estado do Porto A...

O teu Android pode então enviar um pedido ao Arduino deste tipo:

?A/n

E o teu arduino responderia qualquer coisa como:

AX/n onde X era um byte em que os bits indicavam o estado de cada pino desse porto.

Imagina que querias mudar um parametro qualquer.

!TYYYY/n

Onde o ! indica que é um comando, T indica o parâmetro a mudar e os YYYY indicam o novo valor do parâmetro.

Neste caso, o Arduino pdoeria responder com o valor que lhe foi enviado para o Android saber que a comunicacão aconteceu correctamente.

Isto é que é um protocolo de comunicacão. Muito básico e com alguns problemas... mas é basicamente isto.

O que me espanta, e eu também já estive na tua situacão, é o facto disto não ser reforcado nas universidades/escolas. Ou seja,, fala-se imenso do RS232, ou do Profibus ou TCP/IP e UDP, mas nunca se fala de como criar a camada superior do protocolo. Simplesmente incrível.

  • Vote 1

include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
bubulindo

e é confuso porque???

Claro que não precisas de inventar símbolos... se quiseres podes fazer isto com frases completas... mas que vais arrancar os cabelos antes de terminares, isso vais. :\


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
PamkY

Outra questão, tenho as regas programadas assim:

void Morangos()
{
 float periodicidade = (perMorangos * 3600000); // horas
 int duracao = (durMorangos * 60000); // minutos
 digitalWrite(pinMorangos, HIGH);
 delay(duracao);
 digitalWrite(pinMorangos, LOW);
 delay(periodicidade);
}

Tenho mais 3 funções dessas - Batatas, Cenouras e Arvores.

Na função loop() se eu chamar essas 4 funções, elas irão correr ao mesmo tempo? ou não passará à função seguinte devido aos delays? Suponho que ficará trancado nos delays.. Há maneira de executar as 4 ao mesmo tempo?

Share this post


Link to post
Share on other sites
bubulindo

Podes usar o millis como está descrito aí ou, ainda melhor seria se tivesses um RTC ligado ao Arduino e assim definias as horas a que a rega começa e acaba. Afinal de contas o tempo que dura a rega é tão importante como o tempo a que começa. ;)


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
PamkY

Não tenho um RTC :(

A solução que coloquei a pouco deixa de contar sempre que chamo outra função... :s

Há alguma maneira de dar a volta a isto?

Preciso controlar 4 contadores (hora da rega de 4 campos) e outros 4 (duração das regas)

Bloqueei :x

Share this post


Link to post
Share on other sites
bubulindo

Que código tens agora? Coloca aqui para vermos.

O millis() está sempre a correr a não ser que mexas em interrupcões.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
PamkY

void ContadorMorangos()
{
   static unsigned long ult_tempo = 0;
   int tempo = millis();
   if(tempo - ult_tempo >= 1000) 
   {
     ult_tempo = tempo;
     segundo++;
   }
   if(segundo >= 60) 
   {
     segundo = 0;
     minuto++;
   }
   if(minuto >= 60) 
   {
     minuto = 0;
     hora++;
   }
   if(hora >= 24) 
   {
     hora = 0;
     minuto = 0;
   } 
   Serial.print(hora);
   Serial.print(":");
   Serial.print(minuto);
   Serial.print(":");
   Serial.println(segundo);
   delay(1000);
   if (minuto == PhMorangos && segundo == PmMorangos)
   {
     Serial.println("Regar");
     digitalWrite(13, 1);
     rega = true;
     RegaMorangos();
   }
}

void RegaMorangos()
{
 horaR = 0;
 minutoR = 0;
 segundoR = 0;
 static unsigned long ult_tempoR = 0;
 while ( rega == true) 
   {
   int tempoR = millis();
   if(tempoR - ult_tempoR >= 1000) 
   {
     ult_tempoR = tempoR;
     segundoR++;
   }
   if(segundoR >= 60) 
   {
     segundoR = 0;
     minutoR++;
   }
   if(minutoR >= 60) 
   {
     minutoR = 0;
     horaR++;
   }
   if(horaR >= 24) 
   {
     horaR = 0;
     minutoR = 0;
   } 
   Serial.print(horaR);
   Serial.print("-");
   Serial.print(minutoR);
   Serial.print("-");
   Serial.println(segundoR);
   delay(1000);
   if (minutoR == DmMorangos)
   {
    Serial.println("Regado!");
    rega = false;
    digitalWrite(13, 0); 
   }
 }

Chamo a primeira função no loop()

- Editado -

Edited by Rui Carlos

Share this post


Link to post
Share on other sites
PamkY

Aqui está o resultado:

(...)

0:0:59

0:1:0

Regar

0-0-1

0-0-2

(...)

0-0-58

0-0-59

0-1-0

Regado!

0:1:1

0:1:2

0:1:3

0:1:4

Share this post


Link to post
Share on other sites
bubulindo

Desculpa perguntar isto... mas estás em que nível académico ou da aprendizagem de programacão?

Porque é que estás a criar um relógio em cada funcão? Porque não tens uma funcão que te cria o relógio e apenas usas os dados dessa funcão na tua funcão de rega?

Quando eu referi o RTC... não pensaste sequer em pesquisar o que eu estava a escrever para ver se havia algo semelhante já feito?

http://playground.arduino.cc/Code/DateTime

#define MORANGOS   0
#define BATATA     1
#define COUVES     2
#define MILHO      3
struct dados_rega{
  unsigned char comeco;
  unsigned char fim;
  unsigned char em_curso;
  unsigned char pino;
} vegetais[4];
vegetais[MORANGOS].comeco = 8;
vegetais[MORANGOS].fim = 9;
vegetais[MORANGOS].em_curso = 0;
vegetais[MORANGOS].pino = 3;
//ou seja, rega das 8 às 9 de cada dia. 

void process_rega(unsigned char num) {
for (int i = 0; i < num; i++) {
if (hour() == vegetais[i].comeco && !vegetais[MORANGOS].em_curso) { //se a hora é a correcta e a rega não está em curso...
 vegetais[i].em_curso = 1;
 digitalWrite(vegetais[i].pino, HIGH);
 }
if (vegetais[i].em_curso) { // se a rega está em curso...
 if (hour() == vegetais[i].fim) {// e a hora de fim chegou...
  vegetais[i].em_curso = 0;
  digitalWrite(vegetais[i].pino, LOW);
  }
 }
}//end for
}//end function.
loop() {
process_rega(4); //4 vegetais.
}

Se queres fazer isto de forma mais flexivel e eficiente... como por exemplo, apenas regar durante 15 minutos...

Pegas nas horas, minutos e segundos e crias um contador de segundos:

unsigned long t_sec = hours() * 3600 + minutes() * 60 + seconds();
unsigned long comeco = 28800; // 8 horas da manhã
unsigned long fim = 28800 + 900; // 8:15 da manhã...
if (t_sec%comeco) { // comeca a rega...
if (t_sec % fim) { termina a rega...

Simples?

Quando é que tens de entregar isto?


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.