04-07-2017, 08:22
Witam,
Proszę spróbować:
Póki co liczona jest średnia z 10-ciu pomiarów i nadal używana jest funkcja pulseIn().
Jeśli to nie pomoże to spróbujemy to zrealizować inaczej.
Pozdrawiam,
Tomek.
Proszę spróbować:
Kod:
#include <Servo.h> //Biblioteka odpowiedzialna za serwa
#define hallPin 2 //hall na pinie 2
Servo serwomechanizm; //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa
byte pozycja = 0; //Aktualna pozycja serwa 0-180
unsigned long przerwa; //czas miedzy 'mignieciami' niskiego stanu halla
void setup() {
pinMode(hallPin, INPUT_PULLUP); //ustawienie halla
serwomechanizm.attach(11); //Serwomechanizm podłączony do pinu 11
Serial.begin(9600);
}
void loop()
{
// zmmenna pomocnicza do oblicznia sredniej z 10-ciu pomiarow
byte licznik = 0;
// zmienna do obliczenia sredniej arytmetycznej
unsigned long srednia = 0;
// zmienna pomocnicza pojedynczego odczytu
unsigned int odczyt;
// petla w ktorej obliczana jest serdnia z 10-ciu pomiarow
// z eliminacja odczytow z poza zakresu
while (licznik < 10)
{
// odczyt
odczyt = pulseIn(hallPin, LOW);
// sprawdzenie czy w zakresie
if ((odczyt > 2200)&&(odczyt < 3250))
{
// jesli tak to dodanie wyniku do poprzednich
srednia += odczyt;
licznik++;
}
}
// obliczenie sredniej
srednia /= 10;
pozycja = map(srednia, 3250, 2200, 90, 0); //Zamieniamy je na pozycję serwa
serwomechanizm.write(pozycja); //Wykonajujemy ruch
delay(250);
/*
przerwa = pulseIn(hallPin, LOW); //odczytujemy przerwy w impulsach halla, liczba maleje ze wzrostem obrotow
if(przerwa < 3250)
if(przerwa > 2200)
{
pozycja = map(przerwa, 3250, 2200, 90, 0); //Zamieniamy je na pozycję serwa
serwomechanizm.write(pozycja); //Wykonajujemy ruch
Serial.print("hall =\t");
Serial.print(przerwa);
Serial.print("\ servo =\t");
Serial.println(pozycja);
}
else
{
Serial.println("poza skala");
}
delay(250); //Opóźnienie
*/
}
Póki co liczona jest średnia z 10-ciu pomiarów i nadal używana jest funkcja pulseIn().
Jeśli to nie pomoże to spróbujemy to zrealizować inaczej.
Pozdrawiam,
Tomek.