Часы на матрицах

Степлер
Offline
Зарегистрирован: 26.04.2016

Изменение времени показа часов 346 строка

  if(currentTime >= (loopTime + 10000)){ 

изменяем значение 10000

Изменение времени показа "Дома" 593 строка

delay(700);                           

изменяем значение 700

Изменение времени показа "Улица" 643 строка

delay(700);

изменяем значение 700

Изменение времени показа "Давление" 665 строка аналогично.

 

Andrei19
Offline
Зарегистрирован: 19.09.2016

Изменил строки, показания не изменились.. Да и в строках указана 700 мс длительность, это тотчно не 7 сек. Реагирует только задержка показаний часов.

Степлер
Offline
Зарегистрирован: 26.04.2016

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

yucan
Offline
Зарегистрирован: 20.04.2015

Степлер, не подскажите, что нужно изменить в проекте, чтобы вместо  DHT22 AM2320 использовать? 

Степлер
Offline
Зарегистрирован: 26.04.2016

Да вроде ничего менять не надо

yucan
Offline
Зарегистрирован: 20.04.2015

Но они ведь разные...АМ2320 по I2C интерфейсу работает.

Степлер
Offline
Зарегистрирован: 26.04.2016

он же и так и так работает вроде.

MVN123P
Offline
Зарегистрирован: 29.07.2016

Степлер пишет:

он же и так и так работает вроде.

Я установил АМ так он "нагло врет" по температуре.

Степлер
Offline
Зарегистрирован: 26.04.2016

Думаете по I2C он врать не будет?

yucan
Offline
Зарегистрирован: 20.04.2015

MVN123P пишет:

Степлер пишет:

он же и так и так работает вроде.

Я установил АМ так он "нагло врет" по температуре.

"Нагло" - это сколько? 2-3 градуса это для них норма. У меня DHT22 завышает на 1,5-2 градуса. BMP180 - на 3

MVN123P
Offline
Зарегистрирован: 29.07.2016

yucan пишет:

MVN123P пишет:

Степлер пишет:

он же и так и так работает вроде.

Я установил АМ так он "нагло врет" по температуре.

"Нагло" - это сколько? 2-3 градуса это для них норма. У меня DHT22 завышает на 1,5-2 градуса. BMP180 - на 3

По даташит на DHT22 точность 0.2 градуса цельсия (этот сенсор используют в инкубаторах, а там точность 0.1гр). У меня показывает 28 а реально 23

Степлер
Offline
Зарегистрирован: 26.04.2016

подкинуть его под тестовый скетч и сравнить показания при разных подключениях. Думаю что точность не зависит от способа обмена данными.

Andrei19
Offline
Зарегистрирован: 19.09.2016

Назрела идея прикрутить датчик радиоактивности МБМ-20. Схема подключения есть в сети. Вот логика работы датчика: за 36 секунд подсчитывается количество импульсов с выхода датчика, соответственно эти показания и будут значения микрорентгенами/час. 

Реально ли приписать программу для подсчета импульсов (на каком-нибудь свободном входе ардуино) на время 36 сек. И что бы эти 36 сек. не влияли на работу основной программы?

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

http://arduino.ru/imce?app=ckeditor%7Csendto%40ckeditor_fileUrl%7C&CKEditor=edit-comment&CKEditorFuncNum=2&langCode=ru#То же подобная проблема.... поделитесь пожалуйсто правильным скетчем....

Степлер
Offline
Зарегистрирован: 26.04.2016

Почему нет? Все реально.

Степлер
Offline
Зарегистрирован: 26.04.2016

Какая именно проблема? Скетч рабочий.

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

Извиняюсь, возможно попусту для вас, беспокою... но как то "криво"  символы на дисплее отображаются.... (пробовал фото загрузить, но не получилось.... толькт ссылку обозначил... )  например слово "улица" начинает отображсть с третьей матрицы, далее буквы появляются вообще, трудно понять, тем более обьяснить.... пробовал в строксх у-7 в скобки "//" ставить, меняется, но в худшую сторону... получется тоже самое, но еще в добавок " зеркально"... сейчес думаю попробоаать пнрвую матрицу с адресом 0, обозначить как третью с адресом 2... думаю может надт править саму библиотеку... я исптльзую "планку с матрицами 4-ре штуки...  синего цвета... вы не подскажите какие строки править... ? а то я только начинаю с Ардуиной "боротся... да и скетчик как то я удачный находил... на четыре матрицы...  все работалт... потом там вариант на шесть матриц был... загрузил не работает.... потом наверно выключил непрачильно.... сначала внешний +5 , (матрицы светились, питаясь, наверно по сигнальным пинам..., потом с USB отключил... позже залил тестовую библиотеку MAx7219... загрузилссь, прокрутил тест , все без замечаний.... попробовал прежний рабочий скетч залить... не получается.... то ли скетч не тот, то ли какие выходя на Меге ,"не управляемые....

MVN123P
Offline
Зарегистрирован: 29.07.2016
//размещение точек на дисплее
void plot (byte x, byte y, byte val) {
  //выбор матрицы в зависимости от координат х
  byte address;
  if (x >= 0 && x <= 7)   {             // при x >= 0 и x <= 7
    address = 0;                        // адрес матрицы 0
 //   y = 7 - y;                          // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
  }
  if (x >= 8 && x <= 15)  {             // при x >= 8 и x <= 15
    address = 1;                        // адрес матрицы 1
    x = x - 8;                          // координаты х пересчитываются по х - 8
  //  y = 7 - y;                          // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
  }
  if (x >= 16 && x <= 23) {             // при x >= 16 и x <= 23
    address = 2;                        // адрес матрицы 2
    x = x - 16;                         // координаты х пересчитываются по x - 16
//    y = 7 - y;                          // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
  }
  if (x >= 24 && x <= 31) {             // при x >= 24 и x <= 31
    address = 3;                        // адрес матрицы 3
    x = x - 24;                         // координаты х пересчитываются по x - 24
//    y = 7 - y;                          // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
  }
//зажигание и гашение точек
  if (val == 1) {                       // если точку надо зажечь
    lc.setLed(address, y, x, true);     // зажигание точки (для поворота обратно- поменять местами х и у
  } else {                              // если зажигать не надо
    lc.setLed(address, y, x, false);    // потушить точки (для поворота обратно- поменять местами х и у
  }
}

 

Степлер
Offline
Зарегистрирован: 26.04.2016

В

void plot (byte x, byte y, byte val)

поменяйте адреса 0 на 3, 1 на 2, 2 на 1 и 3 на 0

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

Поменял, было заманчиво, потому что просто.... но не помогло... но все равно... Спасибо за отклик желание помочь.... сейчас попробую второй способ...

Степлер
Offline
Зарегистрирован: 26.04.2016

Второй это какой?

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

// подключение модуля часов DS3231
// SCL pin -> Arduino A5
// SDA pin -> Arduino A4
// подключение LED Matrix
// DataIn pin -> Arduino 6
// CLK pin -> Arduino 5
// LOAD pin -> Arduino 4
// подключение DHT -> Arduino 9
// подключение DS18B20 -> Arduino 7
// подключение фоторезистора -> Arduino А0
//загрузка библиотек
#include <LedControl.h>                  // библиотека управления матрицами
#include <FontLEDClock.h>                // библиотека шрифтов
#include <Wire.h>                        // библиотека шины I2C для модуля часов
#include <RTClib.h>                      // библиотека модуля часов
#include <Button.h>                      // библиотека для кнопок
#include <DHT.h>                         // библиотека для датчика температуры и влажности DHT
#include <EEPROM.h>                      // библиотека управления памятью EEPROM
#include <OneWire.h>                     // библиотека шины One Wire
#include <Adafruit_BMP085.h>
// настройки подключений
OneWire ds(7);                          // контакт подключения датчика температуры DS18B20
#define DS3231_I2C_ADDRESS 0x68          // адрес модуля часов на шине I2C
#define DHTPIN 9                         // контакт подключения датчика DHT
#define DHTTYPE DHT22                    // тип датчика DHT
DHT dht(DHTPIN, DHTTYPE);                // инициализация датчика DHT
Adafruit_BMP085 bmp;                    
// настройка LED Matrix
const int numDevices = 4;                        // неизменная константа количества используемых MAX7219. Введена для упращения изменения количества используемых MAX7219.
LedControl lc = LedControl(6, 5, 4, numDevices); //настройки подключения используемых MAX7219.
//глобальные переменные
byte intensityDay = EEPROM.read(0);      // яркость днем по умолчанию из EEPROM
byte intensityNight = EEPROM.read(1);    // яркость ночью по умолчанию из EEPROM
byte intensity = 7;                      // яркость по умолчанию (0-15)
int brightness = EEPROM.read(2);         // чувствительность датчика освещения
byte clock_mode = 0;                     // режим часов по умолчанию
byte old_mode = clock_mode;              // запоминание предидущего режима часов для возвращения из режимов даты и т.д.
unsigned long delaytime = 500;           // ожидание перед обновлением дисплея
unsigned long currentTime;
unsigned long loopTime;
int rtc[7];                              // Holds real time clock output
int ldr = 0;
char daysfull[7][9] = {
  "Voskr.", "Poned.", "Vtorn.", "Sreda", "Hetv.", "Pqtn.", "Subb."
};
//определение констант
#define NUM_DISPLAY_MODES 1              // Количество режимов отображения
#define NUM_SETTINGS_MODES 4             // Количество режимов настройки
#define SLIDE_DELAY 20                   // Время в миллисекундах для слайд-эффекта на знак в режиме слайдов. Увеличить для более медленной анимации
#define cls          clear_display       // Очистка дисплея
RTC_DS3231 ds3231;                              // создание объекта RTC
Button buttonA = Button(2,BUTTON_PULLUP);      // Настройка кнопки А (используется библиотека Button)
Button buttonB = Button(3,BUTTON_PULLUP);      // Настройка кнопки В (используется библиотека Button)
void setup() {
//  EEPROM.write(0, 8);
//EEPROM.write(1, 8);
  digitalWrite(2, HIGH);                 // включение подтягивающего резистора для кнопки на пине 2
  digitalWrite(3, HIGH);                 // включение подтягивающего резистора для кнопки на пине 3
  Serial.begin(9600);                    //запуск передачи по 232
  bmp.begin();
//инициализация панелей MAX7219
for (int address = 0; address < numDevices; address++) { //инициализация всех LCD на шлейфе
    lc.shutdown(address, false);         // MAX72XX в режиме экономии энергии при запуске
    lc.setIntensity(address, intensity); // настройка яркости
    lc.clearDisplay(address);            //очистка дисплея
  }
//Инициализация модуля часов
  Wire.begin();                                   // запуск шины I2C
  ds3231.begin();                                 // запуск RTC часов
//  ds3231.adjust(DateTime(__DATE__, __TIME__));  // автоматическая установка времени и даты из компа
  dht.begin();                                  //запуск DHT  
 // printver(); //Показать версию
}
void loop() {
//Запуск часов в режиме установленом в clock_mode 
  switch (clock_mode){
  case 0:                 //номер режима
    slide();              //название режима
    break;                //принудительное завершение режима
  case 1:                 //номер режима
    setup_menu();         //название режима
    break;                //принудительное завершение режима
  }
}
//размещение точек на дисплее
void plot (byte x, byte y, byte val) {
  //выбор матрицы в зависимости от координат х
  byte address;
  if (x >= 0 && x <= 7)   {             // при x >= 0 и x <= 7
    address = 0;                        // адрес матрицы 0
 //   y = 7 - y;                          // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
  }
  if (x >= 8 && x <= 15)  {             // при x >= 8 и x <= 15
    address = 1;                        // адрес матрицы 1
    x = x - 8;                          // координаты х пересчитываются по х - 8
  //  y = 7 - y;                          // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
  }
  if (x >= 16 && x <= 23) {             // при x >= 16 и x <= 23
    address = 2;                        // адрес матрицы 2
    x = x - 16;                         // координаты х пересчитываются по x - 16
//    y = 7 - y;                          // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
  }
  if (x >= 24 && x <= 31) {             // при x >= 24 и x <= 31
    address = 3;                        // адрес матрицы 3
    x = x - 24;                         // координаты х пересчитываются по x - 24
//    y = 7 - y;                          // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
  }
//зажигание и гашение точек
  if (val == 1) {                       // если точку надо зажечь
    lc.setLed(address, y, x, true);     // зажигание точки (для поворота обратно- поменять местами х и у
  } else {                              // если зажигать не надо
    lc.setLed(address, y, x, false);    // потушить точки (для поворота обратно- поменять местами х и у
  }
}
//очистка дисплея
void clear_display() {
  for (byte address = 0; address < 4; address++) {  //для адресов с 0 до 3
    lc.clearDisplay(address);                       //очистить дисплей
  }
}
//затухание дисплея
void fade_down() {
  //затухание от глобальной яркости до 1
  for (byte i = intensity; i > 0; i--) {                 //для i= текущей интенсивности и больше 0 1 уменьшается на 1 при каждом проходе
    for (byte address = 0; address < 4; address++) {     //для адресов с 0 до 3
      lc.setIntensity(address, i);                       //выставить яркость = i
    }
    delay(30);                                           //ожидание 30 мс   (можно регулировать скорость затухания)
  }
  clear_display();                                       //очистка дисплея
  //сброс яркости до глобальной настройки
  for (byte address = 0; address < 4; address++) {       //для адресов с 0 до 3
    lc.setIntensity(address, intensity);                 //выставить яркость из intensity
  }
}
//тест точек при включении и приветственная надпись
/*void printver() {
  byte i = 0;                    //i=0
  char ver_a[9] = "1.0";    //переменная ver_a = "Vers 1.0"
//  char ver_b[9] = " Hello! ";    //переменная ver_b = " Hello! "
//тест всех точек
  for (byte x = 0; x <= 31; x++) {   //для координат х от 0 до 31 (с каждым проходом х+1)
    for (byte y = 0; y <= 7; y++) {  //для координат у от 0 до 7 (с каждым проходом у+1)
      plot(x, y, 1);                 //зажечь точку с координатами х у
    }
  }
  delay(500);                        //ожидание 500 мс
  fade_down();                       //запуск затемнения
  while (ver_a[i]) {                     // пока i не достигнет 9
    puttinychar((i * 4), 1, ver_a[i]);   // запустить puttinychar с параметрарами: координаты х=i*4, у=1, текст из char ver_a
    delay(35);                           // ожидание 35 мс
    i++;                                 // увеличить i на 1
  }
  delay(700);                            // ожидание 700 мс
  fade_down();                           //запуск затемнения
  i = 0;                                 // обнуление i
  while (ver_b[i]) {                     //пока i не достигнет 9
    puttinychar((i * 4), 1, ver_b[i]);   // запустить puttinychar с параметрарами: координаты х=i*4, у=1, текст из char ver_b
    delay(35);                           // ожидание 35 мс
    i++;                                 // увеличить i на 1
  }
  delay(700);                            // ожидание 700 мс
  fade_down();                           //запуск затемнения
}*/
// копирование символов размером 5х7 из массива myfont в память дисплея с началом координат в левом верхнем углу
// не оптимизировано и использует plot() для рисования каждой точки.
void putnormalchar(byte x, byte y, char c) {
  byte dots;
  if (c >= 'A' && c <= 'Z' ) {                                  //если с от 'A' до 'Z'
    c &= 0x1F;                                                  //то с = от 1 до 31
  }
  else if (c >= 'a' && c <= 'z') {                              //иначе если с от 'a' до 'z'
    c = (c - 'a') + 42;                                         //то с = от 41 до 67
  }
  else if (c >= '0' && c <= '9') {                              // иначе если с от '0' до '9'
    c = (c - '0') + 32;                                         // то с = с 32 до 42
  }
  else if (c == ' ') {                                          //иначе если с=' '
    c = 0;                                                      //то с=0
  }
  else if (c == '.') {                                          //иначе если с='.'
    c = 27;                                                     // то с=27
  }
  else if (c == '\'') {                                         //иначе если с='\''
    c = 28;                                                     //то с=28
  }
  else if (c == ':') {                                          //иначе если с=':'
    c = 29;                                                     //то с=29
  }
  else if (c == '>') {                                          //иначе если с='>'
    c = 30;                                                     // то с=30
  }
   else if (c >= -80 && c <= -68) {                              //иначе если с >= -80 и <= -67
    c *= -1;                                                    //с=с*(-1)
  }
   else if (c == '-') {                                          //иначе если с='%'
   c = 31;                                                     // то с=30
  }
  for (char col = 0; col < 5; col++) {                          //для col от 0 до 4
    dots = pgm_read_byte_near(&myfont[c][col]);                 //точки взять из массива myfont по адресу строки с с col
    for (char row = 0; row < 7; row++) {                        // для строк от 0 до 6
      //check coords are on screen before trying to plot
      //if ((x >= 0) && (x <= 31) && (y >= 0) && (y <= 7)){
      if (dots & (64 >> row)) {                                  //если точки и 64 >>row
        plot(x + col, y + row, 1);                               //нарисовать точки с координатами х+col и у+row
      } else {                                                   //иначе
        plot(x + col, y + row, 0);                               //потушить точки с координатами х+col и у+row
      }
    }
  }
}
void slide() {

  byte digits_old[4] = {99, 99, 99, 99};      //запоминание старых цифр времени
  byte digits_new[4];                         //создание переменной для новых цифр времени
  byte digits_x_pos[4] = {25, 19, 7, 1};      //создание переменной для координат x pos для каждой цифры
  char old_char[2];                           //используется когда используется itoa для перевода текущей цифры (type byte) в символ для передачи в функцию анимации
  char new_char[2];                           //используется когда используется itoa для перевода новой цифры (type byte) в символ для передачи в функцию анимации
  //old_chars - stores the 5 day and date suffix chars on the display. e.g. "mon" and "st". We feed these into the slide animation as the current char when these chars are updated.
  //We sent them as A initially, which are used when the clocl enters the mode and no last chars are stored.
  //char old_chars[6] = "AAAAA";
  currentTime = millis();       // считываем время, прошедшее с момента запуска программы
  loopTime = currentTime; 
  if (analogRead(ldr) < brightness*100){
      intensity = intensityNight;
  }
     else{
     intensity = intensityDay;
     }//
  for (int address = 0; address < numDevices; address++) { //инициализация всех LCD на шлейфе
     lc.setIntensity(address, intensity);
     }// настройка яркости
  cls();                                      //очистка дисплея
  putnormalchar( 13, 0, ':');                 //размещение символа ':' с координатами х=13 у=0
  byte old_secs = rtc[0];                     //запоминаем секунды из модуля часов в old_secs
  while (run_mode()) {                        //выполнять до изменения run_mode
    get_time();                               //получить данные из модуля часов
     if (buttonA.uniquePress()) {             //Если нажата кнопка А
      setup_menu();                          //Перейти в режим setup_menu
      return;                                 //прекращение выполнения switch_mode и возврат
    }
      if (buttonB.uniquePress()) {            //Если нажата кнопка В
      display_date();                         //Перейти в режим display_date
      return;                                 //прекращение выполнения display_date и возврат
    }
    if (rtc[0] != old_secs) {                 //если секунды из модуля часов не равны секундам в old_secs
      old_secs = rtc[0];                      //присвоить old_secs секунды из модуля часов
      byte hours = rtc[2];                    //присвоить hours значение часов из модуля часов
     // if (hours > 12) {                       //если hours меньше 12
     //   hours = hours - ampm * 12;
     // }
     // if (hours < 1) {
     //   hours = hours + ampm * 12;
     // }
//разделение всех знаков времени и даты на отдельные цифры в digits_new массив
      //rtc[0] = secs                        //array pos and digit stored
      //digits_new[0] = (rtc[0]%10);           //0 - secs ones
      //digits_new[1] = ((rtc[0]/10)%10);      //1 - secs tens
      //rtc[1] = mins
      digits_new[0] = (rtc[1] % 10);         //2 - mins ones
      digits_new[1] = ((rtc[1] / 10) % 10);  //3 - mins tens
      //rtc[2] = hours
      digits_new[2] = (hours % 10);         //4 - hour ones
      digits_new[3] = ((hours / 10) % 10);  //5 - hour tens
      //rtc[4] = date
      //digits_new[6] = (rtc[4]%10);           //6 - date ones
      //digits_new[7] = ((rtc[4]/10)%10);      //7 - date tens
//сравнение цифр 0-3 (минут и часов)
      for (byte i = 0; i <= 3; i++) {           //для i от 0 до 3
        if (digits_old[i] != digits_new[i]) {   //если digits_old не равно digits_new
          for (byte seq = 0; seq <= 8 ; seq++) {//для seq от 0 до 8
            itoa(digits_old[i], old_char, 10);  //преобразование digits_old в значение old_char в 10-ричном формате
            itoa(digits_new[i], new_char, 10);  //преобразование digits_new в значение new_char в 10-ричном формате
       //     if (ampm && i == 3) {               //если включен режим ampm и i=3
       //       if (digits_new[3] == 0) {         //если новые десятки часов=0
       //         new_char[0] = ' ';              //символ новых десятков часов заменить на ' '
       //       }
       //       if (digits_old[3] == 0) {         //если старые десятки часов=0
       //         old_char[0] = ' ';              //символ старых десятков часов заменить на ' '
       //       }
       //     }
            slideanim(digits_x_pos[i], 0, seq, old_char[0], new_char[0]); //запуск анимации
            delay(SLIDE_DELAY);                                           //ожидание из SLIDE_DELAY
          }
        }
      }

      /*
      //compare date digit 6 (ones) and (7) tens - if either of these change we need to update the date line. We compare date tens as say from Jan 31 -> Feb 01 then ones digit doesn't change
      if ((digits_old[6] != digits_new[6]) || (digits_old[7] != digits_new[7])) {
        //change the day shown. Loop below goes through each of the 3 chars in turn e.g. "MON"
        for (byte day_char = 0; day_char <=2 ; day_char++){
          //run the anim sequence for each char
          for (byte seq = 0; seq <=8 ; seq++){
            //the day (0 - 6) Read this number into the days char array. the seconds number in the array 0-2 gets the 3 chars of the day name, e.g. m o n
            slideanim(6*day_char,8,seq,old_chars[day_char],days[rtc[3]][day_char]); //6 x day_char gives us the x pos for the char
            delay(SLIDE_DELAY);
          }
          //save the old day chars into the old_chars array at array pos 0-2. We use this next time we change the day and feed it to the animation as the current char. The updated char is fed in as the new char.
          old_chars[day_char] = days[rtc[3]][day_char];
        }

        //change the date tens digit (if needed) and ones digit. (the date ones digit wil alwaus change, but putting this in the 'if' loop makes it a bit neater code wise.)
        for (byte i = 7; i >= 6; i--){
          if (digits_old[i] != digits_new[i]) {
            for (byte seq = 0; seq <=8 ; seq++){
              itoa(digits_old[i],old_char,10);
              itoa(digits_new[i],new_char,10);
              slideanim(digits_x_pos[i],8,seq,old_char[0],new_char[0]);
              delay(SLIDE_DELAY);
            }
          }
        }

        //print the day suffix "nd" "rd" "th" etc. First work out date 2 letter suffix - eg st, nd, rd, th
        byte s = 3; //the pos to read our suffix array from.
        byte date = rtc[4];
        if(date == 1 || date == 21 || date == 31) {
          s = 0;
        }
        else if (date == 2 || date == 22) {
          s = 1;
        }
        else if (date == 3 || date == 23) {
          s = 2;
        }

        for (byte suffix_char = 0; suffix_char <=1 ; suffix_char++){
          for (byte seq = 0; seq <=8 ; seq++){
            slideanim((suffix_char*6)+36,8,seq,old_chars[suffix_char+3],suffix[s][suffix_char]); // we pass in the old_char array char as the current char and the suffix array as the new char
            delay(SLIDE_DELAY);
          }
          //save the suffic char in the old chars array at array pos 3 and 5.  We use these chars next time we change the suffix and feed it to the animation as the current char. The updated char is fed in as the new char.
          old_chars[suffix_char+3] = suffix[s][suffix_char];
        }
      }//end do date line
      */

//сохранение цифр
      for (byte i = 0; i <= 3; i++) {                    //для i от 0 до 3
        digits_old[i] =  digits_new[i];                  //присвоить digits_old значение digits_new
      }
    }//secs/oldsecs
    currentTime = millis();                           // считываем время, прошедшее с момента запуска программы
  if(currentTime >= (loopTime + 10000)){              // сравниваем текущий таймер с переменной loopTime + 1 секунда
    fade_down();
    cls();
    display_date();
    display_temp();
    return;
    loopTime = currentTime;                         // в loopTime записываем новое значение
  }
    }//while loop
 // fade_down();                                           //затухание экрана
}
//отрисовка анимации смены символа. всего 8 шагов анимации в функции от 0 до 7
//вводные данные координат х и у, последовательность кадров sequence и текущие и новые символы
void slideanim(byte x, byte y, byte sequence, char current_c, char new_c) {
  //  To slide one char off and another on we need 9 steps or frames in sequence...
  //  seq# 0123456 <-строки дисплея
  //   |   |||||||
  //  seq0 0123456  START - все строки дисплея 0-6 отображают текущие строки 0-6
  //  seq1  012345  текущий символ смещается вниз на одну строку. мы видим только строки 0-5, они размещены на строках 1-6. сверху добавляется пустая строка
  //  seq2 6 01234  текущий символ смещается вниз на две строки. мы видим только строки 0-4, они размещены на строках 2-6. строка 1 дисплея пустаяс, строка 0 показывает строку 6 нового символа.
  //  seq3 56 0123
  //  seq4 456 012  половина старого символа, половина нового
  //  seq5 3456 01
  //  seq6 23456 0
  //  seq7 123456
  //  seq8 0123456  END - все строки показывают новый символ

  //from above we can see...
  //currentchar runs 0-6 then 0-5 then 0-4 all the way to 0. starting Y position increases by 1 row each time.
  //new char runs 6 then 5-6 then 4-6 then 3-6. starting Y position increases by 1 row each time.

  //if sequence number is below 7, we need to draw the current char
  if (sequence < 7) {
    byte dots;
    // if (current_c >= 'A' &&  || (current_c >= 'a' && current_c <= 'z') ) {
    //   current_c &= 0x1F;   // A-Z maps to 1-26
    // }
    if (current_c >= 'A' && current_c <= 'Z' ) {
      current_c &= 0x1F;   // A-Z maps to 1-26
    }
    else if (current_c >= 'a' && current_c <= 'z') {
      current_c = (current_c - 'a') + 42;   // A-Z maps to 41-67
    }
    else if (current_c >= '0' && current_c <= '9') {
      current_c = (current_c - '0') + 32;
    }
    else if (current_c == ' ') {
      current_c = 0; // space
    }
    else if (current_c == '.') {
      current_c = 27; // full stop
    }
    else if (current_c == '\'') {
      current_c = 28; // single quote mark
    }
    else if (current_c == ':') {
      current_c = 29; //colon
    }
    else if (current_c == '>') {
      current_c = 30; // clock_mode selector arrow
    }

    byte curr_char_row_max = 7 - sequence; //the maximum number of rows to draw is 6 - sequence number
    byte start_y = sequence; //y position to start at - is same as sequence number. We inc this each loop

    //plot each row up to row maximum (calculated from sequence number)
    for (byte curr_char_row = 0; curr_char_row <= curr_char_row_max; curr_char_row++) {
      for (byte col = 0; col < 5; col++) {
        dots = pgm_read_byte_near(&myfont[current_c][col]);
        if (dots & (64 >> curr_char_row))
          plot(x + col, y + start_y, 1); //plot led on
        else
          plot(x + col, y + start_y, 0); //else plot led off
      }
      start_y++;//add one to y so we draw next row one down
    }
  }

  //draw a blank line between the characters if sequence is between 1 and 7. If we don't do this we get the remnants of the current chars last position left on the display
  if (sequence >= 1 && sequence <= 8) {
    for (byte col = 0; col < 5; col++) {
      plot(x + col, y + (sequence - 1), 0); //the y position to draw the line is equivalent to the sequence number - 1
    }
  }

 

  //if sequence is above 2, we also need to start drawing the new char
  if (sequence >= 2) {

    //work out char
    byte dots;
    //if (new_c >= 'A' && new_c <= 'Z' || (new_c >= 'a' && new_c <= 'z') ) {
    //  new_c &= 0x1F;   // A-Z maps to 1-26
    //}
    if (new_c >= 'A' && new_c <= 'Z' ) {
      new_c &= 0x1F;   // A-Z maps to 1-26
    }
    else if (new_c >= 'a' && new_c <= 'z') {
      new_c = (new_c - 'a') + 42;   // A-Z maps to 41-67
    }
    else if (new_c >= '0' && new_c <= '9') {
      new_c = (new_c - '0') + 32;
    }
    else if (new_c == ' ') {
      new_c = 0; // space
    }
    else if (new_c == '.') {
      new_c = 27; // full stop
    }
    else if (new_c == '\'') {
      new_c = 28; // single quote mark
    }
    else if (new_c == ':') {
      new_c = 29; // clock_mode selector arrow
    }
    else if (new_c == '>') {
      new_c = 30; // clock_mode selector arrow
    }

    byte newcharrowmin = 6 - (sequence - 2); //minimumm row num to draw for new char - this generates an output of 6 to 0 when fed sequence numbers 2-8. This is the minimum row to draw for the new char
    byte start_y = 0; //y position to start at - is same as sequence number. we inc it each row

    //plot each row up from row minimum (calculated by sequence number) up to 6
    for (byte newcharrow = newcharrowmin; newcharrow <= 6; newcharrow++) {
      for (byte col = 0; col < 5; col++) {
        dots = pgm_read_byte_near(&myfont[new_c][col]);
        if (dots & (64 >> newcharrow))
          plot(x + col, y + start_y, 1); //plot led on
        else
          plot(x + col, y + start_y, 0); //else plot led off
      }
      start_y++;//add one to y so we draw next row one down
    }
  }
}
//display_date - print the day of week, date and month with a flashing cursor effect
void display_date() {
  cls();
  //read the date from the DS3231

  byte dow = rtc[3]; // day of week 0 = Sunday
  byte date = rtc[4];
  byte month = rtc[5] - 1;

  //array of month names to print on the display. Some are shortened as we only have 8 characters across to play with
  char monthnames[12][6] = {
    "Jan.", "Fev.", "Marta", "Apr.", "May", "Ijnq", "Ijlq", "Avg.", "Sent.", "Okt.", "Noqb.", "Dek."
  };

  //print the day name
 
  //get length of text in pixels, that way we can centre it on the display by divindin the remaining pixels b2 and using that as an offset
  byte len = 0;
  while(daysfull[dow][len]) {
    len++;
  };
  byte offset = (31 - ((len-1)*6)) / 2; //our offset to centre up the text
     
  //print the name    
  int i = 0;
  while(daysfull[dow][i])
  {
    putnormalchar((i*6) + offset , 0, daysfull[dow][i]);
    i++;
  }
  delay(1000);
  fade_down();
  cls();
 
  // print date numerals
String str_date;
  if (date < 10){str_date+="0";}
  str_date+=date;
  //str_date+="-";
 // if (month < 10){str_date+="0";}
  //str_date+=month;
 
  i = 0;
  while(str_date[i])
  {
    putnormalchar((i*6+10), 0, str_date[i]);
  delay(40);
    i++;
  }
 
  delay(1000);
  fade_down();
 
  //print the month name
 
  //get length of text in pixels, that way we can centre it on the display by divindin the remaining pixels b2 and using that as an offset
  len = 0;
  while(monthnames[month][len]) {
    len++;
  };
  offset = (31 - ((len-1)*6)) / 2; //our offset to centre up the text
  i = 0;
  while(monthnames[month][i])
  { 
    putnormalchar((i*6) +offset, 0, monthnames[month][i]);
    i++;
  }
 
  delay(1000);
  fade_down();
  cls();
 // display_temp();
}
void display_temp() {
//Wire.beginTransmission(0x68);
//Wire.write(0x11);
//Wire.endTransmission();
//Wire.requestFrom(0x68, 2);
//float t= (Wire.read()<<2 | Wire.read()>>6)*0.25;
//Serial.println(temp);
// int t= Wire.read ();
 
  cls();
  int t = dht.readTemperature();
  int h = dht.readHumidity();
  int p = bmp.readPressure()/133.3;
  char ver_c[9] = "Doma";
  char ver_d[9] = "Ulica";
  char ver_e[9] = "Davlen.";
  t = dht.readTemperature();
  h = dht.readHumidity();
  p = bmp.readPressure()/133.3;
  String str_temp = "";
  String str_humi = "";
  String str_pres = "";
  //str_temp += "T:";
  str_temp += String(t);
  str_temp += "'S";
  str_humi += "N:";
  str_humi += String(h);
  str_humi += ">";
  str_pres += String(p);
  str_pres += "mm.";

    byte i = 0;
  //  Serial.println (h);
  while (ver_c[i]) {                     // пока i не достигнет 9
    putnormalchar((i * 6)+5, 0, ver_c[i]);   // запустить putnormalchar с параметрарами: координаты х=i*4, у=1, текст из char ver_a
    delay(35);                           // ожидание 35 мс
    i++;                                 // увеличить i на 1
  }
    delay(700);                            // ожидание 700 мс
    fade_down();                           //запуск затемнения
    i = 0;                                 // обнуление i
    byte len = 0;
  while(str_temp[len]) {
    len++;
  };
  byte offset = (31 - ((len-1)*7)) / 2; //our offset to centre up the text
    while (str_temp[i]) {
    putnormalchar((i*6)+offset, 0, str_temp[i]);
    delay(40);
    i++;
  }
    delay(1500);
    fade_down();
    cls();
    i = 0;
    while (str_humi[i]) {
    putnormalchar((i*6+1), 0, str_humi[i]);
    delay(40);
    i++;
  }
    delay(1500);
    fade_down();
    cls();
  //read the Temp from the DS18B20
  byte data[2];
  ds.reset();
  ds.write(0xCC);
  ds.write(0x44);
  delay(75);
  ds.reset();
  ds.write(0xCC);
  ds.write(0xBE);
  data[0] = ds.read();
  data[1] = ds.read();
  int Temp = (data[1]<< 8)+data[0];
  Temp = Temp>>4;
  //Temp = - 25;
  String str_temp2 = "";
  //str_temp2 += "T:";
  str_temp2 += String(Temp);
  str_temp2 += "'S";
  i = 0;
   //print temp from DS18B20
  while (ver_d[i]) {                     //пока i не достигнет 9
    putnormalchar((i * 6)+2, 0, ver_d[i]);   // запустить putnormalchar с параметрарами: координаты х=i*4, у=1, текст из char ver_d
    delay(35);                           // ожидание 35 мс
    i++;                                 // увеличить i на 1
  }
  delay(700);                            // ожидание 700 мс
  fade_down();
  i = 0;
  byte len2 = 0;
  while(str_temp2[len2]) {
    len2++;
  };
  byte offset2 = (31 - ((len2-1)*7)) / 2; //our offset to centre up the text
     while (str_temp2[i]) {
    putnormalchar((i*6)+offset2, 0, str_temp2[i]);
    delay(40);
    i++;
  }
    delay(1500);
    fade_down();
  cls();
  i = 0;
  while (ver_e[i]) {                     //пока i не достигнет 9
    putnormalchar((i * 6)+1, 0, ver_e[i]);   // запустить putnormalchar с параметрарами: координаты х=i*4, у=1, текст из char ver_d
    delay(35);                           // ожидание 35 мс
    i++;                                 // увеличить i на 1
  }
  delay(7000);                            // ожидание 700 мс
  fade_down();
  i = 0;
  byte len3 = 0;
  while(str_pres[len3]) {
    len3++;
  };
  byte offset3 = (31 - ((len3-1)*7)) / 2; //our offset to centre up the text
     while (str_pres[i]) {
    putnormalchar((i*6)+1, 0, str_pres[i]);
    delay(40);
    i++;
  }
  delay(1500);
    fade_down();
  cls();
  i = 0;
}
//run clock main loop as long as run_mode returns true
byte run_mode() {
/*
  //if random mode is on... check the hour when we change mode.
  if (random_mode) {
    //if hour value in change mode time = hours. then reurn false = i.e. exit mode.
    if (change_mode_time == rtc[2]) {
      //set the next random clock mode and time to change it
      set_next_random();
      //exit the current mode.
      return 0;
    }
  }*/
  //else return 1 - keep running in this mode
  return 1;
}
//dislpay menu to change the clock settings
void setup_menu() {

  char* set_modes[] = {
     "Korrek.", "Qr Dnem", "Qr nohz", "Huvst","Vyxod"};
  /*if (ampm == 0) {
    set_modes[1] = ("12 Hr");
  }*/

  byte setting_mode = 0;
  byte next_setting_mode;
  byte firstrun = 1;

  //loop waiting for button (timeout after 35 loops to return to mode X)
  for(int count=0; count < 35 ; count++) {

    //if user hits button, change the clock_mode
    if(buttonA.uniquePress() || firstrun == 1){

      count = 0;
      cls();

      if (firstrun == 0) {
        setting_mode++;
      }
      if (setting_mode > NUM_SETTINGS_MODES) {
        setting_mode = 0;
      }

      //print arrown and current clock_mode name on line one and print next clock_mode name on line two
      char str_top[9];
   
      strcpy (str_top, set_modes[setting_mode]);

      next_setting_mode = setting_mode + 1;
      if (next_setting_mode > NUM_SETTINGS_MODES) {
        next_setting_mode = 0;
      }
     
      byte i = 0;
      while(str_top[i]) {
        putnormalchar(i*6, 0, str_top[i]);
        i++;
      }

      firstrun = 0;
    }
    delay(50);
  }
 
  //pick the mode
  switch(setting_mode){
   /* case 0:
      set_random();
      break;
    case 1:
       set_ampm();
      break;*/
    case 0:
      set_time();
      break;
    case 1:
       set_intensityDay();
      break;
    case 2:
      set_intensityNight();
      break;
    case 3:
      set_brightness();
      break;
    case 4:
      //exit menu
      break;
  }
   
  //change the clock from mode 6 (settings) back to the one it was in before
  clock_mode=old_mode;
}
//change screen intensityintensity
void set_intensityDay() {

  cls();
 
  byte i = 0;
  char text[14] = "qr dnem";
  while(text[i]) {
    putnormalchar((i*6), 0-2, text[i]);
    i++;
  }

  //wait for button input
  while (!buttonA.uniquePress()) {

    levelbar (0,6,(intensityDay*2)+2,2);    //display the intensity level as a bar
    while (buttonB.isPressed()) {

      if(intensityDay == 15) {
        intensityDay = 0;
        cls ();
      }
      else {
        intensityDay++;
      }
      //print the new value
      i = 0;
      while(text[i]) {
        putnormalchar((i*6), 0-2, text[i]);
        i++;
      }
     
      //display the intensity level as a bar
      levelbar (0,6,(intensityDay*2)+2,2);   
     
      //change the brightness setting on the displays
      for (byte address = 0; address < 4; address++) {
        lc.setIntensity(address, intensityDay);
      }
      delay(150);
    }
  }
  EEPROM.write(0, intensityDay);
}
void set_intensityNight() {

  cls();
 
  byte i = 0;
  char text[14] = "qr nohz";
  while(text[i]) {
    putnormalchar((i*6), 0-2, text[i]);
    i++;
  }

  //wait for button input
  while (!buttonA.uniquePress()) {

    levelbar (0,6,(intensityNight*2)+2,2);    //display the intensity level as a bar
    while (buttonB.isPressed()) {

      if(intensityNight == 15) {
        intensityNight = 0;
        cls ();
      }
      else {
        intensityNight++;
      }
      //print the new value
      i = 0;
      while(text[i]) {
        putnormalchar((i*6), 0-2, text[i]);
        i++;
      }
     
      //display the intensity level as a bar
      levelbar (0,6,(intensityNight*2)+2,2);   
     
      //change the brightness setting on the displays
      for (byte address = 0; address < 4; address++) {
        lc.setIntensity(address, intensityNight);
      }
      delay(150);
    }
  }
  EEPROM.write(1, intensityNight);
}
void set_brightness() {

  cls();
 
  byte i = 0;
  char text[14] = "huvst";
  while(text[i]) {
    putnormalchar((i*6), 0-2, text[i]);
    i++;
  }

  //wait for button input
  while (!buttonA.uniquePress()) {

    levelbar (0,6,(brightness*2)+2,2);    //display the intensity level as a bar
    while (buttonB.isPressed()) {

      if(brightness == 15) {
        brightness = 0;
        cls ();
      }
      else {
       brightness = brightness+1;
      }
      //print the new value
      i = 0;
      while(text[i]) {
        putnormalchar((i*6), 0-2, text[i]);
        i++;
      }
     
      //display the intensity level as a bar
      levelbar (0,6,(brightness*2)+2,2);   

      //change the brightness setting on the displays
      if (analogRead(ldr) < brightness*100){
      intensity = intensityNight;
  }
     else{
     intensity = intensityDay;
     }//
  for (int address = 0; address < numDevices; address++) { //инициализация всех LCD на шлейфе
     lc.setIntensity(address, intensity);
     }// настройка яркости
    //  for (byte address = 0; address < 4; address++) {
    //    lc.setIntensity(address, intensityDay);
    //  }
      delay(150);
  //         Serial.println  (brightness);
    }
  }
  EEPROM.write(2, brightness);
}
// display a horizontal bar on the screen at offset xposr by ypos with height and width of xbar, ybar
void levelbar (byte xpos, byte ypos, byte xbar, byte ybar) {
  for (byte x = 0; x < xbar; x++) {
    for (byte y = 0; y <= ybar; y++) {
      plot(x+xpos, y+ypos, 1);
    }
  }
}
//set time and date routine
void set_time() {

  cls();

  //fill settings with current clock values read from clock
  get_time();
  byte set_min   = rtc[1];
  byte set_hr    = rtc[2];
  byte set_date  = rtc[4];
  byte set_mnth  = rtc[5];
  int  set_yr    = rtc[6];

  //Set function - we pass in: which 'set' message to show at top, current value, reset value, and rollover limit.
  set_date = set_value(2, set_date, 1, 31);
  set_mnth = set_value(3, set_mnth, 1, 12);
  set_yr   = set_value(4, set_yr, 2013, 2099);
  set_hr   = set_value(1, set_hr, 0, 23);
  set_min  = set_value(0, set_min, 0, 59);

  ds3231.adjust(DateTime(set_yr, set_mnth, set_date, set_hr, set_min));
 
  cls();
}
//used to set min, hr, date, month, year values. pass
//message = which 'set' message to print,
//current value = current value of property we are setting
//reset_value = what to reset value to if to rolls over. E.g. mins roll from 60 to 0, months from 12 to 1
//rollover limit = when value rolls over
int set_value(byte message, int current_value, int reset_value, int rollover_limit) {

  cls();
  char messages[6][17]   = {
    "minuty", "hasy", "den", "mesqc", "god"};

  //Print "set xyz" top line
  byte i = 0;
  while(messages[message][i])
  {
    putnormalchar(i*4 , 1, messages[message][i]);
    i++;
  }

  delay(2000);
  cls();

  //print digits bottom line
  char buffer[5] = "    ";
  itoa(current_value,buffer,10);
  putnormalchar(0 , 1, buffer[0]);
  putnormalchar(4 , 1, buffer[1]);
  putnormalchar(8 , 1, buffer[2]);
  putnormalchar(12, 1, buffer[3]);

  delay(300);
  //wait for button input
  while (!buttonA.uniquePress()) {

    while (buttonB.isPressed()){

      if(current_value < rollover_limit) {
        current_value++;
      }
      else {
        current_value = reset_value;
      }
      //print the new value
      itoa(current_value, buffer ,10);
      putnormalchar(0 , 1, buffer[0]);
      putnormalchar(4 , 1, buffer[1]);
      putnormalchar(8 , 1, buffer[2]);
      putnormalchar(12, 1, buffer[3]);   
      delay(150);
    }
  }
  return current_value;
}
void get_time() {
  //get time
  DateTime now = ds3231.now();
  //save time to array
  rtc[6] = now.year();
  rtc[5] = now.month();
  rtc[4] = now.day();
  rtc[3] = now.dayOfTheWeek(); //returns 0-6 where 0 = Sunday
  rtc[2] = now.hour();
  rtc[1] = now.minute();
  rtc[0] = now.second();

  //flash arduino led on pin 13 every second
  //if ( (rtc[0] % 2) == 0) {
   // digitalWrite(13, HIGH);
  //}
  //else {
    //digitalWrite(13, LOW);
  //}

  //print the time to the serial port - useful for debuging RTC issues
  /*
  Serial.print(rtc[2]);
  Serial.print(":");
  Serial.print(rtc[1]);
  Serial.print(":");
  Serial.println(rtc[0]);
  */
}

 

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

от

MVN123P

Степлер
Offline
Зарегистрирован: 26.04.2016

Так он там вроде ничего не менял, а показал где именно меняется. Выложите ваш скетч с изменениями, посмотрим.

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

Степлер пишет:

Второй это какой?

от

MVN123P

Кстати скетч выложил, только что то,он подозрительно большой получился.... .... может вы по другому  скейчу работаете....?

Степлер
Offline
Зарегистрирован: 26.04.2016

Я просто не увидел в нем изменений в void plot

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

MVN123P пишет:

//размещение точек на дисплее
void plot (byte x, byte y, byte val) {
  //выбор матрицы в зависимости от координат х
  byte address;
  if (x >= 0 && x <= 7)   {             // при x >= 0 и x <= 7
    address = 0;                        // адрес матрицы 0
 //   y = 7 - y;                          // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
  }
  if (x >= 8 && x <= 15)  {             // при x >= 8 и x <= 15
    address = 1;                        // адрес матрицы 1
    x = x - 8;                          // координаты х пересчитываются по х - 8
  //  y = 7 - y;                          // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
  }
  if (x >= 16 && x <= 23) {             // при x >= 16 и x <= 23
    address = 2;                        // адрес матрицы 2
    x = x - 16;                         // координаты х пересчитываются по x - 16
//    y = 7 - y;                          // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
  }
  if (x >= 24 && x <= 31) {             // при x >= 24 и x <= 31
    address = 3;                        // адрес матрицы 3
    x = x - 24;                         // координаты х пересчитываются по x - 24
//    y = 7 - y;                          // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
  }
//зажигание и гашение точек
  if (val == 1) {                       // если точку надо зажечь
    lc.setLed(address, y, x, true);     // зажигание точки (для поворота обратно- поменять местами х и у
  } else {                              // если зажигать не надо
    lc.setLed(address, y, x, false);    // потушить точки (для поворота обратно- поменять местами х и у
  }
}

 

я токой же заливаю.... попробую еще вставить сой скейч...

 

 

 

 

// подключение модуля часов DS3231
// SCL pin -> Arduino A5
// SDA pin -> Arduino A4
// подключение LED Matrix
// DataIn pin -> Arduino 6
// CLK pin -> Arduino 5
// LOAD pin -> Arduino 4
// подключение DHT -> Arduino 9
// подключение DS18B20 -> Arduino 7
// подключение фоторезистора -> Arduino А0
//загрузка библиотек
#include // библиотека управления матрицами
#include // библиотека шрифтов
#include // библиотека шины I2C для модуля часов
#include // библиотека модуля часов
#include // библиотека для кнопок
#include // библиотека для датчика температуры и влажности DHT
#include // библиотека управления памятью EEPROM
#include // библиотека шины One Wire
#include
// настройки подключений
OneWire ds(7); // контакт подключения датчика температуры DS18B20
#define DS3231_I2C_ADDRESS 0x68 // адрес модуля часов на шине I2C
#define DHTPIN 9 // контакт подключения датчика DHT
#define DHTTYPE DHT22 // тип датчика DHT
DHT dht(DHTPIN, DHTTYPE); // инициализация датчика DHT
Adafruit_BMP085 bmp;
// настройка LED Matrix
const int numDevices = 4; // неизменная константа количества используемых MAX7219. Введена для упращения изменения количества используемых MAX7219.
LedControl lc = LedControl(6, 5, 4, numDevices); //настройки подключения используемых MAX7219.
//глобальные переменные
byte intensityDay = EEPROM.read(0); // яркость днем по умолчанию из EEPROM
byte intensityNight = EEPROM.read(1); // яркость ночью по умолчанию из EEPROM
byte intensity = 7; // яркость по умолчанию (0-15)
int brightness = EEPROM.read(2); // чувствительность датчика освещения
byte clock_mode = 0; // режим часов по умолчанию
byte old_mode = clock_mode; // запоминание предидущего режима часов для возвращения из режимов даты и т.д.
unsigned long delaytime = 500; // ожидание перед обновлением дисплея
unsigned long currentTime;
unsigned long loopTime;
int rtc[7]; // Holds real time clock output
int ldr = 0;
char daysfull[7][9] = {
"Voskr.", "Poned.", "Vtorn.", "Sreda", "Hetv.", "Pqtn.", "Subb."
};
//определение констант
#define NUM_DISPLAY_MODES 1 // Количество режимов отображения
#define NUM_SETTINGS_MODES 4 // Количество режимов настройки
#define SLIDE_DELAY 20 // Время в миллисекундах для слайд-эффекта на знак в режиме слайдов. Увеличить для более медленной анимации
#define cls clear_display // Очистка дисплея
RTC_DS3231 ds3231; // создание объекта RTC
Button buttonA = Button(2,BUTTON_PULLUP); // Настройка кнопки А (используется библиотека Button)
Button buttonB = Button(3,BUTTON_PULLUP); // Настройка кнопки В (используется библиотека Button)
void setup() {
// EEPROM.write(0, 8);
//EEPROM.write(1, 8);
digitalWrite(2, HIGH); // включение подтягивающего резистора для кнопки на пине 2
digitalWrite(3, HIGH); // включение подтягивающего резистора для кнопки на пине 3
Serial.begin(9600); //запуск передачи по 232
bmp.begin();
//инициализация панелей MAX7219
for (int address = 0; address < numDevices; address++) { //инициализация всех LCD на шлейфе
lc.shutdown(address, false); // MAX72XX в режиме экономии энергии при запуске
lc.setIntensity(address, intensity); // настройка яркости
lc.clearDisplay(address); //очистка дисплея
}
//Инициализация модуля часов
Wire.begin(); // запуск шины I2C
ds3231.begin(); // запуск RTC часов
// ds3231.adjust(DateTime(__DATE__, __TIME__)); // автоматическая установка времени и даты из компа
dht.begin(); //запуск DHT
// printver(); //Показать версию
}
void loop() {
//Запуск часов в режиме установленом в clock_mode
switch (clock_mode){
case 0: //номер режима
slide(); //название режима
break; //принудительное завершение режима
case 1: //номер режима
setup_menu(); //название режима
break; //принудительное завершение режима
}
}
//размещение точек на дисплее
void plot (byte x, byte y, byte val) {
//выбор матрицы в зависимости от координат х
byte address;
if (x >= 0 && x <= 7) { // при x >= 0 и x <= 7
address = 0; // адрес матрицы 0
// y = 7 - y; // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
}
if (x >= 8 && x <= 15) { // при x >= 8 и x <= 15
address = 1; // адрес матрицы 1
x = x - 8; // координаты х пересчитываются по х - 8
// y = 7 - y; // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
}
if (x >= 16 && x <= 23) { // при x >= 16 и x <= 23
address = 2; // адрес матрицы 2
x = x - 16; // координаты х пересчитываются по x - 16
// y = 7 - y; // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
}
if (x >= 24 && x <= 31) { // при x >= 24 и x <= 31
address = 3; // адрес матрицы 3
x = x - 24; // координаты х пересчитываются по x - 24
// y = 7 - y; // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
}
//зажигание и гашение точек
if (val == 1) { // если точку надо зажечь
lc.setLed(address, y, x, true); // зажигание точки (для поворота обратно- поменять местами х и у
} else { // если зажигать не надо
lc.setLed(address, y, x, false); // потушить точки (для поворота обратно- поменять местами х и у
}
}
//очистка дисплея
void clear_display() {
for (byte address = 0; address < 4; address++) { //для адресов с 0 до 3
lc.clearDisplay(address); //очистить дисплей
}
}
//затухание дисплея
void fade_down() {
//затухание от глобальной яркости до 1
for (byte i = intensity; i > 0; i--) { //для i= текущей интенсивности и больше 0 1 уменьшается на 1 при каждом проходе
for (byte address = 0; address < 4; address++) { //для адресов с 0 до 3
lc.setIntensity(address, i); //выставить яркость = i
}
delay(30); //ожидание 30 мс (можно регулировать скорость затухания)
}
clear_display(); //очистка дисплея
//сброс яркости до глобальной настройки
for (byte address = 0; address < 4; address++) { //для адресов с 0 до 3
lc.setIntensity(address, intensity); //выставить яркость из intensity
}
}
//тест точек при включении и приветственная надпись
/*void printver() {
byte i = 0; //i=0
char ver_a[9] = "1.0"; //переменная ver_a = "Vers 1.0"
// char ver_b[9] = " Hello! "; //переменная ver_b = " Hello! "
//тест всех точек
for (byte x = 0; x <= 31; x++) { //для координат х от 0 до 31 (с каждым проходом х+1)
for (byte y = 0; y <= 7; y++) { //для координат у от 0 до 7 (с каждым проходом у+1)
plot(x, y, 1); //зажечь точку с координатами х у
}
}
delay(500); //ожидание 500 мс
fade_down(); //запуск затемнения
while (ver_a[i]) { // пока i не достигнет 9
puttinychar((i * 4), 1, ver_a[i]); // запустить puttinychar с параметрарами: координаты х=i*4, у=1, текст из char ver_a
delay(35); // ожидание 35 мс
i++; // увеличить i на 1
}
delay(700); // ожидание 700 мс
fade_down(); //запуск затемнения
i = 0; // обнуление i
while (ver_b[i]) { //пока i не достигнет 9
puttinychar((i * 4), 1, ver_b[i]); // запустить puttinychar с параметрарами: координаты х=i*4, у=1, текст из char ver_b
delay(35); // ожидание 35 мс
i++; // увеличить i на 1
}
delay(700); // ожидание 700 мс
fade_down(); //запуск затемнения
}*/
// копирование символов размером 5х7 из массива myfont в память дисплея с началом координат в левом верхнем углу
// не оптимизировано и использует plot() для рисования каждой точки.
void putnormalchar(byte x, byte y, char c) {
byte dots;
if (c >= 'A' && c <= 'Z' ) { //если с от 'A' до 'Z'
c &= 0x1F; //то с = от 1 до 31
}
else if (c >= 'a' && c <= 'z') { //иначе если с от 'a' до 'z'
c = (c - 'a') + 42; //то с = от 41 до 67
}
else if (c >= '0' && c <= '9') { // иначе если с от '0' до '9'
c = (c - '0') + 32; // то с = с 32 до 42
}
else if (c == ' ') { //иначе если с=' '
c = 0; //то с=0
}
else if (c == '.') { //иначе если с='.'
c = 27; // то с=27
}
else if (c == '\'') { //иначе если с='\''
c = 28; //то с=28
}
else if (c == ':') { //иначе если с=':'
c = 29; //то с=29
}
else if (c == '>') { //иначе если с='>'
c = 30; // то с=30
}
else if (c >= -80 && c <= -68) { //иначе если с >= -80 и <= -67
c *= -1; //с=с*(-1)
}
else if (c == '-') { //иначе если с='%'
c = 31; // то с=30
}
for (char col = 0; col < 5; col++) { //для col от 0 до 4
dots = pgm_read_byte_near(&myfont[c][col]); //точки взять из массива myfont по адресу строки с с col
for (char row = 0; row < 7; row++) { // для строк от 0 до 6
//check coords are on screen before trying to plot
//if ((x >= 0) && (x <= 31) && (y >= 0) && (y <= 7)){
if (dots & (64 >> row)) { //если точки и 64 >>row
plot(x + col, y + row, 1); //нарисовать точки с координатами х+col и у+row
} else { //иначе
plot(x + col, y + row, 0); //потушить точки с координатами х+col и у+row
}
}
}
}
void slide() {

byte digits_old[4] = {99, 99, 99, 99}; //запоминание старых цифр времени
byte digits_new[4]; //создание переменной для новых цифр времени
byte digits_x_pos[4] = {25, 19, 7, 1}; //создание переменной для координат x pos для каждой цифры
char old_char[2]; //используется когда используется itoa для перевода текущей цифры (type byte) в символ для передачи в функцию анимации
char new_char[2]; //используется когда используется itoa для перевода новой цифры (type byte) в символ для передачи в функцию анимации
//old_chars - stores the 5 day and date suffix chars on the display. e.g. "mon" and "st". We feed these into the slide animation as the current char when these chars are updated.
//We sent them as A initially, which are used when the clocl enters the mode and no last chars are stored.
//char old_chars[6] = "AAAAA";
currentTime = millis(); // считываем время, прошедшее с момента запуска программы
loopTime = currentTime;
if (analogRead(ldr) < brightness*100){
intensity = intensityNight;
}
else{
intensity = intensityDay;
}//
for (int address = 0; address < numDevices; address++) { //инициализация всех LCD на шлейфе
lc.setIntensity(address, intensity);
}// настройка яркости
cls(); //очистка дисплея
putnormalchar( 13, 0, ':'); //размещение символа ':' с координатами х=13 у=0
byte old_secs = rtc[0]; //запоминаем секунды из модуля часов в old_secs
while (run_mode()) { //выполнять до изменения run_mode
get_time(); //получить данные из модуля часов
if (buttonA.uniquePress()) { //Если нажата кнопка А
setup_menu(); //Перейти в режим setup_menu
return; //прекращение выполнения switch_mode и возврат
}
if (buttonB.uniquePress()) { //Если нажата кнопка В
display_date(); //Перейти в режим display_date
return; //прекращение выполнения display_date и возврат
}
if (rtc[0] != old_secs) { //если секунды из модуля часов не равны секундам в old_secs
old_secs = rtc[0]; //присвоить old_secs секунды из модуля часов
byte hours = rtc[2]; //присвоить hours значение часов из модуля часов
// if (hours > 12) { //если hours меньше 12
// hours = hours - ampm * 12;
// }
// if (hours < 1) {
// hours = hours + ampm * 12;
// }
//разделение всех знаков времени и даты на отдельные цифры в digits_new массив
//rtc[0] = secs //array pos and digit stored
//digits_new[0] = (rtc[0]%10); //0 - secs ones
//digits_new[1] = ((rtc[0]/10)%10); //1 - secs tens
//rtc[1] = mins
digits_new[0] = (rtc[1] % 10); //2 - mins ones
digits_new[1] = ((rtc[1] / 10) % 10); //3 - mins tens
//rtc[2] = hours
digits_new[2] = (hours % 10); //4 - hour ones
digits_new[3] = ((hours / 10) % 10); //5 - hour tens
//rtc[4] = date
//digits_new[6] = (rtc[4]%10); //6 - date ones
//digits_new[7] = ((rtc[4]/10)%10); //7 - date tens
//сравнение цифр 0-3 (минут и часов)
for (byte i = 0; i <= 3; i++) { //для i от 0 до 3
if (digits_old[i] != digits_new[i]) { //если digits_old не равно digits_new
for (byte seq = 0; seq <= 8 ; seq++) {//для seq от 0 до 8
itoa(digits_old[i], old_char, 10); //преобразование digits_old в значение old_char в 10-ричном формате
itoa(digits_new[i], new_char, 10); //преобразование digits_new в значение new_char в 10-ричном формате
// if (ampm && i == 3) { //если включен режим ampm и i=3
// if (digits_new[3] == 0) { //если новые десятки часов=0
// new_char[0] = ' '; //символ новых десятков часов заменить на ' '
// }
// if (digits_old[3] == 0) { //если старые десятки часов=0
// old_char[0] = ' '; //символ старых десятков часов заменить на ' '
// }
// }
slideanim(digits_x_pos[i], 0, seq, old_char[0], new_char[0]); //запуск анимации
delay(SLIDE_DELAY); //ожидание из SLIDE_DELAY
}
}
}

/*
//compare date digit 6 (ones) and (7) tens - if either of these change we need to update the date line. We compare date tens as say from Jan 31 -> Feb 01 then ones digit doesn't change
if ((digits_old[6] != digits_new[6]) || (digits_old[7] != digits_new[7])) {
//change the day shown. Loop below goes through each of the 3 chars in turn e.g. "MON"
for (byte day_char = 0; day_char <=2 ; day_char++){
//run the anim sequence for each char
for (byte seq = 0; seq <=8 ; seq++){
//the day (0 - 6) Read this number into the days char array. the seconds number in the array 0-2 gets the 3 chars of the day name, e.g. m o n
slideanim(6*day_char,8,seq,old_chars[day_char],days[rtc[3]][day_char]); //6 x day_char gives us the x pos for the char
delay(SLIDE_DELAY);
}
//save the old day chars into the old_chars array at array pos 0-2. We use this next time we change the day and feed it to the animation as the current char. The updated char is fed in as the new char.
old_chars[day_char] = days[rtc[3]][day_char];
}

//change the date tens digit (if needed) and ones digit. (the date ones digit wil alwaus change, but putting this in the 'if' loop makes it a bit neater code wise.)
for (byte i = 7; i >= 6; i--){
if (digits_old[i] != digits_new[i]) {
for (byte seq = 0; seq <=8 ; seq++){
itoa(digits_old[i],old_char,10);
itoa(digits_new[i],new_char,10);
slideanim(digits_x_pos[i],8,seq,old_char[0],new_char[0]);
delay(SLIDE_DELAY);
}
}
}

//print the day suffix "nd" "rd" "th" etc. First work out date 2 letter suffix - eg st, nd, rd, th
byte s = 3; //the pos to read our suffix array from.
byte date = rtc[4];
if(date == 1 || date == 21 || date == 31) {
s = 0;
}
else if (date == 2 || date == 22) {
s = 1;
}
else if (date == 3 || date == 23) {
s = 2;
}

for (byte suffix_char = 0; suffix_char <=1 ; suffix_char++){
for (byte seq = 0; seq <=8 ; seq++){
slideanim((suffix_char*6)+36,8,seq,old_chars[suffix_char+3],suffix[s][suffix_char]); // we pass in the old_char array char as the current char and the suffix array as the new char
delay(SLIDE_DELAY);
}
//save the suffic char in the old chars array at array pos 3 and 5. We use these chars next time we change the suffix and feed it to the animation as the current char. The updated char is fed in as the new char.
old_chars[suffix_char+3] = suffix[s][suffix_char];
}
}//end do date line
*/

//сохранение цифр
for (byte i = 0; i <= 3; i++) { //для i от 0 до 3
digits_old[i] = digits_new[i]; //присвоить digits_old значение digits_new
}
}//secs/oldsecs
currentTime = millis(); // считываем время, прошедшее с момента запуска программы
if(currentTime >= (loopTime + 10000)){ // сравниваем текущий таймер с переменной loopTime + 1 секунда
fade_down();
cls();
display_date();
display_temp();
return;
loopTime = currentTime; // в loopTime записываем новое значение
}
}//while loop
// fade_down(); //затухание экрана
}
//отрисовка анимации смены символа. всего 8 шагов анимации в функции от 0 до 7
//вводные данные координат х и у, последовательность кадров sequence и текущие и новые символы
void slideanim(byte x, byte y, byte sequence, char current_c, char new_c) {
// To slide one char off and another on we need 9 steps or frames in sequence...
// seq# 0123456 <-строки дисплея
// | |||||||
// seq0 0123456 START - все строки дисплея 0-6 отображают текущие строки 0-6
// seq1 012345 текущий символ смещается вниз на одну строку. мы видим только строки 0-5, они размещены на строках 1-6. сверху добавляется пустая строка
// seq2 6 01234 текущий символ смещается вниз на две строки. мы видим только строки 0-4, они размещены на строках 2-6. строка 1 дисплея пустаяс, строка 0 показывает строку 6 нового символа.
// seq3 56 0123
// seq4 456 012 половина старого символа, половина нового
// seq5 3456 01
// seq6 23456 0
// seq7 123456
// seq8 0123456 END - все строки показывают новый символ

//from above we can see...
//currentchar runs 0-6 then 0-5 then 0-4 all the way to 0. starting Y position increases by 1 row each time.
//new char runs 6 then 5-6 then 4-6 then 3-6. starting Y position increases by 1 row each time.

//if sequence number is below 7, we need to draw the current char
if (sequence < 7) {
byte dots;
// if (current_c >= 'A' && || (current_c >= 'a' && current_c <= 'z') ) {
// current_c &= 0x1F; // A-Z maps to 1-26
// }
if (current_c >= 'A' && current_c <= 'Z' ) {
current_c &= 0x1F; // A-Z maps to 1-26
}
else if (current_c >= 'a' && current_c <= 'z') {
current_c = (current_c - 'a') + 42; // A-Z maps to 41-67
}
else if (current_c >= '0' && current_c <= '9') {
current_c = (current_c - '0') + 32;
}
else if (current_c == ' ') {
current_c = 0; // space
}
else if (current_c == '.') {
current_c = 27; // full stop
}
else if (current_c == '\'') {
current_c = 28; // single quote mark
}
else if (current_c == ':') {
current_c = 29; //colon
}
else if (current_c == '>') {
current_c = 30; // clock_mode selector arrow
}

byte curr_char_row_max = 7 - sequence; //the maximum number of rows to draw is 6 - sequence number
byte start_y = sequence; //y position to start at - is same as sequence number. We inc this each loop

//plot each row up to row maximum (calculated from sequence number)
for (byte curr_char_row = 0; curr_char_row <= curr_char_row_max; curr_char_row++) {
for (byte col = 0; col < 5; col++) {
dots = pgm_read_byte_near(&myfont[current_c][col]);
if (dots & (64 >> curr_char_row))
plot(x + col, y + start_y, 1); //plot led on
else
plot(x + col, y + start_y, 0); //else plot led off
}
start_y++;//add one to y so we draw next row one down
}
}

//draw a blank line between the characters if sequence is between 1 and 7. If we don't do this we get the remnants of the current chars last position left on the display
if (sequence >= 1 && sequence <= 8) {
for (byte col = 0; col < 5; col++) {
plot(x + col, y + (sequence - 1), 0); //the y position to draw the line is equivalent to the sequence number - 1
}
}

//if sequence is above 2, we also need to start drawing the new char
if (sequence >= 2) {

//work out char
byte dots;
//if (new_c >= 'A' && new_c <= 'Z' || (new_c >= 'a' && new_c <= 'z') ) {
// new_c &= 0x1F; // A-Z maps to 1-26
//}
if (new_c >= 'A' && new_c <= 'Z' ) {
new_c &= 0x1F; // A-Z maps to 1-26
}
else if (new_c >= 'a' && new_c <= 'z') {
new_c = (new_c - 'a') + 42; // A-Z maps to 41-67
}
else if (new_c >= '0' && new_c <= '9') {
new_c = (new_c - '0') + 32;
}
else if (new_c == ' ') {
new_c = 0; // space
}
else if (new_c == '.') {
new_c = 27; // full stop
}
else if (new_c == '\'') {
new_c = 28; // single quote mark
}
else if (new_c == ':') {
new_c = 29; // clock_mode selector arrow
}
else if (new_c == '>') {
new_c = 30; // clock_mode selector arrow
}

byte newcharrowmin = 6 - (sequence - 2); //minimumm row num to draw for new char - this generates an output of 6 to 0 when fed sequence numbers 2-8. This is the minimum row to draw for the new char
byte start_y = 0; //y position to start at - is same as sequence number. we inc it each row

//plot each row up from row minimum (calculated by sequence number) up to 6
for (byte newcharrow = newcharrowmin; newcharrow <= 6; newcharrow++) {
for (byte col = 0; col < 5; col++) {
dots = pgm_read_byte_near(&myfont[new_c][col]);
if (dots & (64 >> newcharrow))
plot(x + col, y + start_y, 1); //plot led on
else
plot(x + col, y + start_y, 0); //else plot led off
}
start_y++;//add one to y so we draw next row one down
}
}
}
//display_date - print the day of week, date and month with a flashing cursor effect
void display_date() {
cls();
//read the date from the DS3231

byte dow = rtc[3]; // day of week 0 = Sunday
byte date = rtc[4];
byte month = rtc[5] - 1;

//array of month names to print on the display. Some are shortened as we only have 8 characters across to play with
char monthnames[12][6] = {
"Jan.", "Fev.", "Marta", "Apr.", "May", "Ijnq", "Ijlq", "Avg.", "Sent.", "Okt.", "Noqb.", "Dek."
};

//print the day name

//get length of text in pixels, that way we can centre it on the display by divindin the remaining pixels b2 and using that as an offset
byte len = 0;
while(daysfull[dow][len]) {
len++;
};
byte offset = (31 - ((len-1)*6)) / 2; //our offset to centre up the text

//print the name
int i = 0;
while(daysfull[dow][i])
{
putnormalchar((i*6) + offset , 0, daysfull[dow][i]);
i++;
}
delay(1000);
fade_down();
cls();

// print date numerals
String str_date;
if (date < 10){str_date+="0";}
str_date+=date;
//str_date+="-";
// if (month < 10){str_date+="0";}
//str_date+=month;

i = 0;
while(str_date[i])
{
putnormalchar((i*6+10), 0, str_date[i]);
delay(40);
i++;
}

delay(1000);
fade_down();

//print the month name

//get length of text in pixels, that way we can centre it on the display by divindin the remaining pixels b2 and using that as an offset
len = 0;
while(monthnames[month][len]) {
len++;
};
offset = (31 - ((len-1)*6)) / 2; //our offset to centre up the text
i = 0;
while(monthnames[month][i])
{
putnormalchar((i*6) +offset, 0, monthnames[month][i]);
i++;
}

delay(1000);
fade_down();
cls();
// display_temp();
}
void display_temp() {
//Wire.beginTransmission(0x68);
//Wire.write(0x11);
//Wire.endTransmission();
//Wire.requestFrom(0x68, 2);
//float t= (Wire.read()<<2 | Wire.read()>>6)*0.25;
//Serial.println(temp);
// int t= Wire.read ();

cls();
int t = dht.readTemperature();
int h = dht.readHumidity();
int p = bmp.readPressure()/133.3;
char ver_c[9] = "Doma";
char ver_d[9] = "Ulica";
char ver_e[9] = "Davlen.";
t = dht.readTemperature();
h = dht.readHumidity();
p = bmp.readPressure()/133.3;
String str_temp = "";
String str_humi = "";
String str_pres = "";
//str_temp += "T:";
str_temp += String(t);
str_temp += "'S";
str_humi += "N:";
str_humi += String(h);
str_humi += ">";
str_pres += String(p);
str_pres += "mm.";

byte i = 0;
// Serial.println (h);
while (ver_c[i]) { // пока i не достигнет 9
putnormalchar((i * 6)+5, 0, ver_c[i]); // запустить putnormalchar с параметрарами: координаты х=i*4, у=1, текст из char ver_a
delay(35); // ожидание 35 мс
i++; // увеличить i на 1
}
delay(700); // ожидание 700 мс
fade_down(); //запуск затемнения
i = 0; // обнуление i
byte len = 0;
while(str_temp[len]) {
len++;
};
byte offset = (31 - ((len-1)*7)) / 2; //our offset to centre up the text
while (str_temp[i]) {
putnormalchar((i*6)+offset, 0, str_temp[i]);
delay(40);
i++;
}
delay(1500);
fade_down();
cls();
i = 0;
while (str_humi[i]) {
putnormalchar((i*6+1), 0, str_humi[i]);
delay(40);
i++;
}
delay(1500);
fade_down();
cls();
//read the Temp from the DS18B20
byte data[2];
ds.reset();
ds.write(0xCC);
ds.write(0x44);
delay(75);
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
data[0] = ds.read();
data[1] = ds.read();
int Temp = (data[1]<< 8)+data[0];
Temp = Temp>>4;
//Temp = - 25;
String str_temp2 = "";
//str_temp2 += "T:";
str_temp2 += String(Temp);
str_temp2 += "'S";
i = 0;
//print temp from DS18B20
while (ver_d[i]) { //пока i не достигнет 9
putnormalchar((i * 6)+2, 0, ver_d[i]); // запустить putnormalchar с параметрарами: координаты х=i*4, у=1, текст из char ver_d
delay(35); // ожидание 35 мс
i++; // увеличить i на 1
}
delay(700); // ожидание 700 мс
fade_down();
i = 0;
byte len2 = 0;
while(str_temp2[len2]) {
len2++;
};
byte offset2 = (31 - ((len2-1)*7)) / 2; //our offset to centre up the text
while (str_temp2[i]) {
putnormalchar((i*6)+offset2, 0, str_temp2[i]);
delay(40);
i++;
}
delay(1500);
fade_down();
cls();
i = 0;
while (ver_e[i]) { //пока i не достигнет 9
putnormalchar((i * 6)+1, 0, ver_e[i]); // запустить putnormalchar с параметрарами: координаты х=i*4, у=1, текст из char ver_d
delay(35); // ожидание 35 мс
i++; // увеличить i на 1
}
delay(7000); // ожидание 700 мс
fade_down();
i = 0;
byte len3 = 0;
while(str_pres[len3]) {
len3++;
};
byte offset3 = (31 - ((len3-1)*7)) / 2; //our offset to centre up the text
while (str_pres[i]) {
putnormalchar((i*6)+1, 0, str_pres[i]);
delay(40);
i++;
}
delay(1500);
fade_down();
cls();
i = 0;
}
//run clock main loop as long as run_mode returns true
byte run_mode() {
/*
//if random mode is on... check the hour when we change mode.
if (random_mode) {
//if hour value in change mode time = hours. then reurn false = i.e. exit mode.
if (change_mode_time == rtc[2]) {
//set the next random clock mode and time to change it
set_next_random();
//exit the current mode.
return 0;
}
}*/
//else return 1 - keep running in this mode
return 1;
}
//dislpay menu to change the clock settings
void setup_menu() {

char* set_modes[] = {
"Korrek.", "Qr Dnem", "Qr nohz", "Huvst","Vyxod"};
/*if (ampm == 0) {
set_modes[1] = ("12 Hr");
}*/

byte setting_mode = 0;
byte next_setting_mode;
byte firstrun = 1;

//loop waiting for button (timeout after 35 loops to return to mode X)
for(int count=0; count < 35 ; count++) {

//if user hits button, change the clock_mode
if(buttonA.uniquePress() || firstrun == 1){

count = 0;
cls();

if (firstrun == 0) {
setting_mode++;
}
if (setting_mode > NUM_SETTINGS_MODES) {
setting_mode = 0;
}

//print arrown and current clock_mode name on line one and print next clock_mode name on line two
char str_top[9];

strcpy (str_top, set_modes[setting_mode]);

next_setting_mode = setting_mode + 1;
if (next_setting_mode > NUM_SETTINGS_MODES) {
next_setting_mode = 0;
}

byte i = 0;
while(str_top[i]) {
putnormalchar(i*6, 0, str_top[i]);
i++;
}

firstrun = 0;
}
delay(50);
}

//pick the mode
switch(setting_mode){
/* case 0:
set_random();
break;
case 1:
set_ampm();
break;*/
case 0:
set_time();
break;
case 1:
set_intensityDay();
break;
case 2:
set_intensityNight();
break;
case 3:
set_brightness();
break;
case 4:
//exit menu
break;
}

//change the clock from mode 6 (settings) back to the one it was in before
clock_mode=old_mode;
}
//change screen intensityintensity
void set_intensityDay() {

cls();

byte i = 0;
char text[14] = "qr dnem";
while(text[i]) {
putnormalchar((i*6), 0-2, text[i]);
i++;
}

//wait for button input
while (!buttonA.uniquePress()) {

levelbar (0,6,(intensityDay*2)+2,2); //display the intensity level as a bar
while (buttonB.isPressed()) {

if(intensityDay == 15) {
intensityDay = 0;
cls ();
}
else {
intensityDay++;
}
//print the new value
i = 0;
while(text[i]) {
putnormalchar((i*6), 0-2, text[i]);
i++;
}

//display the intensity level as a bar
levelbar (0,6,(intensityDay*2)+2,2);

//change the brightness setting on the displays
for (byte address = 0; address < 4; address++) {
lc.setIntensity(address, intensityDay);
}
delay(150);
}
}
EEPROM.write(0, intensityDay);
}
void set_intensityNight() {

cls();

byte i = 0;
char text[14] = "qr nohz";
while(text[i]) {
putnormalchar((i*6), 0-2, text[i]);
i++;
}

//wait for button input
while (!buttonA.uniquePress()) {

levelbar (0,6,(intensityNight*2)+2,2); //display the intensity level as a bar
while (buttonB.isPressed()) {

if(intensityNight == 15) {
intensityNight = 0;
cls ();
}
else {
intensityNight++;
}
//print the new value
i = 0;
while(text[i]) {
putnormalchar((i*6), 0-2, text[i]);
i++;
}

//display the intensity level as a bar
levelbar (0,6,(intensityNight*2)+2,2);

//change the brightness setting on the displays
for (byte address = 0; address < 4; address++) {
lc.setIntensity(address, intensityNight);
}
delay(150);
}
}
EEPROM.write(1, intensityNight);
}
void set_brightness() {

cls();

byte i = 0;
char text[14] = "huvst";
while(text[i]) {
putnormalchar((i*6), 0-2, text[i]);
i++;
}

//wait for button input
while (!buttonA.uniquePress()) {

levelbar (0,6,(brightness*2)+2,2); //display the intensity level as a bar
while (buttonB.isPressed()) {

if(brightness == 15) {
brightness = 0;
cls ();
}
else {
brightness = brightness+1;
}
//print the new value
i = 0;
while(text[i]) {
putnormalchar((i*6), 0-2, text[i]);
i++;
}

//display the intensity level as a bar
levelbar (0,6,(brightness*2)+2,2);

//change the brightness setting on the displays
if (analogRead(ldr) < brightness*100){
intensity = intensityNight;
}
else{
intensity = intensityDay;
}//
for (int address = 0; address < numDevices; address++) { //инициализация всех LCD на шлейфе
lc.setIntensity(address, intensity);
}// настройка яркости
// for (byte address = 0; address < 4; address++) {
// lc.setIntensity(address, intensityDay);
// }
delay(150);
// Serial.println (brightness);
}
}
EEPROM.write(2, brightness);
}
// display a horizontal bar on the screen at offset xposr by ypos with height and width of xbar, ybar
void levelbar (byte xpos, byte ypos, byte xbar, byte ybar) {
for (byte x = 0; x < xbar; x++) {
for (byte y = 0; y <= ybar; y++) {
plot(x+xpos, y+ypos, 1);
}
}
}
//set time and date routine
void set_time() {

cls();

//fill settings with current clock values read from clock
get_time();
byte set_min = rtc[1];
byte set_hr = rtc[2];
byte set_date = rtc[4];
byte set_mnth = rtc[5];
int set_yr = rtc[6];

//Set function - we pass in: which 'set' message to show at top, current value, reset value, and rollover limit.
set_date = set_value(2, set_date, 1, 31);
set_mnth = set_value(3, set_mnth, 1, 12);
set_yr = set_value(4, set_yr, 2013, 2099);
set_hr = set_value(1, set_hr, 0, 23);
set_min = set_value(0, set_min, 0, 59);

ds3231.adjust(DateTime(set_yr, set_mnth, set_date, set_hr, set_min));

cls();
}
//used to set min, hr, date, month, year values. pass
//message = which 'set' message to print,
//current value = current value of property we are setting
//reset_value = what to reset value to if to rolls over. E.g. mins roll from 60 to 0, months from 12 to 1
//rollover limit = when value rolls over
int set_value(byte message, int current_value, int reset_value, int rollover_limit) {

cls();
char messages[6][17] = {
"minuty", "hasy", "den", "mesqc", "god"};

//Print "set xyz" top line
byte i = 0;
while(messages[message][i])
{
putnormalchar(i*4 , 1, messages[message][i]);
i++;
}

delay(2000);
cls();

//print digits bottom line
char buffer[5] = " ";
itoa(current_value,buffer,10);
putnormalchar(0 , 1, buffer[0]);
putnormalchar(4 , 1, buffer[1]);
putnormalchar(8 , 1, buffer[2]);
putnormalchar(12, 1, buffer[3]);

delay(300);
//wait for button input
while (!buttonA.uniquePress()) {

while (buttonB.isPressed()){

if(current_value < rollover_limit) {
current_value++;
}
else {
current_value = reset_value;
}
//print the new value
itoa(current_value, buffer ,10);
putnormalchar(0 , 1, buffer[0]);
putnormalchar(4 , 1, buffer[1]);
putnormalchar(8 , 1, buffer[2]);
putnormalchar(12, 1, buffer[3]);
delay(150);
}
}
return current_value;
}
void get_time() {
//get time
DateTime now = ds3231.now();
//save time to array
rtc[6] = now.year();
rtc[5] = now.month();
rtc[4] = now.day();
rtc[3] = now.dayOfTheWeek(); //returns 0-6 where 0 = Sunday
rtc[2] = now.hour();
rtc[1] = now.minute();
rtc[0] = now.second();

//flash arduino led on pin 13 every second
//if ( (rtc[0] % 2) == 0) {
// digitalWrite(13, HIGH);
//}
//else {
//digitalWrite(13, LOW);
//}

//print the time to the serial port - useful for debuging RTC issues
/*
Serial.print(rtc[2]);
Serial.print(":");
Serial.print(rtc[1]);
Serial.print(":");
Serial.println(rtc[0]);
*/
}

Степлер
Offline
Зарегистрирован: 26.04.2016
void plot (byte x, byte y, byte val) {
//выбор матрицы в зависимости от координат х
byte address;
if (x >= 0 && x <= 7) { // при x >= 0 и x <= 7
address = 0; // адрес матрицы 0
// y = 7 - y; // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
}
if (x >= 8 && x <= 15) { // при x >= 8 и x <= 15
address = 1; // адрес матрицы 1
x = x - 8; // координаты х пересчитываются по х - 8
// y = 7 - y; // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
}
if (x >= 16 && x <= 23) { // при x >= 16 и x <= 23
address = 2; // адрес матрицы 2
x = x - 16; // координаты х пересчитываются по x - 16
// y = 7 - y; // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
}
if (x >= 24 && x <= 31) { // при x >= 24 и x <= 31
address = 3; // адрес матрицы 3
x = x - 24; // координаты х пересчитываются по x - 24
// y = 7 - y; // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
}

У Вас должна иметь вид

void plot (byte x, byte y, byte val) {
//выбор матрицы в зависимости от координат х
byte address;
if (x >= 0 && x <= 7) { // при x >= 0 и x <= 7
address = 3; // адрес матрицы 0
// y = 7 - y; // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
}
if (x >= 8 && x <= 15) { // при x >= 8 и x <= 15
address = 2; // адрес матрицы 1
x = x - 8; // координаты х пересчитываются по х - 8
// y = 7 - y; // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
}
if (x >= 16 && x <= 23) { // при x >= 16 и x <= 23
address = 1; // адрес матрицы 2
x = x - 16; // координаты х пересчитываются по x - 16
// y = 7 - y; // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
}
if (x >= 24 && x <= 31) { // при x >= 24 и x <= 31
address = 0; // адрес матрицы 3
x = x - 24; // координаты х пересчитываются по x - 24
// y = 7 - y; // координаты у пересчитываются по 7 - y для поворота на 90 градусов по часовой
}

 

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

Если я правильно понял... Вы рекомендуете поменять адреса матриц.... не помогает... по прежнему нечитаемо отображает.... я фото показывал....

Может UNO пришел ППЦ...? как бы ее проверить...?

Степлер
Offline
Зарегистрирован: 26.04.2016

Сделайте фотку сословами, что бы понять куда что двигать.

MVN123P
Offline
Зарегистрирован: 29.07.2016

У меня сначало тоже непонятки были с текстом, но аказалось что библиотека не пресоеденилась. Почемуто в названии файла библиотеки не понравились знаки "тире" заменил их на "подчеркивание" и все получилось.

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

У меня есть сомнения, что RTC не "заводится"..... т.к. библиотеку заливаю.... в мониторе порта  тишина.... можно как то через монитор порта отседить работу этой библиотке.... а фото фрагмента скетча сделаю чуть позже.... С уважением....

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

Нашел  рабочий скейтч.... только по части координат матрицы не пойму.... маленько по-другому сделано.... и скейтч заточен под DS1307... но и с DS3231 нормально работает...  .

https://yadi.sk/d/D2wTIKTH3ErRpc

Степлер
Offline
Зарегистрирован: 26.04.2016

Так это и есть мой скетч на 4 матрицы. Что же Вы до этого заливали?

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

https://yadi.sk/d/cZoQcurB3EscNU вот с этим экспериментировал... а трудно сделать на вашем скейтче еще и будильник... на UM66, чтоб громкость сигнала была нарастающей... потому что утром уже ждешь будильника, т.к. поивык...а громкий сигнал самого пугае  и другим спать не дает.... а так услышал в "тихую"... и вперед..... понеслась "жара"...и чтоб если нет внешнего питания, часы питадись от 18650 без индикации, но чтоб сигнал бвдильника сохранялся.... а то без "света" можно и на работу опаздать...

Степлер
Offline
Зарегистрирован: 26.04.2016

Ну вы заливали для 6 матриц, а там папочка есть для 4, в ней как раз тот на котором у Вас все заработало. Будильник делать не буду, т.к. проект уже уехал на дачу. Но все в Ваших руках, дерзайте, сделать его не сложно.

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

Вариантов конечно у меня не много.... хочешь делай, хочешь нет.... буду пробовать.... скорей всего через FLProg ... видел нечто похожее.. что интересно, на элементах мультиплексора.... если получится покажу.. пока для меня все сложно... т.к. иногда приходится долго догадываться до самых элементарных вещах... могу ли я на вас расчитывать в случае, если будет совсем трудно, и буду тупике..?

Степлер
Offline
Зарегистрирован: 26.04.2016

ЗАчем там мультиплексор?

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

там его натурально, "железякой" нет... просто например, входы помечены как минуты, часы.. когда совпадение есть, происходит изменение на выходе.... я потом покажу...

Степлер
Offline
Зарегистрирован: 26.04.2016

так и в DS1307 и в DS3231 есть встроенный будильник, чего городить-то?

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

Есть ... конечно, целых два.... но как их "добыть.." вот вопрос.... и извините за то, что "котлеты рукой ем.." (шутка)... как из "монитор порта" вывести на индикацию показания и заставить их "бежать..." ? через Сириал порт .? и почему "железка" одна, а команды разные...? т.е. от библиотек зависит..? (может рассмешил.... как младенец...?...) но пока так....

Степлер
Offline
Зарегистрирован: 26.04.2016

Начните с простого. Возьмите любой будильник на ардуине (в сети их море например https://lesson.iarduino.ru/page/urok-19-rtc-chasy-s-budilnikom/) и посмотрите как реализована програмно часть кода отвечающая за пробуждение, дальше надо вживить это в скетч часов. Для этого придется добавить пункт в меню для выставления времени срабатывания будильника и в основной режим добавить контроль состояния. По монитору порта все еще проще, где-нибудь после 238 строки добавить что-то типа

Serial.print(now.hour(), DEC);

Serial.print(':');

Serial.print(now.minute(), DEC);

Serial.print(':');

Serial.print(now.second(), DEC);

Serial.println();

 

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

Спасибо... обязательно попробую...... (жаль, что на форуме нет возможности отправлять сообщения, лично...

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

Не могу скомпилировать скетч.Ошибка:

clock4:51: error: 'RTC_DS3231' does not name a type
 
 RTC_DS3231 ds3231;                              // создание объекта RTC
 
 ^
 
C:\Users\alexey\Desktop\clock1_0\clock4\clock4.ino: In function 'void setup()':
 
clock4:69: error: 'ds3231' was not declared in this scope
 
   ds3231.begin();                                 // запуск RTC часов
 
   ^
 
C:\Users\alexey\Desktop\clock1_0\clock4\clock4.ino: In function 'void set_time()':
 
clock4:944: error: 'ds3231' was not declared in this scope
 
   ds3231.adjust(DateTime(set_yr, set_mnth, set_date, set_hr, set_min));
 

Скетч и библиотеки скачивал от автора,отсюда  https://yadi.sk/d/Ie5zUhb2sr8jz

Arduino IDE 1.8.2

Подскажите как решить проблему!

Степлер
Offline
Зарегистрирован: 26.04.2016

Arduino IDE 1.8.2 все компилируется, только что проверил. Проверьте какую версию RTClib.h использует Arduino IDE , возможно у Вас их установлено несколько.

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

Степлер пишет:

 возможно у Вас их установлено несколько.

Точно! Удалил все,подключил Вашу,скетч скомпилировался. Но показывает вот что

Прочитал всю тему,пробовал менять часть кода,как Вы советовали для замены адреса матриц,ничего не помогает. Заинтересовало сообщение от MVN123P "Почемуто в названии файла библиотеки не понравились знаки "тире" заменил их на "подчеркивание" и все получилось." Про какую библиотеку он говорит? У меня нигде нет ни "тире" ни "подчеркиваний". Ещё я поменял строку с подключением матрицы на то ,как у меня подключено  " LedControl lc = LedControl(11,13,10, numDevices); //настройки подключения используемых MAX7219." 

P.S . Подскажите,можно-ли подключить нужную библиотеку,не удаляя , и не переименования других подобных?

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

Вот здесь неплоие часики Jeka запилил... http://flprog.ru/forum/20-1672-1 , и хоть в FLprog можно под себя модифицировать...

Степлер
Offline
Зарегистрирован: 26.04.2016

hatul косяк какой-то с координатами. Надо разбираться, но у меня уже нет матриц, что бы тестить.

 

putnik401 какое отношение это имеет к моему проекту?

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

Извиняюсь, конечно.... по сути вообще никакого.... ( Я тоже с недельку бился над тем, чтоб все нормально заработало, но тщетно..... не получилось у меня, но это и не удивительно.... т.к. желания одного мало, нужны знания и опыт... а может быть и просто в "комплекте" с скейчем нужны еще исходные библиотеки и версия ID... ,без ни трудно начинаещему, что то поправить в лучшую сторону... я стал копать FLProg, т.к. думаю, аналогично тому как, Винда вытеснила ДОС, так и FLProg или аналогичный интерфейс, вытеснит ID... хотя конечно я считаю, что эти вещи имеют право на жизнь и займут свою нишу, просто для профессионалов нужен АVС студио и ID, т.к позволяют добится целей на железе с меньшими ресурсами, а для новичков проще FLProg..  с его не рациональным и громозким кодом.... ) еще раз приношу извинения, что влез в вашу тему... прсто жалко новичка, который наступает на теже грабли, что и я....

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

Степлер пишет:

 косяк какой-то с координатами. 

А это примерно где в скетче? Здесь,после этой строки   void plot (byte x, byte y, byte val)   пробовать менять данные х,у ?

putnik401  Спасибо за наводку,попробую FLProg.