Официальный сайт компании Arduino по адресу arduino.cc
Часы, будильник, термометр. На ARDUINO NANO, DS3231.
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пт, 06/05/2016 - 09:55
Часы, будильник, термометр. На ARDUINO NANO, DS3231.
#include <Wire.h> #include <DS3231.h> DS3231 clock; RTCDateTime dt; RTCAlarmTime al; boolean AlarmOn = LOW; boolean AlarmSound = LOW; boolean Colon = LOW; boolean ButtonMinuteFlag = LOW; boolean ButtonHourFlag = LOW; boolean ButtonAlarmFlag = LOW; boolean AlarmSet = LOW; long OneButtonTimer; long TwoButtonTimer; long ThreeButtonTimer; long AlarmTimer; long CheckTimer; byte LedDigit[4] = {5, 4, 3, 2};// Led Pin Digit, Digit2, Digit3, Digit4, Led Pin byte LedSigment[7] = {A0, A1, A2, 9, 8, 7, 6};// Led Pin A, B, C, D, E, F, G byte LedColon = 13;// Led Pin Colon byte MinuteButton = 12;// Button Minute Pin byte HourButton = 11;// Button Hour Pin byte AlarmButton = 10;// Alarm Button Pin byte PinBuzzer = A3;// Buzzer Pin byte Second; byte Minute; byte Hour; byte Day; byte Month; byte Year; byte ActivateDigit[4][4] = { {0, 1, 1, 1}, // First digit is on // Change if Anode {1, 0, 1, 1}, // Second digit is on // Change if Anode {1, 1, 0, 1}, // Third digit is on // Change if Anode {1, 1, 1, 0}};// Fourth digit is on // Change if Anode byte ActivateSegments[11][7] = { { 1, 1, 1, 1, 1, 1, 0 }, // = 0 // Change if Anode { 0, 1, 1, 0, 0, 0, 0 }, // = 1 // Change if Anode { 1, 1, 0, 1, 1, 0, 1 }, // = 2 // Change if Anode { 1, 1, 1, 1, 0, 0, 1 }, // = 3 // Change if Anode { 0, 1, 1, 0, 0, 1, 1 }, // = 4 // Change if Anode { 1, 0, 1, 1, 0, 1, 1 }, // = 5 // Change if Anode { 1, 0, 1, 1, 1, 1, 1 }, // = 6 // Change if Anode { 1, 1, 1, 0, 0, 0, 0 }, // = 7 // Change if Anode { 1, 1, 1, 1, 1, 1, 1 }, // = 8 // Change if Anode { 1, 1, 1, 1, 0, 1, 1 }, // = 9 // Change if Anode { 0, 0, 0, 1, 1, 1, 1 }}; // = ("t") // Change if Anode void setup() { clock.begin(); pinMode (LedColon, OUTPUT); pinMode (PinBuzzer, OUTPUT); pinMode (MinuteButton, INPUT_PULLUP); pinMode (HourButton, INPUT_PULLUP); pinMode (AlarmButton, INPUT_PULLUP); for (byte a = 0; a < 4; ++a) { pinMode (LedDigit[a], OUTPUT); } for (byte b = 0; b < 7; ++b) { pinMode (LedSigment[b], OUTPUT); } } void loop() { if (clock.isArmed1()) { if (clock.isAlarm1()) { AlarmTimer = millis(); AlarmOn = HIGH; } } if (AlarmOn) { if (dt.second % 2 == 0) tone(PinBuzzer, 2000, 100); if (millis() - AlarmTimer > 120000) { AlarmOn = LOW; } } if (AlarmSet == HIGH) LED_WriteAlarm(); else { if (millis() - CheckTimer > 400) { dt = clock.getDateTime(); CheckTimer = millis(); } if ((dt.minute % 10) == 0 && dt.second >= 10 && dt.second < 30) { LED_WriteTemp(); } else LED_WriteTime(); } if (digitalRead(MinuteButton) == LOW && digitalRead(HourButton) && (digitalRead(AlarmButton))) { if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) { ButtonMinuteFlag = HIGH; if (AlarmSet == HIGH) { IncAlarmMinutes(); } else { IncMinutes(); } } if (ButtonMinuteFlag == HIGH) { if (millis() - OneButtonTimer > 1300) { if (millis() - TwoButtonTimer > 100) { if (AlarmSet == HIGH) { IncAlarmMinutes(); } else { IncMinutes(); } TwoButtonTimer = millis(); } } } ThreeButtonTimer = millis(); } else { if (digitalRead(HourButton) == LOW && digitalRead(MinuteButton) && (digitalRead(AlarmButton))) { if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) { ButtonHourFlag = HIGH; if (AlarmSet == HIGH) { IncAlarmHour(); } else { IncHour(); } } if (ButtonHourFlag == HIGH) { if (millis() - OneButtonTimer > 1300) { if (millis() - TwoButtonTimer > 100) { if (AlarmSet == HIGH) { IncAlarmHour(); } else { IncHour(); } TwoButtonTimer = millis(); } } } ThreeButtonTimer = millis(); } else { if (digitalRead(AlarmButton) == LOW && digitalRead(MinuteButton) && digitalRead(HourButton)) { if (ButtonMinuteFlag == LOW && ButtonHourFlag == LOW && ButtonAlarmFlag == LOW ) { ButtonAlarmFlag = HIGH; tone(PinBuzzer, 2000, 100);// resonance frequency buzzer AlarmOn = LOW; clock.isAlarm1(LOW); clock.clearAlarm1(); } if (ButtonAlarmFlag == HIGH && AlarmSet == LOW) { if (millis() - OneButtonTimer > 1300) { AlarmSet = HIGH; TwoButtonTimer = millis(); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } } if (ButtonAlarmFlag == HIGH && AlarmSet == HIGH) { if (millis() - TwoButtonTimer > 1300) { TwoButtonTimer = millis(); if (clock.isArmed1()) { al = clock.getAlarm1(); clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, LOW); } else { al = clock.getAlarm1(); clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH); } tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } } ThreeButtonTimer = millis(); } else { OneButtonTimer = millis(); TwoButtonTimer = millis(); } } if (AlarmSet == HIGH && millis() - ThreeButtonTimer > 5000) { AlarmSet = LOW; tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } if (digitalRead(MinuteButton) && ButtonMinuteFlag) ButtonMinuteFlag = LOW; if (digitalRead(HourButton) && ButtonHourFlag) ButtonHourFlag = LOW; if (digitalRead(AlarmButton) && ButtonAlarmFlag) ButtonAlarmFlag = LOW; } } void IncMinutes() { dt = clock.getDateTime(); Minute = dt.minute + 1; if (Minute >= 60) Minute = 0; clock.setDateTime(dt.year, dt.month, dt.day, dt.hour, Minute, 0); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } void IncAlarmMinutes() { al = clock.getAlarm1(); Minute = al.minute + 1; if (Minute >= 60) Minute = 0; clock.setAlarm1(al.day, al.hour, Minute, 0, DS3231_MATCH_H_M_S, HIGH); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } void IncHour() { dt = clock.getDateTime(); Hour = dt.hour + 1; if (Hour >= 24) Hour = 0; clock.setDateTime(dt.year, dt.month, dt.day, Hour, dt.minute, 0); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } void IncAlarmHour() { al = clock.getAlarm1(); Hour = al.hour + 1; if (Hour >= 24) Hour = 0; clock.setAlarm1(al.day, Hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH); tone(PinBuzzer, 2000, 100);// resonance frequency buzzer } void LED_WriteTime() { dt = clock.getDateTime(); Minute = dt.minute; Hour = dt.hour; if (dt.second % 2 == 0) Colon = HIGH; else Colon = LOW; if (Hour > 9) LED_WriteDigit(1, Hour / 10, 0); LED_WriteDigit(2, Hour % 10, Colon); if (Minute < 10) LED_WriteDigit(3, 0, 0); else LED_WriteDigit(3, Minute / 10, 0); LED_WriteDigit(4, Minute % 10, clock.isArmed1()); } void LED_WriteAlarm() { dt = clock.getDateTime(); al = clock.getAlarm1(); Minute = al.minute; Hour = al.hour; if (dt.second % 2 == 0) Colon = HIGH; else Colon = LOW; if (Hour > 9) LED_WriteDigit(1, Hour / 10, 0); LED_WriteDigit(2, Hour % 10, AlarmSet); if (Minute < 10) LED_WriteDigit(3, 0, 0); else LED_WriteDigit(3, Minute / 10, 0); LED_WriteDigit(4, Minute % 10, clock.isArmed1()); } void LED_WriteTemp() { float Temp = clock.readTemperature(); LED_WriteDigit(1, 10, 0); int Temp1 = (Temp * 10) / 100; LED_WriteDigit(2, Temp1, 0); int Temp2 = ((Temp * 10) - (Temp1 * 100)) / 10; LED_WriteDigit(3, Temp2, 1); LED_WriteDigit(4, (Temp * 10) - (Temp1 * 100) - (Temp2 * 10), 0); } void LED_WriteDigit(byte Digit, byte Value, byte Colon) { for (byte DigCount = 0; DigCount < 4; ++DigCount) { digitalWrite(LedDigit[DigCount], ActivateDigit[Digit - 1][DigCount]); } for (byte SegCount = 0; SegCount < 7; ++SegCount) { digitalWrite(LedSigment[SegCount], ActivateSegments[Value][SegCount]); delayMicroseconds(100); digitalWrite(LedSigment[SegCount], 0); }// Change if Anode if (Colon) { digitalWrite(LedColon, HIGH); // Change if Anode delayMicroseconds(100); digitalWrite(LedColon, LOW); } }
Красиво. Цвета на картинке поплыли или индикатор дйствительно розовый? Если розовый, дайте пожалуйста ссылку, где брали такой.
Поплыли.
подскажите, плз, как заменить DS3231 на DS1302 в этом скетче?
Красиво. Цвета на картинке поплыли или индикатор дйствительно розовый? Если розовый, дайте пожалуйста ссылку, где брали такой.
немного поиграя с напряжением можно поиграть с оттенком свечения, только осторожно)
заменить библиотеку и управляющие команды, у меня ds1302 нету не чем помочь не могу. Да и хуже она значительно.
подскажите, плз, как заменить DS3231 на DS1302 в этом скетче?
На АЛИ как буханка хлеба стоит!
я видел, спасибо.
но есть трудности - 1302 у мну есть, а с Али я не смогу получить ближайшее (хз сколько - год, може меньше) время.
так что пытаюсь слепить и говна и палок =)
DarkGenius, спасибо! хоть понятно куда копать.
Делаю часы на WS2812B, с внешним беспроводным термометром. Так же хочу прикрутить IR пульт и сделать функцию лампы настроения ( с этим пока туго т.к. не уживаются пульт и эти светодиоды из-за ограничения по "таймингам", если кто пробовал, то посоветуйте куда копать.)
Использую библ. Adafruit_GFX, Adafruit_NeoMatrix, Adafruit_NeoPixel
На максах дополнительный дисплей реализовал.

