Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Ответить

Часы на ардуино, 74hc595 и куче светодиодов.

Ср сен 09, 2020 16:52:40

Здравствуйте, собрал часы на ардуино, сдвиговых регистрах и DS3231, выбрал этот модуль что бы и время точно показывал и температуру показывал. Готового решения не нашел, пришлось дергать кусок кода там, кусок сям. В итоге по указанному ниже "шедевру" работает нормально, только время и температуру показывает с 10 утра и до 23:59 вечера, а с 00:00 до 10 утра только температуру. За корявость и костыли типа включить-подождать-выключить-подождать... заранее прошу прощения :)) . Не подскажете почему происходит такая ерунда с 12 ночи ?

Код:
/*

#include <Wire.h>                // i2c wire libraries for RTC
#include "RTClib.h"              // RTC libraries

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

// Begin setup() functions //


float get3231Temp(){
  byte tMSB, tLSB;
  float temp3231;

Wire.beginTransmission(0x68);
Wire.write(0x11);
Wire.endTransmission();
Wire.requestFrom(0x68, 2);

  if(Wire.available()) {
    tMSB = Wire.read(); //2's complement int portion
    tLSB = Wire.read(); //fraction portion

    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_digits [0] = 8 + 4 + 2 + 64 + 32 + 1;
  g_digits [1] = 4 + 2;
  g_digits [2] = 8 + 4 + 16 + 32 + 64;
  g_digits [3] = 8 + 4 + 16 + 2 + 64;
  g_digits [4] = 1 + 16 + 4 + 2;
  g_digits [5] = 8 + 1 + 16 + 2 + 64;
  g_digits [6] = 8 + 1 + 16 + 2 + 64 + 32;
  g_digits [7] = 8 + 4 + 2;
  g_digits [8] = 8 + 4 + 2 + 64 + 32 + 1 + 16;
  g_digits [9] = 8 + 4 + 2 + 1 + 16 + 64;
  g_digits [90] = a + d + e + c;           // Degree dot
  g_digits [91] = a +d+f+g;           // Capital C
  g_digits [92] = e + g;                   //  r, 80
  g_digits [93] = f + e + g + c;           //  h, 116
  g_digits [94] = f + e + g + c;
  g_digits [99] = 0;
 
  // 7-segment testing... blink 4 times
  for (int i=0;i<5;i++) {
 
    g_registerArray [0] = g_digits [8];
    g_registerArray [1] = g_digits [8];
    g_registerArray [2] = g_digits [8];
    g_registerArray [3] = g_digits [8];
   
    sendSerialData (g_registers, g_registerArray);
    delay(300);

    g_registerArray [0] = g_digits [99];
    g_registerArray [1] = g_digits [99];
    g_registerArray [2] = g_digits [99];
    g_registerArray [3] = g_digits [99];
   
    sendSerialData (g_registers, g_registerArray);
    delay(300);
     
  }
 
} // End of setup() //

// Простая функция для отправки последовательных данных в один или несколько сдвиговых регистров путем итерации назад по массиву.
// Хотя 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
 
  disp = (hour * 100) + minute;
  g_numberToDisplay = disp;
 

{

   if (g_numberToDisplay < 10)
  {
    g_registerArray [0] = g_digits [0];
    g_registerArray [1] = g_digits [0];
    g_registerArray [2] = g_digits [0];
    g_registerArray [3] = g_digits [g_numberToDisplay];
  }
  else if (g_numberToDisplay < 100)
  {
    g_registerArray [0] = g_digits [0];
    g_registerArray [1] = g_digits [0];
    g_registerArray [2] = g_digits [g_numberToDisplay / 10];
    g_registerArray [3] = g_digits [g_numberToDisplay % 10];
  }
  else if (g_numberToDisplay < 1000)
  {
    g_registerArray [0] = g_digits [0];
    g_registerArray [1] = g_digits [g_numberToDisplay / 100];
    g_registerArray [2] = g_digits [(g_numberToDisplay % 100) / 10];
    g_registerArray [3] = g_digits [g_numberToDisplay % 10];
  }
  else
  {
    g_registerArray [0] = g_digits [g_numberToDisplay / 1000];
    g_registerArray [1] = g_digits [(g_numberToDisplay % 1000) / 100];
    g_registerArray [2] = g_digits [(g_numberToDisplay % 100) / 10];
    g_registerArray [3] = g_digits [g_numberToDisplay % 10];
    sendSerialData (g_registers, g_registerArray);
    // Blink the LED connected to pin 13   
 
   digitalWrite(ledPin,HIGH);
  delay(1000);
  digitalWrite(ledPin,LOW);
  delay(1000);
   digitalWrite(ledPin,HIGH);
  delay(1000);
  digitalWrite(ledPin,LOW);
  delay(1000);
   digitalWrite(ledPin,HIGH);
  delay(1000);
  digitalWrite(ledPin,LOW);
  delay(1000);
   digitalWrite(ledPin,HIGH);
  delay(1000);
  digitalWrite(ledPin,LOW);
  delay(1000);
   digitalWrite(ledPin,HIGH);
  delay(1000);
  digitalWrite(ledPin,LOW);
  delay(1000);
  }

 
  byte temp = get3231Temp();
}

  g_registerArray [0] = g_digits [temp / 10];
  g_registerArray [1] = g_digits [temp % 10];
  g_registerArray [2] = g_digits [90];  // Degree symbol
  g_registerArray [3] = g_digits [91];  // C
 
  sendSerialData (g_registers, g_registerArray);
   delay(3000);
   
  }
 

Re: Часы на ардуино, 74hc595 и куче светодиодов.

Ср сен 09, 2020 18:10:03

Вы код точно скопировали? Компилятор не ругается?
Код:
  disp = (hour * 100) + minute;
  g_numberToDisplay = disp;

{ // вот это что за фигурная скобка? Такая же и внизу кода.

   if (g_numberToDisplay < 10)
  {

Re: Часы на ардуино, 74hc595 и куче светодиодов.

Чт сен 10, 2020 16:00:00

Компилятор не ругался, попробовал разные варианты, начали закрадываться подозрения, что это тупиковая ветвь кода. Ниже более раняя версия с которой все и началось. Работает отлично, но не понравилось, что при показе температуры мигают точки и в попытке это победить вышел вариант кода где не показывает время с 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
 
 Stanley Seow
 stanleyseow@gmail.com
 
 */

