collapse

* Links de Robótica

* Posts Recentes

[Projecto] Bomba Airsoft por SrMorte
[Hoje às 23:07]


Apresentação por SrMorte
[Hoje às 22:32]


Medir Agua que está no Poço por filjoa
[Ontem às 20:58]


URGENTE - display de 7 segmentos com backpack por helderjsd
[20 de Setembro de 2017, 12:30]


Preços e fabricantes de pcb por Sérgio_Sena
[19 de Setembro de 2017, 10:20]


Palavras Cruzadas por Njay
[19 de Setembro de 2017, 02:24]


Isaac Asimov - I, Robot por senso
[18 de Setembro de 2017, 03:41]


ic SL440 da Plessey? por senso
[16 de Setembro de 2017, 13:11]


Compra Colectiva RS-Amidata por brunus
[15 de Setembro de 2017, 22:31]


Ideias para construir um quadrúpede simples por zordlyon
[15 de Setembro de 2017, 10:18]

Autor Tópico: Contadores de minutos millis()  (Lida 5563 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline AndréD.

  • Mini Robot
  • *
  • Mensagens: 180
    • AndreD Robotics
Contadores de minutos millis()
« em: 18 de Setembro de 2013, 11:31 »
Boas Pessoal,

Desde ontem que ando a bater com a cabeça nisto, e não tenho ainda sequer uma solução à vista, por isso vos peço ajuda.

Eis o que necessito:
Tenho um sensor de Temperatura (Lm335) que quando passar dos 30º inicie uma contagem de 1 minuto, ao fim desse minuto se a temperatura continuar acima dos 30º activo uma saída e comece outro contador de 30 minutos em que durante os mesmos caso a temperatura seja maior que 30 o contador seja colocado a 0, caso contrario não faz nada e fica de novo á espera que passe os 30º. Ao fim dos 30 minutos o processo repete.


Situação N1:
A temperatura passa os 30º
Contador de 1 Minuto começa
Se a temperatura continuar nos 30º Depois desse minuto o Led Acende.
- Esta situação está Resolvida -

Situação N2:
A temperatura passa os 30º
Contador de 1 Minuto começa
Se a temperatura não passou dos 30 Depois desse minuto fica de novo á espera que passe os 30 para iniciar novamente o contador de 1 Minuto.
- Esta situação não Resolvida -

Problemas:

A temp passa os 30, o contador de 1 minuto começa, passado esse minuto (com temp abaixo dos 30), assim que a temp os passar invés de o contador de 1 minuto começar acende logo o Led.


Situação N3:
A temperatura passa os 30º
Contador de 1 Minuto começa
Se a temperatura continuar nos 30º Depois desse minuto o Led Acende.
Assim que a temperatura for menor que 30º começa um contador de 30 minutos e sempre que a temperatura subir para lá dos 30º o mesmo tem de reiniciar.
No fim desses 30 Minutos o processo repete-se de novo desde o inicio.
- Esta situação não Resolvida -

Problemas:
Não sei por onde começar.


Aqui fica o pedaço de código que já tenho feito. Espero que me possam dar umas luzes.

Código: [Seleccione]
int pinoLM35 = A15; // Pino Analogico onde vai ser ligado a pata do meio do LM35
int valorLido = 0; // Variavel onde se ira guardar o valor lido pelo LM53
int saida = 22; // Pino Do LED da Board Do Arduino
float temperatura = 0; //Variavel onde vai ser guardada a Temperatura
static unsigned long  tempHIT;
static unsigned long  startTime;
int flag = 0;
int flagTM =0;

void setup() {
  Serial.begin(9600);
  pinMode(saida, OUTPUT);
  startTime = millis();
  tempHIT = millis();
}

void loop() {

  if(CheckTemp() > 30 && flag==0){ //Verifica se a temperatura é maior que 20, e se for acende o Led Da Board do Arduino.
    Serial.println("Dentro do IF 1");
    tempHIT = millis();
    flag = 1;
    flagTM=0;
  }

  if(millis() - tempHIT >= 1UL*60UL*1000UL && CheckTemp() > 30 && flagTM==0) {
    Serial.println("Dentro do IF 2");
    digitalWrite(saida, HIGH); //Acende o led da board do Arduino
    flagTM =1;
    flag=0;

  }

}


float CheckTemp(){


  // delay(1000); // Espera um segundo.

  if(millis() - startTime >=1000){
    valorLido = analogRead(pinoLM35); //Coloca na Variavel valorLido o que está a ser lido pelo sensor.
    temperatura = (valorLido *  0.4887585532746823069403714565); ///
    //temperatura = temperatura / 9.31 *; /// Conversão do valor obtido atraves da porta analogica para um valor “usavel”
    Serial.print("Temperatura actual:"); // Imprime no Serial Monitor “Temperatura Actual:”
    Serial.println(temperatura); // Imprime no Serial monitor o valor da variavel temperatura

      startTime = millis();
  }

  return temperatura; // Retorna A temperatura
}

Desde já muito obrigado pelo tempo.
Os Melhores Cumprimentos
AndréD.

Online jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.124
  • NERD!
Re: Contadores de minutos millis()
« Responder #1 em: 18 de Setembro de 2013, 12:04 »
O teu erro é que estás a querer verificar tudo ao mesmo tempo no teu segundo if.
Primeiro tens de esperar o minuto, e depois conforme a temperatura é que tomas a ação devida. Como tens o código, o segundo if fica bloqueado à espera que a temperatura passe dos 30º
Tem de ser algo do género:

Código: [Seleccione]
if( (millis()-tempHIT)>=1UL*60UL*1000UL && flagTM==0) { //Verifica se já passou 1 minuto
    // já

    if (CheckTemp() > 30)
        // ainda está a cima de 30º
        digitalWrite(saida, HIGH); //Acende o led da board do Arduino

    flagTM=1;
}

E como tens o código, no setup devias inicializar o flagTM a 1.

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: Contadores de minutos millis()
« Responder #2 em: 18 de Setembro de 2013, 15:00 »
Boas. Não estou certo se percebi bem o que tu queres fazer, mas penso que o resultado esperado seja que o led acenda quando a temperatura for maior do que 30 durante mais de um minuto, e apague logo que baixe desse valor. Alem disso, quando o led apaga, só pode voltar a acender 30 minutos depois.
Assumindo que é isto, eu faria a coisa com uma pequena máquina de estados. Tambem poderias fazer com várias flags e verificar as várias condições de outras formas, mas pessoalmente eu sugeria fazer assim.
Há 4 estados possiveis para o sistema:
-Temperatura abaixo dos 30º
-Temperatura acima dos 30, mas à menos de 1 minuto
-Temperatura acima dos 30, à mais de 1 minuto
-Periodo de cooldown, onde vai esperar 30 minutos sem fazer nada

Eu cada um destes estados, basta fazer um ou dois testes simples e passar para o estado seguinte (as flags fazem +- o mesmo, mas acho que é mais simples pensar apenas num estado de cada vez, do que ter de olhar para 3 ou 4 flags ao mesmo tempo (porque ainda irias precisar de mais) para tomar as decisões.

O if proposto pelo jm_araujo só vai testar a temperatura no fim de passar o minuto, o que significa que se a temperatura baixar e voltar a subir durante esse minuto, o led acende à mesma no fim, e penso que isso não seja o pretendido...

Código: [Seleccione]
int pinoLM35 = A15; // Pino Analogico onde vai ser ligado a pata do meio do LM35
int valorLido = 0; // Variavel onde se ira guardar o valor lido pelo LM53
int saida = 22; // Pino Do LED da Board Do Arduino
float temperatura = 0; //Variavel onde vai ser guardada a Temperatura

#define TARGET_TEMPERATURE 30

#define BELOW_TEMP 1
#define ABOVE_TEMP_LESS_1_MINUTE 2
#define ABOVE_TEMP_MORE_1_MINUTE 3
#define COOLDOWN_30_MINUTES 4
byte state;

unsigned long minute_start;
unsigned long cooldown_start;

void setup() {
  Serial.begin(9600);
  pinMode(saida, OUTPUT);
  state = BELOW_TEMP;
}

void loop()
{
// Verifica os vários estados possíveis
switch(state)
{
// Se a temperatura anterior estava abaixo do valor pretendido
case BELOW_TEMP:
if (CheckTemp() >= TARGET_TEMPERATURE)
{
// Comeca a contar o minuto e regista a mudança de estado
minute_start = millis();
state = ABOVE_TEMP_LESS_1_MINUTE;
}
break;
// Se já passou o valor pretendido, mas à menos de 1 minuto
case ABOVE_TEMP_LESS_1_MINUTE:
// Se nesta fase a temperatura for abaixo do valor pretendido, volta ao estado inicial
if (CheckTemp() < TARGET_TEMPERATURE) state = BELOW_TEMP;
else
{
// Caso se mantenha acima do valor pretendido, vai testando se já passou 1 minuto
if (millis() - minute_start >= 1UL*60UL*1000UL)
{
// Se já passou o minuto, acende o led e passa ao estado activo
state = ABOVE_TEMP_MORE_1_MINUTE;
digitalWrite(saida, HIGH);
}
}
break;
// Se estamos na situação em que já passou o valor pretendido à mais de 1 minuto
case ABOVE_TEMP_MORE_1_MINUTE:
// Se nesta fase a temperatura for abaixo do valor pretendido, vai para o estado de cooldown
if (CheckTemp() < TARGET_TEMPERATURE)
{
//Quando a temperatura baixa do valor pretendido, apaga o led e inicia o periodo de cooldown
state = COOLDOWN_30_MINUTES;
cooldown_start = millis();
digitalWrite(saida, LOW);
{
break;
// Se estamos na situação em que o sistema está à espera de passar 30 minutos para activar outra vez
case COOLDOWN_30_MINUTES:
// A unica coisa a fazer aqui é ver se já passaram 30 minutos
if (millis() - cooldown_start >= 30UL*60UL*1000UL)
{
state = BELOW_TEMP; // Volta ao estado inicial
}
break;
{

}

float CheckTemp()
{
  if(millis() - startTime >=1000){
valorLido = analogRead(pinoLM35); //Coloca na Variavel valorLido o que está a ser lido pelo sensor.
temperatura = (valorLido *  0.4887585532746823069403714565); ///
//temperatura = temperatura / 9.31 *; /// Conversão do valor obtido atraves da porta analogica para um valor “usavel”
Serial.print("Temperatura actual:"); // Imprime no Serial Monitor “Temperatura Actual:”
Serial.println(temperatura); // Imprime no Serial monitor o valor da variavel temperatura

  startTime = millis();
  }
  return temperatura; // Retorna A temperatura
}

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.234
    • Tiago Rodrigues
Re: Contadores de minutos millis()
« Responder #3 em: 18 de Setembro de 2013, 15:12 »
Não era mais simples teres uma variável flag para saber a condição do teste anterior e mediante essa saber qual dos casos estas a testar?

Lembra-te da metodologia KISS
http://pt.wikipedia.org/wiki/Keep_It_Simple

Online jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.124
  • NERD!
Re: Contadores de minutos millis()
« Responder #4 em: 18 de Setembro de 2013, 15:20 »
Tarquinio, fizeste a papinha toda ao rapaz, assim não aprende nada.

Ao menos a positiva ficou garantida, basta enfiar os fios nos buracos certos para ter uma boa nota ;)


PS:Tou só a ser mauzinho, não liguem. :D




Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.390
  • Helpdesk do sitio
Re: Contadores de minutos millis()
« Responder #5 em: 18 de Setembro de 2013, 15:30 »
Os floats do arduino são só de 32 bits, isto:
0.4887585532746823069403714565

Não é preciso..
Avr fanboy

Online jm_araujo

  • Mini Robot
  • *
  • Mensagens: 2.124
  • NERD!
Re: Contadores de minutos millis()
« Responder #6 em: 18 de Setembro de 2013, 16:03 »
Os floats do arduino são só de 32 bits, isto:
0.4887585532746823069403714565

Não é preciso..
E fica muito mais legível (e fácil de corrigir) se estiver na forma da fração original:
500/1023 = 0.4887585532746823069403714565


Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: Contadores de minutos millis()
« Responder #7 em: 18 de Setembro de 2013, 16:17 »
Tarquinio, fizeste a papinha toda ao rapaz, assim não aprende nada.
Ao menos a positiva ficou garantida, basta enfiar os fios nos buracos certos para ter uma boa nota ;)

Acordei, vi o post e tava com vontade de programar... E prontos gerou-se código! ;) Mas nem li em lado nenhum que era para um projecto académico, pensei que fosse algo para por a funcionar um projecto pessoal. Se soubesse que era para uma aula provávelmente teria dado só umas dicas tb.

Citação de: tig_pt

Não era mais simples teres uma variável flag para saber a condição do teste anterior e mediante essa saber qual dos casos estas a testar?
Aqui é mais uma questão de preferência, acho eu... Da maneira como eu penso, acho mais natural pensar numa máquina de estados com um valor diferente para cada estado, do que ter várias flags, cada uma para cada estado diferente, alterando cada uma delas separadamente. Seja como for, vais ter sempre de ter a noção do estado em que o sistema está. Fazendo a mesma coisa com várias flags, duvido que a coisa fosse ficar muito mais pequena... As condições a ser verificadas são as mesmas, só que podem ser feitas por uma ordem diferente. E de cada vez que eu mudo o estado no meu código, na versão equivalente usando flags teriam de ser alteradas uma ou mais flags. Por isso o código iria acabar por ter +- o mesmo tamanho, acho que aqui a maneira "correcta" é mesmo a maneira que cada programador preferir :)


Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.234
    • Tiago Rodrigues
Re: Contadores de minutos millis()
« Responder #8 em: 18 de Setembro de 2013, 16:19 »
tens razão, mas quando vi o post não tinha visto sequer o teu reply e estava a ver se puxava a ideia das state machines.

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: Contadores de minutos millis()
« Responder #9 em: 18 de Setembro de 2013, 21:14 »
Pronto então tava tudo a convergir para o mesmo... ;)
Mas ainda não percebi... A cena afinal é para um trabalho escolar ou para um projecto pessoal? :P
Se for para aprendizagem eu para a proxima slacko mais no código... :)

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.234
    • Tiago Rodrigues
