[146] Praktyczny wyświetlacz z czterema przewodami cz. 2
![[146] Praktyczny wyświetlacz z czterema przewodami cz. 2](/_next/image?url=https%3A%2F%2Farduino.pl%2Fimgproxy%2FPk7KC9eMHDpdQ36qhrFb4HCsXuSkVwkwwBnxW-vuI0k%2Ff%3Awebp%2Fw%3A1200%2FbG9jYWw6Ly8vaW1hZ2VzLzAwMDAtLzY5Nzg5LzU1NDJkLzAwMDAtNjk3ODk1NTQyZDgyYzk0Mzk2NjQzMy5wbmc%3D.webp&w=3840&q=75)
W poprzednim artykule zbudowaliśmy miernik czasów migawek aparatów klasycznych, ale miał on wadę. Dokładność powyżej sekundy była wystarczająca, ale poniżej bardzo marna i zwiększała się dopiero przy migawkach rzędu jedna kilkudziesiętna sekundy. Czas to naprawić. Postanowiłem zrobić użytek z przycisku podłączonego do pinu ósmego płytki edukacyjnej TME. Z chwilą jego wciśnięcia zmienimy tryb pracy na pomiar czasu w milisekundach. 10 tysięcy milisekund bez jednej to bardzo dobry zakres, by badać dokładności migawki w czasach nieco krótszych niż sekunda. Tak wygląda poprawiony szkic.
#include <TM1637Display.h> // Biblioteka obsługująca układ TM1637
TM1637Display display(3, 4); // Deklarowanie portów wyświetlacza: CLK, DIO
volatile unsigned long openingMoment = 0; // Moment otwarcia migawki.
volatile unsigned long closingMoment = 0; // Moment zamknięcia migawki.
volatile bool isMeasuring = false; // Flaga - ustawiona, jeśli trwa pomiar.
const byte phototransistorPort = 2; // Adres portu fototranzystora (2 albo 3)
const byte colon[4] = { 0, 128, 0, 0 }; // Tablica dwukropka.
const byte msButton = 8; // Przycisk zmieniający odczyt w milisekundach.
void setup() {
pinMode(phototransistorPort, INPUT); // Deklaruj port fototranzystora jako wejście.
pinMode(msButton, INPUT_PULLUP); // Deklaruj port przycisku jako wejście podciągnięte.
display.setBrightness(15); // Ustawiaw jasność wyświetlacza (0...15)
display.setSegments(colon); // Prześlij na wyświetlacz zawartość powyższej tablicy.
attachInterrupt(digitalPinToInterrupt(phototransistorPort), interrupt, CHANGE); // Włącz przerwania z portu fototranzystora.
}
void loop() {
if (closingMoment > 0) { // Jeśli pomiar jest zakończony...
unsigned long exposureTime = closingMoment - openingMoment; // Policz czas migawki.
if (digitalRead(msButton)) { // Jeśli wymuszono odczyt w milisekundach...
display.showNumberDecEx(exposureTime / 1000, 0, true, 4, 0); // Wyświetl czas migawki w milisekundach z zerami wiodącymi.
} else if (exposureTime < 1000000UL) { // Jeśli przycisk puszczono i czas migawki jest krótszy od sekundy...
display.showNumberDecEx((1000000UL / exposureTime), 0, false, 4, 0); // Wyświetl czas migawki w formie fotograficznej.
} else { // Jeśli przycisk puszczono i czas migawki jest równy sekundzie lub dłuższy...
display.showNumberDecEx((exposureTime / 10000), 64, false, 4, 0); // Wyświetl czas migawki z dwoma miejscami po przecinku (dwukropku).
}
closingMoment = 0; // Wyzeruj licznik dla kolejnego pomiaru.
}
}
void interrupt() {
if (digitalRead(phototransistorPort) == LOW) { // Jeśli migawka została otwarta...
if (!isMeasuring) { // Jeśli nie było mierzenia...
openingMoment = micros(); // Wpisz stan micros do zmiennej momentu otwarcia migawki.
isMeasuring = true; // Włącz flagę mierzenia.
}
} else { // Jeśli migawka została zamknięta...
if (isMeasuring) { // Jeśli było mierzenie...
closingMoment = micros(); // Wpisz stan micros do zmiennej momentu zamknięcia migawki.
isMeasuring = false; // Wyłącz flagę mierzenia.
}
}
}A więc teraz, oprócz niezbędnej deklaracji portu, będziemy musieli dodać jeszcze jeden warunek. Jeśli przycisk zostanie wciśnięty, wynik w mikrosekundach podzielimy przez tysiąc i wyślemy na wyświetlacz. Ale żeby odróżnić ten sposób od poprzedniego, postanowiłem zmienić sposób prezentacji wyników, aktywując wyświetlanie zer wiodących. Zamieniłem trzeci argument funkcji na prawdę. Wyniki te będą się pojawiać dopóki przycisk będzie wciskany, więc w praktycznych realizacjach można tu wstawić przełącznik. Natomiast jeśli ten przycisk będzie zwolniony, program przejdzie dalej, do fragmentu identycznego z poprzednim, prezentując formę klasyczną wartości migawki.
Trzeba pamiętać, że na płytce edukacyjnej wstawiono inwertery, więc w przypadku „gołego” Arduino należy zaprzeczyć warunkowi w linii:
if (digitalRead(msButton)) {I to już wszystko, co chciałem zrobić z tym fotograficznym przydasiem. Ale jeszcze kila słów komentarza. Mając wolne piny, możemy w ten sam sposób realizować regulację jasności wyświetlacza. Całość, jak mówiłem, dobrze jest wrzucić w moduł Nano czy Mili, tworząc małe, zwarte urządzenie. Niestety wyświetlacz katalogowo pracuje dopiero od 3,6 wolta, więc nie da się tu przejść na logikę trzywoltową. Można za to zasilać urządzenie z baterii litowej. Biblioteka ma też pewną wadę: wprowadza niewielkie opóźnienia. Jeśli nam to będzie przeszkadzać, można skorzystać z biblioteki alternatywnej, która pracuje na innej zasadzie obliczania niezbędnych dla wyświetlacza opóźnień. Prezentowane urządzenie spełnia funkcję licznika migawki, ale mając zasoby możemy realizować kolejne zadania: na przykład samowyzwalacza z nastawianym czasem zadziałania, układu do wyzwalania seryjnego migawki czy lampy, a także zegara ciemnicowego – i to wszystko za pomocą jednej płytki Arduino.
























