#include <Wire.h>                // i2c wire libraries for RTC
#include "RTClib.h"              // RTC libraries

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

// Begin setup() functions //


float get3231Temp(){
  byte tMSB, tLSB;
  float temp3231;

Wire.beginTransmission(0x68);
Wire.write(0x11);
Wire.endTransmission();
Wire.requestFrom(0x68, 2);

  if(Wire.available()) {
    tMSB = Wire.read(); //2's complement int portion
    tLSB = Wire.read(); //fraction portion

    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_digits [0] = 8 + 4 + 2 + 64 + 32 + 1;
  g_digits [1] = 4 + 2;
  g_digits [2] = 8 + 4 + 16 + 32 + 64;
  g_digits [3] = 8 + 4 + 16 + 2 + 64;
  g_digits [4] = 1 + 16 + 4 + 2;
  g_digits [5] = 8 + 1 + 16 + 2 + 64;
  g_digits [6] = 8 + 1 + 16 + 2 + 64 + 32;
  g_digits [7] = 8 + 4 + 2;
  g_digits [8] = 8 + 4 + 2 + 64 + 32 + 1 + 16;
  g_digits [9] = 8 + 4 + 2 + 1 + 16 + 64;
  g_digits [90] = a + d + e + c;           // Degree dot
  g_digits [91] = a +d+f+g;           // Capital C
  g_digits [92] = e + g;                   //  r, 80
  g_digits [93] = f + e + g + c;           //  h, 116
  g_digits [94] = f + e + g + c;
  g_digits [99] = 0;
 
  // 7-segment testing... blink 4 times
  for (int i=0;i<5;i++) {
 
    g_registerArray [0] = g_digits [8];
    g_registerArray [1] = g_digits [8];
    g_registerArray [2] = g_digits [8];
    g_registerArray [3] = g_digits [8];
   
    sendSerialData (g_registers, g_registerArray);
    delay(300);

    g_registerArray [0] = g_digits [99];
    g_registerArray [1] = g_digits [99];
    g_registerArray [2] = g_digits [99];
    g_registerArray [3] = g_digits [99];
   
    sendSerialData (g_registers, g_registerArray);
    delay(300);
     
  }
 
} // End of setup() //

// Простая функция для отправки последовательных данных в один или несколько сдвиговых регистров путем итерации назад по массиву.
// Хотя 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
 
  /* Serial output debugging for the date & time
 
   Serial.print(now.year(), DEC);
   Serial.print('/');
   Serial.print(now.month(), DEC);
   Serial.print('/');
   Serial.print(now.day(), DEC);
   Serial.print(' ');
 */
 
   Serial.print(hour);
   Serial.print(':');
   Serial.print(minute);
   Serial.print(':');   
   Serial.print(sec);
   Serial.println();
   Serial.print("Temperature: ");
    Serial.print(get3231Temp());
    Serial.println(" C");
 
 
  // Push the hour 2 digits to the left by multiplying 100
 
  disp = (hour * 100) + minute;
  g_numberToDisplay = disp;
 





   if (g_numberToDisplay < 10)
  {
    g_registerArray [0] = g_digits [0];
    g_registerArray [1] = g_digits [0];
    g_registerArray [2] = g_digits [0];
    g_registerArray [3] = g_digits [g_numberToDisplay];
  }
  else if (g_numberToDisplay < 100)
  {
    g_registerArray [0] = g_digits [0];
    g_registerArray [1] = g_digits [0];
    g_registerArray [2] = g_digits [g_numberToDisplay / 10];
    g_registerArray [3] = g_digits [g_numberToDisplay % 10];
  }
  else if (g_numberToDisplay < 1000)
  {
    g_registerArray [0] = g_digits [0];
    g_registerArray [1] = g_digits [g_numberToDisplay / 100];
    g_registerArray [2] = g_digits [(g_numberToDisplay % 100) / 10];
    g_registerArray [3] = g_digits [g_numberToDisplay % 10];
  }
  else
  {
    g_registerArray [0] = g_digits [g_numberToDisplay / 1000];
    g_registerArray [1] = g_digits [(g_numberToDisplay % 1000) / 100];
    g_registerArray [2] = g_digits [(g_numberToDisplay % 100) / 10];
    g_registerArray [3] = g_digits [g_numberToDisplay % 10];
  }

  // Read the DHT11 sensors
  int span = 10;
  int aRead = 0;

  // Display Temp every 10 secs
 
 
  if ( (sec == 0) || (sec == 10) || (sec == 20) || (sec == 30) ||
       (sec == 40) || (sec == 50) ) {
         
  // Get DHT temp & humid
  byte temp = get3231Temp();
 
  // Adjust DHT11 temp + 1

   
  // Debugging to serial   
  Serial.print("humdity = ");
  Serial.print(humid, DEC);
  Serial.print("%  ");
  Serial.print("temperature = ");
  Serial.print(temp, DEC);
  Serial.println("C  ");
 
  // Push the 2 digit temp, degree symbol & Char C to the 7-segment LED
  g_registerArray [0] = g_digits [temp / 10];
  g_registerArray [1] = g_digits [temp % 10];
  g_registerArray [2] = g_digits [90];  // Degree symbol
  g_registerArray [3] = g_digits [91];  // C
 
  sendSerialData (g_registers, g_registerArray);
 
 
 
  // Blink the LED connected to pin 13   
  digitalWrite(ledPin,HIGH);
  delay(1000);
  digitalWrite(ledPin,LOW);
  delay(1000);
 
 
 
  }
 
 
  // The below codes display the internal voltmeter readings
  if ( (sec == 2) || (sec == 12) || (sec == 22) || (sec == 32) ||
       (sec == 42) || (sec == 52) ) {
         
   // get the internal voltage in four digits
 
 
   // Serial debugging 
 
 
    // push the voltage to the 7-segment four digits
   
   
    sendSerialData (g_registers, g_registerArray);
    }   
   
 
     else {
      // Display time
      sendSerialData (g_registers, g_registerArray);
  }
 
  // Blink the LED on pin 13 every seconds
  digitalWrite(ledPin,HIGH);
  delay(1000);
  digitalWrite(ledPin,LOW);
  delay(1000);
 

}