Re: Contadores de minutos millis()
« Responder #10 em: 18 de Setembro de 2013, 22:22 »
Independentemente do objectivo final, embora estejamos todos aqui para nos ajudar-mos, gostamos de ensinar a pescar e orientar sem dar logo a papinha feita para que consigamos aprender uns com os outros.

Não é regra mas é quase uma opinião unanima.

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: Contadores de minutos millis()
« Responder #11 em: 18 de Setembro de 2013, 22:32 »
Sim tens razão, aprende-se mais se se tiver que puxar mais pela cabeça... Eu tambem costumo dar mais respostas nesse sentido, em vez de fazer tudo. Hoje acho que foi mais por já ter saudades me programar no meu arduino que me deu para disparar o código todo :)

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.234
    • Tiago Rodrigues
Re: Contadores de minutos millis()
« Responder #12 em: 18 de Setembro de 2013, 23:56 »
Haha.

Estou a precisar de gente com essa vontade para um projeto que estou a fazer a prova de conceito antes de apresentar oficialmente. Se quiseres ajudar apita.

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: Contadores de minutos millis()
« Responder #13 em: 19 de Setembro de 2013, 00:36 »
Tens algum sitio onde estejas a discutir esse projecto? Ou podes mandar-me PM se não quiseres estar a discutir num thread, nunca se sabe... :)

Offline TigPT

  • Administrator
  • Mini Robot
  • *****
  • Mensagens: 5.234
    • Tiago Rodrigues
Re: Contadores de minutos millis()
« Responder #14 em: 19 de Setembro de 2013, 10:35 »
Mandei PM