Contador de um estacionamento

Bom dia pessoal,

Tenho uma dúvida a respeito ao meu protótipo que estou realizando. É uma estacionamento, onde ele controla a disponibilidade das vagas através de um sinal do sensor indutivo e envia as informações para um display LCD (Vagas livres/Vagas ocupadas)

Porém, o contador não está funcionando… Eu mando “printar” mas há um problema na contagem. É bem imprevisível, hora não tem alteração no valor das vagas, e hora tem mais não altera de acordo com a contagem (pula 2 números e até 3)

Alguém pode me ajudar e dizer onde estou errando?

Segue o programa:

#include <LiquidCrystal.h>

const int SENSOR1 = 22;
const int SENSOR2 = 23;
const int SENSOR3 = 24;

int VAGA1 = 0;
int VAGA2 = 0;
int VAGA3 = 0;

int VAGAS_LIVRES = 3;
int VAGAS_OCUPADAS = 0;

LiquidCrystal lcd (12, 11, 5, 4, 3, 2);

void setup () {

lcd.begin(16,2);
lcd.setCursor(0,0);
lcd.print("Vagas Livres = ");
lcd.setCursor(0,1);
lcd.print("Vagas Ocup. = ");

pinMode(SENSOR1, INPUT);
pinMode(SENSOR2, INPUT);
pinMode(SENSOR3, INPUT);

}

void loop () {

VAGAS_LIVRES = VAGA1 + VAGA2 + VAGA3;
VAGAS_OCUPADAS = VAGAS_LIVRES - 3;

lcd.setCursor(15, 0);
lcd.print(VAGAS_LIVRES);
lcd.setCursor(14, 1);
lcd.print(VAGAS_OCUPADAS);

VAGA1 = digitalRead(SENSOR1);

if (VAGA1 == HIGH){

VAGA1 = VAGA1 + 1;

}
else {
VAGA1 = 0;
}

VAGA2 = digitalRead(SENSOR2);

if (VAGA2 == HIGH) {

VAGA2 = VAGA2 + 1;

}
else {

VAGA2 = 0;

}

VAGA3 = digitalRead(SENSOR3);

if (VAGA3 == HIGH) {

VAGA3 = VAGA3 + 1;

}

else {

VAGA3 = 0;

}
}

Obrigado! :slight_smile:

Viva eliveltonsassi! Bem-vindo ao fórum. Comece por ler as regras do fórum e altere o código de forma a que esteja conforme as normas (e mais legível).

Obrigado luisilva !

Segue então novamente minha questão.
O que puderem me ajudar, ficarei grato!


#include <LiquidCrystal.h>

const int SENSOR1 = 22;
const int SENSOR2 = 23;
const int SENSOR3 = 24;

int VAGA1 = 0;
int VAGA2 = 0;
int VAGA3 = 0;

int VAGAS_LIVRES = 3;
int VAGAS_OCUPADAS = 0;

LiquidCrystal lcd (12, 11, 5, 4, 3, 2);

void setup () {
 
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.print("Vagas Livres = ");
  lcd.setCursor(0,1);
  lcd.print("Vagas Ocup. = ");
 
  pinMode(SENSOR1, INPUT);
  pinMode(SENSOR2, INPUT);
  pinMode(SENSOR3, INPUT);
 
              }

void loop () {
 
  VAGAS_LIVRES = VAGA1 + VAGA2 + VAGA3;
  VAGAS_OCUPADAS = VAGAS_LIVRES - 3;
 
    lcd.setCursor(15, 0);
    lcd.print(VAGAS_LIVRES);
    lcd.setCursor(14, 1);
    lcd.print(VAGAS_OCUPADAS);
   
 
  VAGA1 = digitalRead(SENSOR1);
 
  if (VAGA1 == HIGH){
   
    VAGA1 = VAGA1 + 1;
   
         }
  else  {
    VAGA1 = 0;
        }
 
  VAGA2 = digitalRead(SENSOR2);
 
  if (VAGA2 == HIGH) {
   
  VAGA2 = VAGA2 + 1;
 
       }
  else {
   
  VAGA2 = 0;
   
       }
       
   VAGA3 = digitalRead(SENSOR3);
 
  if (VAGA3 == HIGH) {
   
  VAGA3 = VAGA3 + 1;
 
        }
 
  else {
   
  VAGA3 = 0;
   
       }
       }

São 3 parques de estacionamento? Ou é um parque com 3 vagas de estacionamento? Como está a implementar os sensores? Sabe o que é "debounce"? Penso que é isso que faz falta (neste tipo de sensores não se deve aplicar este termo, mas a ideia é idêntica).

luisilva,

É um estacionamento, com varias vagas (mas reduzi pra tres para nao ficar muito extenso aqui para voces, ja que o conceito sera o mesmo para todas as vagas).

Os sensores indutivos sao 24v. Liguei cada um deles a contatos NA de relés (1relé para cada sensor) para mandarem o sina 5v para as entradas do arduino (denominadas de SENSOR1, SENSOR2, SENSOR3)

Não, nao conheço o termo debounce, infelizmente nao tenho muita experiencia com programação :/

Você está lendo os sensores rápido demais

Experimente, somente a título de experiência, por enquanto, colocar um delay() a cada iteração do seu programa. Antes do último colchete fechar coloque:

delay(250); // 250ms = 1/4 de segundo, tempo suficiente para fazer o efeito de "debounce"

AlxDroidDev,

Não entendi direito. É isso o que você quis dizer: ??

  if (VAGA1 == HIGH){
   
    VAGA1 = VAGA1 + 1;
   
         }

  else  {


    VAGA1 = 0;
        }

delay (250);

  VAGA2 = digitalRead(SENSOR2);

  if (VAGA2 == HIGH) {
   
  VAGA2 = VAGA2 + 1;

       }

  else {

   
  VAGA2 = 0;
   
       }
       
delay(250);

   VAGA3 = digitalRead(SENSOR3);

  if (VAGA3 == HIGH) {
   
  VAGA3 = VAGA3 + 1;

        }

  else {
   
  VAGA3 = 0;
   
       }
       }
delay(250);

Ou o delay está colocado incorretamente?

Antes do último colchete fechar :

  if (VAGA1 == HIGH){
   
    VAGA1 = VAGA1 + 1;
   
         }

  else  {


    VAGA1 = 0;
        }

delay (250);

  VAGA2 = digitalRead(SENSOR2);

  if (VAGA2 == HIGH) {
   
  VAGA2 = VAGA2 + 1;

       }

  else {

   
  VAGA2 = 0;
   
       }
       
delay(250);

   VAGA3 = digitalRead(SENSOR3);

  if (VAGA3 == HIGH) {
   
  VAGA3 = VAGA3 + 1;

        }

  else {
   
  VAGA3 = 0;
   
       }

delay(250);
  }

Você está lendo os sensores rápido demais

Experimente, somente a título de experiência, por enquanto, colocar um delay() a cada iteração do seu programa.

Ler um sensor rapido demais é uma expressao ironica, ja que nao é isso que devemos desejar, actualizar o estado do sensor o mais rapido possivel e actuar ou processar algo mediante o estado deste?
Neste caso em particular penso que devias fazer o debounce em hardware, visto que se vais ter imensos lugares nao vais querer perder um evento se tiveres o teu cpu pausado.
Isso com delays pode até dar a sensaçao de funcionar, mas é má pratica de programaçao pausares o programa.

Legal.

Assim que eu fizer o teste, trago o resultado para saber se será útil para a aplicação ou não!!

Mais alguma idéia?

Fala pessoal.

Fiz os testes que vocês me falaram, mas nada adiantou. Acredito que a programação acima, está correta. Porém a montagem está com alguns ruídos (acredito eu)

Fazendo varias medições, percebi que ao acionar um sensor, varios relés recebem o sinal de 5v. Para corrigir isso, coloquei resistores de pullup entre o relé e o arduino (10k ohms)

Deu uma melhorada, mas ainda assim continua dando alguns ruidos, pois consigo perceber que os textos do display continua sempre tentando alterar o numero de vagas livres/ocupadas. :confused:

Ja tirei a fonte de alimentação do notebook (USB) e alterei pra uma fonte externa, mas mesmo assim nao adiantou. :sleeping:

Alguem pode me ajudar se preciso de algo pra tirar esse ruido da fonte, ou do relé? Talvez diodos ou capacitores?

Obg.

1 - Incluir deboucing é uma boa ideia sim se ele será feito por hardware ou software fica a tua escolha. Eu faria por software utilizando uma lógica com a função millis. Estude isso: http://playground.arduino.cc/Learning/SoftwareDebounce

2 - Ao que parece essa parte do código não está ok, veja os comentários no código abaixo:

  VAGA1 = digitalRead(SENSOR1);   
 
  if (VAGA1 == HIGH){   // aqui a variavel VAGA1 será igual a 1
   
    VAGA1 = VAGA1 + 1;  // aqui a variavel VAGA1 será igual a 2
   
         }

  else  {
    VAGA1 = 0;
        }