Бинарные часы. Доработка.
- Войдите на сайт для отправки комментариев
Втр, 26/01/2016 - 22:59
Всем привет! Захотел собрать бинарные часики. Хочу поставить на полочку и говорить всем какой я молодец, и как мне помогли форумчане сайта ардуино)) Вообщем в данном скетче нужно кое что изменить. Время должно отображаться в 24 часовом формате. То есть нужно будет добавить еще один светодиод к первому регистру Благо ног на них хватает. Добавить подстройку часов и минут двумя или более кнопок. И RTC у меня не 1307, а 3231. Но это по моему сути дела не меняет. Исполнителю помогу копеечкой. Ссылка на исходник http://nnm.me/blogs/oleg_karp/arduino-delaem-shild-binarnye-chasy-2/

#include "Wire.h"
#define DS1307_ADDRESS 0x68
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 13;
////Pin connected to DS of 74HC595
int dataPin = 11;
void setup(){
Wire.begin();
// setDateTime(); // Первый раз запустит для установки текущего времени, второй раз запускаем "закоментированно"
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop(){
printDate();
delay(1000);
}
void setDateTime(){
byte second = 0; //0-59
byte minute = 05; //0-59
byte hour = 18; //0-23
byte weekDay = 2; //1-7
byte monthDay = 8; //1-31
byte month = 11; //1-12
byte year = 11; //0-99
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(0); //stop Oscillator
Wire.write(decToBcd(second));
Wire.write(decToBcd(minute));
Wire.write(decToBcd(hour));
Wire.write(decToBcd(weekDay));
Wire.write(decToBcd(monthDay));
Wire.write(decToBcd(month));
Wire.write(decToBcd(year));
Wire.write(0); //start
Wire.endTransmission();
}
byte decToBcd(byte val){
// Convert normal decimal numbers to binary coded decimal
return ( (val/10*16) + (val%10) );
}
byte bcdToDec(byte val) {
// Convert binary coded decimal to normal decimal numbers
return ( (val/16*10) + (val%16) );
}
void printDate(){
// Reset the register pointer
Wire.beginTransmission(DS1307_ADDRESS);
Wire.write(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_ADDRESS, 7);
int second = bcdToDec(Wire.read());
int minute = bcdToDec(Wire.read());
int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time
int weekDay = bcdToDec(Wire.read()); //0-6 -> sunday — Saturday
int monthDay = bcdToDec(Wire.read());
int month = bcdToDec(Wire.read());
int year = bcdToDec(Wire.read());
if (hour>12) hour=hour-12;
digitalWrite(latchPin, 0);
//count up on GREEN LEDs
shiftOut(dataPin, clockPin,MSBFIRST, minute);
//count down on RED LEDs
shiftOut(dataPin, clockPin,MSBFIRST, hour);
//return the latch pin high to signal chip that it
//no longer needs to listen for information
digitalWrite(latchPin, 1);
}
Чтобы был 24 часовой формат достаточно убрать 62 строку.
yaryarikyar@ya.ru
Быстро, качественно, недорого)
Выбирайте любые 2 пункта)).
Можно упростить. Без hc595. Ди и без DS, если сильно хочется. htpicc@gmail.com
не, нужно что бы и время не сбрасывалось, и выходов немного занимало. 24 часовой формат сделал, осталось разобраться как сделать подстройку времени, а еще хочу попробовать вывести температуру, тоже в двоичном коде. Добавил еще один сдвиговый регистр для отображения секунд. на их месте и хотел сделать температуру. Пока не вышло...
#include "Wire.h" //#include <DS3231.h> #define DS3231_ADDRESS 0x68 int latchPin = 8; //Pin connected to SH_CP of 74HC595 int clockPin = 13; ////Pin connected to DS of 74HC595 int dataPin = 11; void setup(){ Wire.begin(); // setDateTime(); // Первый раз запустит для установки текущего времени, второй раз запускаем "закоментированно" pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); } void loop(){ printDate(); delay(1000); } void setDateTime(){ byte second = 0; //0-59 byte minute = 05; //0-59 byte hour = 18; //0-23 byte dow = 2; //1-7 byte day = 8; //1-31 byte month = 11; //1-12 byte year = 11; //0-99 byte getTemp = 0; Wire.beginTransmission(DS3231_ADDRESS); Wire.write(0); //stop Oscillator Wire.write(decToBcd(second)); Wire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.write(decToBcd(day)); //число Wire.write(decToBcd(dow)); //день недели Wire.write(decToBcd(month)); Wire.write(decToBcd(year)); Wire.write(decToBcd(getTemp)); Wire.write(0); //start Wire.endTransmission(); } byte decToBcd(byte val){ // Convert normal decimal numbers to binary coded decimal return ( (val/10*16) + (val%10) ); } byte bcdToDec(byte val) { // Convert binary coded decimal to normal decimal numbers return ( (val/16*10) + (val%16) ); } void printDate(){ // Reset the register pointer Wire.beginTransmission(DS3231_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS3231_ADDRESS, 7); int second = bcdToDec(Wire.read()); int minute = bcdToDec(Wire.read()); int hour = bcdToDec(Wire.read() & 0b111111); //24 hour time int dow = bcdToDec(Wire.read()); //0-6 -> sunday — Saturday int day = bcdToDec(Wire.read()); int month = bcdToDec(Wire.read()); int year = bcdToDec(Wire.read()); int getTemp = bcdToDec(Wire.read()); //if (hour>12) hour=hour-12; digitalWrite(latchPin, 0); //count up on GREEN LEDs shiftOut(dataPin, clockPin,MSBFIRST, second); shiftOut(dataPin, clockPin,MSBFIRST, minute); //count down on RED LEDs shiftOut(dataPin, clockPin,MSBFIRST, hour); //return the latch pin high to signal chip that it //no longer needs to listen for information digitalWrite(latchPin, 1); }Так и не будет сбрасываться. А с кучей доп. компонентов и любой сделает.))
Так и не будет сбрасываться. А с кучей доп. компонентов и любой сделает.))
Мне не жалко 30р за RTC. точность хода и независимая память. а 74hc595, 10 штук за 50р вообще не деньги
Чего-то я не вкурил зачем такая городушка и почему не повесить светодиоды на ноги процессора сразу? :)
Так и не будет сбрасываться. А с кучей доп. компонентов и любой сделает.))
Мне не жалко 30р за RTC. точность хода и независимая память. а 74hc595, 10 штук за 50р вообще не деньги
Дак, с RTC, с 74hc595 - это любой сделает.