Go Down

Topic: Projecto com arduino (Read 2459 times) previous topic - next topic

Gouveia

Boas pessoal.
Queria pedir uma ajuda.
Eu mais um colega meu estamos a fazer um projecto com o arduino.
Que consiste em fazer um programa para um portão que irá ser automático, e estamos com algumas dificuldades, pois não dominamos muito isto. Já temos um pedaço de código desenvolvido, mas agora não estamos a conseguir avançar mais porque nos deparamos com um problema na questão do delay().

Codigo:

int motor_abre = 12;
int motor_fecha = 13;
int chave_a = 11;
int chave_f = 8;
int fotoc = 7;
int fc_f = 9;
int fc_a = 10;
int botao=6;

int aberto = 0;
int fechado = 0;
int ordem = 0;
int abrir_c=0;
int fechar_c=0;
int sensor=0;

void setup() {
 
  pinMode(motor_abre, OUTPUT); 
  pinMode(motor_fecha, OUTPUT);
  pinMode(chave_a, INPUT);
  pinMode(chave_f, INPUT);
  pinMode(fc_f, INPUT);
  pinMode(fc_a, INPUT);
  pinMode(fotoc, INPUT);
  pinMode(botao, INPUT);
}



void loop(){
   
  aberto=digitalRead(fc_a);           
  fechado=digitalRead(fc_f);   
  ordem=digitalRead(botao);
  sensor=digitalRead(fotoc);
 
    if(fechado==0 & ordem==1){
        digitalWrite(motor_abre, HIGH); 
      }
      else{
        if(aberto==0){
          digitalWrite(motor_abre, LOW);
         delay (5000);}
        }
    }
   
   
    if(aberto==0 ){
     
        digitalWrite(motor_fecha, HIGH); 
      }
      else{
        if(fechado==0){
          digitalWrite(motor_fecha, LOW);
    }
    }
  }

No delay que temos no programa, ele está a funcionar, o portão abre, activa o fim de curso "fc_a" e faz o delay de 5s, passados esses 5 segundos começa a fechar, mas se manualmente carregarmos no fim de curso "fc_f" o portão não vai parar, só pára passados outros 5s, e não estamos a perceber porque, pois não estamos a mandar fazer isso.

Se alguém poder ajudar, agradecia-mos.
Obrigado

robtillaart

Please translate to English with www.google.com/translate on the international forum,
and please use the # button to properly tag your code
---
Por favor, traduzir para Inglês com www.google.com / translate no fórum internacional,
e por favor, use o botão # para adequadamente tag seu código

(strange I replied on the same post in the international section , sorry)

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)

bubulindo

O problema com o delay() (que é constantemente mal usado) é que bloqueia o programa, ou seja:

Code: [Select]

void loop(){

    if(fechado==0 & ordem==1){
        digitalWrite(motor_abre, HIGH); 
      }
      else{
        if(aberto==0){
          digitalWrite(motor_abre, LOW);
         delay (5000);}  \\  <-  O PROGRAMA PARA AQUI DURANTE 5 SEGUNDOS
        }
    }
   
   
    if(aberto==0 ){
     
        digitalWrite(motor_fecha, HIGH); 
      }
      else{
        if(fechado==0){
          digitalWrite(motor_fecha, LOW);
    }
    }
  }



Se queres usar temporizacões, experimenta com a funcão millis().

Para tornar o código mais perceptível, não seria pior colocares o desenho ou então definires o que é o 0 e o 1.

Quanto ao problema... acho que é algo como:

Code: [Select]


    if(fechado==0 & ordem==1){    //O portão não está fechado e provavelmente não estás a enviar comando nenhum para activar a ordem. Então, este if falha.
        digitalWrite(motor_abre, HIGH); 
      }
      else{
        if(aberto==0){   //como o portão está a fechar, os sensores de aberto e fechado estão desactivos e este if vai estar correcto, iniciando um delay().
          digitalWrite(motor_abre, LOW);
         delay (5000);}
        }
    }


Tenta fazer uma máquina de estados deste género:

Code: [Select]

#define PORTAO_ABERTO   10
#define PORTAO_FECHADO 20
#define PORTAO_ABRIR      30
#define PORTAO_FECHAR   40

int estado = 0;
unsigned long inicio = 0;
unsigned long agora = 0;

loop() {

switch (estado) {
    case PORTAO_FECHADO : {
        if (ordem == true)  {
            //liga motor para abrir portão.
            estado = PORTAO_ABRIR;
            }
        break; }
    case PORTAO_ABRIR: {
        if (aberto == true) {
            //para motor.
            estado = PORTAO_ABERTO;
            inicio = millis();
            }
            break;}
    case PORTAO_ABERTO: {
        agora = millis();
        if (agora-inicio > 5000) {//5 segundos
             //ligar motor para fechar portão
             estado = PORTAO_FECHAR;
             }
        if (ordem_para_fechar_portao == true)  {
            //ligar motor para fechar portão
             estado = PORTAO_FECHAR;
             }
        break;}
    case PORTAO_FECHAR: {
        if (fechado == true)  {
            //desliga motor.
            estado = PORTAO_FECHADO;
            }
        break; }
    }


Desta forma apenas testas determinadas condicões se o portão estiver no estado pretendido e permite-te adicionar muito mais condicões que não entrem em conflito como tens agora. Por exemplo, se o portão estiver a fechar e tu pretenderes abrir, ou vice-versa, etc, etc...
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).

lordskynner

Tenta usar isto, deixei meio comentado, testei com leds somente, e na corrida, mas no lugar de leds, acionariam os delés, que acionariam os motores.


Code: [Select]
int motor_abre = 6;
int motor_fecha = 7;
int fc_f = 4;
int fc_a = 5;
int comando=3;

int sentido = 0;  // Sentido da movimentação do motor
int movendo = 0;  // Verifica se o motor está em movimento
int posicao = 0;  // POsição inicial do Motor  0 Aberto 1 Fechado
int tempoAuto = 5000;  //Tempo de fechamento Automatico em Milisegundos

int aberto;      // Fim de curso de abertura
int fechado;    //  Fim de curso Fechamento
int com;        //  Botoeira de acionamento
int startTime;
int autoFech;

void initSen(){    // Verifica a posição do motor e fim de curso, ao alimentar a placa, caso o fim de curso
  if (digitalRead(fc_a) == 0){ posicao = 1; }       // dos lados esteja acionado, para evitar tranco no motor
  else if(digitalRead(fc_f) == 0){posicao = 0; }
}

void setup() {
  pinMode(motor_abre, OUTPUT); 
  pinMode(motor_fecha, OUTPUT);
  pinMode(fc_f, INPUT);
  pinMode(fc_a, INPUT);
  pinMode(comando, INPUT);
  digitalWrite(motor_fecha,LOW);    //Seta ambas as posições do motor como paradas ao iniciar a placa
  digitalWrite(motor_abre,LOW);
  initSen();
}



void loop(){
  if ((millis()-startTime > tempoAuto)&&(autoFech == 1)) fecha();    //Verifica e fecha o portão automatico no tempo programado
  aberto=digitalRead(fc_a);    // Pega acionamento Fim de Curso Abertura
  fechado=digitalRead(fc_f);  // Pega acionamento Fim de Curso Fechamento
  com=digitalRead(comando);   // Pega acionamento do botão de comando, para abrir, fechar e parar o motor
     if (com == 0){
      if (movendo == 1){      // Se motor estiver se movendo faz ele parar com a botoeira
        if (sentido == 0){
        movendo = 0;
        posicao = 1;
        sentido = 0;
        digitalWrite(motor_abre,LOW);
        } else if (sentido == 1){
        delay(50);
        movendo = 0;
        posicao = 0; 
        sentido = 1;
        digitalWrite(motor_fecha,LOW); 
        }     
      } else if(movendo == 0){    // Se o motor está parado, faz aciona o motor
        if ((posicao == 0)){
            abre();
        } else if ((posicao == 1)){
            fecha();
        }     
      }
        delay(300);     
    }
      if ((aberto == 0)&&(movendo == 1)&&(sentido == 0)){    // Desliga no fim de curso de abertura
        movendo = 0;
        posicao = 1;
        sentido = 1;
        startTime = millis();
        autoFech = 1;
        digitalWrite(motor_abre,LOW);
      } else if ((fechado == 0)&&(movendo == 1)&&(sentido == 1)){  // Desliga no fim de curso de fechamento
        movendo = 0;
        posicao = 0; 
        sentido = 1;
        digitalWrite(motor_fecha,LOW);

      }
}

void abre(){
  digitalWrite(motor_abre,HIGH);
  sentido = 0;
  movendo = 1;
}

void fecha(){
  digitalWrite(motor_fecha,HIGH); 
  sentido = 1;
  movendo = 1;
  autoFech = 0;
}


julio_locks

estou fazendo algo similar no tcc e  precisava de uma ajuda com a parte fisica do projeto, alguem me daria uma luz de como fazer a conexao dos sensores com o arduino?

Go Up