To taki zabawowy projekt na jeden wieczór no a przy okazji kolejny przykład zastosowania języka skryptowego środowiska Waveforms.
Był odczyt równoległej pamięci EPROM no to teraz będzie zegarek.
Układowo całość jest banalna - schemat poniżej.
Spory dylemat miałam w wyborem wyświetlacza, w zamyśle miał być taki zupełny old-school.
Casting na główną rolę wygrał polski CQYP74, ale okazało się szybko, że nie pasuje do płytki stykowej,
jest zbyt wąski. Finalnie wykorzystałam rosyjski wyświetlaczyk z roku 88, klimat odpowiedni zapewniony.
Nietrudno zgadnąć, że cały wic w tej zegarkowej zabawce to odpowiednie oprogramowanie.
Zagadnienia są w sumie trzy:
* jak pozyskać bieżącą wartość czasu - obiekt Date i metody getHours(), getMinutes()
* jak na jednej cyfrze pokazać godziny i minuty, ich dziesiątki i jedności - podział na kolejne cyfry i ich kolejne `wymiganie`
* konwersja liczb 0..9 na kody 7-seg to już detal - tablice kontrolujące zapalanie odpowiednich segmentów (typowy lookup)
Tu dygresja na boku:
język skryptowy Waveforms oparto o Qt-Script, więc biorąc pod uwagę (jak zwykle) skromność firmowego help-a warto poszukać dodatkowych informacji w sieci, ja znalazłam sobie to:
https://doc.qt.io/archives/qsa-1.2.2/language.html
Cały programik sterujący poniżej:
Kod: Zaznacz cały
var segment_A = Array( 1, 0, 1, 1, 0, 1, 1, 1, 1, 1 );
var segment_B = Array( 1, 1, 1, 1, 1, 0, 0, 1, 1, 1 );
var segment_C = Array( 1, 1, 0, 1, 1, 1, 1, 1, 1, 1 );
var segment_D = Array( 1, 0, 1, 1, 0, 1, 1, 0, 1, 1 );
var segment_E = Array( 1, 0, 1, 0, 0, 0, 1, 0, 1, 0 );
var segment_F = Array( 1, 0, 0, 0, 1, 1, 1, 0, 1, 1 );
var segment_G = Array( 0, 0, 1, 1, 1, 1, 1, 0, 1, 1 );
var segment_K = Array( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
function setDigit( n ) {
StaticIO.Channel0.DIO[0].checked = segment_A [ n ];
StaticIO.Channel0.DIO[1].checked = segment_B [ n ];
StaticIO.Channel0.DIO[2].checked = segment_C [ n ];
StaticIO.Channel0.DIO[3].checked = segment_D [ n ];
StaticIO.Channel0.DIO[4].checked = segment_E [ n ];
StaticIO.Channel0.DIO[5].checked = segment_F [ n ];
StaticIO.Channel0.DIO[6].checked = segment_G [ n ];
StaticIO.Channel0.DIO[7].checked = segment_K [ n ];
}
function setNone( ) {
StaticIO.Channel0.DIO[0].checked = 0;
StaticIO.Channel0.DIO[1].checked = 0;
StaticIO.Channel0.DIO[2].checked = 0;
StaticIO.Channel0.DIO[3].checked = 0;
StaticIO.Channel0.DIO[4].checked = 0;
StaticIO.Channel0.DIO[5].checked = 0;
StaticIO.Channel0.DIO[6].checked = 0;
StaticIO.Channel0.DIO[7].checked = 0;
}
while ( 1 ) {
currentTime = new Date();
hours_H = currentTime.getHours() / 10;
hours_L = currentTime.getHours() %10;
minutes_H = Math.floor( currentTime.getMinutes() / 10 );
minutes_L = currentTime.getMinutes() % 10;
seconds_H = Math.floor( currentTime.getSeconds() / 10 );
seconds_L = currentTime.getSeconds() % 10;
//debug
print (
currentTime.getHours() + ":" +currentTime.getMinutes() + ":" + currentTime.getSeconds() +
" -> " +
hours_H + " | " + hours_L + "|" +
minutes_H + " | " + minutes_L + " | " +
seconds_H + " | " + seconds_L
);
setDigit( hours_H ); wait( 0.2 ); setNone();
wait( 0.1 );
setDigit( hours_L); wait( 0.2 ); setNone();
wait( 0.4 );
setDigit( minutes_H ); wait( 0.2 ); setNone();
wait( 0.1 );
setDigit( minutes_L); wait( 0.2 ); setNone();
wait( 0.8 );
}
Dobór czasu aktywności wyświetlacza (błysku cyfry) to jest sprawa otwarta, regulowałam to na przysłowiowe oko (dosłownie!) aż odczyt był w miarę jednoznaczny i dało się rozróżnić godziny od minut.
Na koniec filmik dokumentalny oraz mała galeria z prac na tą zabawką.
https://youtu.be/6SKU-awa3AQ