• 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
Programowanie czujnika Halla
#1
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. 
 
#2
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;
}
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
#3
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);
   }
 }
 
#4
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.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
#5
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();
   }
 }
 
#6
Zamykam.
[Obrazek: banerelektronika.jpg]



Jeśli pomogłem podziękuj punktem reputacji Wink
 
  


Skocz do:


Przeglądający: 1 gości