Re: Часы на ардуино, 74hc595 и куче светодиодов.

Чт сен 10, 2020 18:24:27

Очень плохой компилятор.

Сразу что-то не заметил:
у вас объявлено
Код:
byte g_digits [10];             // Definitions of the 7-bit values for displaying digits
Всего 10.
Потом идет
Код:
g_digits [90] = a + d + e + c;           // Degree dot
Откуда 90 взялось?
Полную схему дайте, в протеусе смоделирую.

Re: Часы на ардуино, 74hc595 и куче светодиодов.

Чт сен 10, 2020 21:10:04

Компилятор ругнется если выставить соответствующие флажки (файл-> настройки -> сообщения компилятора -> ВСЕ)
8)
Не забываем сворачивать исходник в спойлер (или прикреплять файлом приложения).
Ёжли используется DS3231, то его и указывать надо - не путать с DS1307 - у них карта и назначение регистров РАЗНЫЕ.
Да и схемка бы не помешала...
:write:
компилируется, но с кучей вармингов:

Следовательно надо логику отслеживать, лазая по используемым библиотекам.
:roll:

Re: Часы на ардуино, 74hc595 и куче светодиодов.

Сб сен 12, 2020 07:01:22

Не забываем сворачивать исходник в спойлер (или прикреплять файлом приложения).


Админ, поправь пожалуйста, а то у меня пропала возможность вносить правки в написанные сообщения

Re: Часы на ардуино, 74hc595 и куче светодиодов.

Пт окт 30, 2020 16:52:28

Здравствуйте, правка кода ни к чему нормальному не привела + работа, смирился с тем что мигают точки при показе температуры, да и температуру показывает рандомно. Подключил через зарядник от телефона, сами часы с макеткой ардуино поставил на подоконник (очень удобно, проснулся ночью и время видно сразу напрямую или в отражение потолка).
Сегодня (темнеет рано) заметил, что светодиод Rx мигает при показе времени в такт 13 выходу на которую и подключены точки, а при показе температуры точки мигают без подмигивания Rx. Думаю, что эта синхронизация точно не спроста и есть вероятность, что после переноса часов с китайского клона ардуино уно на атмегу 328 заработает нормально. Так же натолкнуло на мысль, что может не хватать тока от зарядника от телефона, подключил 6В аккумулятор к сожалению пропуски в показе температуры не пропали. Ток потребления всей схемы 70мА. При возможности повышу напряжение питания.
Есть какие соображения по синхронной вспышке Rx 13 (по идее без разницы какой, хотя есть смысл изменить) и вывода мигания точек секунд ?

Re: Часы на ардуино, 74hc595 и куче светодиодов.

Сб окт 31, 2020 19:02:25

Всяко"вспышки" - некорректность работы программы обслуживания дисплея (типична при "корявой" динамической индикации).
Потребление в 70 мА... Многовато... Опять же без схемки - гадание на....
Ну и питание на светики должно идти мимо встроенного в адуринку стабилизатора...
8)

Re: Часы на ардуино, 74hc595 и куче светодиодов.

Вс ноя 01, 2020 14:30:27

Что-то у меня этот скетч даже не компилируется, он точно рабочий?
Почему в первом сообщении закоментирован кусок кода отвечающий за подключение библиотек, объявление переменных и стартовую инициализацию?
Почему таблица истинности для семисегментного индикатора не соответствует сегментам индикатора?
Зачем часам задержка в десять секунд на мигание светодиодом, не проще мигать по изменению секунд?
Зачем мигать светодиодом только когда индикация превышает 9:59?
Зачем в условие индикации температуры прописывать столько значений, не проще было взять остаток от деления на десять и сравнить его с нолём?
Зачем фигурная скобка перед началам вывода на индикатор?

Во втором варианте скетча странная индикация: часы, температура раз в десть секунд (вывод в порт значения) и одно мигание СИД, вывод в порт отладочного значения каждые двенадцать секунд, и опять одиночное мигание. Я прав?

И ещё вопрос, как часы корректировать?

Re: Часы на ардуино, 74hc595 и куче светодиодов.

Чт ноя 12, 2020 11:34:25

