Steampunk Analog mätare månfas klocka (8 / 11 steg)

Steg 8: Använda RTC för att köra mätarna




Nu måste vi läsa data från RTC och konvertera det till siffror som kan skickas till mätarna att Visa (datum och tid!). Detta är faktiskt riktigt enkelt på grund av den stora rutinen för DS3231 från steg 6. Rutinen redan konverterar BCD datan från 3231 till decimal så allt vi behöver göra är att multiplicera timmarna av 10, och minuter och sekunder av 4 (när det gäller min mätare, din variera) och skicka de nya pwm värdena till mätarna.
Vi behöver också lite kod till minuter och timmar och till återvända mätarna till noll när de max ut. Detta är verkligen rakt fram, men jag stötte på lite problem. När nålarna återgår till noll från deras full resor kan göra de det ganska kraftfullt. Tillräckligt för att göra en klickande buller och orsaka oro över livslängden av d'Arsonval rörelser i mätarna. Jag ville genomföra en mjuk retur rutin i mjukvaran som vid första rodna verkade ganska lätt att göra. Jag så småningom fick det att fungera och jag kommer att visa dig hur. Några av er elektronik gurus skulle kunna räkna ut en maskinvarulösning för detta (cap avgifter och avlopp genom en diod resistor arrangemang när PWM går till noll eller något). Om så är fallet, låt mig veta. Jag tog programvara sökvägen, och har inte använt någon mer tid att tänka om det.

En liten video av koden nedan körs. O'scope spår är det Kvadrera vinkar från RTC. Meddelande varje gång det löneförhöjningar, sekunder hand steg.

Här är ett program som kommer att läsa den RTC utifrån ett avbrott som genereras av RTC fyrkantsvåg bifogas pin 2 av arduino och utgång sekunder värdet på stift 5 (PWM).
Denna rutin inkluderar inte den mjuk returen för nålen.

#include < Wire.h >

#define DS3231_I2C_ADDRESS 104
#define int_pin 2
#define gauge_pin 5

byte sekunder, minuter, timmar, dag, datum, månad, år.
byte secpos;
char veckodag [4].
booleska int_tick;
byte tMSB, tLSB;
float temp3231;

void setup()
{
Wire.BEGIN();
Serial.BEGIN(9600);
Wire.beginTransmission(DS3231_I2C_ADDRESS); 104 är DS3231 enhetsadress
Wire.send(0x0E); //
Wire.send(B00000000);
Wire.endTransmission();
pinMode (int_pin, ingång);
digitalWrite(2,HIGH); slå på inre dra upp av stift 2
attachInterrupt (0, int0handler, RISING); bifoga avbrott noll till stift 2 och samtal funktion int0handler när stift 2 ser en stigande spänning
secpos = 0;
}

void loop()
{

om (int_tick) {
updategauge();
}

watchConsole(); används för att ändra tid och datum

}

void int0handler() {
int_tick = 1;
}

void updategauge() {
Serial.println("int");
get3231Date();
Serial.Print(weekDay); Serial.Print (","); Serial.Print (månad, DEC). Serial.Print("/"); Serial.Print (datum, DEC); Serial.Print("/"); Serial.Print (år, DEC). Serial.Print ("-");
Serial.Print (timmar, DEC); Serial.Print(":"); Serial.Print (minuter, DEC); Serial.Print(":"); Serial.Print (sekunder, DEC);

Serial.Print ("temperatur:"); Serial.println(get3231Temp());
secpos = sekunder * 4;
om (secpos > = 240) secpos = 0; Detta kommer att återvända den andra nålen i slutet av resor
analogWrite (gauge_pin, secpos);
int_tick = 0; återställa flaggan int fästing
}

Konvertera normala decimaltal till binary coded decimal
byte decToBcd(byte val)
{
tillbaka ((val/10 * 16) + (val % 10));
}

void watchConsole()
{
om (Serial.available()) {/ / leta efter röding i följetong kö och processen om hittade
om (Serial.read() == 84) {//If kommando = "T" Ange datum
set3231Date();
get3231Date();
Serial.println("");
}
}
}

