08-11-2020, 19:41
Hej
Tworzę program do obsługi 2 czujników hala. Nie wiem czy mi to zadziała poprawnie.
Jeden czujnik odpowiedzailny za zliczanie impólsów z przepływomierza z użyciem przerwania. Drugi zlicza czas pomiędzy impulsami i wyznacza prędkość. Osobno jedno i drugie działa, nie wiem jak się zachowa całość, mam tylko jeden czujnik. Możecie rzucić okiem?
Tworzę program do obsługi 2 czujników hala. Nie wiem czy mi to zadziała poprawnie.
Jeden czujnik odpowiedzailny za zliczanie impólsów z przepływomierza z użyciem przerwania. Drugi zlicza czas pomiędzy impulsami i wyznacza prędkość. Osobno jedno i drugie działa, nie wiem jak się zachowa całość, mam tylko jeden czujnik. Możecie rzucić okiem?
Kod:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F,20,4);
#define hallPin 5
byte flowInterrupt = 0; // 0 = digital pin 2
byte flowPin = 2;
float calibrationFactor = 4.0;
volatile byte flowCount;
unsigned long oldTime;
float predkosc;
float obwod_kola = 2.09; //tractor tire circum
byte ilosc_imp = 6; //pulses per revolution on sensor
float wycinek_kola = obwod_kola/ilosc_imp;
float duration;
float dawka;
float wydatek;
void setup() {
Serial.begin(9600);
lcd.init();
lcd.backlight();
pinMode(flowPin, INPUT);
pinMode(hallPin, INPUT);
digitalWrite(flowPin, HIGH);
flowCount = 0;
wydatek = 0.0;
oldTime = 0;
attachInterrupt(flowInterrupt, flowCounter, FALLING);
}
void loop() {
if((millis() - oldTime) > 1000)
{
detachInterrupt(flowInterrupt);
wydatek = ((1000.0 / (millis() - oldTime)) * flowCount) / calibrationFactor;
oldTime = millis();
// Reset the pulse counter so we can start incrementing again
flowCount = 0;
// Enable the interrupt again now that we've finished sending output
attachInterrupt(flowInterrupt, flowCounter, FALLING);
duration = pulseInLong(hallPin, HIGH);
if(duration > 0){
predkosc = (wycinek_kola/(duration*0.00001))*3.6; //get km/h
}else{
predkosc = 0.00;
}
dawka = (wydatek*600)/(0.5 * predkosc); //get litres per hectare
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(dawka, 1);
lcd.print(" L/ha");
lcd.setCursor(0, 3);
lcd.print(predkosc, 1);
lcd.print(" km/h");
}
}
void flowCounter()
{
// Increment the pulse counter for wydatek counting
flowCount++;
}