Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

7-сегментные часы с Arduino Nano + DS3231 + LDR

Компоненты и расходные материалы

Arduino Nano R3
хорошо работает с Arduino Uno или Elegoo Uno
× 1
7-сегментный рюкзак Adafruit - высокие цифры 1,2 дюйма
- 1,2 "высокие цифры в моем случае (необязательно, если вы покупаете комплект)
× 1
4-значный 7-сегментный дисплей Adafruit 1.2 с рюкзаком I2C - зеленый
× 1
Adafruit DS3231
или DS1307, если хотите
× 1
Резистор 100 кОм
× 1
Фоторезистор
× 1
Макет (общий)
× 1
Перемычки (общие)
10–14 штук
× 1
Батарея типа "таблетка" CR1220
× 1

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

Введение

Во времена, когда у вас всегда есть часы на запястье, будь то часы на запястье или смартфон, Arduino Uno / Nano немного скучен. В противном случае в этой статье у вас есть устройства, синхронизированные с NTP-сервером, которые постоянно находятся в сети через ваше Интернет-соединение.

История

Один из моих друзей отказался по личным причинам от устройства с Wi-Fi в своей спальне, поэтому у меня есть Arduino, оснащенный отдельными часами.

Выберите правильный продукт

Я был удивлен, сколько разных продуктов было доступно даже в Adafruit:в зависимости от желаемого натяжения, а также с разной точностью! Здесь я выбрал два продукта:более дешевый DS1307 . и, вероятно, более точный DS3231 .

Для ясности:в этих часах можно использовать оба продукта. Чтобы использовать DS1307, обратите внимание на правильное назначение PIN-кода и ограничение параметра отображения температуры: примечание "//" displayTemp (); функция внутри цикла ().

Адаптируйте эскиз

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

Объявление должно было быть как можно большим, поэтому я остановился на 7-сегментном объявлении:в конце концов, я хотел только иметь в виду время.

Следующий приятный сюрприз, который я испытал при просмотре эскизов:здесь DS3231 предоставляет возможность использовать температуру . , который в DS1307 - помимо неточности - отсутствует.

Инициируйте часы

Если у вас есть батарейка типа "таблетка" CR1220, вы можете следовать короткому руководству Adafruit по настройке часов. Таким образом, время загружается не из Интернета, а со временем с локального ПК. Отметка времени загрузки передается в таймеры.

Функции

После этого я добавил в схему светодиодную матрицу для вывода времени и температуры . . Период изменения времени и температуры можно установить с помощью переменных.

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

Здесь я обращаюсь к другим источникам Adafruit.

Эскиз завершается корректировкой летнего / зимнего времени . и яркость светодиодной матрицы в зависимости от внешнего освещения (ночью дисплей должен быть темнее, чем днем).

На видео вы наверняка заметили изменение времени и температуры. Вы обратили внимание на точку слева на картинке? Это меняет свое положение (вверх или вниз) в зависимости от секунд.

Дайте мне обратную связь, если вы знаете, как выдать "ERR" на светодиодной матрице в случае отказа часов. В момент появления "bEEF":

  // о нет, нет данных! Serial.println («Ошибка датчика DS3231 - не удается прочитать температуру»); matrix.print (0xBEEF, HEX); // информируем пользователя с помощью BEEF matrix.writeDisplay (); задержка (5000);  

Расширение

Будильник или время будильника также еще не интегрированы.

Возможно также удастся расширение через модуль Bluetooth и Blynk.

Обновление 01.02.2019:

Сегодня завершился переход с макета на постоянную ставку на перфокарту. Несколько картинок для интересующихся:

Во вложении вы найдете обновленный код v1.1, а также настроенное изображение фризинга.

Код

  • MyClock v1.0
  • MyClock v1.1
