Как преобразовать переменную для RTC DS1302?

NikitaS
Offline
Зарегистрирован: 22.10.2016

Всем привет! Прошу помощи с часами DS1302. Никак не могу добиться от кода, чтобы в мониторе выводились Hello World. Брал библиотеку отсюда.

Вот код:

// DS1302_Serial_Easy (C)2010 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
//
// A quick demo of how to use my DS1302-library to 
// quickly send time and date information over a serial link
//
// I assume you know how to connect the DS1302.
// DS1302:  CE pin    -> Arduino Digital 2
//          I/O pin   -> Arduino Digital 3
//          SCLK pin  -> Arduino Digital 4

#include <DS1302.h>

// Init the DS1302
DS1302 rtc(2, 3, 4);

void setup()
{
  // Set the clock to run-mode, and disable the write protection
  rtc.halt(false);
  rtc.writeProtect(false);
  
  // Setup Serial connection
  Serial.begin(9600);
  // The following lines can be commented out to use the values already stored in the DS1302
  rtc.setDOW(FRIDAY);        // Set Day-of-Week to FRIDAY
  rtc.setTime(18, 59, 55);     // Set the time to 12:00:00 (24hr format)
  rtc.setDate(22, 9, 2012);   // Set the date to August 6th, 2010
}

void loop()
{
  // Send Day-of-Week
  Serial.print(rtc.getDOWStr());
  Serial.print(" ");
  
  // Send date
  Serial.print(rtc.getDateStr());
  Serial.print(" -- ");
  // Send time
  Serial.println(rtc.getTimeStr());
  if (rtc.getTimeStr() == "19:00:00") //Сравнивается текущее время с нужным
  {
    Serial.print("Hello World");
  }
  // Wait one second before repeating :)
  delay (1000);
}

В результате этого кода на монитор выводятся данные, все хорошо, но вот ХеллоВорлд не выводится. Насколько понимаю, getTimeStr() вовзращает время в виде строки, а в if() в скобках тоже строки. Через 5 секунд время становится 19:00:00, а монитор никак не показывает слова. Если написать if (rtc.getTimeStr() > 1), то слова появляются.

На форуме поискал, есть тема, как получить отдельно часы, минуты. Попытался добавить несколько строк, но IDE ругается, что переменные разного типа, "Time" и "int". Вот код, убрал некоторые лишние строки, выводящие дату:

// DS1302_Serial_Easy (C)2010 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
//
// A quick demo of how to use my DS1302-library to 
// quickly send time and date information over a serial link
//
// I assume you know how to connect the DS1302.
// DS1302:  CE pin    -> Arduino Digital 2
//          I/O pin   -> Arduino Digital 3
//          SCLK pin  -> Arduino Digital 4

#include <DS1302.h>

// Init the DS1302
DS1302 rtc(2, 3, 4);
Time t;

void setup()
{
  // Set the clock to run-mode, and disable the write protection
  rtc.halt(false);
  rtc.writeProtect(false);
  
  // Setup Serial connection
  Serial.begin(9600);
  // The following lines can be commented out to use the values already stored in the DS1302
  rtc.setDOW(FRIDAY);        // Set Day-of-Week to FRIDAY
  rtc.setTime(17, 59, 55);     // Set the time to 12:00:00 (24hr format)
  rtc.setDate(22, 9, 2012);   // Set the date to August 6th, 2010
}

void loop()
{
   t = rtc.getTime();

  // Send time
  Serial.println(rtc.getTimeStr());
  if ( t == 19) //Сравнивается текущее время с нужным
  {
    Serial.print("Hello World");
  }
  // Wait one second before repeating :)
  delay (1000);
}

Ругается вот на эту строчку: if ( t == 19). Выяснил еще интересную вещь.  Команда rtc.getTime() выводит-то час правильно, но если написать if (rtc.getTime() > 10), то условие истинно, а если меньше 10, то уже не истинно, то есть почему-то "внутри" rtc.getTime() всегда 10! Это меня ставит в тупик. Прошу помощи, укажите, где зарылась собака.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Строка 42 первого кода. Строки так не сравниваются. Гуглите функцию strcmp

NikitaS пишет:

IDE ругается, что переменные разного типа, "Time" и "int". 

А что Вас смущает-то? Вы всё правильно понимаете. Вы пытаетесь сравнивать переменные разных типов. Как Вы себе этто видите?  Вы можете ответить на вопрос что больше три вилки или две котлеты? Нельзя сравнивать разные сущности.

NikitaS пишет:

Выяснил еще интересную вещь.  Команда rtc.getTime() выводит-то час правильно, но если написать if (rtc.getTime() > 10), то условие истинно, а если меньше 10, то уже не истинно, то есть почему-то "внутри" rtc.getTime() всегда 10! 

Ну, так тоже самое, что и выше. Вы сравниваете переменные разных типов, т.е. "тёплое с мягким".

NikitaS пишет:

Прошу помощи, укажите, где зарылась собака.

Собака спряталась в Вашем незнании языка на котором Вы пытаетесь программировать. Хотя, в отличие от многих новичков здесь, Вы здраво рассуждаете и в принципе понимаете о чём речь, но знания надо прокачать. Вот Вам моя помощь.

NikitaS
Offline
Зарегистрирован: 22.10.2016

ЕвгенийП пишет:

Строка 42 первого кода. Строки так не сравниваются. Гуглите функцию strcmp

