Arduino Polska Forum

Pełna wersja: Programowanie czujnika Halla
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Witam. 
Mam problem z oprogramowaniem czujnika halla. Posiadam dokładnie coś takiego: https://www.e-biker.pl/czujnik-pas-rapid,3,1090,3128
Potrzebuję uzyskać z takiego czujnika informacją czy korba w rowerze się obraca. Czyli jeżeli dobrze rozumiem to typu boolean. Tylko nie wiem za chiny ludowe jak do tego się zabrać. Szukałem informacji w czeluściach internetu ale odpowiedzi nie znalazłem. Przydały by się jakieś poradnik nie muszą być w języku polskim, lub gotowy program.  Obstawiam że czujnik halla jest cyfrowy bo na tym działa poprawnie i dioda miga. Myślałem nad czymś takim, że muszę teraz jakoś muszę zliczyć ilość impulsów. W tedy gdy zliczy mi 8 impulsów lub więcej to korba się obraca i na wyjściu będę miał 1, a przy przerwie np 1sek już nie kręci się i wartość jest równa 0.  Tylko nie wiem jak to zaprogramować jestem Zielony w tym.

Kod:
const int hallPin = 8;
const int ledPin = 13;

int hallState = 0;


void setup(){
 pinMode(hallPin, INPUT);
 pinMode(ledPin, OUTPUT);
 digitalWrite(hallPin, HIGH);
}


void loop(){
 hallState = digitalRead(hallPin);


if (hallState == HIGH){
   digitalWrite(ledPin, LOW);
 }
 else{
   digitalWrite(ledPin, HIGH);
 }
}


Pozdrawiam. 
Możesz napisać na przykład tak:
Kod:
//gdzieś w loop
int licznik;
int przerwa;
bool wyjscie;

if(hallState==1){
licznik++;
  if (licznik > 8){
wyjscie=1;
przerwa = millis;
}
}

else if(millis-przerwa>1000){
wyjscie=0;
}
Niestety cały czas sypie 1 na wyjściu. Trzeba chyba zrobić w warunku zmianę żeby nie wykrywała tylko stanu wykiego czujnika ale może zmianę że wysoki i niski i dopiero licznik ++
Kod:
const int hallPin = 8;
int hallState = 0;
int licznik = 0;
int przerwa = 0;
bool wyjscie = 0;


void setup(){
 Serial.begin(9600);
 pinMode(hallPin, INPUT);
 digitalWrite(hallPin, HIGH);
}


void loop(){
 hallState = digitalRead(hallPin);
  if(hallState==1){
   licznik++;
  }
 if (licznik > 8){
   wyjscie=1;
   Serial.println(wyjscie);
   licznik = 0;
   przerwa = millis;
 }
 

   else if(millis-przerwa>1000){
    wyjscie=0;
    Serial.println(wyjscie);
   }
 }
A wykrycie magnesu to jedynka, czy może zero.
Bo jak masz w setupie digitalWrite(hallPin, HIGH); to podłączasz pullup i zera nigdy nie wykryjesz na hallu, bo on nie zwiera portu do masy.
Jeśli jedynka to zakomentuj tę linię co podałem i powinno być dobrze.
Wymagało to trochę więcej zmian niż mi się na początku wydawało. Działa i dzięki za pomoc.
Zostawie tu dla potomności Big Grin
Kod:
const int hallPin = 8;
int hallState = 0;
int licznik = 0;
long pauza = 0;
bool wyjscie = 0;
int prew = 0;


void setup(){
 pinMode(hallPin, INPUT);
 digitalWrite(hallPin, HIGH);
 prew = digitalRead(hallPin);
 pauza = millis();
}


void loop(){
 hallState = digitalRead(hallPin);
 
  if(hallState!= prew){
   licznik++;
   pauza = millis();
   prew=hallState;
  }
 if (licznik > 8){
   wyjscie=1;
   pauza = millis();
   licznik=0;
 }
 else if(millis()-pauza>1000){
    wyjscie=0;
    pauza= millis();
   }
 }
Zamykam.