Egy Hall jeladós folyadék áramlás mérőt akarok beüzemelni.
Az elv az lenne hogy amikor érzékeli a szenzor jelét akkor rögzíti az időt.
Az utolsó két időrögzítést kivonja egymásból és megvan mennyi idő telik el két jel érzékelése között.
A mérés pontosítása miatt az utolsó 5 mérést átlagolom és ezt az eredményt dolgozom fel.
Egy kijelzőn kiíratom a sebességet. Jelenleg a két jel közti időt de ezt át lehet alakítani sebességre.
Hogy ne villogjon a kijelző és olvasható legyen a sebesség, ezért a kijelzőt csak időnként frissítem.
Ha az átlag számításnál a számlálót nullázom akkor a kijelző megjelenítésnél nem működik a késleltetés.
Nem látom mi köze van a kettőnek egymáshoz.
A kódban egy shift regiszter is van ahol az értékeket 8 leden kijelzem.
Kód: Egész kijelölése
//Pin connected to ST_CP of 74HC595
int latchPin = 23;
//Pin connected to SH_CP of 74HC595
int clockPin = 22;
////Pin connected to DS of 74HC595
int dataPin = 24;
int kimenet[8]={0};//Shift regiszterrel kiírt adatok tárolása
String adat;
int karakter;
int modul=8; //Shift regiszter modulok száma
//A beolvasott HEXA értékek átkonvertálása
int hallPin = 40; //Hall érzékelő
int hall_count =0;
int hall_new =0;
int hall_old =0;
int szamlalo=0;
long starttime;
long endtime;
long time;
long kiirt;
long sebesseg[5]={0};
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
//set pins to output so you can control the shift register
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(hallPin, INPUT);
// Serial.begin(115200);
lcd.begin(16, 2);
lcd.print("hello, world!");
}
void loop()
{
lcd.display();
hall_new=digitalRead(hallPin);
if(hall_new==HIGH && hall_old==LOW)
{
endtime=starttime;
starttime = micros();
hall_count++;
}
time=starttime-endtime;
hall_old=hall_new;
digitalWrite(latchPin, LOW);
digitalWrite(13, LOW);
time=time;
if(szamlalo<6)
{
szamlalo++;
sebesseg[szamlalo]=time;
if(szamlalo==6)
{
szamlalo=0;
}
}
time=(sebesseg[0]+sebesseg[1]+sebesseg[2]+sebesseg[3]+sebesseg[4])/5;
if(time>0)
{
kimenet[0]=time;
}
if(micros()-starttime>1000000)
{
kimenet[0]=0;
}
for(int i=modul-1;i>=0;i--)
{
shiftOut(dataPin, clockPin, MSBFIRST, kimenet[i]);
}
if((micros()-kiirt)>1000000)
{
lcd.clear();
lcd.print(kimenet[0]);
lcd.print(" ");
lcd.print(micros());
kiirt = micros();
}
digitalWrite(latchPin, HIGH);
digitalWrite(13, HIGH);
}