Проблема с датчиком времени

litaboss
Offline
Зарегистрирован: 02.09.2017

У меня есть лента, к которой 12В+ идет через реле. Замыкание/размыкание реле происходит при 1 на D7. 1 на D7 зависит от датчика времени (DS1302) (цель - добиться включения ленты в 7 утра ежедневно). При проверке данных с датчика времени все оказывается верным. Проблемы с условным оператором, я ставил разные условия выдачи 1 на D7, но во всех случаях он выдает на него 1. Всегда. Даже когда условие не может быть верным ни при каких обстоятельствах. Менял пины, использовал другие библиотеки, бестолку. Надеюсь, мне кто-нибудь что-нибудь посоветует, ибо я в этой теме проездом

#include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS1302,2,4,3);
void setup() {
    delay(300);
    Serial.begin(9600);
    time.begin();
   // time.settime(0,31,20,2,9,17,6);  // 0  сек, 31 мин, 20 час, 2, сентября, 2017 года, суббота
    pinMode(7, OUTPUT);
}
void loop(){
  if(millis()%1000==0){
      Serial.println(time.gettime("d-m-Y, H:i:s, D")); 
     delay(1); // проверка работы датчика выводом данных с переменных
    }
time.gettime();    
if (time.gettime("h")==19) digitalWrite(7,HIGH); // а вот тут на 7 пин всегда дается 1
}

 

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

Библиотека отсюда - http://iarduino.ru/file/235.html ?

Если нет, давайте ссылку. 

А если да, то ...

1. зачем Вы сравниваете значение, возвращаемое gettime() с чсилом 19 (в строке 16)? Чего Вы хотите этим добиться? Вы знаете что именно возвращает gettime? Она возвращает указатель на char - т.е. строку.

2. очень советую выбросить эту библиотеку,  давно не видел столь безграмотного кода.

litaboss
Offline
Зарегистрирован: 02.09.2017

1. Я сравниваю с 19, потому что во время тестов было 19 часов.

2. Ссылку попробую кинуть, минуту

 

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

Давайте, а то если мы на разные библиотеки смотрим, то разговор "в пользу бедных".

litaboss
Offline
Зарегистрирован: 02.09.2017

Скачано отсюда: http://iarduino.ru/file/235.html

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

Т.е. таже самая.

Ну тогда читайте мой предыдущий пост. Похоже первого моего вопроса Вы не поняли. Повторю по-другому.

На кой хрен Вы сравниваете возвращаемое функцией значение с числом 19? Вы знаете, что возврадщает эта функция? Если думаете, что количество часов, то таки нет. Вот её описание:

char* gettime (const char*);

Она возвращает строку! А Вы указатель на эту строку зачем-то с 19 сравниваете.

Ну и второй пункт из моего предыдущего поста никто не отменял.

litaboss
Offline
Зарегистрирован: 02.09.2017

На самом деле, я все еще не знаю как исправить эту проблему. Я понял, что она char, а как мне получить переменную числом, я не понимаю. И какую библиотеку можно использовать? Я пробовал несколько, но я мало что понял из файлов ридми и инфо на сайте, ибо синтаксис Си отличается от паскаля...

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

"Ученье сокращает нам опыты быстротекущей жизни" (с) АСПушкин. ;) За точность не ручаюсь, это из Годунова.

гуглим strcmp(). И да пребудет с тобой сила!

Сорри, добавлю, а то ведь не дойдет - вам нужен вариант strncmp().

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

ЗЫ: Евгений, я временно "скорой помощью" для чайников не работаю, чиню свой автобус, чтобы съездить на рекомендуемую Вами конференцию.

litaboss
Offline
Зарегистрирован: 02.09.2017

Использовал эту функцию, не сработало

  #include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS1302,2,4,3);
void setup() {
    delay(300);
    Serial.begin(9600);
    time.begin();
   // time.settime(0,31,20,2,9,17,6);  // 0  сек, 31 мин, 20 час, 2, сентября, 2017 года, суббота
    pinMode(7, OUTPUT);
}
void loop(){
  if(millis()%1000==0){
      Serial.println(time.gettime("d-m-Y, H:i:s, D"));
     delay(1); // проверка работы датчика выводом данных с переменных
    }
time.gettime();   
if ((strcmp(time.gettime("h"), 19)==0)) digitalWrite(7,HIGH); // а вот тут на 7 пин всегда дается 1
}

 

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

Идиот! Не 19, а "19"! Разницу понимаем или, все таки, продаем ардуино и в дворники?

litaboss
Offline
Зарегистрирован: 02.09.2017

Зачем оскорблять то? Я же сказал, что в этом проездом и не разбираюсь. Я же не называю вас идиотом потому что вы не знаете что такое ВСУ?

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

Не прокатывает. Я знаю. Еще раз придется повторить: я летать умею. Не на тех самолетах, где есть ВСУ, но все же. :-)

litaboss
Offline
Зарегистрирован: 02.09.2017

Что с кавычками, что без - толку никакого

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

