Stap 9: Prototyping het Display, tijdsinstelling en Seconds
In de volgende video gebruik ik de reset-schakelaar op de Uno onze om programma te starten vanaf het begin (tijd 00:00). Kunt u de seconden tellen op de analoge meter die helaas een max waarde van 50, niet 60 heeft (maar we kunnen het openstellen en omwisselen de achtergrond indien gewenst). Ongeacht wat de meter leest, teken het"" 60 keer per minuut. Na een volledige minuut, we zien de tijd wijzigen om 00:01, en de analoge meter wordt opnieuw ingesteld. Ik later schakelen naar instelling tijdweergave (dit is wanneer de oranje LED op de middenboven ingeschakeld wordt), op welk punt kunt u de seconden opnieuw ingesteld op 0. Ik stel de tijd om 16:59, en het moment kom ik tijd instelling modus uit (de oranje LED op de middenboven wordt uitgeschakeld), de seconden op de analoge meter begint opnieuw tellen. Ik wacht nog een minuut, op welk punt de tijd gewijzigd tot 17:00 uur.
De definitieve Code
/*
Cwik klok v1.0 - Prototyping het Display
Auteur: Dennis Cwik
Datum: 23 juli 2012
Dit programma is de controller voor een binaire klok, met LEDs
gekoppeld aan digitale pinnen 0 t/m 10, 12 en 13. 2 potentiometers
aangesloten op A0 en A1 controle hoeveel uren en minuten respectievelijk
en alleen wanneer A2 hoge wordt getrokken. Toen A2 is hoog, trok een LED op
PIN A5 zal oplichten om te vertellen van de gebruiker zijn tijdig ingesteld modus.
Ten slotte, pin 11 met PWM wordt gebruikt om de Toon van de seconden op een analoge
ampèremeter.
Deze voorbeeldcode is in het publieke domein.
*/
Dit kan worden gewijzigd voor debug doeleinden te maken een minuut sneller door.
int ONE_SECOND = 1000; gemeten in milliseconden
int DELAY_BETWEEN_LOOP_CALLS = 200; gemeten in milliseconden
Ik kom niet met dit, het is uit de arduino-documentatie
unsigned long MAX_UNSIGNED_LONG = 4294967295; = (2 ^ 32) - 1
int HOUR_INPUT_PIN = A0;
int MIN_INPUT_PIN = a1 worden verkregen;
int CLOCK_MODE_SWITCH_PIN = A2;
int CLOCK_MODE_LED_PIN = A5;
1e kolom voor LEDs
int PIN_MIN1 = 0;
int PIN_MIN2 = 1;
int PIN_MIN4 = 2;
int PIN_MIN8 = 3;
2e kolom voor LEDs
int PIN_MIN10 = 4;
int PIN_MIN20 = 5;
int PIN_MIN40 = 6;
3e kolom voor LEDs
int PIN_HOUR1 = 7;
int PIN_HOUR2 = 8;
int PIN_HOUR4 = 9;
int PIN_HOUR8 = 10;
PWM op de analoge meter om seconden weer te geven.
int SEC_OUTPUT_PIN = 11;
4e kolom voor LEDs
int PIN_HOUR10 = 12;
int PIN_HOUR20 = 13;
de laatste keer de seconden in de tijd werden verhoogd
unsigned long m_lastTick;
gebruikt om ons te vertellen als we de tijd, of niet instelt
Boole m_inTimeSetMode = false;
de tijd
byte m_second;
byte m_minute;
byte m_hour;
/**
* Verplichte installatieroutine voor Arduino, wordt één keer uitgevoerd bij het begin.
*/
VOID Setup
{
met behulp van één van de analoge ingangen als output
pinMode (CLOCK_MODE_LED_PIN, uitvoer);
initialiseren van de pinnen gebruikt voor de uitvoer van tijd
pinMode (PIN_MIN1, uitvoer);
pinMode (PIN_MIN2, uitvoer);
pinMode (PIN_MIN4, uitvoer);
pinMode (PIN_MIN8, uitvoer);
pinMode (PIN_MIN10, uitvoer);
pinMode (PIN_MIN20, uitvoer);
pinMode (PIN_MIN40, uitvoer);
pinMode (PIN_HOUR1, uitvoer);
pinMode (PIN_HOUR2, uitvoer);
pinMode (PIN_HOUR4, uitvoer);
pinMode (PIN_HOUR8, uitvoer);
pinMode (PIN_HOUR10, uitvoer);
pinMode (PIN_HOUR20, uitvoer);
clock-variabelen initialiseren
m_lastTick = 0;
setTime (0, 0, 0);
}
/**
* Verplichte methode voor Arduino, het heet voortdurend na Setup.
*/
void loop
{
checkMode();
Als we de tijd instellen, of tijd stroom normaal laten zien
Als (m_inTimeSetMode)
{
getTimeFromPots();
}
anders
{
Tick();
}
nu dat het tijd is vernieuwd, de tijd weergeven
displaySeconds();
displayMinutes();
displayHours();
willekeurige vertragen zodat we niet weg 100% van de tijd, zijn verwerkt
een daad van energiebesparing
delay(DELAY_BETWEEN_LOOP_CALLS);
}
/**
* Een helper-methode om het m_hour, m_minute en m_second instellen.
*/
VOID setTime (byte newHour, byte newMinute, byte newSecond)
{
m_second = newSecond;
m_minute = newMinute;
m_hour = newHour;
}
/**
* Deze methode houdt spoor van de logische stroom van de tijd. Als u genoeg tijd heeft
* verstreken sinds de laatste keer dat het werd geroepen, m_second, m_minute en m_hour
* zal nodig worden bijgewerkt. Dit houdt rekening met die millis() rolt
* over ongeveer elke 50 dagen.
*/
VOID tick()
{
niet-ondertekende lang = millis();
unsigned long msElapsed;
Allereerst moeten we erachter te komen hoeveel tijd is verstreken sinds de laatste keer dat we
genaamd tick()
Als (nu < m_lastTick)
{
zucht, ofwel heb gelukt om terug in de tijd, of millis() gewikkeld rond reizen!
msElapsed = (MAX_UNSIGNED_LONG - m_lastTick) + nu;
}
anders
{
msElapsed = nu - m_lastTick;
}
voor elke seconde dat verstreken (hopelijk slechts 1, tenzij onze code echt laggy is),
toevoegen van 1 seconde de tijd en de minuten & uren indien nodig verhoogd
for (int i = 0; ik < msElapsed / ONE_SECOND; ++ ik)
{
m_lastTick = m_lastTick + ONE_SECOND;
++ m_second;
Als (m_second == 60)
{
m_second = 0;
++ m_minute;
Als (m_minute == 60)
{
m_minute = 0;
++ m_hour;
Als (m_hour == 24)
{
m_hour = 0;
}
}
}
}
}
/**
* Deze methode PWM gebruikt voor weergave van de m_second op een analoge meter aangesloten
* om te SEC_OUTPUT_PIN.
*/
VOID displaySeconds()
{
analogWrite (SEC_OUTPUT_PIN, kaart (m_second, 59, 0, 0, 255));
}
/**
* Deze methode leest de m_minute, wordt het geconverteerd naar een binair getal worden omgezet en
* het op de juiste LEDs (degenen die PIN_MIN *).
*/
VOID displayMinutes()
{
byte degenen = m_minute % 10;
digitalWrite (PIN_MIN1, degenen & B1);
digitalWrite (PIN_MIN2, degenen & B10);
digitalWrite (PIN_MIN4, degenen & B100);
digitalWrite (PIN_MIN8, degenen & B1000);
divisie is soort duur, maar we gaan ervan uit dat het compileren optimaliseert dit voor ons :)
byte tientallen = m_minute / 10;
digitalWrite (PIN_MIN10, trans-Europese netwerken & B1);
digitalWrite (PIN_MIN20, trans-Europese netwerken & B10);
digitalWrite (PIN_MIN40, trans-Europese netwerken & B100);
}
/**
* Deze methode leest de m_hour, wordt het geconverteerd naar een binair getal worden omgezet en
* het op de juiste LEDs (degenen die PIN_HOUR *).
*/
VOID displayHours()
{
byte degenen = m_hour % 10;
digitalWrite (PIN_HOUR1, degenen & B1);
digitalWrite (PIN_HOUR2, degenen & B10);
digitalWrite (PIN_HOUR4, degenen & B100);
digitalWrite (PIN_HOUR8, degenen & B1000);
byte tientallen = m_hour / 10;
digitalWrite (PIN_HOUR10, trans-Europese netwerken & B1);
digitalWrite (PIN_HOUR20, trans-Europese netwerken & B10);
}
/**
* Deze methode leest de waarden van de 2 potentiometers, zet hen aan
* mimnutes en uren, en reeksen m_minute en m_hour naar de bijbehorende waarden.
*/
VOID getTimeFromPots()
{
Lees de potentiometers
int hourSensor = analogRead(HOUR_INPUT_PIN);
int minuteSensor = analogRead(MIN_INPUT_PIN);
de lezingen van de sensor (van 0 tot 1023) naar de juiste schaal
schalen (0 tot en met 23 uur, 0 tot en met 59 minuten)
setTime (kaart (hourSensor, 0, 1023, 0, 23), kaart (minuteSensor, 0, 1023, 0, 59), 0);
We stellen de laatste teek op nu, omdat wanneer wij m_inTimeSetMode ingesteld op false,
kunnen veel seconden zijn verstreken sinds de laatste keer, en de tijd vooruit zou springen
m_lastTick = millis();
}
/**
* Deze methode controleert u CLOCK_MODE_SWITCH_PIN om te zien of het hoge. Als het is,
* het betekent dat we nu in de modus voor het instellen van klok (m_inTimeSetMode is ingesteld op true), en
* Hiermee schakelt u de CLOCK_MODE_LED_PIN.
*/
VOID checkMode()
{
m_inTimeSetMode = (analogRead(CLOCK_MODE_SWITCH_PIN) > 512);
digitalWrite (CLOCK_MODE_LED_PIN, m_inTimeSetMode);
}