• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Licznik osób wchodzących oraz wychodzących
#1
Witam Big Grin ,
Jestem w trakcie pisania programu do mojego projektu, którym jest licznik osób - tak jak w temacie na bazie dwóch czujników ultradźwiękowych HC - SR04. Z racji tego, że jestem początkującym napotkałem pewien problem. Mianowicie licznik zlicza bardzo chaotycznie i nierówno Confused . Zgaduje, iż jest to kwestia programu i samego uwarunkowania kiedy licznik idzie w dół, a kiedy do góry. Dlatego przychodzę z tym tutaj i będę wdzięczny za każdą ukazaną pomoc. Podkreślę tylko, że czujniki ułożone są od razu po sobie - w szeregu. Kod napisałem na bazie jednej z książek, udostępnię go na końcu wątku. Wyszedłem z założenia, że w momencie gdy oba czujniki wykryją osobę to zmieni się stan zmiennej "state" po czym w zależności od tego, który pierwszy przestanie wykrywać licznik zwiększy lub zmniejszy się o jeden. Kod:

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define TRIG_1 12
#define ECHO_1 13
#define TRIG_2 6
#define ECHO_2 7
int count=0;
const int WFA = 0; // WFA - waiting for arrival
const int WFD = 1; // WFD - waiting for departure
int state = WFA;

LiquidCrystal_I2C lcd(0x27,20,4);  
void setup()
{
  Serial.begin(9600);
  lcd.init();                      // initialize the lcd
  lcd.backlight();
  pinMode(TRIG_1, OUTPUT);
  pinMode(ECHO_1, INPUT);
  pinMode(TRIG_2, OUTPUT);
  pinMode(ECHO_2, INPUT);
  lcd.setCursor(0, 0);
  lcd.print("Liczba osob:");
}

void loop()
{

  float czas_1, dist_1, czas_2, dist_2;
  digitalWrite(TRIG_1, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_1, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_1, LOW);
 
  czas_1=pulseIn(ECHO_1, HIGH);
  dist_1 = czas_1/58.0;

  digitalWrite(TRIG_2, LOW);
  delayMicroseconds(2);
  digitalWrite(TRIG_2, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_2, LOW);
 
  czas_2=pulseIn(ECHO_2, HIGH);
  dist_2 = czas_2/58.0;

if(state == WFA && dist_1 < 30 && dist_2 < 30)
{
  state = WFD;
}
if(state == WFD && dist_1 >= 30 && dist_2 < 30)
{
  delay(350);
  state = WFA; 
  count++;
}
if(state == WFD && dist_2 >= 30 && dist_1 < 30 && count >0)
{
  delay(350);
  state = WFA; 
  count--; 
}
if(digitalRead(12) == HIGH)
{
  count = 0;
}
lcd.setCursor(0,1);
lcd.print(count);
delay(100);

}
 
Odpowiedź
#2
A dlaczego HC-SR04? po co ci pomiar odległości czujnik-człowiek? Nie prościej było by użyć bariery podczerwieni ?
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości