Часы на лед матрицах
- Войдите на сайт для отправки комментариев
Вс, 09/04/2017 - 15:17
Доброго всем времени суток !
Вот собрал такие часы на матрицах MAX7219 с датчиком давления и DS1307 часы реального времени с установкой времени с помощью энкодера, собрал не давно. Может кто посоветует что можно изменить в скетче для модернизации или упрощения скетча.
#include <DS1307.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Max72xxPanel.h>
#include <myButton.h>
#include <MsTimer2.h>
#include <Encoder.h>
#include <Wire.h>
//#include <BMP085.h>
//
int wait = 15; //Скорость скролинга
int spacer = 1;//Растояние между буквами
int widt = 5 + spacer; // Ширина шрифта - 5 пикселей.
//BMP085 dps = BMP085();
//long Temperature = 0, Pressure = 0;
//******* Установки для кнопок **************************
#define btn1 2//Пин 2 ARD и 4 на Amtege для кнопки 1
#define btn2 3//Пин 3 ARD и 5 на Amtege для кнопки 2
myButton boot1(btn1, 50);
myButton boot2(btn2, 50);
//******* Установки для DS1307 **************************
DS1307 rtc(A2, A3);
String tap;
int s,m,h;
Time t;
//******* Установки для матрицы *************************
int pinCS = 10;//Пин LOAD. Пин DIN - 11, Пин CLK - 13
Max72xxPanel matrix = Max72xxPanel(pinCS, 4, 1);
//******** Установки Энкодера ***************************
enum {ENC_PIN1 = 5, ENC_PIN2 = 6};
int Hor; //Часы
int Min;//Минуты
int change = 1; // Изменение яркости
//************** cursor *******************
int x,y;
String hb = "Temperatura";
String ds = "Davlenie";//Строка которая выводится
//*********************************************************
void prin(long str){
matrix.fillScreen(LOW);
matrix.setCursor(1,1);
matrix.print(str);
matrix.write();
}
//*********************************************************
void scrLeft(String st){//Подпограмма скрола в лево
for(int i = 0; i < widt * st.length()+ matrix.width() - spacer; i++){
matrix.fillScreen(LOW);
int letter = i / widt;
int x = (matrix.width() - 1) - i % widt;
for(int t = 0; t < widt; t++){
if ( letter < st.length() ) {
matrix.drawChar(x, 1, st[letter], HIGH, LOW, 1);
}
letter--;
x -= widt;
}
matrix.write();
delay(wait);
}
}
//*********************************************************
void scrDown(String stri){
for(int sk = 1; sk < 12; sk++){
matrix.fillScreen(LOW);
matrix.setCursor(1,y);
matrix.print(stri);
matrix.write();
delay(50);
y = y + 1;
}
matrix.setCursor(1,1);
y = 1;
}
//*********************************************************
void scrUp(String stri){
for(int sk = 1; sk < 12; sk++){
matrix.fillScreen(LOW);
matrix.setCursor(1,y);
matrix.print(stri);
matrix.write();
delay(50);
y = y - 1;
}
matrix.setCursor(1,1);
y = 1;
}
//*********************************************************
void SetH(){
t = rtc.getTime();
Hor = t.hour;
Min = t.min;
while(1){
static uint8_t oldValue = 0;
uint8_t grayValue = digitalRead(ENC_PIN1) | (digitalRead(ENC_PIN2) << 1), value = graydecode(grayValue);
if (value == 0) // Энкодер вращается
{
if (oldValue == 3) { // Вправо
if (Hor + change <= 23) Hor += change;
}
else if (oldValue == 1) { // Влево
if (Hor - change >= 0) Hor -= change;
}
}
matrix.fillScreen(LOW);
matrix.setCursor(1,1);
matrix.print(Hor);
matrix.write();
oldValue = value;
delay(1);
//-----------------------------------------------------------------
if( boot1.flagClick == true ){//Провека нажатия кнопки Exit
boot1.flagClick = false;
rtc.setTime(Hor,Min,0);
break;
}
//------------------------------------------------------------------
}
}
//*********************************************************
void SetM(){
t = rtc.getTime();
Min = t.min;
Hor = t.hour;
while(1){
static uint8_t oldValue = 0;
uint8_t grayValue = digitalRead(ENC_PIN1) | (digitalRead(ENC_PIN2) << 1), value = graydecode(grayValue);
if (value == 0) // Энкодер вращается
{
if (oldValue == 3) { // Вправо
if (Min + change <= 59) Min += change;
}
else if (oldValue == 1) { // Влево
if (Min - change >= 0) Min -= change;
}
}
matrix.fillScreen(LOW);
matrix.setCursor(1,1);
matrix.print(Min);
matrix.write();
oldValue = value;
delay(1);
//-----------------------------------------------------------------
if( boot1.flagClick == true ){//Провека нажатия кнопки Exit
boot1.flagClick = false;
rtc.setTime(Hor,Min,0);
break;
}
//------------------------------------------------------------------
}
}
//****************************************************************************
unsigned graydecode(unsigned gray) {
unsigned bin;
for (bin = 0; gray; gray >>= 1)
bin ^= gray;
return bin;
}
//****************************************************************************
void setClk(){
matrix.fillScreen(LOW);
matrix.setCursor(1,1);
matrix.print("Horas");
matrix.write();
delay(1000);
scrDown("Horas");
SetH();
delay(5);
//-------------------------------------
matrix.fillScreen(LOW);
matrix.setCursor(1,1);
matrix.print("Minut");
matrix.write();
delay(1000);
scrUp("Minut");
SetM();
delay(5);
matrix.fillScreen(LOW);
matrix.setCursor(1,1);
matrix.print("EXIT");
matrix.write();
delay(1000);
scrDown("EXIT");
}
//****************************************************************************
void timerInterupt() {//Подпрогрмма сканера кнопок и времени
boot1.scanState();
boot2.scanState();
}
//****************************************************************************
void setup() {
matrix.setIntensity(7);
matrix.shutdown(false);
matrix.fillScreen(LOW);
rtc.halt(false);
rtc.setDOW(SUNDAY);
rtc.setDate(1, 4, 2017);
MsTimer2::set(2, timerInterupt); // задаем период прерывания по таймеру 2 мс
MsTimer2::start();// разрешаем прерывание по таймеру
//Wire.begin();
//dps.init();
pinMode(ENC_PIN1, INPUT);
pinMode(ENC_PIN2, INPUT);
}
//****************************************************************************
void loop() {
t = rtc.getTime();
tap = rtc.getTimeStr(FORMAT_SHORT);
//dps.getPressure(&Pressure);
//dps.getTemperature(&Temperature);
s = t.sec;
matrix.fillScreen(LOW);
matrix.setCursor(1,1);
matrix.print(tap);
matrix.write();
if ( boot1.flagClick == true ){//Провека нажатия кнопки SET
boot1.flagClick = false;
setClk();
}
//if(s == 30) scrLeft(tape);
if(s == 30){
scrLeft(ds);
delay(50);
//prin(int(Pressure/133.3));
matrix.setCursor(1,1);
matrix.print("12345");
matrix.write();
delay(3000);
}
if(s == 59){
scrLeft(hb);
delay(50);
//prin(Temperature*0.1);
matrix.setCursor(14,1);
matrix.print("54321");
matrix.write();
delay(3000);
}
//*************************************
delay(10);
//*************************************
}
Выложл бы схему в протеусе но не пойму как сдесь выложить картинку ?
Вот если все работает, нахрена модернизировать али упрощать?
Впринципе все работает просто хотелось добавить может какието эфекты скролинга разного или еще чего))
Да и еще вопрос кто знает где посмотреть документацию на библиотеку Adafruit-GFX есть файл pdf с описанием но там не очень подробно все описывется, особенно с работой с шрифтами, хотел подставить свой шрифт но не пойму как это сделать?
давайте и схему пожайлусто :) genia.flora(сабачка) gmail.com
просто хотелось добавить может какието эфекты
Если добавишь что,будь добр,не забудь поделиться кодом. Хочется тоже чего то этогово,а мозгов не хватает!
Всем привет ! Разбираюсь с скролом в скетче:
void scrLeft(String st){//Подпограмма скрола в лево for(int i = 0; i < widt * st.length()+ matrix.width() - spacer; i++){ matrix.fillScreen(LOW); int letter = i / widt; int x = (matrix.width() - 1) - i % widt; for(int t = 0; t < widt; t++){ if ( letter < st.length() ) { matrix.drawChar(x, 1, st[letter], HIGH, LOW, 1); } letter--; x -= widt; } matrix.write(); delay(wait); } }хочю зделать с лева на право, пока не получается ((
Вот некоторые эфекты скролов
int r = 1; String st = "12345"; void scrol1() { matrix.fillScreen(0); for(int n = 0; n < st.length(); n++){ matrix.drawChar(r,1,st[n],1,0,1); matrix.write();//Вывод на дисплей delay(100); r = r + 6; } r = 1; delay(3000); for(int n = 0; n < st.length(); n++){ matrix.drawChar(r,1,st[n],0,0,1); matrix.write();//Вывод на дисплей delay(100); r = r + 6; } r = 1; delay(1000); }вот ещё
String sd = "12345"; String st = "PROBA"; String sm = "MAX72"; void scrl1(String str,int f,int c,int r){//Скрол с лева на право по одному символу до заполнения for(int w = 0; w < str.length()+1 ;w++){//Цикл прокрутки всех символов,повторяем цикл столько сколько символов в строке for(int n = 0; n < c + 6; n++){//Основной цикл matrix.drawChar(r,1,str[f],1,0,1); matrix.write(); matrix.drawChar(r,1,str[f],0,0,1); delay(10); r = r + 1; } matrix.drawChar(r,1,str[f],1,0,1);//Оставляет видимой символ с кординатами matrix.write(); f = f-1;//Выбирает символы r = -5;//Устанавливает начальную кординату по горизонтали для вывода символа c = c - 6;//отнимаеь 6 это размер символа + отступ delay(100); } } void scrl2(String str,int f,int c,int r){//Скрол с права на лево по одному символу до заполнения for(int w = 0; w < str.length()+1 ;w++){ for(int n = 0; n < c + 6; n++){ matrix.drawChar(r,1,str[f],1,0,1); matrix.write(); matrix.drawChar(r,1,str[f],0,0,1); delay(10); r = r - 1; } matrix.drawChar(r,1,str[f],1,0,1); matrix.write(); r = matrix.width(); f = f+1; c = c - 6; delay(100); } }Попробовал скомпилировать скетч. Не компилируется,просит библиотеки. Encoder.h , MsTimer2.h нашел. Надо myButton.h , нашел Button.h ,переименовал в myButton.h ,не принимает,сплошные ошибки. И пока не дошла очередь до Max72xxPanel.h . Не можешь выложить свои,рабочие библиотеки?
Выложить могу все библиотеки но незнаю как сдесь в чате добавить архив ??? Могу скинуть на почту.
Есть и описание библиотек
Могу скинуть на почту.
Будь добр: tanin33@yandex.ru
И Мне Пожалуйста ! jkud2@yandex.ru
intom33 Ну вот,обещал сбросить на почту,и пропал!
hatul я скидывал тебе вот еще раз скинул, может адрес не коректно написал, проверь
intom33 Премного благодарен! Получил только одно,сегодняшнее отправление. На выходных буду разбираться. Я могу обращаться за помощью? Да,у меня нет энкодера.Будут часы работать без него?
Блин,что со шрифтом!? Как в том анекдоте" у всех вши как вши ,а у меня как танки"! И поменять не могу никак.
hatul Если шо пиши, а вместо энкодера можна подключить кнопки немного изменив код.
Моно и мне скинуть?? на rs_bk@bk.ru .... хочется повторить..
Можно и мне скинуь схемку и библиоеки getzz@mail.ru