void set3231Date()
{
T(SEC)(min)(Hour)(DAYOFWEEK)(dayOfMonth)(month)(Year)
T(00-59)(00-59)(00-23)(1-7)(01-31)(01-12)(00-99)
Exempel: 02-Feb-09 @ 19:57:11 för 3: e dagen i veckan -> T1157193020209

sekunder = (byte) ((Serial.read()-48) * 10 + (Serial.read() - 48)); Användning av (byte) typ gjutning och ASCII-matematik för att uppnå resultat.
minuter = (byte) ((Serial.read()-48) * 10 + (Serial.read() - 48));
timmar = (byte) ((Serial.read()-48) * 10 + (Serial.read() - 48));
dag = (byte) (Serial.read() - 48);
datum = (byte) ((Serial.read()-48) * 10 + (Serial.read() - 48));
månad = (byte) ((Serial.read()-48) * 10 + (Serial.read() - 48));
år = (byte) ((Serial.read()-48) * 10 + (Serial.read() - 48));
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.send(0x00);
Wire.send(decToBcd(seconds));
Wire.send(decToBcd(Minutes));
Wire.send(decToBcd(hours));
Wire.send(decToBcd(Day));
Wire.send(decToBcd(date));
Wire.send(decToBcd(month));
Wire.send(decToBcd(Year));
Wire.endTransmission();
}

void get3231Date()
{
skicka begäran om att ta emot data från register 0
Wire.beginTransmission(DS3231_I2C_ADDRESS); 104 är DS3231 enhetsadress
Wire.send(0x00); börja vid register 0
Wire.endTransmission();
Wire.requestFrom (DS3231_I2C_ADDRESS, 7); begära sju byte

IF(Wire.available()) {
sekunder = Wire.receive(); få sekunder
minuter = Wire.receive(); få minuter
timmar = Wire.receive(); få timmar
dag = Wire.receive();
datum = Wire.receive();
månad = Wire.receive(); Temp månad
år = Wire.receive();

sekunder = (((seconds & B11110000) >> 4) * 10 + (sekunder & B00001111)); konvertera BCD till decimal
minuter = (((minutes & B11110000) >> 4) * 10 + (minuter & B00001111)); konvertera BCD till decimal
timmar = (((hours & B00110000) >> 4) * 10 + (timmar & B00001111)); konvertera BCD till decimal (antar 24 timmarsvisning)
dag = (dag & B00000111); 1-7
datum = (((date & B00110000) >> 4) * 10 + (datum & B00001111)); 1-31
månad = (((month & B00010000) >> 4) * 10 + (månad & B00001111)); msb7 är talet overflow
år = (((year & B11110000) >> 4) * 10 + (år & B00001111));
}
annat {
Åh nej, inga data!
}

Växla (dag) {
fall 1:
strcpy (veckodag, "Sun");
bryta;
fall 2:
strcpy (veckodag, "Må");
bryta;
fall 3:
strcpy (veckodag, "Tis");
bryta;
fall 4:
strcpy (veckodag, "ons");
bryta;
fall 5:
strcpy (veckodag, "Tor");
bryta;
fall 6:
strcpy (veckodag, "Fr");
bryta;
fall 7:
strcpy (veckodag, "Sat");
bryta;
}
}

float get3231Temp()
{
Temp register (11h - 12h) få uppdateras automatiskt varje 64s
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.send(0x11);
Wire.endTransmission();
Wire.requestFrom (DS3231_I2C_ADDRESS, 2);

IF(Wire.available()) {
tMSB = Wire.receive(); 2: s komplettera int del
tLSB = Wire.receive(); bråk del

temp3231 = (tMSB & B01111111); gör 2: s matematik på Tmsb
temp3231 += ((tLSB >> 6) * 0,25); bara bryr sig om bitar 7 & 8
}
annat {
Åh nej, inga data!
}

återvända temp3231;
}

Se Steg
Relaterade Ämnen

Arduino skiss för retro analoga mätare grafik på en modern TFT-skärm

En annan skiss från min samling som kan vara av intresse...Visa små digitala siffror av temperatur och luftfuktighet etc på en liten skärm är inte alltid det bästa sättet att visa information. Gammal stil analoga mätarna är bättre i vissa situationer...

Trådlösa hem routern med utnyttjande av analoga mätare

jag växte upp i och runt båtar att göra ledningar vävstolar och styra paneler, och har en samling av mätare & ringer som skulle normalt finns ansluten till små marina dieselmotorer.Jag jobbar idag som designer bygga gränssnitt till nätverksutrustning...

Arduino Analog hård driva POV klocka

detta arbete baseras bort av två andra personer som gjorde ett utmärkt jobb med att bana väg för mitt projekt.Författare: vishnubobHans arbete var baserat off Ian Smiths version av samma typ av klocka.http://www.Ian.org/HD-Clock/Med hjälp av vishnubo...

Analoga VU-meter och klocka (Arduino Powered)

detta projekt tar tillbaka gammalt tiden analoga VU-Meter, med de extra funktionerna av en snygg snygg klocka! När du stänger av din musik svinga mätarna automatiskt in till klockläge. Bakom är det alla populära och lätt att använda Arduino.Detta är...

Omfattningen klocka: Analog klocka och temperaturgivare på oscilloskop