чтобы не плодить темы.
Переделал свои часики, унесенные в своё время с завода Ресурс в Богородицке и верно отслужившие почти 30 лет.
По хотению жены кажут температуру, есть будильник. Обеспечено бесперебойное питание. Авторегулировка яркости.
Скетчик написан по прочтению разных форумов и пугает меня самого :shock:
Но работают часики, как надо! В архиве файл протеуса, исходник и прошивка. Да, еще фотка часов.
Очень рад буду критике кода и оптимизации схемы.
Вложения
test.rar
(241.41 KiB) Скачиваний: 223

Re: Часы на ардуино, 74hc595 и куче светодиодов.

Ср ноя 18, 2020 13:12:43

Найдена ошибочка, перезалил. Скетчик делал для работы от Кроны. Если от АКБ 18650 с платой заряда и повышайкой - работают часики в полном функционале более 6-ти часов. Тогда часть программы, отвечающей за контроль сети, можно удалить.
Вложения
test.rar
(12.56 KiB) Скачиваний: 206
Последний раз редактировалось chern55 Ср ноя 18, 2020 20:15:59, всего редактировалось 1 раз.

Re: Часы на ардуино, 74hc595 и куче светодиодов.

Ср ноя 18, 2020 15:32:47

Если часы в основном работают от сети, то при питание от батареи следует ограничивать функционал. Например отключить постоянную индикацию, времени. chern55, твои часы тоже на 74hc595?

Re: Часы на ардуино, 74hc595 и куче светодиодов.

Ср ноя 18, 2020 18:51:00

Часики собраны на TM1637 и дисплее E40803-I4-PG2-0-W. при питании от батареи показывают время 1 сек раз в минуту на минимальной яркости. Будильник работает.
В планах замутить на E11501-G-PG2-0-W и расширить функционал. Ввести анимацию, отключаемую по времени, датчик температуры на радиомодуле и датчик давления.
Вложения
индикатор.dip
(117.72 KiB) Скачиваний: 197
индикатор.lay6
(22.55 KiB) Скачиваний: 213

Re: Часы на ардуино, 74hc595 и куче светодиодов.

Чт ноя 19, 2020 02:33:16

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

Re: Часы на ардуино, 74hc595 и куче светодиодов.

Чт ноя 19, 2020 15:07:44

Не сказано, что только 6 часов работы от АКБ. 6 часов - легко, дальше не тестировалось. Показ времени раз в минуту при работе от Кроны - нормально.

Re: Часы на ардуино, 74hc595 и куче светодиодов.

Чт ноя 19, 2020 15:25:02

Ты считаешь что пялится на погасшие часы минуту и ждать когда они соизволят показать время это лучше чем принудительно их попросить?

Re: Часы на ардуино, 74hc595 и куче светодиодов.

Чт ноя 19, 2020 15:30:59

Схему не открыть...
Может в виде рисунка (экспорт файла) или в виде *.pdf (распечатка на doPDF v7 к примеру)
тогда любой посмотреть сможет.
:roll:
Для работы от батарей лучше таки ЖКИ... Те, что без подсветки работают...
:roll:
А насчет "индикации по требованию"... можно или емкостной датчик или еще какай поставить...
8)

Re: Часы на ардуино, 74hc595 и куче светодиодов.

Чт ноя 19, 2020 22:23:05

Если рассчитывать на то, что часики на 176 серии без сети не кажут время вовсе, и ничего, 30 лет проработали. Будили на работу в 6:10.
Схема прикрепил, файл протеуса тоже. Кнопку любую добавить легко. Можно даже по свистку. А еще можно постучать соседям в стену. Тогда и часы не нужны. И время узнаешь, и мнение о своём психофизическом состоянии - тоже.
Обсуждаем корявость скетчика или функционал часов?
Вложения
test.rar
(293.74 KiB) Скачиваний: 217

Re: Часы на ардуино, 74hc595 и куче светодиодов.

Пт ноя 20, 2020 02:39:40

Твои часы не соответствую названию темы, хочешь критики кода, то создавай новую тему.

Re: Часы на ардуино, 74hc595 и куче светодиодов.

Пт ноя 20, 2020 07:34:47

создана новая тема https://radiokot.ru/forum/viewtopic.php?f=57&t=173963
Ответить