Время DS1307

Добрый День!
Прошу помогите разобраться. Как должен выглядеть код если нужно при достижении времени X зажигать лампу а при достижении времени Y выключать или для этого есть более простое решение чем этот код ?
использую Arduino UNO и модуль времени DS1307 подключен через I2C
#include “Wire.h”
#define DS1307_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return( (val/1016) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return( (val/16
10) + (val%16) );
}
void setup()
{
Wire.begin();
Serial.begin(9600);
// set the initial time here:
// DS1307 seconds, minutes, hours, day, date, month, year
// setDS1307time(30,23,2,2,10,4,23);
}
void setDS1307time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
// sets time and date data to DS1307
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour)); // set hours
Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
Wire.write(decToBcd(month)); // set month
Wire.write(decToBcd(year)); // set year (0 to 99)
Wire.endTransmission();
}
void readDS1307time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0); // set DS1307 register pointer to 00h
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
// request seven bytes of data from DS1307 starting from register 00h
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
void displayTime()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
// retrieve data from DS1307
readDS1307time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);
// send it to the serial monitor
Serial.print(hour, DEC);
// convert the byte variable to a decimal number when displayed
Serial.print(“:”);
if (minute<10)
{
Serial.print(“0”);
}
Serial.print(minute, DEC);
Serial.print(“:”);
if (second<10)
{
Serial.print(“0”);
}
Serial.print(second, DEC);
Serial.print(" “);
Serial.print(dayOfMonth, DEC);
Serial.print(”/“);
Serial.print(month, DEC);
Serial.print(”/“);
Serial.print(year, DEC);
Serial.print(” День недели: ");
switch(dayOfWeek){
case 1:
Serial.println(“Воскресенье”);
break;
case 2:
Serial.println(“Понедельник”);
break;
case 3:
Serial.println(“Вторник”);
break;
case 4:
Serial.println(“Среда”);
break;
case 5:
Serial.println(“Четверг”);
break;
case 6:
Serial.println(“Пятница”);
break;
case 7:
Serial.println(“Суббота”);
break;
}
}
void loop()
{
displayTime(); // display the real-time clock data on the Serial Monitor,
delay(2000); // every second
}

Во-первых

Снимок экрана в 2023-03-05 17-05-33

Во-вторых - какое отношение этот код имеет к вашей задаче?

А прежде, чем просить, Вы не могли разобраться как здесь и что на этом форуме? Например, просто прочитать текст, который специально для Вас вставили в пустое окно сообщения (он там был, пока Вы не начали вколачивать свой опус). Или Вы писатель и принципиально ничего не читаете?

Окно выглядело так:

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

Исправьте своё сообщение, вставив в него код правильно, если хотите, чтобы с Вами здесь разговаривали.

ВАМ проще человека с часами поставить у выключателя. Программно ВАМ это сделать практически невозможно

1 лайк

Извините согласен вышло криво.
Не как тут отредактировать свое сообщение ? Не вижу иконки или надписи для этого или начальное сообщение редактировать нельзя ? Потому что ответы редактируются без проблем. Возможно нельзя редактировать сообщение на которое уже ответили ? Тогда как я сделаю то что Вы просите ?

А это нужно нам или вам?
Возможность редактировать посты остается только некоторое время после публикации (вроде бы).

Снимок экрана в 2023-04-11 09-36-52

Если нет, то просто вставьте код заново в новом сообщении

Добрый День!
Прошу помогите разобраться. Как должен выглядеть код если нужно при достижении времени X зажигать лампу а при достижении времени Y выключать или для этого есть более простое решение чем этот код ?
использую Arduino UNO и модуль времени DS1307 подключен через I2C

#include “Wire.h”
#define DS1307_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
return( (val/10<em>16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
return( (val/16</em> 10) + (val%16) );
}
void setup()
{
Wire.begin();
Serial.begin(9600);
// set the initial time here:
// DS1307 seconds, minutes, hours, day, date, month, year
// setDS1307time(30,23,2,2,10,4,23);
}
void setDS1307time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
// sets time and date data to DS1307
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0); // set next input to start at the seconds register
Wire.write(decToBcd(second)); // set seconds
Wire.write(decToBcd(minute)); // set minutes
Wire.write(decToBcd(hour)); // set hours
Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
Wire.write(decToBcd(month)); // set month
Wire.write(decToBcd(year)); // set year (0 to 99)
Wire.endTransmission();
}
void readDS1307time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.write(0); // set DS1307 register pointer to 00h
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
// request seven bytes of data from DS1307 starting from register 00h
*second = bcdToDec(Wire.read() & 0x7f);
*minute = bcdToDec(Wire.read());
*hour = bcdToDec(Wire.read() & 0x3f);
*dayOfWeek = bcdToDec(Wire.read());
*dayOfMonth = bcdToDec(Wire.read());
*month = bcdToDec(Wire.read());
*year = bcdToDec(Wire.read());
}
void displayTime()
{
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
// retrieve data from DS1307
readDS1307time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);
// send it to the serial monitor
Serial.print(hour, DEC);
// convert the byte variable to a decimal number when displayed
Serial.print(“:”);
if (minute<10)
{
Serial.print(“0”);
}
Serial.print(minute, DEC);
Serial.print(“:”);
if (second<10)
{
Serial.print(“0”);
}
Serial.print(second, DEC);
Serial.print(" “);
Serial.print(dayOfMonth, DEC);
Serial.print(”/“);
Serial.print(month, DEC);
Serial.print(”/“);
Serial.print(year, DEC);
Serial.print(” День недели: ");
switch(dayOfWeek){
case 1:
Serial.println(“Воскресенье”);
break;
case 2:
Serial.println(“Понедельник”);
break;
case 3:
Serial.println(“Вторник”);
break;
case 4:
Serial.println(“Среда”);
break;
case 5:
Serial.println(“Четверг”);
break;
case 6:
Serial.println(“Пятница”);
break;
case 7:
Serial.println(“Суббота”);
break;
}
}
void loop()
{
displayTime(); // display the real-time clock data on the Serial Monitor,
delay(2000); // every second
}

Извините за невнимательность . Поправил.

В этот код надо ещё добавить вкл/выкл лампы. Это лишь часы.

в какой именно строчке у вас попытка “зажечь” лампу? И пожалуйста уточните, лампа паяльная, электрическая, Алладина?

Угадаю следующий вопрос: в какой строчке что нужно написать? :slight_smile:

Этого вообще нет.
Я далек от программирования.
Но искренне пытаюсь понять как. Как мне сравнить значение Сколько часов ? (в какой переменной это хранится и как узнать какой тип у этой переменной ?). Надеюсь понятно объяснил

Вижу текст гуру. О великий не могли бы вы помочь ? Вы просто выглядите жалко, возможно Вас кто то постоянно тыкает носом и унижает когда вы спрашиваете про сферу в которой не понимаете, но это мелочь. Не парьтесь если не Вы то я найду решение в другом месте.

думаю вам уже пора начинать искать “другое место”.

Не в традициях форума писать код за новичков. А уж за тех, которые хамят - и подавно.

Кстати, рекомендую, попробовать arduino.cc. Говорят иностранцы вежливые…

Спасибо за подсказку думаю Вы правы надо идти туда где могут подсказать а не показывать свое ЭГО. Извините за портаченное время.

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

Надеюсь, понятно объяснил?

Что ж, учиться постепенно, от примера к примеру нудно, хочется сразу чего-то “серьёзного”…
Я и сам иной раз гляжу на чей-то код, как баран на новые ворота)))

Это вполне нормальный вопрос, почему бы не ответить. Вот они, эти переменные:

а вот тут их тип

Это потому, что учиться на примерах не продуктивно. Не зря же в ВУЗах семинарам всегда предшествуют лекции. Примеры должны только закреплять уже усвоенную теорию практикой.

Ха … Вы правы ChatGPT без лишних эмоций написал мне нужный код, осталось поправить пины. Спасибо. Надеюсь Вы так и будете общаться с ГУРУ и отправлять всех читать учебники. Еще раз извините. На готовом примере проще разобраться оказалось.

Нет, дружище, ты по малообразованности своей все перепутал. Это мы - ГУРУ (для тебеподобных). А учебники мы и сами читаем постоянно. Разные.

Аминь