Przyznam szczerze, że siedzę nad kodem już dobrych parę dni, a nadal nie mogę znaleźć przyczyny błędnego działania.
Na wstępie wspomnę w jakim celu ma służyć dany kod. Potrzebuję mierzyć czas wysokiego stanu sygnału. Przeglądając multum stron internetowych w poszukiwaniu rozwiązania, natknąłem się na funkcję pulseIn, która rzekomo powinna rozwiązać mój problem. Użyłem osobnego Arduino w celu symulowania sygnału - najprostszy możliwy schemat, oparty na funkcjach delay oraz digitalWrite - zapala i gasi diodę co sekundę. pulseIn powinien zwracać wartość 1000 ms za każdym razem, niestety tak nie jest. Poniżej załączam uproszczony kod, rejestrujący czas wysokiego stanu.
Czego już próbowałem?
1. Wyczytałem, że funkcja pulseIn ma wbudowany tzw. "timeout", standardowo ustawiony na wartość 1000 ms. Jeżeli w ciągu jednej sekundy nie zarejestruje sekwencji stanów: low>high>low, zwraca wartość 0. Oczywiście wartość timeout'u można zmienić przykładowo na dwie sekundy wpisując: pulseIn(pin,HIGH,2000);
2. Zmieniałem wartość przerw pomiędzy stanem niskim i wysokim w symulowanym sygnale (korzystałem z różnych: 10ms, 100ms).
3. Symulowałem sygnał przy pomocy innych funkcji. Przykładowo standardowy PWM, "analogWrite" oraz "tone" - w tym przypadku pulseIn odczytuje jakieś wartości. W przypadku digitalWrite zwraca za każdym razem 0.
Na wstępie wspomnę w jakim celu ma służyć dany kod. Potrzebuję mierzyć czas wysokiego stanu sygnału. Przeglądając multum stron internetowych w poszukiwaniu rozwiązania, natknąłem się na funkcję pulseIn, która rzekomo powinna rozwiązać mój problem. Użyłem osobnego Arduino w celu symulowania sygnału - najprostszy możliwy schemat, oparty na funkcjach delay oraz digitalWrite - zapala i gasi diodę co sekundę. pulseIn powinien zwracać wartość 1000 ms za każdym razem, niestety tak nie jest. Poniżej załączam uproszczony kod, rejestrujący czas wysokiego stanu.
Czego już próbowałem?
1. Wyczytałem, że funkcja pulseIn ma wbudowany tzw. "timeout", standardowo ustawiony na wartość 1000 ms. Jeżeli w ciągu jednej sekundy nie zarejestruje sekwencji stanów: low>high>low, zwraca wartość 0. Oczywiście wartość timeout'u można zmienić przykładowo na dwie sekundy wpisując: pulseIn(pin,HIGH,2000);
2. Zmieniałem wartość przerw pomiędzy stanem niskim i wysokim w symulowanym sygnale (korzystałem z różnych: 10ms, 100ms).
3. Symulowałem sygnał przy pomocy innych funkcji. Przykładowo standardowy PWM, "analogWrite" oraz "tone" - w tym przypadku pulseIn odczytuje jakieś wartości. W przypadku digitalWrite zwraca za każdym razem 0.
Kod:
float Th; // czas trwania stanu wysokiego (w tym czasie samochód spala 0,006 l)
void setup(){
Serial.begin(9600);
pinMode(7,INPUT); // wejście rejestrowania sygnału paliwomierza
}
void loop() {
/* Rejestracja i przetwarzanie sygnału z paliwomierza */
Th = pulseIn(7,HIGH); // pomiar czasu trwania pojedynczego stanu wysokiego na wejściu paliwomierza. W tym czasie samochód spala 0,006 l (jednostka [ms])
Serial.println(Th, 4);
}