Ардуино часы

Lelik Lelikovich
Offline
Зарегистрирован: 24.01.2017

Ардуино часы

Состав:

- ардуино мега2560

- 4 матрицы 8х8

- 15 сдвиговых регистров 74CH585

- часовой модуль DS1307

- WIFI модуль ESP-01

- модуль давления и температуры BMP185

- 3 кнопки для управления

Основная концепция - имитация стрелочных часов и синхронизация времени через интернет (через NTP сервера)

видео работы часов https://www.youtube.com/watch?v=VV7ojKkGENk

синхронизация с NTP может производится как в автоматическом режиме в 2-30 либо в ручную по запросу, синхронизируются только минуты и секунды чтоб незапариваться с часовыми поясами.

скетч (неоптимизирован но работает нормально, также есть вывод тестовой отладочной информации на компорт)

может кому пригодится -

/*
 ЧАСЫ НА 4 МАТРИЦАХ 8х8
 подключение модулей к ардуино
 
 ***** пины подключения матрици *****
 pin 12 is connected to the DataIn 
 pin 10 is connected to the CLK 
 pin 11 is connected to CS 
 pin vin is connected to +
 pin gnd is connected to -
 pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
 ***** пины подключения кнопок *****
 pin 2 is connected +
 pin 3 is connected setting
 pin 4 is connected -
 pin is connected gnd
 pin is connected 5V
 ***** пины подключения DS1307 *****
 pin 20 is connected SDA
 pin 21 is connected SCL
 pin 5V is connected VCC
 pin gnd is connected GND
 ***** пины подключения BMP185 *****
 pin 20 is connected SDA
 pin 21 is connected SCL
 pin 3.3V is connected VCC
 pin gnd is connected GND
 ***** пины подключения WIFI *****
 pin 14 is connected TX(3)
 pin 15 is connected RX(3)
 pin 3.3V is connected VCC
 pin gnd is connected GND
 ***** пины подключения кругового дисплея *****  
const int DS =  19;    //DS – вход данных
const int ST_CP =  18; //ST_CP – вход «защёлкивающий» данные
const int SH_CP =  17; //SH_CP – вход для тактовых импульсов
const int MR =  16;    //MR – сброс регистра

 */
//пины кнопок
int pin1=2;
int pin2=3;
int pin3=4;
// режим для установки
int rconf=0;
unsigned long prMillis=0;
int tconf=20; //тайм аут выхода из настроек (секунд)
//состояния кнопок
boolean button1=false;
boolean button2=false;
boolean button3=false;
boolean lbutton1=false;
boolean lbutton2=false;
boolean lbutton3=false;
//задержка для антидребезга кнопок
int tad=5;
// яркость экранов
int ledd = 4;

// переменные для подпрограммы WIFI
byte mmin;
byte ssec;
byte sost;
// счетчик циклов попыток обновления времени
byte counta;
// счетчик попыток обновления
byte wifi_info;

// ***** пины подключения кругового дисплея *****  
const int DS =  19;    //DS – вход данных
const int ST_CP =  18; //ST_CP – вход «защёлкивающий» данные
const int SH_CP =  17; //SH_CP – вход для тактовых импульсов
const int MR =  16;    //MR – сброс регистра
int x = 0;  // переменная для инвертирования сдвиговых регистров
int ch = 0; // часы для кругового дисплея


//библиотеки для часов
#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68
///////////////////////////////////
#include "LedControl.h"
LedControl lc=LedControl(12,10,11,4);
// 4 - количество матриц
///////////////////////////////////
// библиотеки для давления, температуры
#include <Wire.h>
#include <Adafruit_BMP085.h>
Adafruit_BMP085 bmp;
///////////////////////////////////
// флаг для wifi 
int flag_wifi = 0;  // (фиксация обновления времени)
int flag_wifi_2 = 0;  // состояние обновления (для светодиодов)
////////////////////////////////////
// библиотека для работы с памятью
#include <EEPROM.h>

