Здравствуйте, собрал часы на ардуино, сдвиговых регистрах и DS3231, выбрал этот модуль что бы и время точно показывал и температуру показывал. Готового решения не нашел, пришлось дергать кусок кода там, кусок сям. В итоге по указанному ниже "шедевру" работает нормально, только время и температуру показывает с 10 утра и до 23:59 вечера, а с 00:00 до 10 утра только температуру. За корявость и костыли типа включить-подождать-выключить-подождать... заранее прошу прощения . Не подскажете почему происходит такая ерунда с 12 ночи ?
const int g_pinData = 10; // SI (Pin 14 on 74595) Red wire const int g_pinCommLatch = 11; // RCK (Pin 12 on 74595) White wire const int g_pinClock = 12; // SCK (Pin 11 on 74595) Green wire const int ledPin = 13; // for blinking every 1/2 seconds
int temp = 0; int humid = 0; int volt = 0;
RTC_DS1307 RTC; // define RTC variables
byte g_digits [10]; // Definitions of the 7-bit values for displaying digits
int g_numberToDisplay = 0; // default number being displayed, 0
const int g_registers = 4; // Number of shift registers in use, 4
byte g_registerArray [g_registers]; // Array of numbers to pass to shift registers
temp3231 = (tMSB & B01111111); //do 2's math on Tmsb temp3231 += ( (tLSB >> 6) * 0.25 ); //only care about bits 7 & 8 } else { //oh noes, no data! }
return temp3231; }
void setup() {
// I2C RTC Setup Wire.begin(); RTC.begin();
/* Only set the time on compile if the RTC is not running... This is used to set the current time from the computer clock
if ( !RTC.isrunning()) { Serial.println("RTC is NOT running!"); // following line sets the RTC to the date & time this sketch was compiled RTC.adjust(DateTime(__DATE__, __TIME__)); } */
pinMode (g_pinCommLatch, OUTPUT); // define 74595 pins as output pinMode (g_pinClock, OUTPUT); // define 74595 pins as output pinMode (g_pinData, OUTPUT); // define 74595 pins as output pinMode (ledPin, OUTPUT); // define LED pins as output
Serial.begin (9600); // optional, turn on serial monitoring for debugging
// Setup 7 segment display for number 0 to 9 and other characters
// a - top bar // b - top right // c - bottom right // d - bottom bar // e - bottom left // f - top right // g - middle bar
int a = 1, b = 2, c = 4, d = 8, e = 16, f = 32, g = 64;
// Простая функция для отправки последовательных данных в один или несколько сдвиговых регистров путем итерации назад по массиву. // Хотя g_registers существует, они могут использоваться не все, следовательно, входной параметр.
void sendSerialData ( byte registerCount, // Сколько сдвиговых регистров? byte *pValueArray) // Массив байтов с LSByte в массиве [0] { // Сигнал 595s для чтения данных digitalWrite (g_pinCommLatch, LOW);
for (byte reg = registerCount; reg > 0; reg--) { byte value = pValueArray [reg - 1];
for (byte bitMask = 128; bitMask > 0; bitMask >>= 1) { digitalWrite (g_pinClock, LOW); digitalWrite (g_pinData, value & bitMask ? HIGH : LOW); digitalWrite (g_pinClock, HIGH); } } // Сигнал 595s, что я закончил посылать digitalWrite (g_pinCommLatch, HIGH); } // отправка последовательных данных
// ==== Main loop() =====
void loop() {
byte temp = get3231Temp();
int hour,minute,sec,disp = 0;
DateTime now = RTC.now(); // Получить текущее время и дату
hour = now.hour(); // break down time to hour minute = now.minute(); // break down time to minute sec = now.second(); // break down time to second
// Push the hour 2 digits to the left by multiplying 100
Компилятор не ругался, попробовал разные варианты, начали закрадываться подозрения, что это тупиковая ветвь кода. Ниже более раняя версия с которой все и началось. Работает отлично, но не понравилось, что при показе температуры мигают точки и в попытке это победить вышел вариант кода где не показывает время с 00:00 до 10:00. Может подскажет хотя бы где искать способ отключать мигание ? И периодически идут пропуски в показе температуры, то есть показывает время в тот момент когда должна быть температура
Код:
/* Red = Ard Pin 10 White = Ard Pin 11 Green = Ard Pin 12 DHT11() is disabled Version 1.2 with DHT11 RH, DS18B20 & Temp & secret voltmeter Version 1.3 with 7-segment testing, blink 5 times
Original sketch from Paul Electronics 7-segment shift register posting RTC libraries from http://jeelabs.net/projects/cafe/wiki/RTClib Setting realtime clock on-compile was from Ladyada.net
Pin assignment on the 74595 to 7-segment common cathode as follows :-
QA - a QB - b QC - c QD - d QE - e QF - f QG - g
pin 3 & 8 are common cathode resistors used is 220R
const int g_pinData = 10; // SI (Pin 14 on 74595) Red wire const int g_pinCommLatch = 11; // RCK (Pin 12 on 74595) White wire const int g_pinClock = 12; // SCK (Pin 11 on 74595) Green wire const int ledPin = 13; // for blinking every 1/2 seconds
int temp = 0; int humid = 0; int volt = 0;
RTC_DS1307 RTC; // define RTC variables
byte g_digits [10]; // Definitions of the 7-bit values for displaying digits
int g_numberToDisplay = 0; // default number being displayed, 0
const int g_registers = 4; // Number of shift registers in use, 4
byte g_registerArray [g_registers]; // Array of numbers to pass to shift registers
temp3231 = (tMSB & B01111111); //do 2's math on Tmsb temp3231 += ( (tLSB >> 6) * 0.25 ); //only care about bits 7 & 8 } else { //oh noes, no data! }
return temp3231; }
void setup() {
// I2C RTC Setup Wire.begin(); RTC.begin();
/* Only set the time on compile if the RTC is not running... This is used to set the current time from the computer clock
if ( !RTC.isrunning()) { Serial.println("RTC is NOT running!"); // following line sets the RTC to the date & time this sketch was compiled RTC.adjust(DateTime(__DATE__, __TIME__)); } */
pinMode (g_pinCommLatch, OUTPUT); // define 74595 pins as output pinMode (g_pinClock, OUTPUT); // define 74595 pins as output pinMode (g_pinData, OUTPUT); // define 74595 pins as output pinMode (ledPin, OUTPUT); // define LED pins as output
Serial.begin (9600); // optional, turn on serial monitoring for debugging
// Setup 7 segment display for number 0 to 9 and other characters
// a - top bar // b - top right // c - bottom right // d - bottom bar // e - bottom left // f - top right // g - middle bar
int a = 1, b = 2, c = 4, d = 8, e = 16, f = 32, g = 64;
// Простая функция для отправки последовательных данных в один или несколько сдвиговых регистров путем итерации назад по массиву. // Хотя g_registers существует, они могут использоваться не все, следовательно, входной параметр.
void sendSerialData ( byte registerCount, // Сколько сдвиговых регистров? byte *pValueArray) // Массив байтов с LSByte в массиве [0] { // Сигнал 595s для чтения данных digitalWrite (g_pinCommLatch, LOW);
for (byte reg = registerCount; reg > 0; reg--) { byte value = pValueArray [reg - 1];
for (byte bitMask = 128; bitMask > 0; bitMask >>= 1) { digitalWrite (g_pinClock, LOW); digitalWrite (g_pinData, value & bitMask ? HIGH : LOW); digitalWrite (g_pinClock, HIGH); } } // Сигнал 595s, что я закончил посылать digitalWrite (g_pinCommLatch, HIGH); } // отправка последовательных данных
// ==== Main loop() =====
void loop() {
byte temp = get3231Temp();
int hour,minute,sec,disp = 0;
DateTime now = RTC.now(); // Получить текущее время и дату
hour = now.hour(); // break down time to hour minute = now.minute(); // break down time to minute sec = now.second(); // break down time to second
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компилятор ругнется если выставить соответствующие флажки (файл-> настройки -> сообщения компилятора -> ВСЕ)
Не забываем сворачивать исходник в спойлер (или прикреплять файлом приложения). Ёжли используется DS3231, то его и указывать надо - не путать с DS1307 - у них карта и назначение регистров РАЗНЫЕ. Да и схемка бы не помешала...
компилируется, но с кучей вармингов: СпойлерC:\Documents and Settings\User\Мои документы\Arduino\sketch_sep10a\sketch_sep10a.ino: In function 'void setup()':
C:\Documents and Settings\User\Мои документы\Arduino\sketch_sep10a\sketch_sep10a.ino:118:14: warning: unused variable 'b' [-Wunused-variable]
C:\Documents and Settings\User\Мои документы\Arduino\sketch_sep10a\sketch_sep10a.ino: In function 'void loop()':
C:\Documents and Settings\User\Мои документы\Arduino\sketch_sep10a\sketch_sep10a.ino:200:6: warning: unused variable 'temp' [-Wunused-variable]
C:\Documents and Settings\User\Мои документы\Arduino\sketch_sep10a\sketch_sep10a.ino:271:7: warning: unused variable 'span' [-Wunused-variable]
C:\Documents and Settings\User\Мои документы\Arduino\sketch_sep10a\sketch_sep10a.ino:272:7: warning: unused variable 'aRead' [-Wunused-variable]
C:\Documents and Settings\User\��� ���������\Arduino\libraries\Wire\utility\twi.c: In function '__vector_24':
C:\Documents and Settings\User\��� ���������\Arduino\libraries\Wire\utility\twi.c:415:49: warning: this statement may fall through [-Wimplicit-fallthrough=]
twi_masterBuffer[twi_masterBufferIndex++] = TWDR;
^
C:\Documents and Settings\User\��� ���������\Arduino\libraries\Wire\utility\twi.c:416:5: note: here
case TW_MR_SLA_ACK: // address sent, ack received
^~~~
C:\Documents and Settings\User\��� ���������\Arduino\libraries\Wire\utility\twi.c:499:9: warning: this statement may fall through [-Wimplicit-fallthrough=]
if(0 == twi_txBufferLength){
^
C:\Documents and Settings\User\��� ���������\Arduino\libraries\Wire\utility\twi.c:504:5: note: here
case TW_ST_DATA_ACK: // byte sent, ack returned
^~~~
C:\Documents and Settings\User\��� ���������\Arduino\libraries\RTClib\RTClib.cpp: In constructor 'DateTime::DateTime(uint32_t)':
C:\Documents and Settings\User\��� ���������\Arduino\libraries\RTClib\RTClib.cpp:86:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if (days < 365 + leap)
~~~~~^~~~~~~~~~~~
C:\Documents and Settings\User\��� ���������\Arduino\libraries\RTClib\RTClib.cpp: In constructor 'DateTime::DateTime(const char*, const char*)':
C:\Documents and Settings\User\��� ���������\Arduino\libraries\RTClib\RTClib.cpp:136:21: warning: operation on '((DateTime*)this)->DateTime::m' may be undefined [-Wsequence-point]
case 'J': m = date[1] == 'a' ? 1 : m = date[2] == 'n' ? 6 : 7; break;
C:\Documents and Settings\User\��� ���������\Arduino\libraries\RTClib\RTClib.cpp: In constructor 'DateTime::DateTime(const __FlashStringHelper*, const __FlashStringHelper*)':
C:\Documents and Settings\User\��� ���������\Arduino\libraries\RTClib\RTClib.cpp:161:21: warning: operation on '((DateTime*)this)->DateTime::m' may be undefined [-Wsequence-point]
case 'J': m = buff[1] == 'a' ? 1 : m = buff[2] == 'n' ? 6 : 7; break;
C:\Documents and Settings\User\Мои документы\Arduino\sketch_sep10a\sketch_sep10a.ino: In function 'get3231Temp':
C:\Documents and Settings\User\Мои документы\Arduino\sketch_sep10a\sketch_sep10a.ino:76:10: warning: 'temp3231' may be used uninitialized in this function [-Wmaybe-uninitialized]
C:\Documents and Settings\User\Мои документы\Arduino\sketch_sep10a\sketch_sep10a.ino:58:9: note: 'temp3231' was declared here
Скетч использует 6186 байт (20%) памяти устройства. Всего доступно 30720 байт. Глобальные переменные используют 470 байт (22%) динамической памяти, оставляя 1578 байт для локальных переменных. Максимум: 2048 байт. Следовательно надо логику отслеживать, лазая по используемым библиотекам.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Здравствуйте, правка кода ни к чему нормальному не привела + работа, смирился с тем что мигают точки при показе температуры, да и температуру показывает рандомно. Подключил через зарядник от телефона, сами часы с макеткой ардуино поставил на подоконник (очень удобно, проснулся ночью и время видно сразу напрямую или в отражение потолка). Сегодня (темнеет рано) заметил, что светодиод Rx мигает при показе времени в такт 13 выходу на которую и подключены точки, а при показе температуры точки мигают без подмигивания Rx. Думаю, что эта синхронизация точно не спроста и есть вероятность, что после переноса часов с китайского клона ардуино уно на атмегу 328 заработает нормально. Так же натолкнуло на мысль, что может не хватать тока от зарядника от телефона, подключил 6В аккумулятор к сожалению пропуски в показе температуры не пропали. Ток потребления всей схемы 70мА. При возможности повышу напряжение питания. Есть какие соображения по синхронной вспышке Rx 13 (по идее без разницы какой, хотя есть смысл изменить) и вывода мигания точек секунд ?
Всяко"вспышки" - некорректность работы программы обслуживания дисплея (типична при "корявой" динамической индикации). Потребление в 70 мА... Многовато... Опять же без схемки - гадание на.... Ну и питание на светики должно идти мимо встроенного в адуринку стабилизатора...
Что-то у меня этот скетч даже не компилируется, он точно рабочий? Почему в первом сообщении закоментирован кусок кода отвечающий за подключение библиотек, объявление переменных и стартовую инициализацию? Почему таблица истинности для семисегментного индикатора не соответствует сегментам индикатора? Зачем часам задержка в десять секунд на мигание светодиодом, не проще мигать по изменению секунд? Зачем мигать светодиодом только когда индикация превышает 9:59? Зачем в условие индикации температуры прописывать столько значений, не проще было взять остаток от деления на десять и сравнить его с нолём? Зачем фигурная скобка перед началам вывода на индикатор?
Во втором варианте скетча странная индикация: часы, температура раз в десть секунд (вывод в порт значения) и одно мигание СИД, вывод в порт отладочного значения каждые двенадцать секунд, и опять одиночное мигание. Я прав?
чтобы не плодить темы. Переделал свои часики, унесенные в своё время с завода Ресурс в Богородицке и верно отслужившие почти 30 лет. По хотению жены кажут температуру, есть будильник. Обеспечено бесперебойное питание. Авторегулировка яркости. Скетчик написан по прочтению разных форумов и пугает меня самого Но работают часики, как надо! В архиве файл протеуса, исходник и прошивка. Да, еще фотка часов. Очень рад буду критике кода и оптимизации схемы.
Найдена ошибочка, перезалил. Скетчик делал для работы от Кроны. Если от АКБ 18650 с платой заряда и повышайкой - работают часики в полном функционале более 6-ти часов. Тогда часть программы, отвечающей за контроль сети, можно удалить.
Если часы в основном работают от сети, то при питание от батареи следует ограничивать функционал. Например отключить постоянную индикацию, времени. chern55, твои часы тоже на 74hc595?
Часики собраны на TM1637 и дисплее E40803-I4-PG2-0-W. при питании от батареи показывают время 1 сек раз в минуту на минимальной яркости. Будильник работает. В планах замутить на E11501-G-PG2-0-W и расширить функционал. Ввести анимацию, отключаемую по времени, датчик температуры на радиомодуле и датчик давления.
Тогда создавай отдельную тему, потому что твои часы не соответствуют названию темы. А отображение времени раз в минуту, абсолютно неправильное решение, да и высаживание столь ёмкого элемента питания за каких-то шесть часов, это очень расточительно.
Если рассчитывать на то, что часики на 176 серии без сети не кажут время вовсе, и ничего, 30 лет проработали. Будили на работу в 6:10. Схема прикрепил, файл протеуса тоже. Кнопку любую добавить легко. Можно даже по свистку. А еще можно постучать соседям в стену. Тогда и часы не нужны. И время узнаешь, и мнение о своём психофизическом состоянии - тоже. Обсуждаем корявость скетчика или функционал часов?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения