DIY Arduino matrisskrivare armbandsur (7 / 13 steg)
Steg 7: Arduino Program för binär klocka
Alla program är skrivna i arduino miljö och laddas upp till ATMega328 genom att använda arduino uno. ISP programmering protokoll används för programmering. Programmet har jag delat i två delar och var och en kan användas självständigt. En för binär klocka och ett annat för digital-läge i klockan.
Följande program är endast för binärt läge av klockan och används knappen bibliotek:
#include "Wire.h"
#define DS3231_I2C_ADDRESS 0x68
#include < Button.h > / / https://github.com/JChristensen/Button
#define BUTTON_PIN_1 2 //Connect en taktil knapp switch (eller något liknande)
#define BUTTON_PIN_2 9 //from Arduino stift 2 till marken.
#define PULLUP sant //To hålla det enkelt, vi använder Arduinos interna pullup motstånd.
#define INVERTERA true //Since pullup motstånd kommer att hålla pin hög om inte den
växeln är stängd, det är negativ logik, dvs en hög stat
innebär att knappen inte är intryckt. (Förutsatt att en normalt öppen switch.)
#define DEBOUNCE_MS 20 //A debounce tid 20 millisekunder oftast fungerar bra för taktil knappen växlar.
#define LONG_PRESS 1000 //We definierar en "long press" vara 1000 millisekunder.
#define MSEK 1 //for ljusstyrka LED
Knappen myBtn1 (BUTTON_PIN_1, PULLUP, INVERTERA, DEBOUNCE_MS); Deklarera på knappen
Knappen myBtn2 (BUTTON_PIN_2, PULLUP, INVERTERA, DEBOUNCE_MS);
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.
lång lastPressTime;
Du måste justera pin-kod enligt din anslutning
byte colPin [8] = {4, 15, 14, 7, 12, 6, 3, 0}; -ve pin
byte rowPin [8] = {8, 1, 10, 5, 17, 11, 16, 13}; + ve
byte buttonStateOne = 0, buttonLongStateOne = 0, buttonStateTwo = 0, buttonLongStateTwo = 0;
byte clockMode = 0;
void setup() {
Wire.BEGIN();
för (byte jag = 3; jag < = 17; i ++) {
IF(i==9) fortsätta; Ignorera pin 9
pinMode (i, matas);
}
pinMode (0, OUTPUT);
pinMode (1, OUTPUT);
pinMode (2, ingång); knappen en
pinMode (9, ingång); knappen två
digitalWrite (2, hög). Aktivera inre pullup
digitalWrite (9, hög).
Ställ in kolumner och rader
för (byte jag = 1; jag < = 8; i ++) {
digitalWrite (colPin [i - 1], hög);
}
för (byte jag = 1; jag < = 8; i ++) {
digitalWrite (rowPin [i - 1], låg);
}
}
void loop() {
calculateDateTime();
IF(buttonLongStateTwo == 0)
binaryClock();
annat
editDisplay();
}
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 time_zero (int pos) {
Delay(MSEC);
}
void time_one (int pos) {
digitalWrite (colPin [pos], låg);
digitalWrite (rowPin [7], hög);
Delay(MSEC);
digitalWrite (colPin [pos], hög);
digitalWrite (rowPin [7], låg);
}
void time_two (int pos) {
digitalWrite (colPin [pos], låg);
digitalWrite (rowPin [6], hög);
Delay(MSEC);
digitalWrite (colPin [pos], hög);
digitalWrite (rowPin [6], låg);
}
void time_three (int pos) {
digitalWrite (colPin [pos], låg);
digitalWrite (rowPin [6], hög);
digitalWrite (rowPin [7], hög);
Delay(MSEC);
digitalWrite (colPin [pos], hög);
digitalWrite (rowPin [6], låg);
digitalWrite (rowPin [7], låg);
}
void time_four (int pos) {
digitalWrite (colPin [pos], låg);
digitalWrite (rowPin [5], hög);
Delay(MSEC);
digitalWrite (colPin [pos], hög);
digitalWrite (rowPin [5], låg);
}
void time_five (int pos) {
digitalWrite (colPin [pos], låg);
digitalWrite (rowPin [5], hög);
digitalWrite (rowPin [7], hög);
Delay(MSEC);
digitalWrite (colPin [pos], hög);
digitalWrite (rowPin [5], låg);
digitalWrite (rowPin [7], låg);
}
void time_six (int pos) {
digitalWrite (colPin [pos], låg);
digitalWrite (rowPin [5], hög);
digitalWrite (rowPin [6], hög);
Delay(MSEC);
digitalWrite (colPin [pos], hög);
digitalWrite (rowPin [5], låg);
digitalWrite (rowPin [6], låg);
}
void time_seven (int pos) {
digitalWrite (colPin [pos], låg);
digitalWrite (rowPin [5], hög);
digitalWrite (rowPin [6], hög);
digitalWrite (rowPin [7], hög);
Delay(MSEC);
digitalWrite (colPin [pos], hög);
digitalWrite (rowPin [5], låg);
digitalWrite (rowPin [6], låg);
digitalWrite (rowPin [7], låg);
}
void time_eight (int pos) {
digitalWrite (colPin [pos], låg);
digitalWrite (rowPin [4], hög);
Delay(MSEC);
digitalWrite (colPin [pos], hög);
digitalWrite (rowPin [4], låg);
}
void time_nine (int pos) {
digitalWrite (colPin [pos], låg);
digitalWrite (rowPin [4], hög);
digitalWrite (rowPin [7], hög);
Delay(MSEC);
digitalWrite (colPin [pos], hög);
digitalWrite (rowPin [4], låg);
digitalWrite (rowPin [7], låg);
}
void date_zero (int pos) {
Delay(MSEC);
}
void date_one (int pos) {
digitalWrite (colPin [pos], låg);
digitalWrite (rowPin [7-4], hög);
Delay(MSEC);
digitalWrite (colPin [pos], hög);
digitalWrite (rowPin [7-4], låg);
}
void date_two (int pos) {
digitalWrite (colPin [pos], låg);
digitalWrite (rowPin [6-4], hög);
Delay(MSEC);
digitalWrite (colPin [pos], hög);
digitalWrite (rowPin [6-4], låg);
}
void date_three (int pos) {
digitalWrite (colPin [pos], låg);
digitalWrite (rowPin [6-4], hög);
digitalWrite (rowPin [7-4], hög);
Delay(MSEC);
digitalWrite (colPin [pos], hög);
digitalWrite (rowPin [6-4], låg);
digitalWrite (rowPin [7-4], låg);
}
void date_four (int pos) {
digitalWrite (colPin [pos], låg);
digitalWrite (rowPin [5-4], hög);
Delay(MSEC);
digitalWrite (colPin [pos], hög);
digitalWrite (rowPin [5-4], låg);
}
void date_five (int pos) {
digitalWrite (colPin [pos], låg);
digitalWrite (rowPin [5-4], hög);
digitalWrite (rowPin [7-4], hög);
Delay(MSEC);
digitalWrite (colPin [pos], hög);
digitalWrite (rowPin [5-4], låg);
digitalWrite (rowPin [7-4], låg);
}
void date_six (int pos) {
digitalWrite (colPin [pos], låg);
digitalWrite (rowPin [5-4], hög);
digitalWrite (rowPin [6-4], hög);
Delay(MSEC);
digitalWrite (colPin [pos], hög);
digitalWrite (rowPin [5-4], låg);
digitalWrite (rowPin [6-4], låg);
}
void date_seven (int pos) {
digitalWrite (colPin [pos], låg);
digitalWrite (rowPin [5-4], hög);
digitalWrite (rowPin [6-4], hög);
digitalWrite (rowPin [7-4], hög);
Delay(MSEC);
digitalWrite (colPin [pos], hög);
digitalWrite (rowPin [5-4], låg);
digitalWrite (rowPin [6-4], låg);
digitalWrite (rowPin [7-4], låg);
}
void date_eight (int pos) {
digitalWrite (colPin [pos], låg);
digitalWrite (rowPin [4-4], hög);
Delay(MSEC);
digitalWrite (colPin [pos], hög);
digitalWrite (rowPin [4-4], låg);
}
void date_nine (int pos) {
digitalWrite (colPin [pos], låg);
digitalWrite (rowPin [4-4], hög);
digitalWrite (rowPin [7-4], hög);
Delay(MSEC);
digitalWrite (colPin [pos], hög);
digitalWrite (rowPin [4-4], låg);
digitalWrite (rowPin [7-4], låg);
}
{Ogiltig Visa (int siffror, int pos)
Switch(DIGIT) {
fall 0:
time_zero(POS);
bryta;
fall 1:
time_one(POS);
bryta;
fall 2:
time_two(POS);
bryta;
fall 3:
time_three(POS);
bryta;
fall 4:
time_four(POS);
bryta;
fall 5:
time_five(POS);
bryta;
fall 6:
time_six(POS);
bryta;
fall 7:
time_seven(POS);
bryta;
mål 8:
time_eight(POS);
bryta;
mål 9:
time_nine(POS);
bryta;
}
}
void date_show (int tecken, int pos) {
Switch(DIGIT) {
fall 0:
date_zero(POS);
bryta;
fall 1:
date_one(POS);
bryta;
fall 2:
date_two(POS);
bryta;
fall 3:
date_three(POS);
bryta;
fall 4:
date_four(POS);
bryta;
fall 5:
date_five(POS);
bryta;
fall 6:
date_six(POS);
bryta;
fall 7:
date_seven(POS);
bryta;
mål 8:
date_eight(POS);
bryta;
mål 9:
date_nine(POS);
bryta;
}
}
void binaryClock() {
FrequencyTimer2::setOnOverflow(0);
Visa (second_unit, 7);
Visa (second_tens, 6);
Visa (minute_unit, 4);
Visa (minute_tens, 3);
Visa (hour_unit, 1);
Visa (hour_tens, 0);
date_show (date_unit, 7);
date_show (date_tens, 6);
date_show (month_unit, 4);
date_show (month_tens, 3);
date_show (year_unit, 1);
date_show (year_tens, 0);
}
void showMinute() {
int _minute_unit = _minute % 10.
int _minute_tens = _minute / 10;
Visa (_minute_unit, 4);
Visa (_minute_tens, 3);
}
void showHour() {
int _hour_unit = _hour % 10.
int _hour_tens = _hour / 10;
Visa (_hour_unit, 1);
Visa (_hour_tens, 0);
}
void showDate() {
int _date_unit = _date % 10.
int _date_tens = _date / 10;
date_show (_date_unit, 7);
date_show (_date_tens, 6);
}
void showMonth() {
int _month_unit = _month % 10.
int _month_tens = _month / 10;
date_show (_month_unit, 4);
date_show (_month_tens, 3);
}
void showYear() {
int _year_unit = _year % 10.
int _year_tens = _year / 10;
date_show (_year_unit, 1);
date_show (_year_tens, 0);
}
void button() {
myBtn1.read(); Läs på-knappen
myBtn2.read(); Läs på-knappen
om (myBtn1.wasReleased()) {
lastPressTime = millis();
IF(buttonLongStateTwo == 0) {}
annars om ((buttonLongStateTwo == 1) & & (buttonStateTwo == 1))
{
showMinute();
_minute ++;
Delay(20);
IF(_minute > 59)
_minute = 0;
Serial.println(Minute);
}
annars om ((buttonLongStateTwo == 1) & & (buttonStateTwo == 2))
{
showHour();
_hour ++;
Delay(20);
IF(_hour > 12)
_hour = 1;
Serial.println(Hour);
}
annars om ((buttonLongStateTwo == 1) & & (buttonStateTwo == 3))
{
showDate();
_date ++;
Delay(20);
IF(_date > 31)
_date = 1;
Serial.println(date);
}
annars om ((buttonLongStateTwo == 1) & & (buttonStateTwo == 4))
{
showMonth();
_month ++;
Delay(20);
IF(_month > 12)
_month = 1;
Serial.println(month);
}
annars om ((buttonLongStateTwo == 1) & & (buttonStateTwo == 5))
{
showYear();
_Year ++;
IF(_Year > 99)
_Year = 15.
Delay(20);
Serial.println(Year);
}
}
annat if (myBtn1.pressedFor(LONG_PRESS)) {
lastPressTime = millis();
setDS3231time(_second,_minute,_hour,1,_date,_month,_year);
Serial.println ("datum uppsättning");
buttonLongStateTwo = 0;
Serial.println(buttonLongStateTwo);
Delay(100);
}
annat if (myBtn2.wasReleased()) {
lastPressTime = millis();
IF(buttonLongStateTwo == 0) {
}
annat if(buttonLongStateTwo == 1) {
buttonStateTwo ++;
IF(buttonStateTwo > 5)
buttonStateTwo = 1;
}
om ((buttonStateTwo == 1) & &(buttonLongStateTwo == 1)) {
showMinute();
Delay(20);
Serial.println ("display minut");
}
om ((buttonStateTwo == 2) & &(buttonLongStateTwo == 1)) {
Serial.println ("display timme");
showHour();
Delay(20);
}
om ((buttonStateTwo == 3) & &(buttonLongStateTwo == 1)) {
Serial.println ("display datum");
showDate();
Delay(20);
}
om ((buttonStateTwo == 4) & &(buttonLongStateTwo == 1)) {
Serial.println ("display månad");
showMonth();
Delay(20);
}
om ((buttonStateTwo == 5) & &(buttonLongStateTwo == 1)) {
Serial.println ("display år").
showYear();
Delay(20);
}
}
annat if (myBtn2.pressedFor(LONG_PRESS)) {
lastPressTime = millis();
readDS3231time (_second, _minute, & _hour, & _day, & _date, & _month,
& _year);
buttonLongStateTwo = 1;
Serial.println ("redigeringsläge");
Delay(10);
}
}
void editDisplay() {
om ((buttonStateTwo == 1) & &(buttonLongStateTwo == 1)) {
showMinute();
Serial.println ("display minut");
}
om ((buttonStateTwo == 2) & &(buttonLongStateTwo == 1)) {
Serial.println ("display timme");
showHour();
}
om ((buttonStateTwo == 3) & &(buttonLongStateTwo == 1)) {
Serial.println ("display datum");
showDate();
}
om ((buttonStateTwo == 4) & &(buttonLongStateTwo == 1)) {
Serial.println ("display månad");
showMonth();
}
om ((buttonStateTwo == 5) & &(buttonLongStateTwo == 1)) {
Serial.println ("display år").
showYear();
}
}