Часы на лед матрицах

intom33
Offline
Зарегистрирован: 26.11.2016

Доброго всем времени суток !

Вот собрал такие часы на матрицах 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);
 //*************************************

 }

Выложл бы схему в протеусе но не пойму как сдесь выложить картинку ?

 

bwn
Offline
Зарегистрирован: 25.08.2014

Вот если все работает, нахрена модернизировать али упрощать?

intom33
Offline
Зарегистрирован: 26.11.2016

Впринципе все работает просто хотелось добавить может какието эфекты скролинга разного или еще чего))

Да и еще вопрос кто знает где посмотреть документацию на библиотеку Adafruit-GFX есть файл pdf с описанием но там не очень подробно все описывется, особенно с работой с шрифтами, хотел подставить свой шрифт но не пойму как это сделать?

dgeka
Offline
Зарегистрирован: 05.07.2016

давайте и схему пожайлусто :) genia.flora(сабачка) gmail.com

hatul
Offline
Зарегистрирован: 12.04.2017

intom33 пишет:

просто хотелось добавить может какието эфекты 

Если добавишь что,будь добр,не забудь поделиться кодом. Хочется тоже чего то этогово,а мозгов не хватает!

intom33
Offline
Зарегистрирован: 26.11.2016

Всем привет !  Разбираюсь с скролом в скетче:

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);
  }
}

хочю зделать с лева на право, пока не получается ((

intom33
Offline
Зарегистрирован: 26.11.2016

Вот некоторые эфекты скролов

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);
  }
}

 

hatul
Offline
Зарегистрирован: 12.04.2017

Попробовал скомпилировать скетч. Не компилируется,просит библиотеки.  Encoder.h , MsTimer2.h нашел. Надо myButton.h ,  нашел Button.h ,переименовал в myButton.h ,не принимает,сплошные ошибки. И пока не дошла очередь до Max72xxPanel.h . Не можешь выложить свои,рабочие библиотеки?

intom33
Offline
Зарегистрирован: 26.11.2016

Выложить могу все библиотеки но незнаю как сдесь в чате добавить архив ??? Могу скинуть на почту.

intom33
Offline
Зарегистрирован: 26.11.2016

Есть и описание библиотек

 

hatul
Offline
Зарегистрирован: 12.04.2017

intom33 пишет:

Могу скинуть на почту.

Будь добр:   tanin33@yandex.ru

jkud2
Offline
Зарегистрирован: 15.04.2017

И Мне Пожалуйста ! jkud2@yandex.ru

hatul
Offline
Зарегистрирован: 12.04.2017

intom33  Ну вот,обещал сбросить на почту,и пропал!

intom33
Offline
Зарегистрирован: 26.11.2016

hatul  я скидывал тебе вот еще раз скинул, может адрес не коректно написал, проверь

hatul
Offline
Зарегистрирован: 12.04.2017

intom33 Премного благодарен! Получил только одно,сегодняшнее отправление. На выходных буду разбираться. Я могу обращаться за помощью? Да,у меня нет энкодера.Будут часы работать без него?

Блин,что со шрифтом!? Как в том анекдоте" у всех вши как вши ,а у меня как танки"! И поменять не могу никак.

intom33
Offline
Зарегистрирован: 26.11.2016

hatul Если шо пиши, а вместо энкодера можна подключить кнопки немного изменив код.

putnik401
Offline
Зарегистрирован: 16.12.2016

Моно и  мне скинуть?? на rs_bk@bk.ru .... хочется повторить..

Satellite83
Offline
Зарегистрирован: 24.07.2017

Можно и мне скинуь схемку и библиоеки getzz@mail.ru