26

Re: Часы (DS3231) с будильником (Arduino)

???

27 (2024-04-27 23:07:21 отредактировано Evgen326)

Re: Часы (DS3231) с будильником (Arduino)

Вопрос по схеме, а именно кнопке "-", на какой порт (пин) платы она подключается (на схеме написано 4, но на А4 висит DS3231, а на D4 висит LCD)?

28

Re: Часы (DS3231) с будильником (Arduino)

Покажите схему

29

Re: Часы (DS3231) с будильником (Arduino)

http://forum.rcl-radio.ru/uploads/images/2024/04/69f0c80cfeb41e40fde500d3a93afdef.png

30

Re: Часы (DS3231) с будильником (Arduino)

а на D4 висит LCD)?

7 8 9 10 11 12

D4 не занят под LCD

31

Re: Часы (DS3231) с будильником (Arduino)

Я так понимаю на D4

32

Re: Часы (DS3231) с будильником (Arduino)

D4 по схеме, это пин LCD

33

Re: Часы (DS3231) с будильником (Arduino)

История и замысел проекта:
  В 1990 году были приобретены электронные часы «Электронника 12-41А», которые достаточно долго выполняли свои функции. Но время не стоит на месте, а электронные элементы имеют свойство терять свои параметры и выходить из строя. Корпус часов сохранился в достаточно хорошем состоянии, а вот элементы, такие как трансформатор, конденсаторы и индикатор умерли. Часы были убраны в кладовку и так пролежали лет 5, дожидаясь своей участи, отправится на помойку истории или получить новую жизнь.
  Наступил новый год и принёс новую идею по поводу часов.
  Родную начинку на разбор, собираем схему из новых элементов и даем часам новую жизнь с сохранением функционала кнопок, добавляем возможностей отображать дополнительной информации.
    Алгоритм работы:
  При включении питания (прошивка уже залита) Arduino NANO считывает данные с модулей DS3231 и BME280, и выводит информацию на LCD1604 + I2C. Пользователь в процессе эксплуатации, может в ручном режиме нажимая на кнопки, устанавливать (корректировать) на модуле DS3231 текущее время, дату и время будильника. Кроме того, будильник может быть принудительно включен или выключен переключателем "СИГНАЛ", при включении будильника переключателем "СИГНАЛ" загорается светодиод, указывая на то, что режим будильника активен. При срабатывании будильника пользователь может его остановить, нажав на сенсорную кнопку "СИГНАЛ-СТОП", которая распологается в  верхней правой части корпуса. Подсветка LCD1604 автоматическая и может быть выключена пользователем нажатием на сенсорную кнопку "ИНДИКАЦИЯ", которая распологается в верхней левой части корпуса.

    Требования:
- автоматическая регулировка яркости дисплея;
- часы;
- дата;
- день недели (на русском);
- будильник;
- выключатель будильника;
- термометр комнатной температуры;
- датчик атмосферного давления;
- автономное питание не менее 168 часов;
- выключатель дисплея (для экономии энергии в автономном режиме);
- выключение всех модулей (через тумблер, для жесткой экономии АКБ, но модуль DS3231 продолжает работать от своей батареи);

    Доп.функции (по возможности):
- таймер обратного времени;
- секундомер;
- кнопка «Общий сброс»;
   
    Питание:
- 5V (USB или …)

    Модули и элементы:
- Arduino NANO
- DS3231 (часы реального времени)
- LCD1604 + I2C
- BME280 (датчик температуры, влажности и давления воздуха I2C/SPI)
- TZT PGM5537 (фоторезистор)
- TP4056 (контроллер заряда АКБ)
- АКБ 18650 (2000 мА)
- TTP223 (сенсорная кнопка) х2

34

Re: Часы (DS3231) с будильником (Arduino)

Прошу помощи в написании части кода для ручной установки времени и будильника.

35

Re: Часы (DS3231) с будильником (Arduino)

Опубликуйте скетч который Вы сейчас используете.

36 (2024-05-02 21:39:36 отредактировано Evgen326)

Re: Часы (DS3231) с будильником (Arduino)

int fr = 0;

  #include <Wire.h>
  #include <LiquidCrystal_I2C.h>
  #include <LCD_1602_RUS.h>
  LCD_1602_RUS lcd(0x27,16,2);
  #include <iarduino_RTC.h>
  iarduino_RTC watch(RTC_DS3231);
  #include "SparkFunBME280.h"
  BME280 mySensor;
  byte bcdToDec(byte value){  return ((value / 16) * 10 + value % 16); }
  byte decToBcd(byte value){  return (value / 10 * 16 + value % 10); }


