Унапређење #4
Рутине за чување укупног времена свирања.
Позадина
Како већ погон користи флексибилну (читај програмабилну) контролу, једна од задњих опција које сам хтео имплементирати је снимање укупног времена свирања. Ово је, бар за мене, прилично корисна функција за праћење старости звучнице.
Ова могућност би морала укључити бар следећe:
Снимање укупног времена ротације;
Приказ тог времена у формат који се лако чита (нарочито на минијатурном дисплеју); и,
Брисање (ресетирање) укупног времена.
Приступ
Типично, Ардуино ресетира све параметре (променљиве) при сваком искључивању. На срећу, Nano има ЕЕПРОМ (non-volatile) величине једног (1) килобајта, што би требало бити довољно за ову фукнционалност.
Имплементација је прилично једноставна:
При сваког извршења главне петље, упоређује се број тикова (ticks) са ранијом вредности;
Кад разлика тикова надмаши 1 секунду, у ЕЕПРОМ се упише нова вредност;
Кад се напуни слот ЕЕПРОМ-а, показивач се повећа.
Код
Сва логика око снимања се налази унутар процедури checkTimer():
void checkTimer()
{
if (timerCurrentMicros == 0 && timerPreviousMicros == 0)
{
timerCurrentMicros = micros();
timerPreviousMicros = timerCurrentMicros;
}
else { timerCurrentMicros = micros(); }
int timerSeconds = (int) ((timerCurrentMicros - timerPreviousMicros) / 1000000);
if (timerSeconds > 0)
{
for (int e = 0; e < timerSlots; e++)
{
byte valueX = EEPROM.read(e);
timerX[e] = (int) valueX;
}
timerPreviousMicros = timerCurrentMicros;
int changeX = timerSeconds;
for (int e = 0; e < 4; e++)
{
timerX[e] += changeX;
if (timerX[e] > 255)
{
changeX = timerX[e] - 255;
timerX[e] = changeX;
changeX = 1;
}
else
{
changeX = 0;
}
EEPROM.write(e, timerX[e]);
}
}
}
А регулира се уз помоћ пар променљива:
unsigned long timerCurrentMicros = 0, timerPreviousMicros = 0;
const int timerSlots = 4; int timerX[timerSlots]; const int timerMessageWait = 5000; long timerMessage = 0; boolean timerShown = false;
Калкулација укупног времена је у процедури calculateRunTime():
void calculateRuntime(int & calcX1, int & calcX2)
{
long runtimeX = 0;
for (int e = 0; e < timerSlots; e++)
{
int tempX = (int) EEPROM.read(e);
if (tempX > 0) { runtimeX += tempX * pow(255, e); }
}
calcX2 = (runtimeX / 60) % 60;
calcX1 = (int) (runtimeX / 3600);
}
Ресетирање тајмера (ЕЕПРОМ-а) је у процедури clearTimer():
void clearTimer()
{
if (activeSpin || !timerShown)
{
return;
}
writeToDisplay(5);
for (int e = 0; e <= timerSlots; e++) {
EEPROM.write(e, 0);
}
}
Рад
За приступ тајмеру, тахометар мора да буде у stand-by стању:
Дужи притисак на дугме за промену брзине показује укупно време;
Након 5 секунди дисплеј се враћа на stand-by мод;
Дужи притисак на дугме за укључивања ротације док је дисплеј у моду првог корака (показано укупно време) ресетира тајмер.
Приказ показује укупан број сати и минута, због ограничења простора на дисплеју:
Закључак
Ово је задње планирано унапређење. Будуће промене су планиране једино у склопу оддржавања.
Код је, као и увек (4f0184d), овде:
https://github.com/stojnev/dwr-controller