//            1                   2                   3                   4                   5                   6 
//   1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0
  boolean Arr_1[10][60]= { 
    {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},
    {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0},
    {0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
    {0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0},
    {0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0},
    {0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0},
    {1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0},
  }; 
 //            1                   2                   3                   4                   5                   6 
//   1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0
  boolean Arr_2[10][60]= {
    {0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1},
    {1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0},
    {0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0},
    {0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0},
    {0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0},
    {0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0},
    {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0},
    {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0},
    {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0},
  }; 
 //            1                   2                   3                   4                   5                   6 
//   1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0
  boolean Arr_3[10][15]= { 
    {1,0,0,0,1,0,0,0,1,0,0,1,0,0,1},
    {1,0,0,0,1,0,0,1,0,0,0,1,0,0,1},
    {0,1,0,0,1,0,0,1,0,0,1,0,0,0,1},
    {0,1,0,1,0,0,0,1,0,0,1,0,0,1,0},
    {0,0,1,1,0,0,1,0,0,0,1,0,0,1,0},
    {0,0,1,1,0,0,1,0,0,1,0,0,0,1,0},
    {1,1,1,0,0,0,1,0,0,1,0,0,1,0,0},
    {1,1,1,0,0,1,0,0,0,1,0,0,1,0,0},
    {0,0,0,0,0,1,0,0,1,0,0,0,1,0,0},
    {0,0,0,0,0,1,0,0,1,0,0,1,0,0,0},
  };    
int u = 0;
int i = 0;

//
// настройка === часы-минуты-секунды-год-месяц-день-день недели-яркость

void setup() {
  
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
Wire.begin();
// кнопки  
pinMode(pin1, INPUT);
pinMode(pin2, INPUT);
pinMode(pin3, INPUT);
// initialize both serial ports:
Serial.begin(9600);
Serial3.begin(115200);
// двоеточие
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
  /*
   MAX72XX - настройка подключенных матриц
   */
  //первый экран
  lc.shutdown(0,false);// выключить энергосбережение включает дисплей display
  lc.setIntensity(0,ledd);// Установка яркости (0 ~ 15 возможных значений)
  lc.clearDisplay(0);// очистка экрана
  //второй экран
  lc.shutdown(1,false);// выключить энергосбережение включает дисплей display
  lc.setIntensity(1,ledd);// Установка яркости (0 ~ 15 возможных значений)
  lc.clearDisplay(1);// очистка экрана
  //третий экран
  lc.shutdown(2,false);// выключить энергосбережение включает дисплей display
  lc.setIntensity(2,ledd);// Установка яркости (0 ~ 15 возможных значений)
  lc.clearDisplay(2);// очистка экрана
  //четвертый экран
  lc.shutdown(3,false);// выключить энергосбережение включает дисплей display
  lc.setIntensity(3,ledd);// Установка яркости (0 ~ 15 возможных значений)
  lc.clearDisplay(3);// очистка экрана
   /*
   MAX72XX - настройка подключенных матриц
   */
//  setDateDs1307(10, 33, 16, 5, 5, 4, 2016);
// иниацилизация датчика давления и температуры
bmp.begin();

  pinMode(SH_CP, OUTPUT);
  pinMode(ST_CP, OUTPUT);
  pinMode(MR, OUTPUT);
  pinMode(DS, OUTPUT); 
digitalWrite(SH_CP, LOW);
digitalWrite(DS, LOW);

//flag_wifi = EEPROM.read(0);

}

void loop() {
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

// сброс
digitalWrite(MR, LOW);
digitalWrite(ST_CP, HIGH);
digitalWrite(ST_CP, LOW);
digitalWrite(MR, HIGH);  
  
///////////////////////////////////// обработка нажатий кнопок - режим установки
if(digitalRead(pin2)) 
  { 
  delay(tad);
  if(digitalRead(pin2))
    {
      button2=true;      
      if(lbutton2 == false && button2 == true)
      {
        rconf++; 
        lbutton2=true;
        if(rconf > 9) rconf = 0;
        prMillis = millis();
      }
    }
  } else {
    button2=false; 
    if(lbutton2 == true && button2 == false)
    {
     lbutton2=false; 
    }
  }
//////////////////////////////////////////////////////

  switch(rconf)
  {
  case 1:
////////////////////////////////////////////////////// настройка часов +
    if(digitalRead(pin1)) 
      { 
      delay(tad);
      if(digitalRead(pin1))
        {
        button1=true;      
        if(lbutton1 == false && button1 == true)
          {
          getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
          if(hour == 23) { hour = 0; } else { hour++; }
          setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
          lbutton1=true;
          prMillis = millis();
          }
        }
      } else {
        button1=false; 
        if(lbutton1 == true && button1 == false)
          {
          lbutton1=false; 
          }
      }
////////////////////////////////////////////////////// настройка часов -
    if(digitalRead(pin3)) 
      { 
      delay(tad);
      if(digitalRead(pin3))
        {
        button3=true;      
        if(lbutton3 == false && button3 == true)
          {
          getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
          if(hour == 0) { hour = 23; } else { hour--; }
          setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
          lbutton3=true;
          prMillis = millis();
          }
        }
      } else {
        button3=false; 
        if(lbutton3 == true && button3 == false)
          {
          lbutton3=false; 
          }
      }
  break;

  case 2:
////////////////////////////////////////////////////// настройка минут +
    if(digitalRead(pin1)) 
      { 
      delay(tad);
      if(digitalRead(pin1))
        {
        button1=true;      
        if(lbutton1 == false && button1 == true)
          {
          getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
          if(minute == 59) { minute = 0; } else { minute++; }
          setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
          lbutton1=true;
          prMillis = millis();
          }
        }
      } else {
        button1=false; 
        if(lbutton1 == true && button1 == false)
          {
          lbutton1=false; 
          }
      }
////////////////////////////////////////////////////// настройка минут -
    if(digitalRead(pin3)) 
      { 
      delay(tad);
      if(digitalRead(pin3))
        {
        button3=true;      
        if(lbutton3 == false && button3 == true)
          {
          getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
          if(minute == 0) { minute = 59; } else { minute--; }
          setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
          lbutton3=true;
          prMillis = millis();
          }
        }
      } else {
        button3=false; 
        if(lbutton3 == true && button3 == false)
          {
          lbutton3=false; 
          }
      }
  break;

  case 3:
////////////////////////////////////////////////////// настройка секунд +
    if(digitalRead(pin1)) 
      { 
      delay(tad);
      if(digitalRead(pin1))
        {
        button1=true;      
        if(lbutton1 == false && button1 == true)
          {
          getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
          if(second == 59) { second = 0; } else { second++; }
          setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
          lbutton1=true;
          prMillis = millis();
          }
        }
      } else {
        button1=false; 
        if(lbutton1 == true && button1 == false)
          {
          lbutton1=false; 
          }
      }
////////////////////////////////////////////////////// настройка секунд -
    if(digitalRead(pin3)) 
      { 
      delay(tad);
      if(digitalRead(pin3))
        {
        button3=true;      
        if(lbutton3 == false && button3 == true)
          {
          getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
          if(second == 0) { second = 59; } else { second--; }
          setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
          lbutton3=true;
          prMillis = millis();
          }
        }
      } else {
        button3=false; 
        if(lbutton3 == true && button3 == false)
          {
          lbutton3=false; 
          }
      }
  break;

  case 4:
////////////////////////////////////////////////////// настройка года +
    if(digitalRead(pin1)) 
      { 
      delay(tad);
      if(digitalRead(pin1))
        {
        button1=true;      
        if(lbutton1 == false && button1 == true)
          {
          getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
          if(year == 99) { year = 0; } else { year++; }
          setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
          lbutton1=true;
          prMillis = millis();
          }
        }
      } else {
        button1=false; 
        if(lbutton1 == true && button1 == false)
          {
          lbutton1=false; 
          }
      }
////////////////////////////////////////////////////// настройка года -
    if(digitalRead(pin3)) 
      { 
      delay(tad);
      if(digitalRead(pin3))
        {
        button3=true;      
        if(lbutton3 == false && button3 == true)
          {
          getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
          if(year == 0) { year = 99; } else { year--; }
          setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
          lbutton3=true;
          prMillis = millis();
          }
        }
      } else {
        button3=false; 
        if(lbutton3 == true && button3 == false)
          {
          lbutton3=false; 
          }
      }
  break;

  case 5:
////////////////////////////////////////////////////// настройка месяца +
    if(digitalRead(pin1)) 
      { 
      delay(tad);
      if(digitalRead(pin1))
        {
        button1=true;      
        if(lbutton1 == false && button1 == true)
          {
          getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
          if(month == 12) { month = 1; } else { month++; }
          setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
          lbutton1=true;
          prMillis = millis();
          }
        }
      } else {
        button1=false; 
        if(lbutton1 == true && button1 == false)
          {
          lbutton1=false; 
          }
      }
////////////////////////////////////////////////////// настройка месяца -
    if(digitalRead(pin3)) 
      { 
      delay(tad);
      if(digitalRead(pin3))
        {
        button3=true;      
        if(lbutton3 == false && button3 == true)
          {
          getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
          if(month == 1) { month = 12; } else { month--; }
          setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
          lbutton3=true;
          prMillis = millis();
          }
        }
      } else {
        button3=false; 
        if(lbutton3 == true && button3 == false)
          {
          lbutton3=false; 
          }
      }
  break;

  case 6:
////////////////////////////////////////////////////// настройка дня +
    if(digitalRead(pin1)) 
      { 
      delay(tad);
      if(digitalRead(pin1))
        {
        button1=true;      
        if(lbutton1 == false && button1 == true)
          {
          getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
          if(dayOfMonth == 31) { dayOfMonth = 1; } else { dayOfMonth++; }
          setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
          lbutton1=true;
          prMillis = millis();
          }
        }
      } else {
        button1=false; 
        if(lbutton1 == true && button1 == false)
          {
          lbutton1=false; 
          }
      }
////////////////////////////////////////////////////// настройка дня -
    if(digitalRead(pin3)) 
      { 
      delay(tad);
      if(digitalRead(pin3))
        {
        button3=true;      
        if(lbutton3 == false && button3 == true)
          {
          getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
          if(dayOfMonth == 1) { dayOfMonth = 31; } else { dayOfMonth--; }
          setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
          lbutton3=true;
          prMillis = millis();
          }
        }
      } else {
        button3=false; 
        if(lbutton3 == true && button3 == false)
          {
          lbutton3=false; 
          }
      }
  break;

  case 7:
////////////////////////////////////////////////////// настройка дня недели +
    if(digitalRead(pin1)) 
      { 
      delay(tad);
      if(digitalRead(pin1))
        {
        button1=true;      
        if(lbutton1 == false && button1 == true)
          {
          getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
          if(dayOfWeek == 7) { dayOfWeek = 1; } else { dayOfWeek++; }
          setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
          lbutton1=true;
          prMillis = millis();
          }
        }
      } else {
        button1=false; 
        if(lbutton1 == true && button1 == false)
          {
          lbutton1=false; 
          }
      }
////////////////////////////////////////////////////// настройка дня недели -
    if(digitalRead(pin3)) 
      { 
      delay(tad);
      if(digitalRead(pin3))
        {
        button3=true;      
        if(lbutton3 == false && button3 == true)
          {
          getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
          if(dayOfWeek == 1) { dayOfWeek = 7; } else { dayOfWeek--; }
          setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); 
          lbutton3=true;
          prMillis = millis();
          }
        }
      } else {
        button3=false; 
        if(lbutton3 == true && button3 == false)
          {
          lbutton3=false; 
          }
      }
  break;

  case 8:
////////////////////////////////////////////////////// настройка синхронизировать по wifi сейчас? +
    if(digitalRead(pin1)) 
      { 
      delay(tad);
      if(digitalRead(pin1))
        {
        button1=true;      
        if(lbutton1 == false && button1 == true)
          {
/////////////////////////////////////////
//гашение экрана
flag_wifi_2 = 0; // зажигаем светодиод при начале обновления
     out_led8(99,3);
     out_led8(99,2);
     out_led8(99,1);
     out_led8(99,0);
    sost = 0;
    counta = 0;
    wifi_info = 0;
    while (sost == 0) 
    {
      counta++;
      wifi_info++; out_led8(wifi_info / 10,1); out_led8(wifi_info % 10,0);
      ntpupdate(1, &mmin, &ssec, &sost);
     if (sost == 1) break;
     delay(10);
      wifi_info++; out_led8(wifi_info / 10,1); out_led8(wifi_info % 10,0);
      ntpupdate(2, &mmin, &ssec, &sost);
     if (sost == 1) break;
     delay(10);
      wifi_info++; out_led8(wifi_info / 10,1); out_led8(wifi_info % 10,0);
      ntpupdate(3, &mmin, &ssec, &sost);
      if (sost == 1) break;
      delay(10);  
      if (counta == 2) break;
    }
    if (sost == 1) {
    Serial.print(" -- KORREKT -- ");
    Serial.print(ssec);
    Serial.print(" - ");
    Serial.print(mmin);    
    Serial.print(" -- KORREKT -- ");
    getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
    setDateDs1307(ssec, mmin, hour, dayOfWeek, dayOfMonth, month, year);
    //counta = 0;
    flag_wifi_2 = 1; //флаг успешного обновления (зажигаем светодиод)
    }
    rconf = 0; 
/////////////////////////////////////////
          lbutton1=true;
          prMillis = millis();
          }
        }
      } else {
        button1=false; 
        if(lbutton1 == true && button1 == false)
          {
          lbutton1=false; 
          }
      }
////////////////////////////////////////////////////// настройка синхронизировать по wifi сейчас? -
    if(digitalRead(pin3)) 
      { 
      delay(tad);
      if(digitalRead(pin3))
        {
        button3=true;      
        if(lbutton3 == false && button3 == true)
          {
/////////////////////////////////////////
//гашение экрана
flag_wifi_2 = 0; // зажигаем светодиод при начале обновления
     out_led8(99,3);
     out_led8(99,2);
     out_led8(99,1);
     out_led8(99,0);
    sost = 0;
    counta = 0;
    wifi_info = 0;
    while (sost == 0) 
    {
      counta++;
      wifi_info++; out_led8(wifi_info / 10,1); out_led8(wifi_info % 10,0);
      ntpupdate(1, &mmin, &ssec, &sost);
     if (sost == 1) break;
     delay(10);
      wifi_info++; out_led8(wifi_info / 10,1); out_led8(wifi_info % 10,0);
      ntpupdate(2, &mmin, &ssec, &sost);
     if (sost == 1) break;
     delay(10);
      wifi_info++; out_led8(wifi_info / 10,1); out_led8(wifi_info % 10,0);
      ntpupdate(3, &mmin, &ssec, &sost);
      if (sost == 1) break;
      delay(10);  
      if (counta == 2) break;
    }
    if (sost == 1) {
    Serial.print(" -- KORREKT -- ");
    Serial.print(ssec);
    Serial.print(" - ");
    Serial.print(mmin);    
    Serial.print(" -- KORREKT -- ");
    getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
    setDateDs1307(ssec, mmin, hour, dayOfWeek, dayOfMonth, month, year);
    //counta = 0;
    flag_wifi_2 = 1; //флаг успешного обновления (зажигаем светодиод)
    }
    rconf = 0; 
/////////////////////////////////////////
          lbutton3=true;
          prMillis = millis();
          }
        }
      } else {
        button3=false; 
        if(lbutton3 == true && button3 == false)
          {
          lbutton3=false; 
          }
      }
  break;

  case 9:
////////////////////////////////////////////////////// настройка автоматическое обновление wifi +
    if(digitalRead(pin1)) 
      { 
      delay(tad);
      if(digitalRead(pin1))
        {
        button1=true;      
        if(lbutton1 == false && button1 == true)
          {
//////////////////////
  EEPROM.write(0, 1);
//////////////////////
          lbutton1=true;
          prMillis = millis();
          }
        }
      } else {
        button1=false; 
        if(lbutton1 == true && button1 == false)
          {
          lbutton1=false; 
          }
      }
////////////////////////////////////////////////////// настройка автоматическое обновление wifi -
    if(digitalRead(pin3)) 
      { 
      delay(tad);
      if(digitalRead(pin3))
        {
        button3=true;      
        if(lbutton3 == false && button3 == true)
          {
//////////////////////
  EEPROM.write(0, 0);
//////////////////////
          lbutton3=true;
          prMillis = millis();
          }
        }
      } else {
        button3=false; 
        if(lbutton3 == true && button3 == false)
          {
          lbutton3=false; 
          }
      }
  break;

  default:
////////////////////////////////////////////////////// настройка яркости +
    if(digitalRead(pin1)) 
      { 
      delay(tad);
      if(digitalRead(pin1))
        {
        button1=true;      
        if(lbutton1 == false && button1 == true)
          {

          if(ledd == 7) { ledd = 0; } else { ledd++; }
            lc.setIntensity(0,ledd);
            lc.setIntensity(1,ledd);
            lc.setIntensity(2,ledd);
            lc.setIntensity(3,ledd);// Установка яркости (0 ~ 15 возможных значений)
          lbutton1=true;
          }
        }
      } else {
        button1=false; 
        if(lbutton1 == true && button1 == false)
          {
          lbutton1=false; 
          }
      }
////////////////////////////////////////////////////// настройка яркости -
    if(digitalRead(pin3)) 
      { 
      delay(tad);
      if(digitalRead(pin3))
        {
        button3=true;      
        if(lbutton3 == false && button3 == true)
          {

          if(ledd == 0) { ledd = 7; } else { ledd--; }
            lc.setIntensity(0,ledd);
            lc.setIntensity(1,ledd);
            lc.setIntensity(2,ledd);
            lc.setIntensity(3,ledd);// Установка яркости (0 ~ 15 возможных значений)
          lbutton3=true;
          }
        }
      } else {
        button3=false; 
        if(lbutton3 == true && button3 == false)
          {
          lbutton3=false; 
          }
      }
/////////////////////////////////////////////////////////////
  break;
  }


if(millis() - prMillis > tconf*1000) rconf=0; 


 getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

/////////////////////////////////////////////////////////////////////////////////////
//вывод на экран
//////////////////////////////////////////////////////////////////////////////////////

   if(rconf == 0) {

    if (minute == 0) { // если 00 минут мигаем светодиодами
      for(i=0;i<10;i++) {
        digitalWrite(ST_CP, LOW);

          for(u=0;u<15;u++) {
            digitalWrite(DS, Arr_3[i][u]); 
            digitalWrite(SH_CP, LOW);
            digitalWrite(SH_CP, HIGH);  
          }

          for(u=0;u<60;u++) {
            digitalWrite(DS, Arr_2[i][u]); 
            digitalWrite(SH_CP, LOW);
            digitalWrite(SH_CP, HIGH);  
          }
        
          for(u=0;u<60;u++) {
            digitalWrite(DS, Arr_1[i][u]); 
            digitalWrite(SH_CP, LOW);
            digitalWrite(SH_CP, HIGH);  
          }
        digitalWrite(ST_CP, HIGH);
        
     out_led8(hour / 10,3);
     out_led8(hour % 10,2);
     out_led8(minute / 10,1);
     out_led8(minute % 10,0);
////////////////////////// мигание точками////////////////
 if ((second - (second/2)*2) == 1) {    //если четное // включаем точки
  digitalWrite(8, HIGH);  digitalWrite(9, HIGH);
 } else {                         //иначе // гасим точки
digitalWrite(8, LOW); digitalWrite(9, LOW);  }
////////////////////////// мигание точками////////////////     
      }
////////////////////////
/////////////////////////////////////////////////////////////////////////////////////



     // вывод температуры
    } else if(second % 10 == 4 or second % 10 == 5 or second % 10 == 6) {
// преобразования типа для вывода температуры
int tempVar1 = bmp.readTemperature();
int tempVar2 = bmp.readTemperature() * 10;
//вывод температуры
     out_led8(tempVar1 / 10,3);
     out_led8(tempVar1 % 10,2);
     out_led8(tempVar2 % 10,1);
     out_led8b(11);
digitalWrite(9, HIGH); digitalWrite(8, LOW);

      // вывод давления
      } else if (second % 10 == 7 or second % 10 == 8 or second % 10 == 9) {
digitalWrite(8, LOW); digitalWrite(9, LOW);         
  // преобразования типа для вывода давления
int davlVar = bmp.readPressure()/133.3224;
//вывод давления
     out_led8((davlVar / 100)%10,3);
     out_led8((davlVar / 10)%10,2);
     out_led8(davlVar % 10,1);
     out_led8b(12);

      // иначе показываем месяц день
      } else {
digitalWrite(8, LOW); digitalWrite(9, LOW);         
     out_led8(dayOfMonth / 10,3);
     out_led8(dayOfMonth % 10,2);
     out_led8(month / 10,1);
     out_led8(month % 10,0);

      
      }



////вывод состояния обновления
if (flag_wifi_2 == 0 and EEPROM.read(0) == 1) { // зажечь красный светодиод
   digitalWrite(DS, HIGH);   
   digitalWrite(SH_CP, LOW);
   digitalWrite(SH_CP, HIGH);   
} else if (flag_wifi_2 == 1 and EEPROM.read(0) == 1) { // зажечь зеленый светодиод
   digitalWrite(DS, HIGH);   
   digitalWrite(SH_CP, LOW);
   digitalWrite(SH_CP, HIGH); 
   digitalWrite(DS, LOW);  
   digitalWrite(SH_CP, LOW);
   digitalWrite(SH_CP, HIGH);  
   digitalWrite(DS, LOW);  
   digitalWrite(SH_CP, LOW);
   digitalWrite(SH_CP, HIGH);      
}

 
////вывод состояния обновления   
////вывод часы
if (hour > 11) ch = hour-12; else ch = hour;
  for(x=12;x>0;x--) {
    if (x == ch+1) {
      digitalWrite(DS, HIGH);   
    } else {
      digitalWrite(DS, LOW);  
    }
   digitalWrite(SH_CP, LOW);
   digitalWrite(SH_CP, HIGH);  
  }
////вывод часы
////вывод минут
  for(x=60;x>0;x--) {
    if (x == minute+1) {
      digitalWrite(DS, HIGH);   
    } else {
      digitalWrite(DS, LOW);  
    }
   digitalWrite(SH_CP, LOW);
   digitalWrite(SH_CP, HIGH);  
  }
////вывод минут
////вывод секунд
  for(x=60;x>0;x--) {
    if (x == second+1) {
      digitalWrite(DS, HIGH);   
    } else {
      digitalWrite(DS, LOW);  
    }
   digitalWrite(SH_CP, LOW);
   digitalWrite(SH_CP, HIGH);  
  }
////вывод секунд
digitalWrite(ST_CP, HIGH);
//// вывод конец















if (EEPROM.read(0) == 1) {
//*****************************************************************************
// иниациализация процедуры корекции времени по wifi в 2:30 если ее небыло
if (hour == 2 and minute == 30 and flag_wifi == 0) {
 flag_wifi_2 = 0; // зажигаем светодиод при начале обновления
//гашение экрана
     out_led8(99,3);
     out_led8(99,2);
     out_led8(99,1);
     out_led8(99,0);
    sost = 0;
    counta = 0;
    wifi_info = 0;
    while (sost == 0) 
    {
      counta++;
      wifi_info++; out_led8(wifi_info / 10,1); out_led8(wifi_info % 10,0);
      ntpupdate(1, &mmin, &ssec, &sost);
     if (sost == 1) break;
     delay(10);
      wifi_info++; out_led8(wifi_info / 10,1); out_led8(wifi_info % 10,0);
      ntpupdate(2, &mmin, &ssec, &sost);
     if (sost == 1) break;
     delay(10);
      wifi_info++; out_led8(wifi_info / 10,1); out_led8(wifi_info % 10,0);
      ntpupdate(3, &mmin, &ssec, &sost);
      if (sost == 1) break;
      delay(10);  
      if (counta == 5) break;
    }
    if (sost == 1) {
    Serial.print(" -- KORREKT -- ");
    Serial.print(ssec);
    Serial.print(" - ");
    Serial.print(mmin);    
    Serial.print(" -- KORREKT -- ");
    getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
    setDateDs1307(ssec, mmin, hour, dayOfWeek, dayOfMonth, month, year);
    flag_wifi_2 = 1; //флаг успешного обновления (зажигаем светодиод)
   // counta = 0;
    } 
    flag_wifi = 1;       
}

// откат флага процедуры корекции времени по wifi в 6:10
if (hour == 3 and minute == 30 and flag_wifi == 1) {
    flag_wifi = 0;
}
//*****************************************************************************
}

   //  out_led8(99,5,2,0);
   //  out_led8(dayOfMonth / 10,4,1,0);
   //  out_led8(dayOfMonth % 10,3,1,1);
   //  out_led8(month / 10,2,3,1);
   //  out_led8(month % 10,1,3,0); 
   //  out_led8(99,0,2,0);
                  

   }
   if(rconf == 1) {
     out_led8b(1);
     out_led8(hour / 10,1);
     out_led8(hour % 10,0);
     digitalWrite(8, HIGH);  digitalWrite(9, HIGH);


//// вывод начало
digitalWrite(ST_CP, LOW);
////вывод часы
if (hour > 11) ch = hour-12; else ch = hour;
  for(x=12;x>0;x--) {
    if (x == ch+1) {
      digitalWrite(DS, HIGH);   
    } else {
      digitalWrite(DS, LOW);  
    }
   digitalWrite(SH_CP, LOW);
   digitalWrite(SH_CP, HIGH);  
  }
////вывод часы
////вывод минут
  for(x=60;x>0;x--) {
    if (x == minute+1) {
      digitalWrite(DS, HIGH);   
    } else {
      digitalWrite(DS, LOW);  
    }
   digitalWrite(SH_CP, LOW);
   digitalWrite(SH_CP, HIGH);  
  }
////вывод минут
////вывод секунд
  for(x=60;x>0;x--) {
    if (x == second+1) {
      digitalWrite(DS, HIGH);   
    } else {
      digitalWrite(DS, LOW);  
    }
   digitalWrite(SH_CP, LOW);
   digitalWrite(SH_CP, HIGH);  
  }
////вывод секунд
digitalWrite(ST_CP, HIGH);
//// вывод конец



     
   }
   if(rconf == 2) {
     out_led8b(2);
     out_led8(minute / 10,1);
     out_led8(minute % 10,0);
     digitalWrite(8, HIGH);  digitalWrite(9, HIGH);

//// вывод начало
digitalWrite(ST_CP, LOW);
////вывод часы
if (hour > 11) ch = hour-12; else ch = hour;
  for(x=12;x>0;x--) {
    if (x == ch+1) {
      digitalWrite(DS, HIGH);   
    } else {
      digitalWrite(DS, LOW);  
    }
   digitalWrite(SH_CP, LOW);
   digitalWrite(SH_CP, HIGH);  
  }
////вывод часы
////вывод минут
  for(x=60;x>0;x--) {
    if (x == minute+1) {
      digitalWrite(DS, HIGH);   
    } else {
      digitalWrite(DS, LOW);  
    }
   digitalWrite(SH_CP, LOW);
   digitalWrite(SH_CP, HIGH);  
  }
////вывод минут
////вывод секунд
  for(x=60;x>0;x--) {
    if (x == second+1) {
      digitalWrite(DS, HIGH);   
    } else {
      digitalWrite(DS, LOW);  
    }
   digitalWrite(SH_CP, LOW);
   digitalWrite(SH_CP, HIGH);  
  }
////вывод секунд
digitalWrite(ST_CP, HIGH);
//// вывод конец


     
   }
   if(rconf == 3) {
     out_led8b(3);
     out_led8(second / 10,1);
     out_led8(second % 10,0); 
     digitalWrite(8, HIGH);  digitalWrite(9, HIGH);

//// вывод начало
digitalWrite(ST_CP, LOW);
////вывод часы
if (hour > 11) ch = hour-12; else ch = hour;
  for(x=12;x>0;x--) {
    if (x == ch+1) {
      digitalWrite(DS, HIGH);   
    } else {
      digitalWrite(DS, LOW);  
    }
   digitalWrite(SH_CP, LOW);
   digitalWrite(SH_CP, HIGH);  
  }
////вывод часы
////вывод минут
  for(x=60;x>0;x--) {
    if (x == minute+1) {
      digitalWrite(DS, HIGH);   
    } else {
      digitalWrite(DS, LOW);  
    }
   digitalWrite(SH_CP, LOW);
   digitalWrite(SH_CP, HIGH);  
  }
////вывод минут
////вывод секунд
  for(x=60;x>0;x--) {
    if (x == second+1) {
      digitalWrite(DS, HIGH);   
    } else {
      digitalWrite(DS, LOW);  
    }
   digitalWrite(SH_CP, LOW);
   digitalWrite(SH_CP, HIGH);  
  }
////вывод секунд
digitalWrite(ST_CP, HIGH);
//// вывод конец

     
   }
   if(rconf == 4) {
     out_led8b(4);
     out_led8(year / 10,1);
     out_led8(year % 10,0);
     digitalWrite(8, HIGH);  digitalWrite(9, HIGH); 
   }   
   if(rconf == 5) {
     out_led8b(5);
     out_led8(month / 10,1);
     out_led8(month % 10,0);
     digitalWrite(8, HIGH);  digitalWrite(9, HIGH); 
   } 
   if(rconf == 6) {
     out_led8b(6);
     out_led8(dayOfMonth / 10,1);
     out_led8(dayOfMonth % 10,0); 
     digitalWrite(8, HIGH);  digitalWrite(9, HIGH);
   }  
   if(rconf == 7) {
     out_led8b(7);
     out_led8(99,1);
     out_led8(dayOfWeek,0); 
     digitalWrite(8, HIGH);  digitalWrite(9, HIGH);
   }  
   if(rconf == 8) {
     out_led8b(25);
     out_led8(99,1);
     digitalWrite(8, LOW);  digitalWrite(9, LOW);
   }   
   if(rconf == 9) {
     out_led8b(26);
     if (EEPROM.read(0) == 0) { 
      out_led8(22,0);
     }
     if (EEPROM.read(0) == 1) {
      out_led8(21,0);     
     }
     digitalWrite(8, LOW);  digitalWrite(9, LOW);
   }  


 //вывод на экран
  Serial.print(button1);
  Serial.print(" ");
  Serial.print(button2);
  Serial.print(" ");
  Serial.print(button3);
  Serial.print(" ");
  Serial.print(rconf);
  Serial.print(" ");
   
  Serial.print(hour, DEC);
  Serial.print(":");
  Serial.print(minute, DEC);
  Serial.print(":");
  Serial.print(second, DEC);
  Serial.print("  ");
  Serial.print(dayOfMonth, DEC);
  Serial.print("/");
  Serial.print(month, DEC);
  Serial.print("/");
  Serial.print(year, DEC);
  Serial.print("  Day_of_week:");
  Serial.print(dayOfWeek, DEC);
  Serial.print(" -upd--"); 
  Serial.print(flag_wifi);
  Serial.print("-- ");


    //вывод температуры
    Serial.print("|| T = ");
    Serial.print(bmp.readTemperature());
    Serial.print(" *C ");
    //вывод давления в мм.рт.ст
    Serial.print(" P = ");
    Serial.print(bmp.readPressure()/133.3224);
    Serial.println(" Br ||");  

    


}


//вывод на матрицу цифр
void out_led8(byte in, byte nom)// цифра, номер индикатора
{

  byte a1[8]={B00011000,B00101000,B01001000,B00001000,B00001000,B00001000,B00001000,B01111110};
  byte a2[8]={B00111100,B01000010,B01000010,B00000100,B00011000,B00100000,B01000000,B01111110};
  byte a3[8]={B00111100,B01000010,B00000010,B00011100,B00000010,B00000010,B01000010,B00111100};
  byte a4[8]={B00000100,B00001100,B00010100,B00100100,B01000100,B01111110,B00000100,B00000100};
  byte a5[8]={B01111110,B01000000,B01000000,B01111100,B00000010,B00000010,B01000010,B00111100};
  byte a6[8]={B00111100,B01000000,B01000000,B00111100,B01000010,B01000010,B01000010,B00111100};
  byte a7[8]={B01111110,B00000010,B00000100,B00001000,B00010000,B00100000,B00100000,B00100000};
  byte a8[8]={B00111100,B01000010,B01000010,B00111100,B01000010,B01000010,B01000010,B00111100};
  byte a9[8]={B00111100,B01000010,B01000010,B00111100,B00000010,B00000010,B01000010,B00111100};
  byte a0[8]={B00111100,B01000010,B01000010,B01000010,B01000010,B01000010,B01000010,B00111100}; 
  byte a99[8]={B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000}; 
  // Y
  byte y0[8]={B00100010,B00100010,B00100010,B00010100,B00001000,B00001000,B00001000,B00001000};
  // N 
  byte n0[8]={B00100010,B00110010,B00110010,B00101010,B00101010,B00100110,B00100110,B00100010};
   


     
  if(in == 1) {
  lc.setRow(nom,0,a1[0]);
  lc.setRow(nom,1,a1[1]);
  lc.setRow(nom,2,a1[2]);
  lc.setRow(nom,3,a1[3]);
  lc.setRow(nom,4,a1[4]);
  lc.setRow(nom,5,a1[5]);
  lc.setRow(nom,6,a1[6]);
  lc.setRow(nom,7,a1[7]);
  }
    
  if(in == 2) {
  lc.setRow(nom,0,a2[0]);
  lc.setRow(nom,1,a2[1]);
  lc.setRow(nom,2,a2[2]);
  lc.setRow(nom,3,a2[3]);
  lc.setRow(nom,4,a2[4]);
  lc.setRow(nom,5,a2[5]);
  lc.setRow(nom,6,a2[6]);
  lc.setRow(nom,7,a2[7]);
  }
      
  if(in == 3) {
  lc.setRow(nom,0,a3[0]);
  lc.setRow(nom,1,a3[1]);
  lc.setRow(nom,2,a3[2]);
  lc.setRow(nom,3,a3[3]);
  lc.setRow(nom,4,a3[4]);
  lc.setRow(nom,5,a3[5]);
  lc.setRow(nom,6,a3[6]);
  lc.setRow(nom,7,a3[7]);
  }

      
  if(in == 4) {
  lc.setRow(nom,0,a4[0]);
  lc.setRow(nom,1,a4[1]);
  lc.setRow(nom,2,a4[2]);
  lc.setRow(nom,3,a4[3]);
  lc.setRow(nom,4,a4[4]);
  lc.setRow(nom,5,a4[5]);
  lc.setRow(nom,6,a4[6]);
  lc.setRow(nom,7,a4[7]);
  }

  if(in == 5) {
  lc.setRow(nom,0,a5[0]);
  lc.setRow(nom,1,a5[1]);
  lc.setRow(nom,2,a5[2]);
  lc.setRow(nom,3,a5[3]);
  lc.setRow(nom,4,a5[4]);
  lc.setRow(nom,5,a5[5]);
  lc.setRow(nom,6,a5[6]);
  lc.setRow(nom,7,a5[7]);
  }

      
  if(in == 6) {
  lc.setRow(nom,0,a6[0]);
  lc.setRow(nom,1,a6[1]);
  lc.setRow(nom,2,a6[2]);
  lc.setRow(nom,3,a6[3]);
  lc.setRow(nom,4,a6[4]);
  lc.setRow(nom,5,a6[5]);
  lc.setRow(nom,6,a6[6]);
  lc.setRow(nom,7,a6[7]);
  }

  if(in == 7) {
  lc.setRow(nom,0,a7[0]);
  lc.setRow(nom,1,a7[1]);
  lc.setRow(nom,2,a7[2]);
  lc.setRow(nom,3,a7[3]);
  lc.setRow(nom,4,a7[4]);
  lc.setRow(nom,5,a7[5]);
  lc.setRow(nom,6,a7[6]);
  lc.setRow(nom,7,a7[7]);
  }
      
  if(in == 8) {
  lc.setRow(nom,0,a8[0]);
  lc.setRow(nom,1,a8[1]);
  lc.setRow(nom,2,a8[2]);
  lc.setRow(nom,3,a8[3]);
  lc.setRow(nom,4,a8[4]);
  lc.setRow(nom,5,a8[5]);
  lc.setRow(nom,6,a8[6]);
  lc.setRow(nom,7,a8[7]);
  }
    
  if(in == 9) {
  lc.setRow(nom,0,a9[0]);
  lc.setRow(nom,1,a9[1]);
  lc.setRow(nom,2,a9[2]);
  lc.setRow(nom,3,a9[3]);
  lc.setRow(nom,4,a9[4]);
  lc.setRow(nom,5,a9[5]);
  lc.setRow(nom,6,a9[6]);
  lc.setRow(nom,7,a9[7]);
  }
      
  if(in == 0) {
  lc.setRow(nom,0,a0[0]);
  lc.setRow(nom,1,a0[1]);
  lc.setRow(nom,2,a0[2]);
  lc.setRow(nom,3,a0[3]);
  lc.setRow(nom,4,a0[4]);
  lc.setRow(nom,5,a0[5]);
  lc.setRow(nom,6,a0[6]);
  lc.setRow(nom,7,a0[7]);
  }
  
  if(in == 99) {
  lc.setRow(nom,0,a99[0]);
  lc.setRow(nom,1,a99[1]);
  lc.setRow(nom,2,a99[2]);
  lc.setRow(nom,3,a99[3]);
  lc.setRow(nom,4,a99[4]);
  lc.setRow(nom,5,a99[5]);
  lc.setRow(nom,6,a99[6]);
  lc.setRow(nom,7,a99[7]);
  }

  if(in == 21) {
  lc.setRow(nom,0,y0[0]);
  lc.setRow(nom,1,y0[1]);
  lc.setRow(nom,2,y0[2]);
  lc.setRow(nom,3,y0[3]);
  lc.setRow(nom,4,y0[4]);
  lc.setRow(nom,5,y0[5]);
  lc.setRow(nom,6,y0[6]);
  lc.setRow(nom,7,y0[7]);
  }
  
  if(in == 22) {
  lc.setRow(nom,0,n0[0]);
  lc.setRow(nom,1,n0[1]);
  lc.setRow(nom,2,n0[2]);
  lc.setRow(nom,3,n0[3]);
  lc.setRow(nom,4,n0[4]);
  lc.setRow(nom,5,n0[5]);
  lc.setRow(nom,6,n0[6]);
  lc.setRow(nom,7,n0[7]);
  }

  
}