// Функция вывода сокращенного дня недели русскими буквами
void dn() {
  if ((watch.weekday) == 0) {
    lcd.setCursor(14, 0);
     lcd.print("ВС");
     }
  if ((watch.weekday) == 1) {
    lcd.setCursor(14, 0);
     lcd.print("ПН");
     }
  if ((watch.weekday) == 2) {
    lcd.setCursor(14, 0);
     lcd.print("ВТ");
     }
  if ((watch.weekday) == 3) {
    lcd.setCursor(14, 0);
     lcd.print("СР");
     }
  if ((watch.weekday) == 4) {
    lcd.setCursor(14, 0);
     lcd.print("ЧТ");
     }
  if ((watch.weekday) == 5) {
    lcd.setCursor(14, 0);
     lcd.print("ПТ");
     }
  if ((watch.weekday) == 6) {
    lcd.setCursor(14, 0);
     lcd.print("СБ");
     }
  lcd.setCursor(13, 0);
   lcd.print(" ");
   lcd.setCursor(10, 0);
   lcd.print((String(":")));
   delay(500);
  lcd.setCursor(10, 0);
   lcd.print((String(" ")));
   delay(500);
}

// Функция чтения данных из молуля BME280
void BME280() {
  mySensor.settings.commInterface = I2C_MODE;
  mySensor.settings.I2CAddress = 0x76;
  mySensor.settings.runMode = 3;
  mySensor.settings.tStandby = 2;
  mySensor.settings.filter = 0;
  mySensor.settings.tempOverSample = 1;
  mySensor.settings.pressOverSample = 1;
  mySensor.settings.humidOverSample = 1;
  mySensor.begin();
}

// Функция преобразования значений фоторезистора
void FR() {
  fr = map(analogRead(A2), 0, 100, 10, 250);
}

// Плавная регулировка подсветки LCD
void FR_LCD_LED() {
   analogWrite(10, fr);
  delay(250);
}

// Сенсорная кнопка D2 - вкл/выкл подсветки LCD
void FR_SK1() {
  if (digitalRead(11) == 1) {
    pinMode(10, OUTPUT);
     digitalWrite(10, 1);
    FR_LCD_LED();
  }
  if (digitalRead(11) == 0) {
    pinMode(10, OUTPUT);
     digitalWrite(10, 0);
  }
  delay(250);
}


void setup() {
  Wire.begin();
  lcd.init();
  lcd.backlight();
  watch.begin();

  pinMode(10, OUTPUT);
  pinMode(11, INPUT_PULLUP);
}

void loop() {
 
     lcd.setCursor(8, 0); {lcd.println(watch.gettime("H:i"));}
    dn();
    lcd.setCursor(6, 1); {lcd.println(watch.gettime("d.m.Y"));}
    BME280();
    FR();
    FR_SK1();

    lcd.setCursor(0, 0);
     lcd.print(mySensor.readTempC());
     lcd.setCursor(4, 0);
     lcd.print((String(char(223)) + String("C")));
     int mmH=mySensor.readFloatPressure()/133.5;
    lcd.setCursor(0, 1);
     lcd.print((String(mmH) + String("mH")));

}

37

Re: Часы (DS3231) с будильником (Arduino)

http://forum.rcl-radio.ru/uploads/images/2024/04/48f50bf1f22b052a2335b50e8c068160.jpg

38

Re: Часы (DS3231) с будильником (Arduino)

У Вас уже собрана схема которую Вы опубликовали?

39

Re: Часы (DS3231) с будильником (Arduino)

Да

40

Re: Часы (DS3231) с будильником (Arduino)

Фото на первой странице

41

Re: Часы (DS3231) с будильником (Arduino)

Я не работаю с чужими скетчами, мне проще написать с нуля. Но потребуется много тестов с Вашей стороны, так как я не буду собирать схему.

Сейчас нет в наличии всех компонентов схемы,

42

Re: Часы (DS3231) с будильником (Arduino)

Я готов тестить

43

Re: Часы (DS3231) с будильником (Arduino)

Вот тестовый скетч, выводит в монитор порта показания всех датчиков:
время, температуру, давление, влажность, значение датчика освещенности

Установите все библиотеки указанные в скетче

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

#include <Wire.h> 
#include <Adafruit_Sensor.h>    // https://github.com/adafruit/Adafruit_Sensor.git                      
#include <Adafruit_BME280.h>    // https://github.com/adafruit/Adafruit_BME280_Library.git
// может понадобится библиотека Adafruit_I2CDevice.h >>> https://github.com/adafruit/Adafruit_BusIO.git
#include <DS3231.h>             // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip
 DS3231 clock;RTCDateTime DateTime;
 Adafruit_BME280 bme;

 int hour,minut,secon,year,month,day,den;
 int svet;
 float temp,p,h;

void setup() {
  Serial.begin(9600);
  clock.begin();
  bme.begin(0x76);
  pinMode(A2,INPUT);
}