MyClock v1.0 C / C ++
 // MyClock v1.0 // Ingo Lohs // Аппаратное обеспечение:протестировано с Arduino Uno и Arduino Nano (ATmega328P [Old Bootloader]) с использованием Arduino IDE v1.8.8 / * Теория для матрицы ht16k33 Самый простой - просто позвонить print - как и в случае с Serialprint (переменная, HEX) - будет напечатано шестнадцатеричное число от 0000 до FFFFprint (переменная, DEC) или print (переменная) - будет напечатано десятичное целое число от 0000 до 9999. нужно больше контроля, вы можете вызвать writeDigitNum (location, number) - это запишет номер (0-9) в одно место. Местоположение # 0 полностью слева, местоположение # 2 - это точки двоеточия, поэтому вы, вероятно, Если вы хотите пропустить его, позиция # 4 находится полностью вправо. Для управления двоеточием и десятичными точками используйте функцию writeDigitRaw (расположение, растровое изображение). (Обратите внимание, что обе точки центрального двоеточия соединены вместе внутри дисплея. , поэтому невозможно адресовать их по отдельности.) Укажите 2 для местоположения, и биты будут отображаться следующим образом:0x02 - центральное двоеточие (оба d ots) 0x04 - левое двоеточие - нижняя точка0x08 - левое двоеточие - верхняя точка0x10 - десятичная точка Если вам нужна десятичная точка, вызовите writeDigitNum (location, number, true), который закрасит десятичную точку. Чтобы нарисовать двоеточие, используйте drawColon (true или false) Если вы хотите полностью контролировать сегменты во всех цифрах, вы можете вызвать writeDigitRaw (location, bitmask), чтобы нарисовать необработанную 8-битную маску (хранящуюся в uint8_t) в любое место. Все процедуры рисования изменяют только отображение память хранится в Arduino. Не забудьте вызвать writeDisplay () после рисования, чтобы «сохранить» память в матрице через I2C. Источник:https://www.mouser.com/ds/2/737/adafruit-led-backpack-932846. pdf * / # include  // Включите эту строку при использовании Arduino Uno, Mega и т. д. # include  #include "Adafruit_LEDBackpack.h" #define DS3231_I2C_ADDRESS 0x68int ldr_sensor =A0; // Фоторезистор LDR с сопротивлением 100 кОм на массу, другая нога 5Vint ldr_value =0; // значение LDR - значение var store int яркость_matrix; // Яркость светодиодной матрицы - значение var storeint threshold_brightness =400; // Пороговое значение blinkrate_value =0; // Частота мигания светодиодной матрицы int delay_matrix_time =20; // сколько времени отображается (20 сек) int delay_matrix_temp =2000; // сколько времени показывать temp (2 секунды) int blinky_dot =2; // ничего не мигает - слева 2 одиночные точки Adafruit_7segment matrix =Adafruit_7segment (); byte decToBcd (byte val) {return ((val / 10 * 16) + (val% 10));} byte bcdToDec (byte val) { return ((значение / 16 * 10) + (значение% 16));} void setup () {Serial.begin (9600); Wire.begin (); matrix.begin (0x70);} void loop () {lightBrightness (); // Определение яркости матрицы matrixBlinkrate (); // Mattrix-Blinkrate Jusitierung displayTime (); // отображаем данные часов реального времени displayTemp (); // отображаем температуру} void lightBrightness () {// setBrightness (яркость) - позволит вам изменить общую яркость всего дисплея. 0 - наименее яркое, 15 - самое яркое, и это то, что инициализируется дисплеем при запуске ldr_value =analogRead (ldr_sensor); Serial.print ("LDR:"); Serial.println (ldr_value); if (ldr_value <=threshold_brightness) {// измерение яркости по сравнению с Threshold bright_matrix =0; // яркое при дневном свете} else {яркость_matrix =15; // темно ночью}} void matrixBlinkrate () {// blinkRate (rate) - Вы можете мигать на весь экран. 0 не мигает. 1, 2 или 3 предназначены для мигания дисплея. matrix.blinkRate (blinkrate_value);} void displayTime () {matrix.setBrightness (матрица яркости); matrix.clear (); // сколько времени отображается на матрице в секундах for (uint16_t i =0; i > Переход на летнее время - последнее воскресенье марта в 2 часа if ((dayOfWeek ==7) &&(dayOfMonth> =25) &&(month ==3) &&(hour ==2)) {// nastavení hodin na 3 hodinu // установить часы на 3 часа setDS3231time (se, mi, 3, we, dm, mo, ye); } // změna času na zimní //>> Переход на зимнее время if ((dayOfWeek ==7) &&(dayOfMonth> =25) &&(month ==10) &&(hour ==1) &&(year! =1 )) {// rok použit jako indikace, že bylo léto // год используется как указание на то, что было лето setDS3231time (se, mi, ho, we, dm, mo, 1); } if ((dayOfWeek ==7) &&(dayOfMonth> =25) &&(month ==10) &&(hour ==3) &&(year ==1)) {// наступил ход на 2 года и на 0 // устанавливаем часы на 2 часа и отмечаем год равным 0 setDS3231time (se, mi, 2, we, dm, mo, 0); } / * Укажите 2 для местоположения, и биты отображаются следующим образом:0x02 - центральное двоеточие (обе точки) 0x04 - левое двоеточие - нижняя точка 0x08 - левое двоеточие - верхняя точка 0x10 - десятичная точка * / / * расположение # 2 контролирует также две левые одиночные точки, подобные этому (=blinky_dot):2 =ничего не мигает 3 =ничего не мигает 4 =мигает вверху слева (одна верхняя точка) 5 =мигает вверху слева (одна верхняя точка) 6 =мигает вверху слева (одна верхняя точка) ) + оба двоеточия в середине 7 =мигают вверху слева (одна верхняя точка) + оба двоеточия в середине 8 =мигают внизу слева (одна нижняя точка) 9 =мигает внизу слева (одна нижняя точка) 10 =мигает внизу слева (одна нижняя точка ) + оба двоеточия в середине 11 =мигают внизу слева (одна нижняя точка) + оба двоеточия в середине 12 =мигают оба двоеточия (обе точки слева) без двоеточия в середине * / // формат часов:_0:мм if (час> 9) {matrix.writeDigitNum (0, (час / 10), ложь); matrix.writeDigitNum (1, (час% 10), ложь); // это запишет число (0-9) в одно место по модулю https://www.arduino.cc/reference/en/language/structure/arithmetic-operators/modulo/} else {matrix.writeDigitNum ( 1, час, ложь); } // matrix.drawColon (true); // оба двоеточия в середине активны:если вы не хотите мигать, оставленные точки можно активировать здесь оба двоеточия // дать секундам возможность отобразить точки слева, если (se <=30) {blinky_dot =10; // мигает внизу слева (одна нижняя точка) + двоеточие посередине} else if (se> 30) {blinky_dot =6; // мигает верхний левый угол (одна верхняя точка) + двоеточие в середине} matrix.writeDigitRaw (2, blinky_dot); matrix.writeDigitNum (3, (минута / 10), ложь); matrix.writeDigitNum (4, (минута% 10), ложь); matrix.writeDisplay (); // мигающие двойные точки на полсекунды задержки (500); matrix.drawColon (ложь); matrix.writeDisplay (); задержка (500); }} void displayTemp () {matrix.setBrightness (яркость_матрица); matrix.clear (); byte temp =get3231Temp (); int abs_temp =abs (темп); // абсолютный номер значения matrix.writeDigitNum (1, (abs_temp% 10), false); // позиция 1, значение 9, показывать десятичную дробь) if (temp <0) matrix.writeDigitRaw (0,64); если (темп <=-10) matrix.writeDigitRaw (2,12); // а если температура отрицательная, мы ставим знак минус на первое место. если (temp>
 =10) matrix.writeDigitNum (0, (abs_temp / 10), false); // позиция 0, значение 1, показывать десятичную дробь) if (temp <=-10) matrix.writeDigitNum (0, (abs_temp / 10), false); // позиция 0, значение 1, показывать десятичную дробь) // matrix.writeDigitRaw (2,0x10); // десятичная матрица .writeDigitRaw (3,99); // 99 ="°" matrix.writeDigitRaw (4,57); // 57 ="C" matrix.writeDisplay (); // отображение значений температуры в последовательной строке // отображение температуры на серийной линии Serial.print ("Температура в C:"); Serial.println (get3231Temp ()); // +/- 3 градуса Цельсия // сколько времени отображать температуру на матрице в секундах delay (delay_matrix_temp);} void setDS3231time (байтовая секунда, байтовая минута, байтовый час, байтовый деньOfWeek, байтовый деньOfMonth, байтовый месяц, байтовый год) {/ / установить дату и время для DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // устанавливаем следующий ввод для начала в регистре секунд Wire.write (decToBcd (second)); // устанавливаем секунды Wire.write (decToBcd (minute)); // устанавливаем минуты Wire.write (decToBcd (hour)); // устанавливаем часы Wire.write (decToBcd (dayOfWeek)); // устанавливаем день недели (1 =воскресенье, 7 =суббота) Wire.write (decToBcd (dayOfMonth)); // устанавливаем дату (от 1 до 31) Wire.write (decToBcd (month)); // установить месяц Wire.write (decToBcd (год)); // установить год (от 0 до 99) Wire.endTransmission ();} void getDateDs3231 (байт * секунда, байт * минута, байт * час, байт * dayOfWeek, байт * деньOfMonth, байт * месяц, байт * год) {Wire. beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); * второй =bcdToDec (Wire.read () &0x7f); * минута =bcdToDec (Wire.read ()); * час =bcdToDec (Wire.read () &0x3f); * dayOfWeek =bcdToDec (Wire.read ()); * dayOfMonth =bcdToDec (Wire.read ()); * месяц =​​bcdToDec (Wire.read ()); * год =bcdToDec (Wire.read ());} float get3231Temp () {byte tMSB, tLSB; float temp3231; Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0x11); Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 2); если (Wire.available ()) {tMSB =Wire.read (); // Дополнение до 2 int часть tLSB =Wire.read (); // дробная часть temp3231 =(tMSB &B01111111); // вычисляем двойки на Tmsb temp3231 + =((tLSB>> 6) * 0.25); // заботятся только о битах 7 и 8 return temp3231; } else {// о нет, нет данных! Serial.println («Ошибка датчика DS3231 - не удается прочитать температуру»); matrix.print (0xBEEF, HEX); // информируем пользователя с помощью BEEF matrix.writeDisplay (); задержка (5000); }} 