К тому ж эт я любя....

litaboss
Offline
Зарегистрирован: 02.09.2017

Так в чем может быть проблема кроме кривой библиотеки?

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

strncmp и указывайте длину 2. Предварительно выведите в сериал эти часы, чтобы видеть, что возвращает ваша чудная библиотека.

litaboss
Offline
Зарегистрирован: 02.09.2017

 Вот что выдает моя чудная библиотека, strncmp с длиной 2 также не помогает

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

Вы выведите time.gettime("h")

litaboss
Offline
Зарегистрирован: 02.09.2017

Выдает последовательность 21, как и должно быть

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

У меня часы только 3132 и я человек не молодой и уже ко сну отхожу. Посему пишу с телефона и посмотреть код этой дивной библиотеки сегодня не могу. Поэтому жду от вас результата печати

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

Ля! Выведитн на печать, окружив любыми символами, чтобы увидеть пробелы. И листинг покажите

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

Это где сейчас 21? В москве 23! :)

litaboss
Offline
Зарегистрирован: 02.09.2017

Что такое листинг? Что значит вывести на печать?

litaboss
Offline
Зарегистрирован: 02.09.2017

Я в МСК, просто такое время установил на датчик

 

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

На печать это в сериал. Листинг это то, что видно в мониторе порта. Вы ребенок или старик? Термины, вроде, общепринятые?

litaboss
Offline
Зарегистрирован: 02.09.2017

Я не ребенок, и не старик. Термины совсем не общепринятые, имея дело с паскалем я их слышу впервые

litaboss
Offline
Зарегистрирован: 02.09.2017

Что конкретно нужно напечатать в сериал?

nik182
Offline
Зарегистрирован: 04.05.2015

А если так попробовать?

 atoi(time.gettime("h"))==19

 

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

Все... Я засыпаю... Если у меня будет желание, то завтра помогу.

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

Во. Ника послушайте.

litaboss
Offline
Зарегистрирован: 02.09.2017

В любом случае, спасибо за потраченное время

litaboss
Offline
Зарегистрирован: 02.09.2017

Надеюсь, я правильно использовал эту строку, в любом случае, не сработало

time.gettime();
if (atoi(time.gettime("H"))==19) digitalWrite(7,HIGH);

 

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

Не смог выкигуть из головы. А почему вв не используете time.Hours? Как и написано в примерах к этой библиотеке. Я все-таки открыл примеры с телефона...

litaboss
Offline
Зарегистрирован: 02.09.2017

Я пытался... Результат такой же, а точнее его отсутствие в виде присутствия на 7 пине единицы

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

Этого не может быть. Скопируйте код примера с iarduino. И рпсскажите.

nik182
Offline
Зарегистрирован: 04.05.2015

litaboss пишет:

Надеюсь, я правильно использовал эту строку, в любом случае, не сработало

time.gettime();
if (atoi(time.gettime("H"))==19) digitalWrite(7,HIGH);

Использовали правильно, но надо проверить, что дает atoi(time.gettime("H")) . Компилятор не ругается на эту строку? Судя по дискусии http://arduino.ru/forum/programmirovanie/preobrazovanie-tipov-string-hex-v-int есть подводные камни.  

litaboss
Offline
Зарегистрирован: 02.09.2017

Перечитал еще раз весь пример, все сделано также как и там. В сериал сейчас выводил с time.gettime(), чтобы получить ответ числом. Получил 21, как и было до этого. Попробовал использовать time.hours("H") (снова), результат один

litaboss
Offline
Зарегистрирован: 02.09.2017

Вот это:

Serial.println(atoi(time.gettime("H")));

даёт тоже самое, что и time.gettime("H") и time.hours. Компилятор не ругается.

А ссылка на дискуссию недоступна

 

nik182
Offline
Зарегистрирован: 04.05.2015

Тогда так надо if (time.hours==19) digitalWrite(7,HIGH); else digitalWrite(7,LOW);

http://arduino.ru/forum/programmirovanie/preobrazovanie-tipov-string-hex...

litaboss
Offline
Зарегистрирован: 02.09.2017

Простите, но это снова не помогло. На D7 постоянно 1... Может быть, что дело не в коде?

nik182
Offline
Зарегистрирован: 04.05.2015

Напечатайте   time.hours  и убедитесь ,что оно меняется, когда прыгают часы. Если часы прыгают, а 1 не меняется, попробовать просто без if подавать 0 и 1. Если меняется , то такого не может быть :-)  

time.minutes меняются чаще, при настройке проще.

litaboss
Offline
Зарегистрирован: 02.09.2017

time.hours изменяются, 1 нет. Самое интересное, что я дал на 7 пин LOW, а реле все равно включено. Видимо, дело было не в условиях, и возможно, даже, не в коде...

litaboss
Offline
Зарегистрирован: 02.09.2017

Мы решили проблему, я, действительно, идиот, перепутал провода в реле, и оно было нормально замкнутым. Огромное спасибо за потраченное время..