• 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
Obsługa 2 czujników halla
#1
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?

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++;
}
 
Odpowiedź
#2
Trochę do kitu, funkcja pulseIn może być zakłócona przez przerwania.... A tym samym okres morze być bardzo rozbieżny..
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
O faktycznie, a jak bym aktywował spowrotem przerwania np. poniżej funkcji pulsein, miało by to ręce i nogi? W sumie to niedopatrzenie.
 
Odpowiedź
#4
No jest sens ale też i byś musiał oldtimer po pomiarze zresetować, wiec wyniki będziesz miał 1s+pulsein
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#5
No tak trzeba będzie zrobić.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości