Ардуино часы
- Войдите на сайт для отправки комментариев
Втр, 24/01/2017 - 05:15
Ардуино часы
Состав:
- ардуино мега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); } }
регистры наверное 74CH595, а датчик давления BMP180 или BMP085...Проект трудоёмкий, но всё равно спасибо!
хоть бы че полезное сделал а.
там вон в исполнителях тем для приложения рук море
регистры наверное 74CH595, а датчик давления BMP180 или BMP085...Проект трудоёмкий, но всё равно спасибо!
74CH595, BMP 180 - да, все верно, опечатался, спосибо за поправку.
хоть бы че полезное сделал а.
Целью данного проекта было изучение работы сдвиговых регистров и получение времени через WIFI для реализации другого проекта, таксказать промежуточная тестовая конструкция (братся сразу за сложный проект немного страшновато). Ну а поскольку получилось вполне функциональное устройство решил выложить сдесь, может кому пригодятся наработки.
Вот что то подобное давно ищу.Только попроще. Ардуино,4 матрицы,DS3231,и плюс светодиоды и сдвиговые регистры. Так как DS3231 часы относительно точные,то даже кнопки настройки не обязательны. Ничем не можешь помочь? Есть пару рабочих скетчей для 4 матриц,а как прикрутить сдвиговые регистры не могу сообразить. В программировании я не силен,от слова вообще!
ну вот есть описание 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 т.к. я суда редко захожу.
Вопросы конечно есть. Только какая-то почта странная,без @ . У меня письмо на такую почту не отправляется. Будь добр,черкни пару слов мне на почту lesha131@gmail.com ,я тогда увижу правильный адрес. Буду очень признателен!
Ардуино часы...
...и синхронизация времени через интернет (через NTP сервера)
Добрый день!
Накак не хочет синхронизироваться время.
застревает на получении ответа от сервера (на сколько я понимаю)
RST OK!
Connect OK!
Connect TD? .........................OK!
----------------------- ERROR -----------------------
Может прошивка ESP не та? Пробовал на АТ прошивках 1.5.3 и на 1.6.2. На 0.9.3 и 0.9.4 просто зависает. Подскажите, пожалуйста, что можно проверить.
Добрый день!
со времени публикации прошло много времени, NTP сервера стали неактуальны, нужно актуализировать.
это строки:
Добрый день!
со времени публикации прошло много времени, NTP сервера стали неактуальны, нужно актуализировать.
это строки:
это строки:
непомню, наверно нет , но с цифрами точно работает.
непомню, наверно нет , но с цифрами точно работает.
Server answer :
!----------------------- The UTC time is 22:57:29 -----------------------
Только пока в RTC не прописывает, но это уже другая тема.
Спасибо, все работает, просто забыл, что обновляются только минуты и секунды
ну да, при обновлении часов нужно задавать часовые пояса и делать пересчет на свой часовой пояс, я это опустил для упращения, потому как часы немогут за сутки уйти более 1 минуты, 1-2 секунды максимум, ну если необходимо можно и обновление часов дописать.
я это опустил для упращения