Lav et nøjagtigt Arduino ur med kun ét ledning - ingen ekstern hardware nødvendig!

Lav et nøjagtigt Arduino ur med kun ét ledning - ingen ekstern hardware nødvendig!

Indholdsfortegnelse:

Anonim

Sådan laver du et Arduino ur - uden at bruge eksterne oscillatorer eller klokke chips:

(flere af mine projekter på vores forskningswebside - klik på arduino logoet øverst på hjemmesiden)

Du får brug for:

Et Arduino bord (næsten enhver smag fungerer fint) og software

1 LED

1 Jumper Wire

(Ledningseksempel opdateret nedenfor …)

Jeg er en elektroingeniør på 20 + år og har lige opdaget Arduino-platformen for et par måneder siden. Det er overflødigt at sige, at jeg blev forelsket i det og er nu i gang med projekter. Til jul i år ønskede jeg at lave nogle meget hjerte-følte, en-of-a-kind gaver til mine forældre. For min mor var det definitivt et 'one-of' ur design. Jeg var ikke bekymret for at holde op med sommertid eller springår - bare nøjagtigt holde dagen for ugen og tiden.

Sådan genereres urpulserne på en unik men præcis måde selv? Sikker på, at jeg kunne bruge en fancy indlejret ur IC eller den fælles 32.768 krystaloscillator, men jeg ville have noget andet end resten. Jeg begyndte at bruge en 555 timer til at udgive en stabil 100Hz firkantbølge. Dette fungerede ret godt, men jeg tabte omkring 1 sekund i timen. Intet problem - jeg har lige skrevet en algoritme for at rette det manglende sekund i software. Jeg var glad. Derefter opdagede jeg, at selvom Arduino's interne timer ikke var helt pålidelig for tidsbesparelse, havde de analoge PWM-udgange en meget stabil firkantbølge på 490Hz. Driftscyklusen bestemmes af den værdi, der er skrevet til den analoge pin. (dvs. - 0 er nul volt, 127 er en 50% arbejdscyklus, 255 er en logisk høj / 5V).

Jeg besluttede at prøve den analoge PWM-udgang, der var ledet direkte til afbryderstiften 2, og det fungerede godt! Plus, det holdt perfekt sammen med min computers realtidsklok til anden uden brug for software kompensation. Jeg har kørt det i dagevis nu, og det fortsætter med at udføre, ligesom jeg havde håbet …. alle med en ledning og en kode.

Den færdige gave vil have Eagle CAD brugerdefinerede PCB'er til strømforsyning og logik, der er anbragt i en plexiglas kabinet. Hele temaet er isblå LED belysning for at simulere et analogt ur. Mens kabinettet har en hvid på blå LCD, der viser dag, tid og rumtemperatur, forbinder et serielt kabel fra projektboksen til det aktuelle ur. Ved hjælp af en 12 bit tiårstæller, en servo og masser af blå LED'er belyser jeg de relevante timersegmenter på et brugerdefineret analogt urflade, der er trykt på plexiglas. Servo er monteret i midten af ​​urets ansigt og har en armatur fastgjort med en LED monteret for at lyse op minutter efter glasset. (hvert minut vender servo 6 grader, belyser det passende minut). Jeg håber at få det færdigt snart og vil lave en video af det endelige produkt …. Jeg håber, at hun elsker det !!

Enkelt Arduino ledningsdiagram og demo kode til at lave dit eget ur ved hjælp af denne metode. Også et link til Circuit Lab, der viser, hvordan du kan bruge metoden 555 timer @ 100Hz, hvis du vælger det.

Kode og links nedenfor …

555 Timer Oscillator Circuit (hvis du ønsker at prøve denne metode)

www.circuitlab.com/circuit/b575r9/555-100hz-oscillator/

Ur Demo Kode:

/ * Enkel intern klok demo: af Joseph Unik aka Relic1974

Bruger analog PWM output på 490Hz med en 50% arbejdscyklus til

holde meget præcis tid;). Tilslut en LED til pin 13 til

se sekunder blinke. Tilslut en jumper fra Analog pin 0

til Digital Pin 2 (afbryd 0). Minutter output til seriel

overvåge. http://www.planetxresearch.com 'Arduino' logo

til flere projekter og tricks …

(Du er velkommen til at bruge denne kode til at udvide til en fuldt funktionel

ur eller andet projekt under Creative Commons;)

*/

int clockInt = 0; // Digital pin 2 er nu afbrudt 0

int masterClock = 0; // tæller stigende kantsignaler

int sekunder = 0; // variabel

int minutter = 0; // variabel

int ledPin = 13;

void setup ()

{

attachInterrupt (clockInt, clockCounter, RISING);

// clockInt er vores afbrydelse, clockCounter-funktion kaldes når

// påkaldt på en RISING ur kant

analogReference (STANDARD);

pinMode (ledPin, OUTPUT);

Serial.begin (57600);

analog skrift (0, 127); // dette starter vores PWM 'ur' med en 50% arbejdscyklus

}

void clockCounter () // kaldet af interrupt

{

masterClock ++; // med hver klokkeforøgelse tilføj 1 til masterclock-tæller

hvis (masterClock == 489) // 490Hz nået

{

sekunder ++; // efter en 490Hz cyklus tilføj 1 sekund;)

masterClock = 0; // Nulstil efter 1 sekund er nået

tone (13, 100, 500); // ved hjælp af tone til puls LED uden forsinkelse;)

}

Vend tilbage;

}

void loop ()

{

hvis (sekunder == 60) // NU KOMMER TIL AT VÆRE I TIDEN

{

minutter ++; // stigning minutter med 1

sekunder = 0; // nulstil sekunder variablen

Serial.print ("Minutes =");

Serial.println (minutter);

}

}

Demo af mit projekt i værkerne her

forsyninger: