код полностью
#include <Adafruit_GFX.h> //Библиотеки для работы с матрицами
#include <Adafruit_NeoMatrix.h> //Библиотеки для работы с матрицами
#include <Adafruit_NeoPixel.h> //Библиотеки для работы с матрицами
#include <Wire.h> // Если используется аппаратная шина I2C, то подключаем библиотеку Wire, до подключения библиотеки iarduino_RTC (для модуля часов).
#include <iarduino_RTC.h> // Подключаем библиотеку iarduino_RTC для работы с модулями реального времени.
#include <Fonts/FreeSansBold9pt7b.h> // Подключение шрифта высотой 13 пикселей
#include <NecDecoder.h> // Библиотека Гувера для ИК приемника
#include "DHT.h" // Библиотека датчика температуры и влажности
#include <TimeLord.h> // Библиотека расчета времени захода и восхода солнца и фаз луны
#include "FontsRus/TimesNRCyr10.h"
#include "FontsRus/TimesNRCyr9.h"
#include "FontsRus/FreeSansOblique6.h"
#include "Fonts/FreeSerifBoldItalic9pt7b.h"
#include "FontsRus/TimesNRCyr7.h"
#include "FontsRus/TimesNRCyr6.h" // Русский шрифт. Изменены символ A - латинская на прямоугольник большой и @ на прямоугольник маленикий
#include "FontsRus/TimesNRCyr8.h"
// Мои функции приведенные в конце кода (после loop())
void fromsun(); // Функция подбора времени захода и восхода
void gimn(); // Функция проигрывания гимна РФ на пищалке
void lordt(); // Функция для определения восхода и захода солнца и фазы луны
void modechoice(); // Функция выбора режима или настройки часов с пульта ДУ
// Назначение пинов для устройств
#define tonePin 5 // Пин для пищалки
#define DHTPIN 7 // Пин на датчик температуры и влажности
#define PIN 12 // Пин для светодидной матрицы
#define ESP_RST_PIN 7 // Пин для сброса ESP8266
#define ESP_EN_PIN 8
//Определение переменных
//Переменные редактируемые для настройки устройства на отключение матрицы
int offmin = 15; // Минуты отключения матрицы
int offhour = 0; // Часы отключения матрицы
int onmin = 30; // Минуты включения матрицы
int onhour = 5; // Часы включения матрицы
// Переменные времени
int min = 0; // Переменная для minutes
int sekunda = 0; // Переакнная для секунды (в программе не используется)
int hou = 0; // Переменная для Hours
int den = 0; // Переменная для day
int mon = 0; // Переменная для month
int year = 0; // Переменная для year
int week = 0; // Переменная для weekday
//Переменные функции бегущей строки
int pass = 0; // Индекс массива цветов
int startrun = 48; // Начало координат начала бегущей строки
String runtext; // Текст для бегущей строки
int runstr = 0; // Определяет выводится ли бегущаяя строка или данные о восходе и заходе в режиме 1.
// Переменные функций подключения к интернету
int st1 = 0; // счетчик подключения к интернету
int st2 = 0; // счетчик ожидания вода данных сети
int st3 = 0; // счетчик отсутвия данных точного времени (так для информации)
int status = 6; // Переменная статуса полученных данных из последовательного порта
int errordata; // 0 - Данные времени из интернета получены и применяются, 1 - Ошибка. Данные на получены и применяется врямя из модуля часов
int stcount = 0; // счетчи к максимального количества шагов при подключении к интернету
String inputString = ""; // Переменная для получения времени (временная)
int countitime = 0; // Счетчик для массива int datatime [6] в который заносятся данные времени полученные с ESP8266
int datatime [7]; // массив данных времени
const char* espdata; // временные переменные
char* ee; // временные переменные
char c ; // временные переменные
// Переменные для астрономических данных
float const LONGITUDE = 30.2017; // значения долготы (западные значения отрицательные) 30°12′05″ в.д. (для Сертолово)
float const LATITUDE = 60.1444; // значения широты (южные значения отрицательные) 60°08′39″ с.ш. (для Сертолово)
String voshod; // Значения времени восхода
String zahod; // Значения времени захода
float phase; // Фаза луны в числах библиотеки TimeLord
int moon; // Фаза луны в определении
uint8_t step = 1; // для организации таймера
int moder = 4; // Режим 3. Поочередный вывод режима 1 и режима 2
int mode = 1; // Переменная указывающая режим
auto korrect = 1; // Переменная применяется при чтении кнопок нажатия пульта.
NecDecoder ir; // объект для работы с ик приемник
int show = 1; // если 0 то матрица не работает (наверное можно без нее)
int runcaunt;
uint32_t last_millis = 0; // Переменная для организации таймера
String weekday1; // Переменная будних дней недели
String weekday2; // Переменная выходных дней недели
// Создание объектов
iarduino_RTC time(RTC_DS3231); // для модуля DS3231 с i2C
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(16, 16, 3, 1, PIN, // Декларирование матрицы. См. описание 1 (внизу)
NEO_TILE_TOP + NEO_TILE_LEFT + NEO_MATRIX_COLUMNS + NEO_TILE_PROGRESSIVE +
NEO_MATRIX_TOP + NEO_MATRIX_LEFT + NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
NEO_GRB + NEO_KHZ800);
DHT dht(DHTPIN, DHT11); //Датчика DHT11 (синий корпус)
// Массив цветов для светодиодной матрицы
const uint16_t colors[] = {
matrix.Color(150, 0, 115), // 0
matrix.Color(11, 224, 217), // 1
matrix.Color(255, 0, 0), // 2 Красный
matrix.Color(0, 255, 0), // 3 Зеленый
matrix.Color(0, 0, 255), // 4 Синий
matrix.Color(176, 40, 176), // 5 Фиолетовый
matrix.Color(255, 12, 200), // 6
matrix.Color(255, 255, 255), // 7 белый
matrix.Color(254, 180, 52) // 8 лунный
};
void setup()
{
// Настройка пинов управления ESP8266
pinMode(ESP_RST_PIN, OUTPUT);
pinMode(ESP_EN_PIN, OUTPUT);
// Включение ESP8266
digitalWrite(ESP_EN_PIN, HIGH);
digitalWrite(ESP_RST_PIN, HIGH);
// Инициализация последовательных портов
Serial.begin(9600); // Для отладки и вывода на монитор
Serial3.begin(115200); // Для связи с ESP8266
time.begin(); // Инициируем модуль часов.
dht.begin(); // Инициируем модуль температуры и влажности
matrix.begin(); // Инициируем светодиодную матриу
itime(); // Получение времени с интернета
// Считываем данные часов в переменные
min = time.minutes;
hou = time.Hours;
den = time.day;
mon = time.month;
year = time.year;
week = time.weekday;
}
//***************************************************************************************************************************************
// Функция вывода на матрицы информацию о подключении к WiFi
void wificonn ()
{ matrix.setBrightness(50);
matrix.setTextColor(colors[1]);
matrix.setFont();
matrix.fillScreen(0);
matrix.setCursor(3, 4);
matrix.print("WAITING");
matrix.show();
return;
}
//******************************************************************************************************************************************
// Бегущая строка
void runstring()
{ int j = 0;
startrun = 48;
// Организуем смену цветов в бегущей строке
pass++;
if (pass == 9) pass = 0;
matrix.setTextColor(colors[pass]); // Применяем следующий цвет из массива
// Цикл прокрутки строки
while (j != runcaunt)
{
j++;
matrix.fillScreen(0); // Очистка экрана
matrix.setCursor(startrun, 10); // Определяем позицию начала текста (x, y)
matrix.setFont(&TimesNRCyr7pt8b); // Используем наш шрифт
matrix.print(runtext); // Выводим текст на экран
startrun--;
matrix.show(); // Показываем обновленное изображение на матрице
delay(30); // Задерживаем выполнение на 30 миллисекунд
}
}
//**********************************************************************************************************************************
// Вывод на матрицу информацию о попытках подключения к WiFi сети
void wifistatus1 ()
{ matrix.setBrightness(50);
matrix.setTextColor(colors[3]);
matrix.setFont();
matrix.fillScreen(0);
matrix.setCursor(2, 4);
matrix.print("WIFI");
matrix.setTextColor(colors[1]);
matrix.setCursor(34, 4);
matrix.print(st1);
matrix.show();
return;
}
//**********************************************************************************************************************************
// Вывод на матрицу ожидания данных сети
void wifistatus2 ()
{ matrix.setBrightness(50);
matrix.setTextColor(colors[2]);
matrix.setFont();
matrix.fillScreen(0);
matrix.setCursor(0, 0);
matrix.print("DATA net");
matrix.setTextColor(colors[1]);
matrix.setCursor(20, 8);
matrix.print(st2);
matrix.show();
return;
}
//**********************************************************************************************************************************
// Вывод на матрицу информации о неудачном получении данных точного времени
void wifistatus3 ()
{ matrix.setBrightness(50);
matrix.setTextColor(colors[2]);
matrix.setFont();
matrix.fillScreen(0);
matrix.setCursor(4, 0);
matrix.print("NO DATA");
matrix.setTextColor(colors[1]);
matrix.setCursor(20, 8);
matrix.print(st3);
matrix.show();
return;
}
//**********************************************************************************************************************************
// Функция получения данных от ESP8266
void itime()
{
wificonn ();
resetESP8266();
delay (3000);
resetESP8266();
while ( status != 99 && stcount != 400 )
{
// Условия устраният зависания при включении когда количесво попыток начинает превышать заданное
if (status == 6)
{
wifistatus1 ();
st1++;
if (st1 == 80) status = 99;
}
if (status == 77) {wifistatus2 (); st2++; }
if (status == 88) {wifistatus3 (); st3++; delay (5000);}
delay (1000);
inputString = "";
// Serial.println(status); // Для отладки
while (Serial3.available())
{
c = Serial3.read(); // Посимвольно читаем порт Serial3
inputString += c; // Заносим полученные данные в строку
if (c == '\n') espdata = inputString.c_str(); // Если дошли до конца строки
}
ee = strtok(espdata,":"); //Разделяет строку на токены на основе разделителя ":". Токен — это подстрока, разделённая разделителями, которые могут быть любым символом или набором символов.
countitime = 0;
while (ee!= NULL) {
datatime[countitime] = atoi(ee);
status = datatime[0];
min = datatime[1];
hou = datatime[2];
den = datatime[3];
mon = datatime[4];
year = datatime[5];
week = datatime[6];
ee = strtok(NULL,":");
countitime ++;
}
stcount++;
}
if (year == 0 || year == 1970)
{
// Serial.println("Данные не получены"); // Для отладки
errordata = 1;
}
else
{
//Serial.println("Данные получены"); // Для отладки
errordata = 0;
year=year-2000; // Получение двузначного значения года
time.settime(-1 ,min, hou, den, mon, year, week);
}
return;
}
//******************************************************************************************************************************
// Функция сброса/перезагрузки ESP
void resetESP8266() {
digitalWrite(ESP_RST_PIN, LOW);
delay(100);
digitalWrite(ESP_RST_PIN, HIGH);
delay(4000); // Даем время на загрузку ESP8266
}
//******************************************************************************************************************************
//Функция прерывания обрабатываем кнопки пульта
void irIsr() {
ir.tick();
if (ir.available()) {
//Serial.println(ir.readCommand(), HEX); // Для отладки. Дает код нажатой клавиши пульта
korrect = ir.readCommand();
}
}
//*****************************************************************************************************************************
// ДЛЯ РЕЖИМА 1
// Функция вывода времени на матрицу
void clockmatr()
{
matrix.setBrightness(10);
matrix.setTextColor(colors[1]);
if (errordata == 1) matrix.setTextColor(colors[2]); // Цвет цифр времени если время с интернета не получено
switch (mode)
{
case 1:
matrix.setFont(&FreeSansBold9pt7b); // Шрифт цифр времени для режима 1
matrix.fillScreen(0);
matrix.setCursor(1, 13);
break;
case 2:
matrix.setFont(&FreeSerifBoldItalic9pt7b); // Шрифт цифр времени для режима 2
matrix.fillScreen(0);
matrix.setCursor(4, 12);
break;
}
matrix.print(time.gettime("H:i"));
matrix.show();
return;
}
//****************************************************************************************************************************
// Функция вывода температуры и влажности на матрицу
void tempvlaz()
{
float h = dht.readHumidity(); //Измеряем влажность
float t = dht.readTemperature(); //Измеряем температуру
if (isnan(h) || isnan(t)) { // Проверка. Если не удается считать показания, выводится «Ошибка считывания», и программа завершает работу
Serial.println("Ошибка считывания");
return;
}
t = (int)t;
matrix.fillScreen(0);
matrix.setFont();
matrix.setTextColor(colors[2]);
if (t>0) {
matrix.setCursor(3, 5);
matrix.print("+");
matrix.print(t,0);
}
else
{
matrix.setCursor(8, 5);
matrix.print(t,0);
}
matrix.setFont();
matrix.setTextColor(colors[4]);
matrix.setCursor(28, 5);
matrix.print(h,0);
matrix.print("%");
matrix.show();
return;
}
//*****************************************************************************************************************************************************************
// Функция вывода даты на матрицу. Дни недели обозначены квадратиками. Текущий день недели высокий квадрат (символ A). остальные дни символ @
void matrdate ()
{ matrix.setBrightness(10);
matrix.setTextColor(colors[7]);
matrix.setFont();
matrix.fillScreen(0);
matrix.setCursor(0, 0);
matrix.print(time.gettime("d-m-y"));
matrix.setFont(&TimesNRCyr6pt8b); //внимание шрифт измененный
matrix.setTextColor(colors[7]);
matrix.setCursor(3, 14);
matrix.print(weekday1); // будние дни
matrix.setTextColor(colors[2]);
matrix.print(weekday2); // суббота и воскресенье
matrix.show();
return;
}
//************************************************************************************************
// Функция вывода фаз луны на матрицы. Шрифт измененный
void phasemoon ()
{ // matrix.setTextWrap(false); // запрет перевода строки в матрице
matrix.setBrightness(10);
matrix.setTextColor(colors[8]);
matrix.setFont(&TimesNRCyr6pt8b); //Внимание измененный шрифт
matrix.fillScreen(0);
matrix.setCursor(0, 11);
switch (moon)
{
case 1:
matrix.print("B"); // Новая луна;
matrix.setCursor(18, 16);
matrix.print("НОВ.");
break;
case 2:
matrix.print("I"); // "молодая луна";
matrix.setCursor(18, 16);
matrix.print("НОВАЯ");
break;
case 3:
matrix.print("G"); //"1 четверть";
matrix.setCursor(18, 16);
matrix.print("1 ЧТ");
break;
case 4:
matrix.print("F"); //" растущая луна";
matrix.setCursor(18, 16);
matrix.print("РАСТ");
break;
case 5:
matrix.print("E"); // "полная луна";
matrix.setCursor(18, 16);
matrix.print("ПОЛН");
break;
case 6:
matrix.print("D"); // "убывающая луна";
matrix.setCursor(18, 16);
matrix.print("УБЫВ");
break;
case 7:
matrix.print("C"); // "2 четверть";
matrix.setCursor(18, 16);
matrix.print("2 ЧТ");
break;
case 8:
matrix.print("J"); // "старая луна";
matrix.setCursor(18, 16);
matrix.print("СТАР");
break;
}
matrix.setTextColor(colors[1]);
matrix.setCursor(18, 8);
matrix.print("ЛУНА");
matrix.show();
return;
}
//************************************************************************************************
// Функция отлючения матрицы
void matrixoff ()
{ matrix.fillScreen(0) ;
matrix.show();
time.gettime("H:i");
Serial.println(hou);
Serial.println(mode);
Serial.println(time.minutes);
return;
}
//************************************************************************************************
// Функция вывода времени восхода и захода данные забиты или бегущая строка о празднике
void matrvoshod ()
{ if(mon==5 && den==9 && mode == 1)
{
runcaunt = 150;
runtext = "День победы";
runstring();
runstr = 1; }
if(mon==5 && den==1 && mode == 1)
{
runcaunt = 150;
runtext = "День труда";
runstring();
runstr = 1;}
if(mon==7 && den==23 && mode == 1)
{
runcaunt = 240;
runtext = "С днем рождения Леночка";
runstring();
runstr = 1;}
if(mon==7 && den==25 && mode == 1)
{
runcaunt = 200;
runtext = "С днем рождения Сергей";
runstring();
runstr = 1;}
if(mon==1 && den==1 && mode == 1)
{
runcaunt = 150;
runtext = "С новым годом";
runstring();
runstr = 1;}
if(mon==12 && den==31 && mode == 1)
{
runcaunt = 150;
runtext = "С новым годом";
runstring();
runstr = 1;}
if(mon==1 && den==7 && mode == 1)
{
runcaunt = 150;
runtext = "С Рождеством";
runstring();
runstr = 1;}
if(mon==3 && den==8 && mode == 1)
{
runcaunt = 200;
runtext = "С праздником 8 марта";
runstring();
runstr = 1;}
if(mon==2 && den==23 && mode == 1)
{
runcaunt = 200;
runtext = "С днем защитника отечества";
runstring();
runstr = 1;}
if(mon==8 && den==12 && mode == 1)
{
runcaunt = 200;
runtext = "Неплохой день";
runstring();
runstr = 1;}
if (runstr == 0 )
{
matrix.fillScreen(0) ;
matrix.setTextColor(colors[4]);
matrix.setCursor(10, 1);
matrix.print(zahod);
matrix.setCursor(12, 9);
matrix.setTextColor(colors[2]);
matrix.print(voshod);
matrix.show();
return;}
}
// *****************************************************************************************************************************
// Режим работы 1
void mode1()
{
if(millis() - last_millis >= 7000 && step == 1 ) // Вывод часов на 7 сек
{
last_millis = millis();
clockmatr();
step = 2;
}
if(millis() - last_millis >= 7000 && step == 2 ) // Вывод часов на даты и дня недели
{
last_millis = millis();
matrdate ();
step = 3;
}
if(millis() - last_millis >= 5000 && step == 3 ) // Вывод температуры и влажность
{
last_millis = millis();
tempvlaz();
step = 4;
}
if(millis() - last_millis >= 5000 && step == 4 ) // Вывод твремени восхода и захода солнца
{
last_millis = millis();
fromsun();
matrvoshod ();
step = 5;
}
if(millis() - last_millis >= 5000 && step == 5 )
{
last_millis = millis();
clockmatr();
step = 1;
}
}
//************************************************************************************************************
// Режим работы 2
void mode2()
{
if(millis() - last_millis >= 7000 && step == 1 )
{
last_millis = millis();
clockmatr();
step = 2;
}
if(millis() - last_millis >= 5000 && step == 2 )
{
last_millis = millis();
tempvlaz();
step = 3;
}
if(millis() - last_millis >= 5000 && step == 3 )
{
last_millis = millis();
lordt();
matrvoshod ();
step = 4;
}
if(millis() - last_millis >= 5000 && step == 4 )
{
last_millis = millis();
lordt();
phasemoon ();
step = 5;
}
if(millis() - last_millis >= 5000 && step == 5 )
{
last_millis = millis();
clockmatr();
step = 1;
}
}
//*****************************************************************************************************
void loop()
{
// Вызов прерывания при нажатии клавиши на пульте для установки времени
attachInterrupt(0, irIsr, FALLING);
modechoice();
if (korrect==0) time.settime(-1, min,hou,den,mon,year,week);
korrect=1;
// Serial.println(time.gettime("d-m-Y, H:i:s, D"));
den = time.day;
mon = time.month;
min = time.minutes;
hou = time.Hours;
sekunda = time.seconds;
year = time.year;
week = time.weekday;
time.gettime("d:m:y");
// Блок присваивающий переменной текущий день недели использует измененный шрифт
switch (week)
{
case 0:
weekday1 = "@@@@@";
weekday2 = "@A";
break;
case 1:
weekday1 = "A@@@@";
weekday2 = "@@";
break;
case 2:
weekday1 = "@A@@@";
weekday2 = "@@";
break;
case 3:
weekday1 = "@@A@@";
weekday2 = "@@";
break;
case 4:
weekday1 = "@@@A@";
weekday2 = "@@";
break;
case 5:
weekday1 = "@@@@A";
weekday2 = "@@";
break;
case 6:
weekday1 = "@@@@@";
weekday2 = "A";
break;
}
// Смена режима 1 и 2 каждые 15 минут
if (moder == 4)
{
switch (min)
{
case 5: // Режим 1-14 сек время, 5 секунд дата, темпрература и влажность, 5 сек время восхода и хахода солнца
mode = 1;
break;
case 20:
mode = 2;
break;
case 35:
mode = 1;
break;
case 55: // Режим 1-14 сек время, 5 секунд дата, темпрература и влажность, 5 сек время восхода и хахода солнца
mode = 2;
break;
}
}
//Играет гимн в 00.00 и в 12.00
if (min==0 && hou == 0 && sekunda == 0 || min==0 && hou == 12 && sekunda == 0 ) { clockmatr(); gimn();}
// Выключение матрицы в определенное время (ножной режим)
if (time.Hours == offhour && time.minutes == offmin)
{
while (time.Hours != onhour)
{ time.gettime("H:i:y");
while ( time.minutes != onmin)
{
show = 0;
matrixoff ();
}
}
}
switch (mode)
{
case 1: // Режим 1-14 сек время, 5 секунд дата, темпрература и влажность, 5 сек время восхода и хахода солнца
mode1();
break;
case 2: // Режим 1-14 сек время, 5 секунд дата, темпрература и влажность, 5 сек время восхода и хахода солнца
mode2();
break;
case 3:
itime();
mode = 1;
break;
case 4:
mode = 1; // Режим 1-14 сек время, 5 секунд дата, темпрература и влажность, 5 сек время восхода и хахода солнца
moder = 4;
break;
}
}
//****************************************************************************************************************************
// Функция управления с пульта ДУ
void modechoice()
{
switch (korrect)
{
case 162: // Прибавляем минуты
min++;
if( min == 60) min=0;
clockmatr();
korrect=0;
break;
case 34:
// clockmatr(); // Убавляем минуты
min--;
if( min == -1) min=59;
clockmatr();
korrect=0;
break;
case 98:
// clockmatr(); // Прибавляем часы
hou++;
if( hou == 24) hou=0;
clockmatr();
korrect=0;
break;
case 2:
// clockmatr(); // Убавляем часы
hou--;
if( hou == -1) hou=0;
clockmatr();
korrect=0;
break;
case 226:
// matrdate(); // Прибавляем день
den++;
if( den == 31) den=1;
matrdate();
korrect=0;
break;
case 194: // Убавляем день
// matrdate();
den--;
if( den == 0) den=31;
matrdate();
korrect=0;
break;
case 224: // Прибавляем месяц
// matrdate();
mon++;
if( mon == 31) mon=1;
matrdate();
korrect=0;
break;
case 104: // Убавляем месяц
// matrdate();
mon--;
if( mon == 0) mon=31;
matrdate();
korrect=0;
break;
case 168: // Прибавляем год
// matrdate();
year++;
if( year == 13) year=1;
matrdate();
korrect=0;
break;
case 152: // Убавляем год
// matrdate();
year--;
if( year == 0) year=12;
matrdate();
korrect=0;
break;
case 144: // Прибавляем день недели
week++;
if( week == 8) week = 1;
korrect=0;
break;
case 176: // Убавляем день недели
week--;
if( week == 0) week = 7;
korrect=0;
break;
case 24: // Режим 1 стрелка вверх
mode = 1;
moder = 1;
break;
case 74: // Режим 2 стрелка вниз
mode = 2;
moder = 1;
break;
case 16:
mode = 3; // Режим 3 стрелка влево Переподклбчение к интернету
break;
case 90:
mode = 4; // Режим 4 стрелка вправо Переключающийся режим каждые 15 мин
break;
case 56: // Режим 4 кнопка ОК
mode = 5;
break;
}
}
//*********************************************************************************************************************************
// Получение данных по времени восхода и захода по дням в году и фаз луны. Данные расчитываются
void lordt()
{
time.gettime("d:m:y");
TimeLord tardis; // Инициализация объекта TimeLord
tardis.TimeZone(3 * 60); // Установка часового пояса
tardis.Position(LATITUDE, LONGITUDE); // Устанавливается позиция в координатах
byte today[] = {sekunda, min, 12, den, mon, year}; // store today's date (at noon) in an array for TimeLord to use (format SS, MM, HH, DD, MM, YY)
tardis.SunRise(today); // Данные по времени восхода
if (today[tl_minute]<10)
{
voshod = String(today[tl_hour])+"."+"0"+ String(today[tl_minute]);
} else
{
voshod = String(today[tl_hour])+"."+ String(today[tl_minute]);
}
tardis.SunSet(today); // Данные по времени захода
if (today[tl_minute]<10)
{
zahod = String(today[tl_hour])+"."+"0"+ String(today[tl_minute]);
} else
{
zahod = String(today[tl_hour])+"."+ String(today[tl_minute]);
}
byte tonight[] = {sekunda, min, 0, den, mon, year};
phase= tardis.MoonPhase(tonight); // Данные по фазе луны
if (phase == 0) moon = 1; //"новая";
if (phase >= 0 && phase < 0.20) moon = 2; // "молодая луна";
if (phase >= 0.20 && phase <= 0.3) moon = 3; //"1 четверть";
if (phase > 0.3 && phase < 0.45) moon = 4; //" растущая луна";
if (phase >= 0.45 && phase <= 0.55) moon = 5; // "полная луна";
if (phase > 0.55 && phase < 0.70) moon = 6; // "убывающая луна";
if (phase >= 0.70 && phase<=0.8) moon = 7; // "2 четверть";
if (phase > 0.8 && phase <= 0.999) moon = 8; // "старая луна";
Serial.println(moon);
}