Witam
Dość długo podchodziłem do tego zagadnienia.
Początkowo chciałem zrealizować to na mikrofonie i wzmacniaczu.
Ostatecznie po poszukiwaniach i analizie postanowiłem to zrobić na odczycie temperatury przy nosie.
Wdech omiata termometr powietrzem otoczenia i go ochładza, a wydech podnosi temperaturę powietrzem z płuc.
W zasadzie to działa, ale sam algorytm wymaga małego dopieszczenie i podniesienia selektywności i tu za bardzo nie wiem co zrobić. Więc swoje kroki kieruję do bardziej doświadczonych programistów.
Mianowicie wygląda to tak iż za czujnik temperatury robi najbanalniejszy DS18b20 ustawiony na odczyt 9bitowy (dla zmniejszenia czasu oczekiwania na konwersję A-D)
Wynik jest porównywany z poprzednim odczytem i gdy jest wyższy to zwiększa się licznik oddechu.
Wprowadzenie dodatkowej zmiennej "FLAGA" zapobiega ponownemu zwiększeniu licznika "oddech" przy tym samym wydechu. Gdyż aby ponownie "flaga" została ustawiona, musi być odczyt temperatury niższy od poprzedniego, czyli nastąpić wdech.
Dodatkowo dla wprawek nad procedurą zapala się dioda sygnalizująca nastąpienie wydechu. Ale to tak dla wizualizacji.
W zasadzie taka procedura działa i w 90% spełnia swoją funkcję, ale zdarza się iż niekiedy i tak podwójnie zliczy oddech (szczególnie przy długich wdechach), lub gdy leży nieużywany czujnik na stole, sam z siebie zlicza impulsy gdyż odczyty temperatur wahają się same z siebie o jakieś ułamki.
Chciałem ograniczyć trochę czułość pomiaru stosując zaokrąglenie wyniku, A właściwie jego części po przecinku (różnica temperatur pomiędzy wdechem a wydechem - zaobserwowane około 0,7C) procedurą Fusing (Temperatura, "#.##") Ale działa mi to jedynie w momencie wyświetlania wyniku na LCD. Gdy chcę to zrobić na zmiennej (single) i dopiero wynik wyświetlić na LCD, to w wyniku dostaję liczbę w formacie 0.00000xxxx
Więc też stanowczo nie tak. A wydaje mi się, że to załatwiło by to sprawę rozbiegu dokładności, gdyż był by mniejszy rozbieg po przecinku.
Będę wdzięczy za pomoc w poprawieniu. lub naprowadzeniu na procedurę poprawiającą selektywność pomiaru.
Dość długo podchodziłem do tego zagadnienia.
Początkowo chciałem zrealizować to na mikrofonie i wzmacniaczu.
Ostatecznie po poszukiwaniach i analizie postanowiłem to zrobić na odczycie temperatury przy nosie.
Wdech omiata termometr powietrzem otoczenia i go ochładza, a wydech podnosi temperaturę powietrzem z płuc.
W zasadzie to działa, ale sam algorytm wymaga małego dopieszczenie i podniesienia selektywności i tu za bardzo nie wiem co zrobić. Więc swoje kroki kieruję do bardziej doświadczonych programistów.
Mianowicie wygląda to tak iż za czujnik temperatury robi najbanalniejszy DS18b20 ustawiony na odczyt 9bitowy (dla zmniejszenia czasu oczekiwania na konwersję A-D)
Wynik jest porównywany z poprzednim odczytem i gdy jest wyższy to zwiększa się licznik oddechu.
Do
...
If Flaga = 1 And Temperatura > Temperatura_temp Then
Flaga = 0
Incr Oddech
Set Portb.0
End If
If Flaga = 0 And Temperatura < Temperatura_temp Then
Flaga = 1
Reset Portb.0
End If
Temperatura_temp = Temperatura
...
Loop
Wprowadzenie dodatkowej zmiennej "FLAGA" zapobiega ponownemu zwiększeniu licznika "oddech" przy tym samym wydechu. Gdyż aby ponownie "flaga" została ustawiona, musi być odczyt temperatury niższy od poprzedniego, czyli nastąpić wdech.
Dodatkowo dla wprawek nad procedurą zapala się dioda sygnalizująca nastąpienie wydechu. Ale to tak dla wizualizacji.
W zasadzie taka procedura działa i w 90% spełnia swoją funkcję, ale zdarza się iż niekiedy i tak podwójnie zliczy oddech (szczególnie przy długich wdechach), lub gdy leży nieużywany czujnik na stole, sam z siebie zlicza impulsy gdyż odczyty temperatur wahają się same z siebie o jakieś ułamki.
Chciałem ograniczyć trochę czułość pomiaru stosując zaokrąglenie wyniku, A właściwie jego części po przecinku (różnica temperatur pomiędzy wdechem a wydechem - zaobserwowane około 0,7C) procedurą Fusing (Temperatura, "#.##") Ale działa mi to jedynie w momencie wyświetlania wyniku na LCD. Gdy chcę to zrobić na zmiennej (single) i dopiero wynik wyświetlić na LCD, to w wyniku dostaję liczbę w formacie 0.00000xxxx
Temperatura = Fusing(temperatura , "#.##")Więc też stanowczo nie tak. A wydaje mi się, że to załatwiło by to sprawę rozbiegu dokładności, gdyż był by mniejszy rozbieg po przecinku.
Będę wdzięczy za pomoc w poprawieniu. lub naprowadzeniu na procedurę poprawiającą selektywność pomiaru.