Scopeclock är en enkel att använda hårdvara till göra din X-Y kan analogt oscilloskop mer användbara. Med denna enkla för att använda maskinvara kan du konvertera dina analoga oscilloskop till en omfattning klocka. Detta projekt var jag och min vän M...

"Analog" Bicycle hastighetsmätare

I detta instructable jag ska visa hur man gör en enkel "analog" hastighetsmätare med en arduino nano, en servomotor och några fler extrakomponenter.Den analoga delen av projektet är bara i visningen av hastigheten, alla sensing, kalkyl och bearb...

Lägga till en digital mätare till din gamla analogical variabel PSU

min 20 år gamla variabel strömförsörjning börjar få några vagheten i mäta spänning med hans analogical mätare. Sedan bestämde jag mig att lägga till en digital mätare, som jag kan veta exakt den spänningsfrekvens. Eftersom dessa digitala mätare är my...

Steampunk Nätverkscenter

Hej allaJag är så glad att presentera min nyaste steampunk objekt efter så lång tid av frånvaro.Jag fick idén till detta projekt efter att ha sett Bird's nest av kablar bakom min nätverksutrustning.Organisera röran av kablar under (och på) mitt skriv...

Analog talar glöd i mörka 3D tryckt klockan

Klockan visar tiden med 4 analoga mätare. Jag har sett dessa typ av klockor i olika inkarnationer men jag såg aldrig en analog klocka i detta format som talade. Denna klocka meddelar tiden halv timmes mellanrum och spelar ett meddelande varje gång kl...

Cwik klocka v1.0 - An Arduino binär klocka

ÖversiktDetta är en guide till att bygga en Arduino-driv klocka som använder lysdioder för att Visa 24-timmarsformat (timmar och minuter) som binära siffror, en analog mätare att Visa sekunderna, en switch för att växla mellan tidsvisning och tidsins...

Connect 4 binär klocka

välkomna mina damer och herrar!Som entreprenör söker jag alltid stora projekt att dela. Jag själv och två andra klasskamrater nyligen sätta ihop ett projekt för våra Master of Engineering program i teknisk entreprenörskap, och vi är glada att dela vå...

Clockwork kolv (Steampunk)

göra din alldeles egna steampunk kolv ur en cigarrlåda, klocka delar och använt bullet skal! Återvinn din gamla klocka delar att göra en grej som driver sig själv!Steg 1: Klockan tarmar Först och främst, hitta en gammal klocka med lättillgängliga red...

GPS båt hastighetsmätare

När man tittar på GPS meningsbyggnad är sagt "Fart över marken, knop" och jag tänkte genast båt...Detta kan enkelt anpassas till varje annan användning även det driva hjulen jeep!Steg 1: Schematisk och kodAllt du egentligen behöver är en 1K resi...

Mad Professor steampunk lampa!

Efter att ha sett massor av bra ljusa idéer på denna webbplats som jag trodde jag skulle ge ett par en gå.Här en jag inte trodde riktigt motiverat en instructable så dess 'bara' ett bildspel.Låt mig veta om du vill ha en på detta ändå?Det är bara en...

Steampunk clock

Hejmitt första försök på steampunk design. Detta är en klocka som jag hittade på en loppis och juiced med olika bitar av metall och fixturer som om runt min butik. För ljuset använde jag en 12 volt transformator och 12 v glödlampor som är aktivt som...

DIY Analog Voltmeter

Hej, i detta instructable jag vill visa dig hur man gör en analog voltmeter med korrekta avläsningar. Arbetar på rektor för magnetisk kraft som genereras av elektricitet. Med denna smarta idé behöver du inte köpa en ny voltmeter när brutit. Bara ta m...

Bicycle hastighetsmätare med grafik LCD

Detta är en multi-funktion cykel dator jag har utformats med en 128 X 64 monokrom grafik LCD-skärmen.Detta har realtidsklocka samt en temperaturgivare. Uppmätta data kan antingen visas i helt digitala eller i två olika analoga visningslägen.Cykeldato...

CDV-717 civilförsvar strålningsmätare undersökning konverteras till en bärbar HIFI-förstärkare.

jag ändrade fallet av en CDV-717 undersökning instrument att hysa en TK2050 klass D 100 watt/kanal förstärkare och strömförsörjning.Jag behövde något robust att använda som min amp styrelser inhägnad för användning i mitt garage för att driva ett par...

Voltmeter klockan

Denna klocka talar tiden - timmar, minuter och sekunder med 3 analog Voltmätare. En PIC16F628A mikrokontroller används för att visa tiden genom att variera spänningen till varje voltmeter och ger också mycket grundläggande tidtagning. Mikrokontroller...