//вывод на матрицу слов
void out_led8b(byte in)//выбор вывода
{
  // настройка === часы-минуты-секунды-год-месяц-день-день недели-яркость

  //час
  byte c1[8]={B00000000,B10010011,B10010100,B10010100,B01110100,B00010111,B00010100,B00000000};
  byte c2[8]={B00000000,B00011000,B10100100,B10100000,B10100000,B10100100,B10011000,B00000000};
  //мин
  byte m1[8]={B00000000,B10001010,B11011010,B10101010,B10001011,B10001010,B10001010,B00000000};
  byte m2[8]={B00000000,B01010010,B01010010,B11010010,B01011110,B01010010,B01010010,B00000000};
  //сек
  byte s1[8]={B00000000,B01100111,B10010100,B10000111,B10000100,B10010100,B01100111,B00000000};
  byte s2[8]={B00000000,B10100100,B00101000,B00110000,B00110000,B00101000,B10100100,B00000000};
  //год
  byte g1[8]={B00000000,B11100110,B10001001,B10001001,B10001001,B10001001,B10000110,B00000000};
  byte g2[8]={B00000000,B00011000,B00101000,B00101000,B00101000,B01111100,B01000100,B00000000};
  //мес
  byte mm1[8]={B00000000,B10001011,B11011010,B10101011,B10001010,B10001010,B10001011,B00000000};
  byte mm2[8]={B00000000,B11001100,B00010010,B10010000,B00010000,B00010010,B11001100,B00000000};
  //ден
  byte d1[8]={B00000000,B00110011,B01010010,B01010011,B01010010,B11111010,B10001011,B00000000};
  byte d2[8]={B00000000,B11010010,B00010010,B10011110,B00010010,B00010010,B11010010,B00000000};
  //д.нед
  byte dd1[8]={B00000101,B00000101,B00110111,B01010101,B01010101,B01010000,B11110000,B10010100};
  byte dd2[8]={B01100011,B01000101,B01100101,B01000101,B01101111,B00001001,B00000000,B00000000};
  // градусы С
  byte t1[8]={B11001110,B11010001,B00010001,B00010000,B00010000,B00010000,B00010001,B00001110};
  // давление
  byte b1[8]={B00011000,B00011000,B00011000,B00011000,B00011000,B00011000,B11111111,B11111111};

  // коррекция времени
  byte ww11[8]={B00010001,B00100010,B01000100,B01000100,B01000100,B01000100,B00100010,B00000000};
  byte ww12[8]={B00010000,B00100000,B01000010,B01000111,B01000111,B01000010,B00100010,B00000010};
  
  byte ww21[8]={B00100010,B01000100,B10001000,B10001000,B10001000,B10001000,B01000100,B00000000};
  byte ww22[8]={B00100000,B01000000,B10000010,B10000111,B10000111,B10000010,B01000010,B00000010};

  byte ww31[8]={B01000100,B10001000,B00010001,B00010001,B00010001,B00010001,B10001000,B00000000};
  byte ww32[8]={B01000100,B10001000,B00010010,B00010111,B00010111,B00010010,B10001010,B00000010}; 
  
  byte ww41[8]={B10001000,B00010001,B00100010,B00100010,B00100010,B00100010,B00010001,B00000000};
  byte ww42[8]={B10001000,B00010000,B00100010,B00100111,B00100111,B00100010,B00010010,B00000010};
 // запрос корекции времени сейчас
  byte ww51[8]={B00000000,B01000101,B01000100,B01010101,B01010101,B01010101,B00101001,B00000000};
  byte ww52[8]={B00000000,B01111010,B01000000,B01110010,B01000010,B01000010,B01000010,B00000000}; 
  byte ww53[8]={B00111000,B01000100,B00000100,B00000100,B00001000,B00010000,B00000000,B00010000}; 
 // автоматическая коррекция времени да/нет
  byte ww61[8]={B00000000,B01000101,B01000100,B01010101,B01010101,B01010101,B00101001,B00000000};
  byte ww62[8]={B00000000,B01111010,B01000000,B01110010,B01000010,B01000010,B01000010,B00000000}; 
  byte ww63[8]={B00000000,B00110110,B01010101,B10010110,B11110101,B10010101,B10010111,B00000000}; 

  
  if(in == 1) { //час-
  lc.setRow(3,0,c1[0]);
  lc.setRow(3,1,c1[1]);
  lc.setRow(3,2,c1[2]);
  lc.setRow(3,3,c1[3]);
  lc.setRow(3,4,c1[4]);
  lc.setRow(3,5,c1[5]);
  lc.setRow(3,6,c1[6]);
  lc.setRow(3,7,c1[7]);

  lc.setRow(2,0,c2[0]);
  lc.setRow(2,1,c2[1]);
  lc.setRow(2,2,c2[2]);
  lc.setRow(2,3,c2[3]);
  lc.setRow(2,4,c2[4]);
  lc.setRow(2,5,c2[5]);
  lc.setRow(2,6,c2[6]);
  lc.setRow(2,7,c2[7]);
  }  

  if(in == 2) {//мин
  lc.setRow(3,0,m1[0]);
  lc.setRow(3,1,m1[1]);
  lc.setRow(3,2,m1[2]);
  lc.setRow(3,3,m1[3]);
  lc.setRow(3,4,m1[4]);
  lc.setRow(3,5,m1[5]);
  lc.setRow(3,6,m1[6]);
  lc.setRow(3,7,m1[7]);

  lc.setRow(2,0,m2[0]);
  lc.setRow(2,1,m2[1]);
  lc.setRow(2,2,m2[2]);
  lc.setRow(2,3,m2[3]);
  lc.setRow(2,4,m2[4]);
  lc.setRow(2,5,m2[5]);
  lc.setRow(2,6,m2[6]);
  lc.setRow(2,7,m2[7]);
  }  

  if(in == 3) {//сек
  lc.setRow(3,0,s1[0]);
  lc.setRow(3,1,s1[1]);
  lc.setRow(3,2,s1[2]);
  lc.setRow(3,3,s1[3]);
  lc.setRow(3,4,s1[4]);
  lc.setRow(3,5,s1[5]);
  lc.setRow(3,6,s1[6]);
  lc.setRow(3,7,s1[7]);

  lc.setRow(2,0,s2[0]);
  lc.setRow(2,1,s2[1]);
  lc.setRow(2,2,s2[2]);
  lc.setRow(2,3,s2[3]);
  lc.setRow(2,4,s2[4]);
  lc.setRow(2,5,s2[5]);
  lc.setRow(2,6,s2[6]);
  lc.setRow(2,7,s2[7]);
  }  

  if(in == 4) {//год
  lc.setRow(3,0,g1[0]);
  lc.setRow(3,1,g1[1]);
  lc.setRow(3,2,g1[2]);
  lc.setRow(3,3,g1[3]);
  lc.setRow(3,4,g1[4]);
  lc.setRow(3,5,g1[5]);
  lc.setRow(3,6,g1[6]);
  lc.setRow(3,7,g1[7]);

  lc.setRow(2,0,g2[0]);
  lc.setRow(2,1,g2[1]);
  lc.setRow(2,2,g2[2]);
  lc.setRow(2,3,g2[3]);
  lc.setRow(2,4,g2[4]);
  lc.setRow(2,5,g2[5]);
  lc.setRow(2,6,g2[6]);
  lc.setRow(2,7,g2[7]);
  }
  
  if(in == 5) {//мес
  lc.setRow(3,0,mm1[0]);
  lc.setRow(3,1,mm1[1]);
  lc.setRow(3,2,mm1[2]);
  lc.setRow(3,3,mm1[3]);
  lc.setRow(3,4,mm1[4]);
  lc.setRow(3,5,mm1[5]);
  lc.setRow(3,6,mm1[6]);
  lc.setRow(3,7,mm1[7]);

  lc.setRow(2,0,mm2[0]);
  lc.setRow(2,1,mm2[1]);
  lc.setRow(2,2,mm2[2]);
  lc.setRow(2,3,mm2[3]);
  lc.setRow(2,4,mm2[4]);
  lc.setRow(2,5,mm2[5]);
  lc.setRow(2,6,mm2[6]);
  lc.setRow(2,7,mm2[7]);
  }  

  if(in == 6) {//ден
  lc.setRow(3,0,d1[0]);
  lc.setRow(3,1,d1[1]);
  lc.setRow(3,2,d1[2]);
  lc.setRow(3,3,d1[3]);
  lc.setRow(3,4,d1[4]);
  lc.setRow(3,5,d1[5]);
  lc.setRow(3,6,d1[6]);
  lc.setRow(3,7,d1[7]);

  lc.setRow(2,0,d2[0]);
  lc.setRow(2,1,d2[1]);
  lc.setRow(2,2,d2[2]);
  lc.setRow(2,3,d2[3]);
  lc.setRow(2,4,d2[4]);
  lc.setRow(2,5,d2[5]);
  lc.setRow(2,6,d2[6]);
  lc.setRow(2,7,d2[7]);
  }  
  
  if(in == 7) {//д.нед
  lc.setRow(3,0,dd1[0]);
  lc.setRow(3,1,dd1[1]);
  lc.setRow(3,2,dd1[2]);
  lc.setRow(3,3,dd1[3]);
  lc.setRow(3,4,dd1[4]);
  lc.setRow(3,5,dd1[5]);
  lc.setRow(3,6,dd1[6]);
  lc.setRow(3,7,dd1[7]);

  lc.setRow(2,0,dd2[0]);
  lc.setRow(2,1,dd2[1]);
  lc.setRow(2,2,dd2[2]);
  lc.setRow(2,3,dd2[3]);
  lc.setRow(2,4,dd2[4]);
  lc.setRow(2,5,dd2[5]);
  lc.setRow(2,6,dd2[6]);
  lc.setRow(2,7,dd2[7]);
  }      

  if(in == 11) {//градусы С
  lc.setRow(0,0,t1[0]);
  lc.setRow(0,1,t1[1]);
  lc.setRow(0,2,t1[2]);
  lc.setRow(0,3,t1[3]);
  lc.setRow(0,4,t1[4]);
  lc.setRow(0,5,t1[5]);
  lc.setRow(0,6,t1[6]);
  lc.setRow(0,7,t1[7]);
  } 
  
  if(in == 12) {//давление
  lc.setRow(0,0,b1[0]);
  lc.setRow(0,1,b1[1]);
  lc.setRow(0,2,b1[2]);
  lc.setRow(0,3,b1[3]);
  lc.setRow(0,4,b1[4]);
  lc.setRow(0,5,b1[5]);
  lc.setRow(0,6,b1[6]);
  lc.setRow(0,7,b1[7]);
  } 
  
  if(in == 21) {//коррекция времени1
  lc.setRow(3,0,ww11[0]);
  lc.setRow(3,1,ww11[1]);
  lc.setRow(3,2,ww11[2]);
  lc.setRow(3,3,ww11[3]);
  lc.setRow(3,4,ww11[4]);
  lc.setRow(3,5,ww11[5]);
  lc.setRow(3,6,ww11[6]);
  lc.setRow(3,7,ww11[7]);

  lc.setRow(2,0,ww12[0]);
  lc.setRow(2,1,ww12[1]);
  lc.setRow(2,2,ww12[2]);
  lc.setRow(2,3,ww12[3]);
  lc.setRow(2,4,ww12[4]);
  lc.setRow(2,5,ww12[5]);
  lc.setRow(2,6,ww12[6]);
  lc.setRow(2,7,ww12[7]);
  }
     
  if(in == 22) {//коррекция времени2
  lc.setRow(3,0,ww21[0]);
  lc.setRow(3,1,ww21[1]);
  lc.setRow(3,2,ww21[2]);
  lc.setRow(3,3,ww21[3]);
  lc.setRow(3,4,ww21[4]);
  lc.setRow(3,5,ww21[5]);
  lc.setRow(3,6,ww21[6]);
  lc.setRow(3,7,ww21[7]);

  lc.setRow(2,0,ww22[0]);
  lc.setRow(2,1,ww22[1]);
  lc.setRow(2,2,ww22[2]);
  lc.setRow(2,3,ww22[3]);
  lc.setRow(2,4,ww22[4]);
  lc.setRow(2,5,ww22[5]);
  lc.setRow(2,6,ww22[6]);
  lc.setRow(2,7,ww22[7]);
  }      

  if(in == 23) {//коррекция времени3
  lc.setRow(3,0,ww31[0]);
  lc.setRow(3,1,ww31[1]);
  lc.setRow(3,2,ww31[2]);
  lc.setRow(3,3,ww31[3]);
  lc.setRow(3,4,ww31[4]);
  lc.setRow(3,5,ww31[5]);
  lc.setRow(3,6,ww31[6]);
  lc.setRow(3,7,ww31[7]);

  lc.setRow(2,0,ww32[0]);
  lc.setRow(2,1,ww32[1]);
  lc.setRow(2,2,ww32[2]);
  lc.setRow(2,3,ww32[3]);
  lc.setRow(2,4,ww32[4]);
  lc.setRow(2,5,ww32[5]);
  lc.setRow(2,6,ww32[6]);
  lc.setRow(2,7,ww32[7]);
  }   


  if(in == 24) {//коррекция времени4
  lc.setRow(3,0,ww41[0]);
  lc.setRow(3,1,ww41[1]);
  lc.setRow(3,2,ww41[2]);
  lc.setRow(3,3,ww41[3]);
  lc.setRow(3,4,ww41[4]);
  lc.setRow(3,5,ww41[5]);
  lc.setRow(3,6,ww41[6]);
  lc.setRow(3,7,ww41[7]);

  lc.setRow(2,0,ww42[0]);
  lc.setRow(2,1,ww42[1]);
  lc.setRow(2,2,ww42[2]);
  lc.setRow(2,3,ww42[3]);
  lc.setRow(2,4,ww42[4]);
  lc.setRow(2,5,ww42[5]);
  lc.setRow(2,6,ww42[6]);
  lc.setRow(2,7,ww42[7]);
  }   

  if(in == 25) {//коррекция времени сейчас 5
  lc.setRow(3,0,ww51[0]);
  lc.setRow(3,1,ww51[1]);
  lc.setRow(3,2,ww51[2]);
  lc.setRow(3,3,ww51[3]);
  lc.setRow(3,4,ww51[4]);
  lc.setRow(3,5,ww51[5]);
  lc.setRow(3,6,ww51[6]);
  lc.setRow(3,7,ww51[7]);

  lc.setRow(2,0,ww52[0]);
  lc.setRow(2,1,ww52[1]);
  lc.setRow(2,2,ww52[2]);
  lc.setRow(2,3,ww52[3]);
  lc.setRow(2,4,ww52[4]);
  lc.setRow(2,5,ww52[5]);
  lc.setRow(2,6,ww52[6]);
  lc.setRow(2,7,ww52[7]);

  lc.setRow(0,0,ww53[0]);
  lc.setRow(0,1,ww53[1]);
  lc.setRow(0,2,ww53[2]);
  lc.setRow(0,3,ww53[3]);
  lc.setRow(0,4,ww53[4]);
  lc.setRow(0,5,ww53[5]);
  lc.setRow(0,6,ww53[6]);
  lc.setRow(0,7,ww53[7]);  
  }  
   
  if(in == 26) {//автоматическая коррекция аремени на/нет
  lc.setRow(3,0,ww61[0]);
  lc.setRow(3,1,ww61[1]);
  lc.setRow(3,2,ww61[2]);
  lc.setRow(3,3,ww61[3]);
  lc.setRow(3,4,ww61[4]);
  lc.setRow(3,5,ww61[5]);
  lc.setRow(3,6,ww61[6]);
  lc.setRow(3,7,ww61[7]);

  lc.setRow(2,0,ww62[0]);
  lc.setRow(2,1,ww62[1]);
  lc.setRow(2,2,ww62[2]);
  lc.setRow(2,3,ww62[3]);
  lc.setRow(2,4,ww62[4]);
  lc.setRow(2,5,ww62[5]);
  lc.setRow(2,6,ww62[6]);
  lc.setRow(2,7,ww62[7]);

  lc.setRow(1,0,ww63[0]);
  lc.setRow(1,1,ww63[1]);
  lc.setRow(1,2,ww63[2]);
  lc.setRow(1,3,ww63[3]);
  lc.setRow(1,4,ww63[4]);
  lc.setRow(1,5,ww63[5]);
  lc.setRow(1,6,ww63[6]);
  lc.setRow(1,7,ww63[7]);  
  }       
  
}






///////////////////////////////////////////////////////////////////////////подпрограммы для часов
byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}

void setDateDs1307(byte second,        // 0-59
                   byte minute,        // 0-59
                   byte hour,          // 1-23
                   byte dayOfWeek,     // 1-7
                   byte dayOfMonth,    // 1-28/29/30/31
                   byte month,         // 1-12
                   byte year)          // 0-99
{
   Wire.beginTransmission(DS1307_I2C_ADDRESS);
   Wire.write(0);
   Wire.write(decToBcd(second));    
   Wire.write(decToBcd(minute));
   Wire.write(decToBcd(hour));     
   Wire.write(decToBcd(dayOfWeek));
   Wire.write(decToBcd(dayOfMonth));
   Wire.write(decToBcd(month));
   Wire.write(decToBcd(year));
   Wire.endTransmission();
}

void getDateDs1307(byte *second,
          byte *minute,
          byte *hour,
          byte *dayOfWeek,
          byte *dayOfMonth,
          byte *month,
          byte *year)
{

  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

  *second     = bcdToDec(Wire.read() & 0x7f);
  *minute     = bcdToDec(Wire.read());
  *hour       = bcdToDec(Wire.read() & 0x3f); 
  *dayOfWeek  = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month      = bcdToDec(Wire.read());
  *year       = bcdToDec(Wire.read());
}

///////////////////////////////////////////////////////////////////////////получение времени по wifi ntp


  
void ntpupdate(byte ip, byte *minute, byte *second, byte *sost)
{
  const byte NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message
  byte packetBuffer[ NTP_PACKET_SIZE];
  byte iii = 1;
  byte countb;
//////////////////////////////////////////////////////////////////
out_led8b(iii+20);

Serial.print("RST ");             // ребут wifi
 while(1){                       // 
    Serial3.println("AT+RST");     // спрашиваем состояние
      if (Serial3.find("OK")) break;  // если в ответе на команду нашли OK, выходим из цикла
      else Serial.print(".");
        delay(1);          
  }
Serial.println("OK!");

//Serial.print("CWMODE ");          // установка режима wifi клиент
 while(1){                       // 
    Serial3.println("AT+CWMODE=1");     // спрашиваем состояние
      if (Serial3.find("OK")) break;  // если в ответе на команду нашли OK, выходим из цикла
//      else Serial.print(".");
        delay(1);          
  }
//Serial.println("OK!");

//Serial.print("CWQAP ");           // выключаем режим множественных подключений  
 while(1){                       // 
    Serial3.println("AT+CWQAP");     // спрашиваем состояние
      if (Serial3.find("OK")) break;  // если в ответе на команду нашли OK, выходим из цикла
 //     else Serial.print(".");
        delay(1);          
  }
//Serial.println("OK!");

Serial.print("Connect ");           // подключение к ТД
countb = 0;
 while(1){                       // ждем подключение к сети
    Serial3.println("AT+CWJAP=\"WLAN\",\"5477254772\"");     // спрашиваем состояние
      if (Serial3.find("OK")) break;  // если в ответе на команду нашли OK, выходим из цикла
      else { 
        Serial.print("."); 
        iii++;
        countb++;
        if (iii > 4) iii = 1;
        out_led8b(iii + 20);
        if (countb == 25) break;
        }
        delay(1);          
  }
Serial.println("OK!");


Serial.print("Connect TD? ");       // проверяем, действительно подключились?
countb = 0;
 while(1){                       // ждем пока выдадут IP
    Serial3.println("AT+CIFSR");     // спрашиваем состояние
      if (Serial3.find("172")) break;  // если нам дали IP, выходим из цикла
      else { 
        Serial.print(".");
        countb++;
        if (countb == 25) break;        
      }
        delay(1);          
  }
Serial.println("OK!");

//+CIFSR:STAIP,"192.168.43.124"
//+CIFSR:STAMAC,"18:fe:34:d5:07:a0"

//Serial.print("CIPMUX ");
 while(1){                       // 
    Serial3.println("AT+CIPMUX=0");     // спрашиваем состояние
      if (Serial3.find("OK")) break;  // если нам дали IP, выходим из цикла
//      else Serial.print(".");
        delay(1);          
  }
//Serial.println("OK!");

///////////////////////////////////////////////////////////////////
//запрос времени
///////////////////////////////////////////////////////////////////

if (ip == 1) {
Serial3.println("AT+CIPSTART=\"UDP\",\"24.56.178.140\",123"); 
    }
if (ip == 2) {
Serial3.println("AT+CIPSTART=\"UDP\",\"91.226.136.141\",123");
  }
if (ip == 3) {
Serial3.println("AT+CIPSTART=\"UDP\",\"129.6.15.28\",123");
  }
    
  delay(500);
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
 
 // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
 
 packetBuffer[0] = 0b11100011; // LI, Version, Mode
  packetBuffer[1] = 0; // Stratum, or type of clock
  packetBuffer[2] = 6; // Polling Interval
  packetBuffer[3] = 0xEC; // Peer Clock Precision
 
 // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12] = 49;
  packetBuffer[13] = 0x4E;
  packetBuffer[14] = 49;
  packetBuffer[15] = 52;
  Serial3.print("AT+CIPSEND=");
  Serial3.println(NTP_PACKET_SIZE);
  delay(1000);
  for (uint32_t i = 0; i < NTP_PACKET_SIZE; i++) {
    Serial3.write(packetBuffer[i]);
  }

  int counta = 0;
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  if (Serial3.find("+IPD,48:"))
  {
    Serial.println("Server answer : ");

    int i = 0;
    while (Serial3.available() > 0) {
      byte ch = Serial3.read();
      if (i < NTP_PACKET_SIZE)
      {
        packetBuffer[i] = ch;
      }
      i++;
      if ( ( i < NTP_PACKET_SIZE ) && ( Serial3.available() == 0 ) )
      {
        while (Serial3.available() == 0) // you may have to wait for some bytes
        {
          counta += 1;
          Serial.print("!");
          delay(100);
          if (counta == 15) {
            exit;
          }
        }
      }
    }
  }
   //the timestamp starts at byte 40 of the received packet and is four bytes,
  // or two words, long. First, esxtract the two words:
  unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
  unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
  // combine the four bytes (two words) into a long integer
  // this is NTP time (seconds since Jan 1 1900):
  unsigned long secsSince1900 = highWord << 16 | lowWord;
//  Serial.print("Seconds since Jan 1 1900 = " );
//  Serial.println(secsSince1900);
  // now convert NTP time into everyday time:
//  Serial.print("Unix time = ");
  // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
  const unsigned long seventyYears = 2208988800UL;
  // subtract seventy years:
  unsigned long epoch = secsSince1900 - seventyYears;
  // print Unix time:
//  Serial.println(epoch);


  if ( secsSince1900 == 0) {
    *sost = 0;
   Serial.println("----------------------- ERROR -----------------------");
   Serial.println(" ");
   } else { 
     *sost = 1;    
    Serial.print("----------------------- "); 


  // print the hour, minute and second:
  Serial.print("The UTC time is "); // UTC is the time at Greenwich Meridian (GMT)
  Serial.print((epoch % 86400L) / 3600); // print the hour (86400 equals secs per day)
  Serial.print(':');
  if ( ((epoch % 3600) / 60) < 10 ) {
    // In the first 10 minutes of each hour, we'll want a leading '0'
    Serial.print('0');
  }
  Serial.print((epoch % 3600) / 60); // print the minute (3600 equals secs per minute)
  Serial.print(':');
  if ( (epoch % 60) < 10 ) {
    // In the first 10 seconds of each minute, we'll want a leading '0'
    Serial.print('0');
  }
  Serial.print(epoch % 60); // print the second
  
  Serial3.println("AT+CIPCLOSE");


    Serial.println(" -----------------------"); 
    Serial.println(" ");

  *second     = (epoch % 60);
  *minute     = ((epoch % 3600) / 60);
    
    }
  

   }

 

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

регистры наверное 74CH595, а датчик давления BMP180 или BMP085...Проект трудоёмкий, но всё равно спасибо!

arDubino
Offline
Зарегистрирован: 12.01.2017

хоть бы че полезное сделал а.

там вон в исполнителях тем для приложения рук море

Lelik Lelikovich
Offline
Зарегистрирован: 24.01.2017

yucan пишет:

регистры наверное 74CH595, а датчик давления BMP180 или BMP085...Проект трудоёмкий, но всё равно спасибо!

74CH595, BMP 180 - да, все верно, опечатался, спосибо за поправку.

Lelik Lelikovich
Offline
Зарегистрирован: 24.01.2017

arDubino пишет:

хоть бы че полезное сделал а.

Целью данного проекта было изучение работы сдвиговых регистров и получение времени через WIFI для реализации другого проекта, таксказать промежуточная тестовая конструкция (братся сразу за сложный проект немного страшновато). Ну а поскольку получилось вполне функциональное устройство решил выложить сдесь, может кому пригодятся наработки.

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

Вот что то подобное давно ищу.Только попроще. Ардуино,4 матрицы,DS3231,и плюс светодиоды и сдвиговые регистры. Так как DS3231 часы относительно точные,то даже кнопки настройки не обязательны. Ничем не можешь помочь? Есть пару рабочих скетчей для 4 матриц,а как прикрутить сдвиговые регистры не могу сообразить. В программировании я не силен,от слова вообще!

Lelik Lelikovich
Offline
Зарегистрирован: 24.01.2017

ну вот есть описание http://arduino.ru/Tutorial/registr_74HC595 , там и схема подключения и примеры кода даны.

у меня немножко иначе написано в коде, но это несущественно, смысл тотже что и в примере.

-- фрагмент кода выдающий на сдвиговые регистры команды для отображения текущего времени --

0909 ////вывод часы
0910 if (hour > 11) ch = hour-12; else ch = hour;
0911   for(x=12;x>0;x--) {
0912     if (x == ch+1) {
0913       digitalWrite(DS, HIGH);  
0914     else {
0915       digitalWrite(DS, LOW); 
0916     }
0917    digitalWrite(SH_CP, LOW);
0918    digitalWrite(SH_CP, HIGH); 
0919   }
0920 ////вывод часы
0921 ////вывод минут
0922   for(x=60;x>0;x--) {
0923     if (x == minute+1) {
0924       digitalWrite(DS, HIGH);  
0925     else {
0926       digitalWrite(DS, LOW); 
0927     }
0928    digitalWrite(SH_CP, LOW);
0929    digitalWrite(SH_CP, HIGH); 
0930   }
0931 ////вывод минут
0932 ////вывод секунд
0933   for(x=60;x>0;x--) {
0934     if (x == second+1) {
0935       digitalWrite(DS, HIGH);  
0936     else {
0937       digitalWrite(DS, LOW); 
0938     }
0939    digitalWrite(SH_CP, LOW);
0940    digitalWrite(SH_CP, HIGH); 
0941   }
0942 ////вывод секунд
0943 digitalWrite(ST_CP, HIGH);

на входе этого кода есть 3 переменные - hour, minute, second, в которых имеются текущие значения времени. x == minute+1 это небольшой сдвиг для коректного отображения (изначально было все здвинуто на одно значение)

вывод анимации (бегающие огоньки на 00 минут) реализовано также, только значения берутся из масива (строки основного кода 101-140)

в данной конструкции у меня стоит 17 микросхем регистровых сдвигов, статичкая индикация (еще бывает динамическая индикация, при динамической индикации потребывалось бы всего 5 микросхем регистровых сдвигов)

что еще добавить я даж и низнаю, тут какбэ все просто, код и примеры и схему подключения я указал, если еще вопросы то на почту ra0ceq (ГАВГАВ) ya.ru т.к. я суда редко захожу.

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

Вопросы конечно есть. Только какая-то почта странная,без @ . У меня письмо на такую почту не отправляется. Будь добр,черкни пару слов мне на почту lesha131@gmail.com   ,я тогда увижу правильный адрес. Буду очень признателен!

post125
Offline
Зарегистрирован: 15.10.2018

Lelik Lelikovich пишет:

Ардуино часы...

...и синхронизация времени через интернет (через NTP сервера)

 

Добрый день!

Накак не хочет синхронизироваться время.

застревает на получении ответа от сервера (на сколько я понимаю)

 

RST OK!
Connect OK!
Connect TD? .........................OK!
----------------------- ERROR -----------------------

Может прошивка ESP не та? Пробовал на АТ прошивках 1.5.3 и на 1.6.2. На 0.9.3 и 0.9.4 просто зависает. Подскажите, пожалуйста, что можно проверить.

Lelik Lelikovich
Offline
Зарегистрирован: 24.01.2017

Добрый день!

со времени публикации прошло много времени, NTP сервера стали неактуальны, нужно актуализировать.

это строки:

1925 Serial3.println("AT+CIPSTART=\"UDP\",\"24.56.178.140\",123");
1928 Serial3.println("AT+CIPSTART=\"UDP\",\"91.226.136.141\",123");
1931 Serial3.println("AT+CIPSTART=\"UDP\",\"129.6.15.28\",123");
 
это - тип соединения UDP, ИП-адрес, порт сервера, поставить суда рабочие\актуальные и все опять заработает. перед заменой адреса желательно проверить его работоспособность.  (кстати 3 строки\3 сервера были заданы для уменьшения вероятности отказа в корекции времени)
 
WIFI модуль ESP-01... версию прошивки даж несмотрел, но на 5 ESP с али работает 
post125
Offline
Зарегистрирован: 15.10.2018

Lelik Lelikovich пишет:

Добрый день!

со времени публикации прошло много времени, NTP сервера стали неактуальны, нужно актуализировать.

это строки:

1925 Serial3.println("AT+CIPSTART=\"UDP\",\"24.56.178.140\",123");
1928 Serial3.println("AT+CIPSTART=\"UDP\",\"91.226.136.141\",123");
1931 Serial3.println("AT+CIPSTART=\"UDP\",\"129.6.15.28\",123");
 
это - тип соединения UDP, ИП-адрес, порт сервера, поставить суда рабочие\актуальные и все опять заработает. перед заменой адреса желательно проверить его работоспособность.  (кстати 3 строки\3 сервера были заданы для уменьшения вероятности отказа в корекции времени)
 
WIFI модуль ESP-01... версию прошивки даж несмотрел, но на 5 ESP с али работает 

благодарю за ответ, сейчас попробую

post125
Offline
Зарегистрирован: 15.10.2018

Lelik Lelikovich пишет:

это строки:

1925 Serial3.println("AT+CIPSTART=\"UDP\",\"24.56.178.140\",123");
1928 Serial3.println("AT+CIPSTART=\"UDP\",\"91.226.136.141\",123");
1931 Serial3.println("AT+CIPSTART=\"UDP\",\"129.6.15.28\",123");

  а здесь сервера типа us.pool.ntp.org допустимо прописывать? или только в цифрах?

Lelik Lelikovich
Offline
Зарегистрирован: 24.01.2017

непомню, наверно нет , но с цифрами точно работает.

post125
Offline
Зарегистрирован: 15.10.2018

Lelik Lelikovich пишет:

непомню, наверно нет , но с цифрами точно работает.

Премного благодарен!

Server answer :
!----------------------- The UTC time is 22:57:29 -----------------------
 

Только пока в RTC не прописывает, но это уже другая тема.

post125
Offline
Зарегистрирован: 15.10.2018

Спасибо, все работает, просто забыл, что обновляются только минуты и секунды

Lelik Lelikovich
Offline
Зарегистрирован: 24.01.2017

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

post125
Offline
Зарегистрирован: 15.10.2018

Lelik Lelikovich пишет:

я это опустил для упращения

Очень разумно. так и оставлю, а то еще головная боль с переходом на зимнее/летнее время. Как оказалось, адреса NTP серверов в текстовом виде в скетче работают.