05-06-2022, 19:33
Witam ,
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 . 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);
}
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 . 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);
}