Berlin klocka, Arduino Nano, DS1307 Realtidsklocka. 74HC595N 8-bitars skiftregister. (3 / 5 steg)
Steg 3: Elektronik och programmet förklaras
Som förklarade jag använder en Arduino Nano (eller klon) för enhet 3 * 595 SKIFT register och en RTC ansluten till I2C att hålla tiden. På denna punkt jag försöker och förklara de mer utmanande delarna av koden, eftersom det inte är en uppenbart en att räkna ut, (även om lätt när du arbeta ut det).
Tiden levereras av realtidsklocka som 0-59 sekunder, minuter 0-59 och timmar 0-23. Eftersom klockan är baserad på 5 är måste du dela den minuter (och timmar) av 5 först får du raden "5 minuter" (det andra
en upp) om du sedan träna modulus av beräkningen då ger dig resten som är 0-4 minuter (slutresultat).
dvs. minuter = 48
48/5 = 9 (spara det som minFives)
48 %5 = 3 (spara det som minUnits)
9 tänder på andra raden i 45 minuter sedan 3 lampor på den nedersta raden i 3 minuter tillsätt de två tillsammans ger dig 48.
bor med protokollet nästa problem är 595 SKIFT register innehåller endast 8 bitar och jag behöver använda en fullständigt och sedan 3 "bitar" av ett annat register.
Så att göra denna titt på minFives (0-11) och om antalet är större än 7 sedan dela värdet i två värden.
dvs. om (minFives > 7)
om (minFives > 7) {
regOne = minFives;
regTwo = minFives-8.
}
annat
{
regOne = minFives;
regTwo = 0;
}
Nästa fråga är att visa alla lampor och inte bara det faktiska antalet, så i ovanstående exempel (48) du har 3 lampor på den nedersta raden och 9 ljus på andra raden. Så för att korrigera detta för den nedersta raden måste du aktivera ljus 1och ljus 2 och ljus 3, vilket innebär ett antal 7 (totalt 1 + 2 + 4) behöver skickas till seriell registret. Jag är säker på att det finns mer än ett sätt att göra detta men jag valde att köra en slinga för det givna talet och för varje slinga dubbel indexnumret och lägga till fil. (se nedan för pow() funktion som ett alternativ)
dvs.
k = 1; nummer för att läggas till varje gång men kommer att fördubblas för varje slinga.
j = 0; antal gånger slingan kommer att köras.
medan (j < (regOne)) / / regOne är ett nummer 0-8
{
minFivesBar1 = minFivesBar1 + k;
k = k * 2;
j = j + 1.
}
förhoppningsvis kan du arbeta här ute, men i grund och botten får du rätt erforderligt antal lysdioder lyser för ett givet input tal.
dvs. 1 = 1, 2 = 3, 3 = 7, 4 = 15, 5 = 31
Jag insåg efter att jag skrev detta att jag kunde använda funktionen pow() så jag kommer att göra ett försök och se om dess effektivare. exempel, ingång 6 (pow(2,6)) -1 = 63
(Jag provade det och det är verkligen inte mycket skillnad i tiden, båda är riktigt snabb. Jag antar att pow() ser snyggare men jag fastnade med funktionen ovan)