MyClock v1.1 C / C ++
Обновление Summer / Winter-Time
 // MyClock v1.1 // Ingo Lohs // Оборудование:протестировано с Arduino Uno и Arduino Nano (ATmega328P [Old Bootloader]) с использованием Arduino IDE v1.8.8 // Изменить v1.0> v1.1 // dayOfWeek ==1 anstatt 7 abgeändert в displayTime () zur korrekten Ermittlung des Sonntages für die Zeitumstellung / * Теория для матрицы ht16k33 Самый простой - просто вызвать print - точно так же, как вы делаете с Serialprint (variable, HEX) - будет напечатано шестнадцатеричное число от 0000 до FFFFprint (переменная, DEC) или print (переменная) - будет напечатано десятичное целое число от 0000 до 9999 Если вам нужно больше контроля, вы можете вызвать writeDigitNum (location, number) - это запишет номер (0-9) в одно место. Местоположение # 0 полностью слева, место # 2 - это точки с двоеточием, поэтому вы, вероятно, захотите пропустить его, местоположение # 4 полностью до Для управления двоеточием и десятичными точками используйте функцию writeDigitRaw (расположение, растровое изображение) (обратите внимание, что обе точки центрального двоеточия соединены вместе в (2). Укажите 2 для местоположения, и биты будут сопоставлены следующим образом:0x02 - центральное двоеточие (обе точки) 0x04 - левое двоеточие - нижняя точка0x08 - левое двоеточие - верхняя точка0x10 - десятичная точка Если вам нужна десятичная точка, вызовите writeDigitNum (location, number, true), который закрасит десятичную точку. Чтобы нарисовать двоеточие, используйте drawColon (true или false). Если вы хотите полностью контролировать сегменты во всех цифрах, вы может вызвать writeDigitRaw (location, bitmask), чтобы нарисовать необработанную 8-битную маску (которая хранится в uint8_t) в любое место. Все процедуры рисования изменяют только отображаемую память, сохраняемую Arduino. Не забудьте вызвать writeDisplay () после рисования, чтобы «сохранить» память в матрице через I2C. Источник:https://www.mouser.com/ds/2/737/adafruit-led-backpack-932846. pdf * / # include  // Включите эту строку при использовании Arduino Uno, Mega и т. д. # include  #include "Adafruit_LEDBackpack.h" #define DS3231_I2C_ADDRESS 0x68int ldr_sensor =A0; // Фоторезистор LDR с сопротивлением 100 кОм на массу, другая нога 5Vint ldr_value =0; // значение LDR - значение var store int яркость_matrix; // Яркость светодиодной матрицы - значение var storeint threshold_brightness =400; // Пороговое значение blinkrate_value =0; // Частота мигания светодиодной матрицы int delay_matrix_time =20; // сколько времени отображается (20 сек) int delay_matrix_temp =2000; // сколько времени показывать temp (2 секунды) int blinky_dot =2; // ничего не мигает - слева 2 одиночные точки Adafruit_7segment matrix =Adafruit_7segment (); byte decToBcd (byte val) {return ((val / 10 * 16) + (val% 10));} byte bcdToDec (byte val) { return ((значение / 16 * 10) + (значение% 16));} void setup () {Serial.begin (9600); Wire.begin (); matrix.begin (0x70);} void loop () {lightBrightness (); // Определение яркости матрицы matrixBlinkrate (); // Mattrix-Blinkrate Jusitierung displayTime (); // отображаем данные часов реального времени displayTemp (); // отображаем температуру} void lightBrightness () {// setBrightness (яркость) - позволит вам изменить общую яркость всего дисплея. 0 - наименее яркое, 15 - самое яркое, и это то, что инициализируется дисплеем при запуске ldr_value =analogRead (ldr_sensor); Serial.print ("LDR:"); Serial.println (ldr_value); if (ldr_value <=threshold_brightness) {// измерение яркости по сравнению с Threshold bright_matrix =0; // яркое при дневном свете} else {яркость_matrix =15; // темно ночью}} void matrixBlinkrate () {// blinkRate (rate) - Вы можете мигать на весь экран. 0 не мигает. 1, 2 или 3 предназначены для мигания дисплея. matrix.blinkRate (blinkrate_value);} void displayTime () {matrix.setBrightness (матрица яркости); matrix.clear (); // сколько времени отображается на матрице в секундах for (uint16_t i =0; i > Переход на летнее время - последнее воскресенье марта в 2 часа if ((dayOfWeek ==1) &&(dayOfMonth> =25) &&(month ==3) &&(hour ==2)) {// nastavení hodin na 3 hodinu // установить часы на 3 часа setDS3231time (se, mi, 3, we, dm, mo, ye); } // změna času na zimní //>> Переход на зимнее время if ((dayOfWeek ==1) &&(dayOfMonth> =25) &&(month ==10) &&(hour ==1) &&(year! =1 )) {// rok použit jako indikace, že bylo léto // год используется как указание на то, что было лето setDS3231time (se, mi, ho, we, dm, mo, 1); } if ((dayOfWeek ==1) &&(dayOfMonth> =25) &&(month ==10) &&(hour ==3) &&(year ==1)) {// наставені ходин на 2 ходьі а пршізнак на 0 // устанавливаем часы на 2 часа и отмечаем год равным 0 setDS3231time (se, mi, 2, we, dm, mo, 0); } / * Укажите 2 для местоположения, и биты отображаются следующим образом:0x02 - центральное двоеточие (обе точки) 0x04 - левое двоеточие - нижняя точка 0x08 - левое двоеточие - верхняя точка 0x10 - десятичная точка * / / * расположение # 2 контролирует также две левые одиночные точки, подобные этому (=blinky_dot):2 =ничего не мигает 3 =ничего не мигает 4 =мигает вверху слева (одна верхняя точка) 5 =мигает вверху слева (одна верхняя точка) 6 =мигает вверху слева (одна верхняя точка) ) + оба двоеточия в середине 7 =мигают вверху слева (одна верхняя точка) + оба двоеточия в середине 8 =мигают внизу слева (одна нижняя точка) 9 =мигает внизу слева (одна нижняя точка) 10 =мигает внизу слева (одна нижняя точка ) + оба двоеточия в середине 11 =мигают внизу слева (одна нижняя точка) + оба двоеточия в середине 12 =мигают оба двоеточия (обе точки слева) без двоеточия в середине * / // формат часов:_0:мм if (час> 9) {matrix.writeDigitNum (0, (час / 10), ложь); matrix.writeDigitNum (1, (час% 10), ложь); // это запишет число (0-9) в одно место по модулю https://www.arduino.cc/reference/en/language/structure/arithmetic-operators/modulo/} else {matrix.writeDigitNum ( 1, час, ложь); } // matrix.drawColon (true); // оба двоеточия в середине активны:если вы не хотите мигать, оставленные точки можно активировать здесь оба двоеточия // дать секундам возможность отобразить точки слева, если (se <=30) {blinky_dot =10; // мигает внизу слева (одна нижняя точка) + двоеточие посередине} else if (se> 30) {blinky_dot =6; // мигает верхний левый угол (одна верхняя точка) + двоеточие в середине} matrix.writeDigitRaw (2, blinky_dot); matrix.writeDigitNum (3, (минута / 10), ложь); matrix.writeDigitNum (4, (минута% 10), ложь); matrix.writeDisplay (); // мигающие двойные точки на полсекунды задержки (500); matrix.drawColon (ложь); matrix.writeDisplay (); задержка (500); }} void displayTemp () {matrix.setBrightness (яркость_матрица); matrix.clear (); byte temp =get3231Temp (); int abs_temp =abs (темп); // абсолютный номер значения matrix.writeDigitNum (1, (abs_temp% 10), false); // позиция 1, значение 9, показывать десятичную дробь) if (temp <0) matrix.writeDigitRaw (0,64); если (темп <=-10) matrix.writeDigitRaw (2,12); // а если температура отрицательная, мы ставим знак минус на первое место. если (temp>
 =10) matrix.writeDigitNum (0, (abs_temp / 10), false); // позиция 0, значение 1, показывать десятичную дробь) if (temp <=-10) matrix.writeDigitNum (0, (abs_temp / 10), false); // позиция 0, значение 1, показывать десятичную дробь) // matrix.writeDigitRaw (2,0x10); // десятичная матрица .writeDigitRaw (3,99); // 99 ="°" matrix.writeDigitRaw (4,57); // 57 ="C" matrix.writeDisplay (); // отображение значений температуры в последовательной строке // отображение температуры на серийной линии Serial.print ("Temperatur in C:"); Serial.println (get3231Temp ()); // +/- 3 градуса Цельсия // сколько времени отображать температуру на матрице в секундах delay (delay_matrix_temp);} void setDS3231time (байтовая секунда, байтовая минута, байтовый час, байтовый деньOfWeek, байтовый деньOfMonth, байтовый месяц, байтовый год) {/ / установить дату и время для DS3231 Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); // устанавливаем следующий ввод для начала в регистре секунд Wire.write (decToBcd (second)); // устанавливаем секунды Wire.write (decToBcd (minute)); // устанавливаем минуты Wire.write (decToBcd (hour)); // устанавливаем часы Wire.write (decToBcd (dayOfWeek)); // устанавливаем день недели (1 =воскресенье, 7 =суббота) Wire.write (decToBcd (dayOfMonth)); // устанавливаем дату (от 1 до 31) Wire.write (decToBcd (month)); // установить месяц Wire.write (decToBcd (год)); // установить год (от 0 до 99) Wire.endTransmission ();} void getDateDs3231 (байт * секунда, байт * минута, байт * час, байт * dayOfWeek, байт * деньOfMonth, байт * месяц, байт * год) {Wire. beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0); Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 7); * второй =bcdToDec (Wire.read () &0x7f); * минута =bcdToDec (Wire.read ()); * час =bcdToDec (Wire.read () &0x3f); * dayOfWeek =bcdToDec (Wire.read ()); * dayOfMonth =bcdToDec (Wire.read ()); * месяц =​​bcdToDec (Wire.read ()); * год =bcdToDec (Wire.read ());} float get3231Temp () {byte tMSB, tLSB; float temp3231; Wire.beginTransmission (DS3231_I2C_ADDRESS); Wire.write (0x11); Wire.endTransmission (); Wire.requestFrom (DS3231_I2C_ADDRESS, 2); если (Wire.available ()) {tMSB =Wire.read (); // Дополнение до 2 int часть tLSB =Wire.read (); // дробная часть temp3231 =(tMSB &B01111111); // вычисляем двойки на Tmsb temp3231 + =((tLSB>> 6) * 0.25); // заботятся только о битах 7 и 8 return temp3231; } else {// о нет, нет данных! Serial.println («Ошибка датчика DS3231 - не удается прочитать температуру»); matrix.print (0xBEEF, HEX); // информируем пользователя с помощью BEEF matrix.writeDisplay (); задержка (5000); }} 
Github
https://github.com/ILohs/MySketches

Схема

Путь LDR исправлен

Производственный процесс

  1. Часы видения Arduino pov
  2. Самодельные простейшие часы Numitron IV9 с Arduino
  3. Простые настенные часы с использованием Adafruit 1/4 60 Ring Neopixel
  4. Часы Arduino с исламским временем молитв
  5. Основные часы
  6. Arduino Temp. Монитор и часы реального времени с дисплеем 3.2
  7. Arduino Nano:управление двумя шаговыми двигателями с помощью джойстика
  8. Arduino Apple Watch
  9. 7-сегментный массив часов
  10. Простой будильник с DS1302 RTC