Спасибо, Евгений! Раньше изучал основы С++, но так и остался на уровне новичка. Погуглил функцию strcmp. На первом сайте код совершенно непонятный:

Число         Значение

Меньше 0 str1 меньше, чем str2
0 str1 равна str2
Больше 0 str1 больше, чем str2

 

Следующая функция может использоваться как программа проверки пароля. Она возвращает 0 в случае неудачи и 1 в противном случае.
int password()
{
char s[80];
printf("Enter password: ");
gets(s);
if (strcmp(s, "pass")) {
printf("Invalid password.\n");
return 0;
}
return 1;
}

В строчке if (strcmp(s, "pass"))   

если ввести "pass", то в результате if() вернет же 0, правильно? А в коде возвращает почему-то

printf("Invalid password.\n");
return 0;

Почему же "Invalid password", если пользователь вводит правильный пароль, то есть s и "pass" равны? Может, сайт неправильный? В этом еще больше убеждает второй сайт, код на котором логичнее:

#include <iostream>
#include <cstring>
 
int main ()
{
  char fruit[] = "яблоко";                         // загаданный фрукт
  char answer[80];                                 // строка-ответ
 
  do
  {
     std::cout << "Угадайте мой любимый фрукт! >> ";
     std::cin  >> answer;
  } while ( strcmp(fruit, answer) != 0);           // пока фрукт не отгадан, цикл будет работать
 
  std::cout << "Правильный ответ!n";
  return 0;
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Invalid password будет написано, только когда строки не равны

Если s равно "pass", тогда strcmp вернет. 0 и if выполнит часть else

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Скорее всего  gets читает с \n (или \r) на конце.

Напечатйет длину s и саму её поисмовльно - разберётесь.

NikitaS
Offline
Зарегистрирован: 22.10.2016

DetSimen пишет:

Если s равно "pass", тогда strcmp вернет. 0 и if выполнит часть else

Наконец-то понял логику этого кода. Ничего не скажешь, хитро придумано )))

Евгений, скетч заработал как надо, благодаря strcmp:

if(strcmp(rtc.getTimeStr(), "19:00:00") == 0))
{
 Serial.print("HW");
}

Спасибо за ссылку на книгу, может, как-нибудь возьмусь за С. Если сейчас буду изучать, не до конца изучив С++, боюсь, как бы не запутаться.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так Вы порядок перепутали, надо с С начинать :)

NikitaS
Offline
Зарегистрирован: 22.10.2016

C++ везде рекламируется, как более продвинутый вариант С. Поэтому и выбрал С++.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Аглицкий учить тож с О'Генри в оригинале или, все же, с традиционного "Лондон из зе Кэпитл оф Грейт Британ"?

NikitaS
Offline
Зарегистрирован: 22.10.2016

Запорожец или жигули?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Я, када сдавал кандидацкий минимум, читал Алису в стране чудес в оригинале. Мозгодробительное чтиво.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

DetSimen пишет:

читал Алису в стране чудес в оригинале. Мозгодробительное чтиво.

Ага: "Never Imagine yourself not to be otherwise than what it might appear to others that what you were or might have been was not otherwise than what you had been would have appeared to them to be otherwise"

NikitaS
Offline
Зарегистрирован: 22.10.2016

ЕвгенийП пишет:

Ага: "Never Imagine yourself not to be otherwise than what it might appear to others that what you were or might have been was not otherwise than what you had been would have appeared to them to be otherwise"

Так изучить С проще? Полагаю, где-то в 2 раза, в связи с тем, что в С нет указателей и ссылок?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

NikitaS пишет:

 в связи с тем, что в С нет указателей 

А куда ж они оттуда делись?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

вы перепутали, это в С# указателей нету.  Есть, но очень не на виду. 

NikitaS
Offline
Зарегистрирован: 22.10.2016

Неужели изучение С так же просто, как изучение букваря? Может, поэтому я остановился на уровне новичка в С++?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ЕвгенийП пишет:

DetSimen пишет:

читал Алису в стране чудес в оригинале. Мозгодробительное чтиво.

Ага: "Never Imagine yourself not to be otherwise than what it might appear to others that what you were or might have been was not otherwise than what you had been would have appeared to them to be otherwise"

О! Не заметил комментов.

В Алисе смыслы прикольные, ничуть не потерянные при переводе, а язык - очень простой. Без вульгарных просторечий,как в американской прозе и без архаизмов, как у Шекспира, с его вечными зай и зии. Я по Алисе как раз и учил язык еще а школе.

=================================

Для вопрошающего:

С++ это расширение С, а не другой язык. Утверждение не совсем точно, но неточность на уровень выше, чем это вас касается.

Поэтому технически невозможно "учить С++" не изучая С. В этом причина того, что на вами глумятся.

NikitaS
Offline
Зарегистрирован: 22.10.2016

wdrakula пишет:

С++ это расширение С, а не другой язык. Утверждение не совсем точно, но неточность на уровень выше, чем это вас касается.

Поэтому технически невозможно "учить С++" не изучая С. В этом причина того, что на вами глумятся.

В таком случае, верно ли обратное утверждение - изучая С++, изучается С?

NikitaS
Offline
Зарегистрирован: 22.10.2016

NikitaS пишет:

В таком случае, верно ли обратное утверждение - изучая С++, изучается С?

Я так понимаю, что верно, С и С++ - это же один, по сути, язык.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Кровожадный Влад уже ж ответил выше.  #16

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

NikitaS пишет:

Я так понимаю, что верно, С и С++ - это же один, по сути, язык.

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