Cwik klocka v1.0 - An Arduino binär klocka (7 / 15 steg)
Steg 7: Prototyping displayen och tidsinställning
För detta använder vi en enda pole double throw (SPDT) switch, eller en "på - på" switch. Fäst den mellersta ledningen analog ingång A2, en av de utanför leder till marken, och andra utanför bly till 5V. Metoden analogRead(A2) ska nu returnera 0 eller 1023 när växeln ska växlas fram och tillbaka.
Vi vill tala om för användaren visuellt de är i läget för inställning av tid med en LED. Uno har endast 14 digitala stift, och eftersom vi redan använder dem alla (13 för tid lysdioder), och 1 stift för PWM som ska användas på den analog mätaren, vi lyckligtvis kan förvandla en analog stift till en digital ut pin! Helt enkelt kalla pinMode (A5, OUTPUT) för att använda A5 som en digital utgång pin.
Vi kommer att behöva kontrollera om vi är i tid-inställning eller tid-Visa läge i början av metoden loop(). Vi kommer att sätta det logiken i en metod som kallas checkMode().
Nu du har en binär klocka som håller tiden, och kan ställas in manuellt av användaren!
Hela koden så långt
/*
Cwik klocka v1.0 - prototyper displayen
Författare: Dennis Cwik
Datum: Juli 23, 2012
Detta program är registeransvarige för en binär klocka, med lysdioder
fäst till digital stift 0 till 10, möjliggör 12 och 13, tid
inställning med potentiometrar och kan växlas mellan tid
ställa in läge och tid visningsläge.
Denna exempelkod är offentlig.
*/
Detta kan ändras för debug ändamål att göra en minut gå snabbare.
int ONE_SECOND = 1000; mäts i millisekunder
int DELAY_BETWEEN_LOOP_CALLS = 200. mäts i millisekunder
Jag kom inte med detta, det är från arduino dokumentationen
osignerade långa MAX_UNSIGNED_LONG = 4294967295; = (2 ^ 32) - 1
int HOUR_INPUT_PIN = A0;
int MIN_INPUT_PIN = A1;
int CLOCK_MODE_SWITCH_PIN = A2;
int CLOCK_MODE_LED_PIN = A5;
1: a kolumnen av lysdioder
int PIN_MIN1 = 0;
int PIN_MIN2 = 1;
int PIN_MIN4 = 2;
int PIN_MIN8 = 3;
2: a kolumnen av lysdioder
int PIN_MIN10 = 4;
int PIN_MIN20 = 5;
int PIN_MIN40 = 6;
3: e kolumnen av lysdioder
int PIN_HOUR1 = 7.
int PIN_HOUR2 = 8;
int PIN_HOUR4 = 9;
int PIN_HOUR8 = 10;
4: e kolumn med lysdioder
int PIN_HOUR10 = 12;
int PIN_HOUR20 = 13.
sista gången sekunderna i tiden var ökas
osignerade långa m_lastTick;
brukade berätta för oss om vi ställer tiden eller inte
booleska m_inTimeSetMode = false;
tid
byte m_second;
byte m_minute;
byte m_hour;
Rutinen installationsprogrammet körs en gång när du trycker på reset:
void setup()
{
med en av de analoga ingångarna som utdata
pinMode (CLOCK_MODE_LED_PIN, OUTPUT);
initiera stiften används för utskrift av tid som utgång
pinMode (PIN_MIN1, OUTPUT);
pinMode (PIN_MIN2, OUTPUT);
pinMode (PIN_MIN4, OUTPUT);
pinMode (PIN_MIN8, OUTPUT);
pinMode (PIN_MIN10, OUTPUT);
pinMode (PIN_MIN20, OUTPUT);
pinMode (PIN_MIN40, OUTPUT);
pinMode (PIN_HOUR1, OUTPUT);
pinMode (PIN_HOUR2, OUTPUT);
pinMode (PIN_HOUR4, OUTPUT);
pinMode (PIN_HOUR8, OUTPUT);
pinMode (PIN_HOUR10, OUTPUT);
pinMode (PIN_HOUR20, OUTPUT);
initiera klocka variabler
m_lastTick = 0;
setTime (2, 18, 0);
}
loop rutinen körs för evigt om och om igen:
void loop()
{
checkMode();
se om vi ställa in tiden, eller att låta tiden flöde normalt
om (m_inTimeSetMode)
{
getTimeFromPots();
}
annat
{
Tick();
}
nu när tiden har uppdaterats, Visa tid
displaySeconds();
displayMinutes();
displayHours();
godtyckliga fördröja så att vi inte behandlar bort 100% av tiden,
en handling av energispar
Delay(DELAY_BETWEEN_LOOP_CALLS);
}
/**
* En helper metoden att ställa in m_hour, m_minute och m_second.
*/
void setTime (byte newHour, byte newMinute, byte newSecond)
{
m_second = newSecond;
m_minute = newMinute;
m_hour = newHour;
}
/**
* Denna metod håller reda på det logiska flödet av tid. Om tillräckligt med tid har
* gått sedan den senaste gången som det kallades, m_second, m_minute och m_hour
* kommer att uppdateras lämpliga. Detta beaktar den millis() rullar
* över ungefär varje 50 dagar.
*/
void tick()
{
osignerade långa nu = millis();
osignerade långa msElapsed;
först måste vi ta reda på hur mycket tid har gått sedan senast gången vi
kallas tick()
om (nu < m_lastTick)
{
Flämta, antingen har vi lyckats resa tillbaka i tiden, eller millis() virad runt!
msElapsed = (MAX_UNSIGNED_LONG - m_lastTick) + nu;
}
annat
{
msElapsed = nu - m_lastTick;
}
för varje sekund som har passerat (förhoppningsvis bara 1, om inte vår kod är verkligen laggar),
Lägg 1 sekund till tiden och öka minuter & timmar om det behövs.
för (int jag = 0; jag < msElapsed / ONE_SECOND; ++ jag)
{
m_lastTick = m_lastTick + ONE_SECOND;
++ m_second;
om (m_second == 60)
{
m_second = 0;
++ m_minute;
om (m_minute == 60)
{
m_minute = 0;
++ m_hour;
om (m_hour == 24)
{
m_hour = 0;
}
}
}
}
}
void displaySeconds()
{
TODO styra analoga visningen
}
/**
* Denna metod läser den rörliga m_minute, omvandlar den till ett binärt och visar
* det på lämplig lysdioder (de vara PIN_MIN *).
*/
void displayMinutes()
{
byte som = m_minute % 10.
digitalWrite (PIN_MIN1, kära & B1);
digitalWrite (PIN_MIN2, kära & B10);
digitalWrite (PIN_MIN4, kära & B100);
digitalWrite (PIN_MIN8, kära & B1000);
uppdelningen är ganska dyra, men antar vi att sammanställa optimerar detta för oss :)
byte tior = m_minute / 10;
digitalWrite (PIN_MIN10, tens & B1);
digitalWrite (PIN_MIN20, tens & B10);
digitalWrite (PIN_MIN40, tens & B100);
}
/**
* Denna metod läser den rörliga m_hour, omvandlar den till ett binärt och visar
* det på lämplig lysdioder (de vara PIN_HOUR *).
*/
void displayHours()
{
byte som = m_hour % 10.
digitalWrite (PIN_HOUR1, kära & B1);
digitalWrite (PIN_HOUR2, kära & B10);
digitalWrite (PIN_HOUR4, kära & B100);
digitalWrite (PIN_HOUR8, kära & B1000);
byte tior = m_hour / 10;
digitalWrite (PIN_HOUR10, tens & B1);
digitalWrite (PIN_HOUR20, tens & B10);
}
/**
* Denna metod läser värdena från de 2 potentiometrar, konverterar dem till
* mimnutes och timmar, och uppsättningar m_minute och m_hour till de associerade värdena.
*/
void getTimeFromPots()
{
Läs potentiometrar
int hourSensor = analogRead(HOUR_INPUT_PIN);
int minuteSensor = analogRead(MIN_INPUT_PIN);
skala avläsningarna (från 0 till 1023) att i lämplig skala (0 till 23 timmar, 0 till 59 minuter)
setTime (karta (hourSensor, 0, 1023, 0, 23), karta (minuteSensor, 0, 1023, 0, 59), 0);
vi ställa in den sista markeringen nu, eftersom när vi in m_inTimeSetMode till false
många sekunder kunde har gått sedan sist, och tiden skulle hoppa framåt
m_lastTick = millis();
}
/**
* Denna metod kontrollerar CLOCK_MODE_SWITCH_PIN för att se om det är hög. Om det är,
* Det innebär att vi nu i klockläge set (m_inTimeSetMode är satt till true), och
* blir CLOCK_MODE_LED_PIN.
*/
void checkMode()
{
m_inTimeSetMode = (analogRead(CLOCK_MODE_SWITCH_PIN) > 512);
digitalWrite (CLOCK_MODE_LED_PIN, m_inTimeSetMode);
}