https://youtu.be/IJ8PPtEiprQ
подскажите, пожалуйста, что означает в строке 221
"clock.isArmed1()"? смотрю в библиотеках(скачал уже штук пять) для этого RTC и не вижу такой команды.
или подскажите, плз, какая команда соответствует из библиотеки DS1302?
суть простая - пытаюсь авторский скетч переделать под DS1302
статус будильника, включен\выключен
ага!
"я догадался, что 0,5 и 0,5 это литр, да постеснялся сказать"(с)
спасибо DarkGenius!
UPD. не подскажешь где библиотеку 3231 брал?
пытаюсь разобраться с командами, что б заменить на 1302, но все библиотеки которые мне попадаются не имеют команд, которые в скетче.
UPD1. сам спросил, сам ответил =) вот библиотека
UPD2. всё-таки 1302 это "г" на палочке - создание будильника целый геморр
У меня почему то не идет ... горят одни восьмёрки. Скетч загрузился без ошибок. индикатор - общий анод. DS3231 предварительно тоже проверял из образцов. В мониторе все показывает нормально. Три раза пересобирал на макетке, думал ошибка. Но всё одно и то же. :(
Да все есть в самом начале. Повторю еще раз, чтоб рядом было.
Подключение к индикатору и кнопки:
и скетч
два примера для различных индикаторов. Возможно что то править надо. Под такой индикатор делал, пока не знаю как включенный будильник обозначить.
CommonCathode
CommonAnode
Индикатор 0.56", зеленый, с ОА такой
попробую предоставленую Вами CommonAnode и потом отпишусь.
Пробовал два типа индикатора. Везде восьмёрки после включения. На 13 пине светодиод мигает - точки работают. Должно ведь без кнопок работать ?! На всякий случай подключил кнопку и попробовал.
Подключение ведь такое: 5v - button - пин:12(или 11,10) - 10k resistor - gnd.
Может не правильно предварительно модуль DS3231 прошил ? Брал из примеров библиотеки.
Раньше делал такие варианты и они работали.
http://arduino.ru/forum/programmirovanie/chasy-na-7-segmentnom-led-indikatore-nuzhna-pomoshch
http://arduino-project.net/led-chasy-na-arduino/
но там сервису никакого нету и будильника. Ну и без модуля реального времени.
Вот такой еще проект нашел. Вполне рабочий.
http://arduinotehniq.blogspot.com/2014/09/manual-adjust-for-rtc-clock-with.html
Если 13 мигает знать часы идут, похоже я скетчи местами спутал. Где анод там катод и наоборот, исправил. Кнопки просто на корпус, зуммер через сопротивление.
не знаю как включенный будильник обозначить.
Неспешным (1 - 1/2 Гц) миганием самой правой точки (возе единиц минут)???
На этом индикаторе только две в центре точки, активны. В оригинале последняя горит при активном.
Там же вроде на картинке видны десятичные точки возле цифр. Они что, не горят? Я имел в виду такой точкой помигать.
Где анод там катод и наоборот, исправил.
Теперь все скетчи правильно выше предоставлены - CommonCathode - для катода, CommonAnode - для анода. Теперь все заработало. Только на моем индикаторе точки мигают после 3 и 4 цифр одновременнно. Где, в каком месте поправить ? И для меня наверное лучше в первой половине суток, чтобы в переди нолик был. Минуты, часы кнопками правильно выставляються. Будильник, озвучка - все нармально работает.
сравни с первоначальным вариантом, корекция нуля так же в скетче есть надо просто её удалить.
if
(Hour > 9) LED_WriteDigit(1, Hour / 10, 0);
изменить на
LED_WriteDigit(1, Hour / 10, 0);
точки есть а диодов под ними нет, китайцы........
сравни с первоначальным вариантом, корекция нуля так же в скетче есть надо просто её удалить.
изменить на
LED_WriteDigit(1, Hour / 10, 0);
Спасибо. Всё получилось. Нолик в переди появился. А в каком месте править, чтобы точку передвинуть чтобы была после второго знака. А то у меня сейчас секундные импульсы(точки) мигают после третей и четвертой цифр вместе. :(
Выкладываю мной исправленный рабочий вариант скеча! Замечания принимаются.
Здрасте, а какую библиотеку часов используете?
https://github.com/jarzebski/Arduino-DS3231
Благодарю. А скетчем, где дополнительный экран не поделитесь? В чем там нюансы?
В данныймомент переписываю его, там экран из десяти модулей 8х8, вот и все нюансы, как только допишу выложу, можктк присоединится к этой группе в вк. https://vk.com/electronicsprojects
Привет всем!
У меня индикатор такой. Как видно, две точки Colon (DP2 и DP3) работают с разными Digit (Dig4 и Dig3, соответственно).
В коде из #29, в "void LED_WriteTime()" я изменил:
DP3 засветился. А DP2 никак не получается зажечь.
Знающие, поделитесь фрагментами кода, как зажечь DP2 вместе с DP3, а также заставить их мигать с частотой 1 Гц.
UPD:
Удалось задействовать DP2, взяв кусок кода из топика, и даже обе DP замигали. Но частота мигания 0,5 Гц.
Поэтому вопрос о мигании DP с частотой 1 Гц остается актуальным.
Также наблюдается слабое свечение сегментов. Замеры показали ток 1 мА на сегмент без использования ограничивающего резистора. Отсюда еще вопрос: где в коде можно изменить яркость свечения сегментов?
Уважаемый ЕвгенийП! У меня есть несколько вопросов к Вам. Могли бы Вы вызвать меня по скайпу beldom2000.
Пишите здесь. Какие секреты-то?
Писать много придётся.
Здравствуйте! Подскажите,какая индикация (статическая,динамическая)используется в данном коде?
Типа динамическая. Но, именно "типа"
А где можно найти вариант с статической индикацией? В интернете перерыл множество примеров, но все только с динамической индикацмей. Не удается подключить светодиодное табло для изготовления больших часов.
Коллеги!
Прошу пояснить - применялись ли в конструкциях часов токоограничительные резисторы в цепях дисплея и какого номинала?
Применялись, 47ом.
Стаическая индикация имеет иной код и он проще.
помогите, кто обладает.
нужно изменить время индикации температуры, раз в 10 минут это слишком.
помогите, кто обладает.
нужно изменить время индикации температуры, раз в 10 минут это слишком.
вроде в 97 строке.
спасибо UILLIS, проглядел. там так в коментах и написано, только на грузинском.
поправил, раз в минуту. стало информативнее.
добавить-бы есче анимацию....
поделюсь своими часиками на интересном дисплейчике - Vacuum Fluorescent Display Module VAF1613
питается от зарядника телефона 5 вольт жрет 1,5А. на борту ДС-ДС преобразователь с 5 до 12 вольт стоит для питания дисплея
собрана вся из модулей! плата ЛУТ для красоты соединений (не люблю сопли и макетки)
на борту так же датчик температуры влажности, синхронизация времени идет по GPS если нету спутников то с RTC (которое так же синхронизируется с GPS пока есть сигнал)
Фотки: https://yapx.ru/u/Gok7g
на первом снимке SAT-6 означает что видно 6 спутников и синхронизация времени идет от ЖПС, если не видно спутников то будет написано RTC
допиливать можно до бесконечности (кнопочки датчики будильники,фотодатчик для изменения яркости дисплея в ночное время, матерные слова на дисплее писать тоже можно), например к часам на ин-14 я в качестве будильника МП3 модуль подключил на флешку гимн закачал.. вполне патриотично)))
Собрал несколько часиков на VFD индикаторах:
https://youtu.be/ZjMJv97twpY
Вот что получилось внутри часиков, всё собрано на макетке потому как лень ЛУТ делать:
Показывают время, дату, температуру, влажность, давление, есть будильник по дням недели.
Код для ардуино кому интересно:
Может кто посоветовать недорогой доступный VFD экраньчик с 14-16 сегментными символами на 16 разрядов? на алиэкспрессе VAF1613 не находится.
Схему надо, для подкрепления интереса.