16-02-2024, 16:28
(12-01-2018, 20:14)adixpogo napisał(a): Witam,
Uważam, że zmienna Th wręcz powinna być typu float. Zależy mi na wartościach dziesiętnych. Udało mi się uzyskać odczyt sygnału. Mój błąd - nie doczytałem dość istotnej informacji, że timeout jest liczony w mikrosekundach, nie milisekundach.
Przyznam szczerze, że funkcja pulseIn w miarę precyzyjnie wychwytuje sygnały o wyższej częstotliwości. Gdy przychodzi do pomiaru niskich częstotliwości (poniżej 1Hz), dane mają niewiele wspólnego z rzeczywistymi wartościami. Chyba pozostaje wspomniane przez Ciebie alternatywne rozwiązanie z wykorzystaniem przerwań.
witam, post bardzo stary, ale może ktoś tak jak ja przegląda stare archiwa w poszukiwaniu rozwiązania. Funkcja pulseln() zwraca wartość w mikrosekundach typu unsigned long.
Kod:
int pin = 7;
unsigned long duration;
void setup() {
Serial.begin(9600);
pinMode(pin, INPUT);
}
void loop() {
duration = pulseIn(pin, HIGH);
Serial.println(duration);
}
a tu przykład oparty na przerwaniach:
Kod:
/*
* Non-blocking pulseIn(): returns the pulse length in microseconds
* when the falling edge is detected. Otherwise returns 0.
*/
unsigned long read_pulse(int pin)
{
static unsigned long rising_time; // time of the rising edge
static int last_state; // previous pin state
int state = digitalRead(pin); // current pin state
unsigned long pulse_length = 0; // default return value
// On rising edge: record current time.
if (last_state == LOW && state == HIGH) {
rising_time = micros();
}
// On falling edge: report pulse length.
if (last_state == HIGH && state == LOW) {
unsigned long falling_time = micros();
pulse_length = falling_time - rising_time;
}
last_state = state;
return pulse_length;
}