DIY Arduino matrisskrivare armbandsur (8 / 13 steg)
Steg 8: Arduino skiss för Digital klocka
Digital-läge använda frekvensen Timer 2 biblioteket. Du kan hämta bibliotek från här.
#include < FrequencyTimer2.h >
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
Konvertera normala decimaltal till binary coded decimal
byte decToBcd(byte val)
{
tillbaka ((val/10 * 16) + (val % 10));
}
Konvertera binary coded decimal till normala decimaltal
byte bcdToDec(byte val)
{
tillbaka ((val/16 * 10) + (val % 16));
}
byte second_unit, second_tens, minute_unit, minute_tens, hour_unit, hour_tens,
date_unit, date_tens, month_unit, month_tens, year_unit, year_tens, year_remain;
byte _second = 0, _minute = 10, _hour = 12, _day = 1, _date = 1, _month = 1, _year = 15.
byte tMSB, tLSB;
float temp3231;
lång lastPressTime;
#define utrymme {\
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
#define slash {\
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 1, 0, 0}, \
{0, 0, 0, 0, 1, 0, 0, 0}, \
{0, 0, 0, 1, 0, 0, 0, 0}, \
{0, 0, 1, 0, 0, 0, 0, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
#define A {\
{0, 0, 1, 1, 1, 0, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 1, 1, 1, 1, 1, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
#define M {\
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 1, 1, 0, 1, 1, 0, 0}, \
{0, 1, 0, 1, 0, 1, 0, 0}, \
{0, 1, 0, 1, 0, 1, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
#define P {\
{0, 1, 1, 1, 1, 0, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 1, 1, 1, 1, 0, 0, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
#define noll {\
{0, 0, 1, 1, 1, 0, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 1, 0, 0, 1, 1, 0, 0}, \
{0, 1, 0, 1, 0, 1, 0, 0}, \
{0, 1, 1, 0, 0, 1, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 0, 1, 1, 1, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
#define en {\
{0, 0, 0, 1, 0, 0, 0, 0}, \
{0, 0, 1, 1, 0, 0, 0, 0}, \
{0, 0, 0, 1, 0, 0, 0, 0}, \
{0, 0, 0, 1, 0, 0, 0, 0}, \
{0, 0, 0, 1, 0, 0, 0, 0}, \
{0, 0, 0, 1, 0, 0, 0, 0}, \
{0, 0, 1, 1, 1, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
#define två {\
{0, 0, 1, 1, 1, 0, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 0, 0, 0, 0, 1, 0, 0}, \
{0, 0, 0, 0, 1, 0, 0, 0}, \
{0, 0, 0, 1, 0, 0, 0, 0}, \
{0, 0, 1, 0, 0, 0, 0, 0}, \
{0, 1, 1, 1, 1, 1, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
#define tre {\
{0, 1, 1, 1, 1, 1, 0, 0}, \
{0, 0, 0, 0, 1, 0, 0, 0}, \
{0, 0, 0, 1, 0, 0, 0, 0}, \
{0, 0, 0, 0, 1, 0, 0, 0}, \
{0, 0, 0, 0, 0, 1, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 0, 1, 1, 1, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
#define fyra {\
{0, 0, 0, 0, 1, 0, 0, 0}, \
{0, 0, 0, 1, 1, 0, 0, 0}, \
{0, 0, 1, 0, 1, 0, 0, 0}, \
{0, 1, 0, 0, 1, 0, 0, 0}, \
{0, 1, 1, 1, 1, 1, 0, 0}, \
{0, 0, 0, 0, 1, 0, 0, 0}, \
{0, 0, 0, 0, 1, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
#define fem {\
{0, 1, 1, 1, 1, 1, 0, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 1, 1, 1, 1, 0, 0, 0}, \
{0, 0, 0, 0, 0, 1, 0, 0}, \
{0, 0, 0, 0, 0, 1, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 0, 1, 1, 1, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
#define sex {\
{0, 0, 0, 1, 1, 0, 0, 0}, \
{0, 0, 1, 0, 0, 0, 0, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 1, 1, 1, 1, 0, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 0, 1, 1, 1, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
#define sju {\
{0, 1, 1, 1, 1, 1, 0, 0}, \
{0, 0, 0, 0, 0, 1, 0, 0}, \
{0, 0, 0, 0, 1, 0, 0, 0}, \
{0, 0, 0, 1, 0, 0, 0, 0}, \
{0, 0, 1, 0, 0, 0, 0, 0}, \
{0, 0, 1, 0, 0, 0, 0, 0}, \
{0, 0, 1, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
#define åtta {\
{0, 0, 1, 1, 1, 0, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 0, 1, 1, 1, 0, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 0, 1, 1, 1, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
#define nio {\
{0, 0, 1, 1, 1, 0, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 0, 1, 1, 1, 1, 0, 0}, \
{0, 0, 0, 0, 0, 1, 0, 0}, \
{0, 0, 0, 0, 1, 0, 0, 0}, \
{0, 0, 1, 1, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
#define kolon {\
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 1, 1, 0, 0, 0, 0}, \
{0, 0, 1, 1, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 1, 1, 0, 0, 0, 0}, \
{0, 0, 1, 1, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
#define DEGC {\
{1, 1, 0, 0, 1, 1, 1, 0}, \
{1, 1, 0, 1, 0, 0, 0, 1}, \
{0, 0, 0, 1, 0, 0, 0, 0}, \
{0, 0, 0, 1, 0, 0, 0, 0}, \
{0, 0, 0, 1, 0, 0, 0, 0}, \
{0, 0, 0, 1, 0, 0, 0, 1}, \
{0, 0, 0, 0, 1, 1, 1, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
#define T {\
{0, 1, 1, 1, 1, 1, 0, 0}, \
{0, 0, 0, 1, 0, 0, 0, 0}, \
{0, 0, 0, 1, 0, 0, 0, 0}, \
{0, 0, 0, 1, 0, 0, 0, 0}, \
{0, 0, 0, 1, 0, 0, 0, 0}, \
{0, 0, 0, 1, 0, 0, 0, 0}, \
{0, 0, 0, 1, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
#define smallm {\
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 1, 1, 0, 1, 0, 0, 0}, \
{0, 1, 0, 1, 0, 1, 0, 0}, \
{0, 1, 0, 1, 0, 1, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
#define smallp {\
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0}, \
{0, 1, 1, 1, 1, 0, 0, 0}, \
{0, 1, 0, 0, 0, 1, 0, 0}, \
{0, 1, 1, 1, 1, 0, 0, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 1, 0, 0, 0, 0, 0, 0}, \
{0, 0, 0, 0, 0, 0, 0, 0} \
}
byte col = 0;
byte lysdioder [8] [8].
byte rader [8] = {0, 3, 6, 12, 7, 14, 15, 4};
byte cols [8] = {8, 1, 10, 5, 17, 11, 16, 13};
CONST byte numPatterns = 14.
byte mönster [numPatterns] [8] [8] = {
noll, en, två, tre, fyra, fem, sex, sju, åtta, nio, kolon, utrymme, slash, DEGC
};
int mönster = 0;
void setup() {
Wire.BEGIN();
för (byte jag = 3; jag < = 17; i ++) {
IF(i==9) fortsätta;
pinMode (i, matas);
}
pinMode (0, OUTPUT);
pinMode (1, OUTPUT);
Ställ in kolumner och rader
för (byte jag = 1; jag < = 8; i ++) {
digitalWrite (rader [i - 1], låg);
}
för (byte jag = 1; jag < = 8; i ++) {
digitalWrite (cols [i - 1], låg);
}
clearLeds();
Inaktivera växla av stift 11
FrequencyTimer2::disable();
Ställa in uppdateringsfrekvens (avbrott timeout-perioden)
FrequencyTimer2::setPeriod(2000);
Ställa in avbrott rutin att kallas
FrequencyTimer2::setOnOverflow(display);
setPattern(pattern);
}
void loop() {
calculateDateTime();
digitalClock();
}
void clearLeds() {
Tydlig display array
för (int jag = 0; jag < 8; i ++) {
för (int j = 0; j < 8; j ++) {
lysdioder [i] [j] = 0;
}
}
}
void setPattern (int mönster) {
för (int jag = 0; jag < 8; i ++) {
för (int j = 0; j < 8; j ++) {
lysdioder [i] [j] = mönster [mönster] [i] [j];
}
}
}
void slidePattern (int mönster, int del) {
för (int l = 0; l < 8; l ++) {
för (int jag = 0; jag < 7; i ++) {
för (int j = 0; j < 8; j ++) {
lysdioder [j] [i] = lysdioder [j] [i + 1];
}
}
för (int j = 0; j < 8; j ++) {
lysdioder [j] [7] = mönster [mönster] [j] [0 + l];
}
Delay(del);
}
}
Avbryta rutin
void display() {
digitalWrite (cols [col], låg); Stäng hela föregående kolumn av
Col ++;
digitalWrite (rader [rad], låg); Stäng hela föregående kolumn av
rad ++;
om (col == 8) {
Col = 0;
}
för (int rad = 0; rad < 8; rad ++) {
om (lysdioder [col] [7 - rad] == 1) {
digitalWrite (rader [rad], låg); Slå på detta ledde
}
annat {
digitalWrite (rader [rad], hög); Stänga av detta ledde
}
}
digitalWrite (cols [col], hög); Aktivera hela kolumnen på en gång (för lika belysning gånger)
}
void setDS3231time (byte andra, byte minut, byte timme, byte dayOfWeek, byte
dayOfMonth, byte månad, byte år)
{
ställer in tid och datum data till DS3231
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); ställa in nästa ingång att starta vid sekunder register
Wire.write(decToBcd(Second)); ställa in sekunder
Wire.write(decToBcd(Minute)); minuter
Wire.write (decToBcd(hour | 0x40)); Ange timmar
Wire.write(decToBcd(DAYOFWEEK)); Ställ in dagen i veckan (1 = söndag, 7 = lördag)
Wire.write(decToBcd(dayOfMonth)); Ställ in datum (1 till 31)
Wire.write(decToBcd(month)); ange månad
Wire.write(decToBcd(Year)); år (0-99)
Wire.endTransmission();
}
void readDS3231time (byte * andra,
byte * minut,
byte * timme,
byte * dayOfWeek,
byte * dayOfMonth,
byte * månad,
byte * år)
{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); Ange DS3231 register pekaren till 00h
Wire.endTransmission();
Wire.requestFrom (DS3231_I2C_ADDRESS, 7);
begära sju byte data från DS3231 start från registret 00h
* andra = bcdToDec(Wire.read() & 0x7f);
* minut = bcdToDec(Wire.read());
* timme = bcdToDec(Wire.read() & 0x1f);
* dayOfWeek = bcdToDec(Wire.read());
* dayOfMonth = bcdToDec(Wire.read());
* månad = bcdToDec(Wire.read());
* år = bcdToDec(Wire.read());
}
void calculateDateTime() {
byte sekund, minut, timme, dayOfWeek, dayOfMonth, månad, år.
Hämta data från DS3231
readDS3231time (& sekund, minut, timme, & dayOfWeek, & dayOfMonth, & månad,
& år);
om (timme > 12) {
timme = timme - 24;
}
second_unit = andra % 10.
second_tens = andra / 10;
minute_unit = minut % 10.
minute_tens = minuter / 10;
hour_unit = timme % 10.
hour_tens = timme / 10;
date_unit = dayOfMonth % 10.
date_tens = dayOfMonth / 10;
month_unit = månad % 10.
month_tens = månad / 10;
year_unit = år % 10.
year_tens = år / 10;
}
void digitalClock() {
FrequencyTimer2::setOnOverflow(display);
slidePattern (hour_tens, 80);
slidePattern (hour_unit, 80);
slidePattern (10, 80);
slidePattern (minute_tens, 80);
slidePattern (minute_unit, 80);
slidePattern (10, 80);
slidePattern (second_tens, 80);
slidePattern (second_unit, 80);
slidePattern (11, 80);
slidePattern (11, 80);
slidePattern (date_tens, 80);
slidePattern (date_unit, 80);
slidePattern (12, 80);
slidePattern (month_tens, 80);
slidePattern (month_unit, 80);
slidePattern (12, 80);
slidePattern (2, 80);
slidePattern (0, 80);
slidePattern (year_tens, 80);
slidePattern (year_unit, 80);
slidePattern (11, 80);
int tempC = get3231Temp();
int tempC_unit = tempC % 10.
int tempC_tens = tempC / 10;
slidePattern (tempC_tens, 80);
slidePattern (tempC_unit, 80);
slidePattern (13, 80);
slidePattern (11, 80);
slidePattern (11, 80);
}
int get3231Temp()
{
Temp register (11h - 12h) få uppdateras automatiskt varje 64s
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0x11);
Wire.endTransmission();
Wire.requestFrom (DS3231_I2C_ADDRESS, 2);
IF(Wire.available()) {
tMSB = Wire.read(); 2: s komplettera int del
tLSB = Wire.read(); bråk del
temp3231 = (tMSB & B01111111); gör 2: s matematik på Tmsb
}
annat {
Åh nej, inga data!
}
återvända temp3231;
}