void loop() {
  svet = analogRead(A2);
  
  DateTime = clock.getDateTime();
  hour = DateTime.hour;
  minut = DateTime.minute;
  secon = DateTime.second;
  year=DateTime.year;
  month=DateTime.month;
  day=DateTime.day;
  den=DateTime.dayOfWeek;

  temp = bme.readTemperature();
  p = bme.readPressure() / 133.3224;
  h = bme.readHumidity();

  Serial.print(hour/10);Serial.print(hour%10);Serial.print(":");
  Serial.print(minut/10);Serial.print(minut%10);Serial.print(":");
  Serial.print(secon/10);Serial.println(secon%10);
  Serial.println(temp,1);
  Serial.println(p,1);
  Serial.println(h,1);
  Serial.println(svet);
  delay(1000);
}

44

Re: Часы (DS3231) с будильником (Arduino)

http://forum.rcl-radio.ru/uploads/images/2024/04/3b5a3452ce53387a33598dbbee4735d1.jpg

45

Re: Часы (DS3231) с будильником (Arduino)

У Вас влажность 100%???
Нет напряжения на датчике освещенности, вход А2 подключен датчик освещенности?

46

Re: Часы (DS3231) с будильником (Arduino)

http://forum.rcl-radio.ru/uploads/images/2024/04/aedd62c73539cdc2198935a2039f2b7d.jpg
Мордой вниз лежала лицевая часть, по этому не было показаний с фоторезистора, а по поводу влажности вопрос, т.к. мне изначально не удалось получить адекватные показания (менял библиотеки, устраивал танцы с бубном, но без результатно).

47

Re: Часы (DS3231) с будильником (Arduino)

Напряжение на датчике освещенности очень маленькое, возможно не верно подобран резистор делителя напряжения.

48

Re: Часы (DS3231) с будильником (Arduino)

http://forum.rcl-radio.ru/uploads/images/2024/04/39bafcd975808e564cb80ac78ff39e30.jpg

49

Re: Часы (DS3231) с будильником (Arduino)

На улице пасмурно, по этому и были низкие показатели, последнее фото с включеной настольной лампой.

50

Re: Часы (DS3231) с будильником (Arduino)

Должна работать автоподсветка дисплея

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>  // http://forum.rcl-radio.ru/misc.php?action=pan_download&item=45&download=1
#include <Adafruit_Sensor.h>    // https://github.com/adafruit/Adafruit_Sensor.git                      
#include <Adafruit_BME280.h>    // https://github.com/adafruit/Adafruit_BME280_Library.git
// может понадобится библиотека Adafruit_I2CDevice.h >>> https://github.com/adafruit/Adafruit_BusIO.git
#include <DS3231.h>             // http://rcl-radio.ru/wp-content/uploads/2022/10/DS3231.zip
 DS3231 clock;RTCDateTime DateTime;
 Adafruit_BME280 bme;
 LiquidCrystal_I2C lcd(0x27,16,2); 

 int hour,minut,secon,year,month,day,den;
 int svet;
 float temp,p,h;

void setup() {
  Serial.begin(9600);
  lcd.init();lcd.backlight();
  pinMode(10,OUTPUT);  
  analogWrite(10, 200);
  clock.begin();
  bme.begin(0x76);
  pinMode(A2,INPUT);
}

void loop() {
  svet = map(200, 0,250,50,250);if(svet>250){svet=250;}
  analogWrite(10, svet);
  
  DateTime = clock.getDateTime();
  hour = DateTime.hour;
  minut = DateTime.minute;
  secon = DateTime.second;
  year=DateTime.year;
  month=DateTime.month;
  day=DateTime.day;
  den=DateTime.dayOfWeek;

  temp = bme.readTemperature();
  p = bme.readPressure() / 133.3224;
  h = bme.readHumidity();

  Serial.print(hour/10);Serial.print(hour%10);Serial.print(":");
  Serial.print(minut/10);Serial.print(minut%10);Serial.print(":");
  Serial.print(secon/10);Serial.println(secon%10);
  Serial.println(temp,1);
  Serial.println(p,1);
  Serial.println(h,1);
  Serial.println(svet);

  lcd.setCursor(0, 0);
  lcd.print(temp,1);lcd.print((char)223);lcd.print("C ");
  lcd.setCursor(8, 0); 
  lcd.print(hour/10);lcd.print(hour%10);lcd.print(":");lcd.print(minut/10);lcd.print(minut%10);

  lcd.setCursor(0, 1);
  lcd.print(p,0);lcd.print("mH");
  lcd.setCursor(6, 1);
  lcd.print(day/10);lcd.print(day%10);lcd.print(".");lcd.print(month/10);lcd.print(month%10);lcd.print(".");lcd.print(year);
  
  delay(1000);
}