перевод часов в минуты. для работы таймера реле.

SUPERNYAMSTER

✩✩✩✩✩✩✩
19 Дек 2020
27
1
из железа:
ардуино уно
лсд 1602
часики DS1302
реле синее
и барахло их стартового кита от китайцев.

пытался чиркануть программу для вкл реле в 6,00 и выкл в 23,00. посредством сравнения часа
сравнение часа:
if (time.Hours >= 6) { // c 06:00 до 22:00
//    if (time.hours <23)
    digitalWrite(10, HIGH);} //вкл пин10 типа реле и вся х**ня

//         else {digitalWrite (10, LOW); //если время не 6-22 то выкл с**а
. в 6 реле включилось. а в 23 не выключает. Более того, после 23 начинает время(отоброжает с секундами) на лсд переключаться по прошествии 15-20 сек.

после этих событий и ковыряний интернета, я понял что так делать не практикуется. чаще всего переводят в секунды или минуты.
начал переводить время в unsigned long minuts = time.gettime("H"); и вроде бы логично простой головой понять что "кол-во минут = (часы*60)+минуты";
но что то у меня пошло не так.
прошу тыкнуть пальцем(можно в голову) что мне изучить что бы это получилось.
P.S. писать мне сразу готовый код пока не надо. мне надо самому сперва понять это.
 

poty

★★★★★★✩
19 Фев 2020
3,261
949
Какую библиотеку используете для времени (в частности, откуда класс time)?
Если библиотека позволяет получать часы в цифровом виде, смысла переводить в минуты и секунды не вижу никакого. В Вашем кусочке кода, кстати, в одном случае Hours написано с большой буквы, в закомментированной части - с маленькой. Учтите, что это будут разные переменные!
 

SUPERNYAMSTER

✩✩✩✩✩✩✩
19 Дек 2020
27
1
библиотека iarduino_RTC покапался в папке библиотеки. нашел список команд и прочее разное. а я и не знал что там такое существует.
воощем ошибок у меня оказалось чучуть, и больше из-за своей невынимательности и синтаксиса.
в случае с Hours и hours это оба выводят количество часов. только один 0-24, а другой 0-12. вот и происходил конфликт в
if (time.hours <23), что как бы "если час(0-12) меньше 23" что давало в значении fails .
и второе, я еще не доконца понял функцию скобок ( ) и {}. если круглые скобки болимене понятны для разного рода переменных и функций там туда сюда. то фигурные скобки немного напрягают
 

poty

★★★★★★✩
19 Фев 2020
3,261
949
Так проблема решена или нет?
По поводу элементов текста программы - это лучше почитать какие-нибудь обучающие статьи, так как использование их довольно многозначно. Например, круглые скобки в математических выражениях действуют примерно также, как в школе учили, но при определении функции - задают передаваемые в неё параметры.
Фигурные скобки наиболее часто встречаются в тексте программы в варианте, когда определяют набор команд, рассматриваемый как одна команда. Внутри этих скобок действует своя область видимости, это тоже иногда используется, например, чтобы определить временную переменную или (для С++) ограниченный по области действия класс. Но также используются для задания значений переменным и ещё для нескольких неочевидных вещей.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Если время больше 6 часов Ваша программа будет включать выход кучу раз в секунду, Вам бы добавить ещё флаг, чтобы 1 раз включать и 1 раз отключать, ещё неплохо бы не запрашивать время через i2c шину кучу раз в секунду, а делать опрос модуля скажем 1 раз в минуту, ну или раз в секунду. Не хватает полного кода.
If (time.Hour>=6 && time.Hour<23) {
digital.write(10,HIGH);
} else {
digital.write(10,LOW);
}
 
Изменено:

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@DAK, согласен на все 100%.
Да я сам новичок во всех этих дебрях, но у меня есть одна мега, на которой я отлаживаю всё прошивки и как бы понял одно, надо кучу раз всё проверять, научится понимать код, чтобы читать подключаемые библиотеки, и с самого начала учиться экономить ресурсы и энергопотребление, дабы в последующих проектах постоянно улучшать алгоритмы и код... И да, надо отдельный контроллер для отладки, у меня на Меги уже 7 выходов мёртвые, ну и пусть, зато на устройстве стоит нормальный контроллер, прошитый всего 2-3 раза. Мне ещё далеко до идеала, я пока познаю кучу граблей, то с прошивками, то с глючными китайскими элементами, то с кривыми платами, но пока не сдаюсь, думаю ардуино, это полезная платформа, много идей для разработки, но как не странно, ощущение, что главное не прошивка, а схемотехника, грамотно продуманная схема иногда может решить проблемы и упростить код прошивки.
 

SUPERNYAMSTER

✩✩✩✩✩✩✩
19 Дек 2020
27
1
включение реле и показывай влаж и темп:
#include <Wire.h>                 // подключаем библиотеку для чего то
#include <LiquidCrystal_I2C.h>    // подключаем библиотеку для экрана
#include <iarduino_RTC.h>         // подключаем библиотеку для часов
#include <DHT.h>                  // подключаем библиотеку для датчика темп и влаж

LiquidCrystal_I2C lcd(0x27,16,2);       // экран 1602 (0x27 адрес,16 символов в строке; 2 строки) в i2c
iarduino_RTC time(RTC_DS1302, 7, 5, 6); // подключаем RTC DS1302, к выводам модуля RST, CLK, DAT
DHT dht(12, DHT11);                     // датчик влаж темп по имени dht (12 пин, тип DHT11)

 
  void setup() {
    pinMode(10, OUTPUT);          // пин 10 на выход
      digitalWrite(10, LOW);      // пин 10 запись 0
    lcd.init();                   // инициализация экрана
    lcd.backlight();              // инициализация подсветки экрана
    time.begin();                 // инициализация часиков
    dht.begin();                  // инициализация датчика влаж темп
  //time.settime(0,51,14,0,0,0,0);  // установка времени даты 0  сек, 59 мин, 22 час, 4 , октября, 2017 года, среда
    }
    
void loop(){

    if(millis()%1000==0){                 // если прошла 1 секунда, идем узнавать время и влаж темп
      lcd.setCursor(4,0);                 // 4 знак первой строки
      lcd.print(time.gettime("H:i:s"));   // вывод времени (ч:м:с)
      delay(1);                           // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
    float h = dht.readHumidity();         // переменная h = влажность
    float t = dht.readTemperature(false); // переменная t = температура
        if (isnan(h) || isnan(t));        // Проверка удачно прошло ли считывание h  и t
      lcd.setCursor(0,1);                 // 0 знак второй строки
      lcd.print(h);                       // вывод влажности
      lcd.print("%");                     // вывод знака процент
      lcd.setCursor(9,1);                 // 9 знак второй строки
      lcd.print(t);                       // вывод температуры
      lcd.print("C");                     // вывод знака C
        if (time.Hours >= 06)             // если час больше 6
          if (time.Hours <=22)            // если час больше либо равно 22
            digitalWrite(10, HIGH);       // то пин10 запись 1 вкл реле синее китай
        else (digitalWrite (10, LOW));    //  если время не 6-23 то пин10 запись 0
               }
}
вот такое дело у меня получилось
 

poty

★★★★★★✩
19 Фев 2020
3,261
949
Не очень понял вот это:
delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс
и это:
if (isnan(h) || isnan(t)); // Проверка удачно прошло ли считывание h и t
Первая строка вообще никакого влияния не оказывает: вход в этот блок происходит каждую секунду.
Вторая строка содержит проверку, но не содержит действия, которое должно выполняться по этой проверке.
Проверка на 6 и 22 часа довольно избыточна и написана не очень правильно, но так как Ардуино всё равно ничего не делает, то почему бы и нет.
 

SUPERNYAMSTER

✩✩✩✩✩✩✩
19 Дек 2020
27
1
C++:
if (isnan(h) || isnan(t)); // Проверка удачно прошло ли считывание h и t
согласен, можно выкинуть, тогда на экран выйдет вместо цифровых значений "nan" что в принципе и понятно будет что показания не пришли. либо для одаренных вывести "ахтунг"
C++:
        if (time.Hours >= 06)             // если час больше 6
          if (time.Hours <=22)            // если час больше либо равно 22
            digitalWrite(10, HIGH);       // то пин10 запись 1 вкл реле синее китай
        else (digitalWrite (10, LOW));    //  если время не 6-23 то пин10 запись 0

// можно проще
        if (time.Hours >= 06 && time.Hours <=22)             // если 6<= час <= 22
                  digitalWrite(10, HIGH);       // то пин10 запись 1 вкл реле синее китай
        else (digitalWrite (10, LOW));    //  если время не 6-23 то пин10 запись 0
конечно в данном девайсе это абсолютно не критично, но выглядит проще. теперь то это я умею.

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

bort707

★★★★★★✩
21 Сен 2020
3,067
916
C++:
if (isnan(h) || isnan(t)); // Проверка удачно прошло ли считывание h и t
согласен, можно выкинуть, тогда на экран выйдет вместо цифровых значений "nan" что в принципе и понятно будет что показания не пришли. либо для одаренных вывести "ахтунг"
Вы похоже не поняли, что вам написал @poty,
Ваша строчка, процитированная выше - вообще ничего не делает. Она никак не влияет, будет ли на экран выведено "nan" или нет.
 

SUPERNYAMSTER

✩✩✩✩✩✩✩
19 Дек 2020
27
1
если я правильно понял. то эта иснан...как бы проверяет что переменная h, которая ранее описанна как тип float (то есть число с плавающей запятой), является вообще числом? ибо is Not a Number вроде
если так, то смысла в ней не вижу в моем случае.
в случае не получения данных температуры и влажности выйдут 0.00 что ли. а если иснан, то иснан
 

bort707

★★★★★★✩
21 Сен 2020
3,067
916
@SUPERNYAMSTER,
Вы все равно не понимаете.
Вы думаете. что с Вами обсуждают логику кода - нужна эта строка или нет.
А на самом деле Вам пытаются сказать. что это строчка просто неверная с точки зрения синтаксиса.
 

SUPERNYAMSTER

✩✩✩✩✩✩✩
19 Дек 2020
27
1
То, что после if isnan и далее по строчке, нет никаких условий в случае True или false, я уже прочитал.
 

poty

★★★★★★✩
19 Фев 2020
3,261
949
То, что после if isnan и далее по строчке, нет никаких условий в случае True или false, я уже прочитал.
Да, то есть, будет эта строка или нет - ничего в выводе на экран не изменится.
Теперь по поводу проверки на 6 и 23 часа. Вот Ваш "первый подход":
Первый вариант:
if (time.Hours >= 06)   if (time.Hours <=22) digitalWrite(10, HIGH);
                        else (digitalWrite (10, LOW));
Я позволил себе за счёт табуляции немного структурировать то, что Вы написали. И означает это следующее:
1. Если часы больше или равны 6 и меньше или равны 22, то выставить в порт 10 высокий уровень.
2. Если часы больше или равны 6 и больше 22, то выставить в порт 10 низкий уровень.
3. Если часы меньше 6 - ничего не делать.

А вот это - вторая версия (тоже структурированная):
C++:
if (time.Hours >= 06 && time.Hours <=22) digitalWrite(10, HIGH);
else (digitalWrite (10, LOW));
означающая:
1. Если часы больше или равны 6 и меньше или равны 22, то выставить в порт 10 высокий уровень.
2. В любом другом случае - выставить порт 10 в низкий уровень.
Заметили разницу?

Что Вам предлагали сделать:
1. Добавить переменную:
Объявление переменной:
...
DHT dht(12, DHT11);                     // датчик влаж темп по имени dht (12 пин, тип DHT11)

boolean    portState = false;           // добавить переменную состояния порта
 
  void setup() {
...
2. Версию изменения состояния порта написать как:
Оптимизация кода:
...
if (time.Hours >= 06 && time.Hours <=22  && !portState) {  // если 6<= час <= 22 и порт в LOW - перевести в HIGH
  digitalWrite(10, HIGH); 
  portState = true;
} else if (portState) {                                    //  если время не 6-23 и порт HIGH - перевести в LOW
  digitalWrite (10, LOW);
  portState = false;
}
 

bort707

★★★★★★✩
21 Сен 2020
3,067
916
как вариант, немножко покороче
C++:
static bool prev_time_to_work = false;

bool time_to_work = (time.Hours >= 06 && time.Hours <=22 );
if { prev_time_to_work != time_to_work) {
    digitalWrite(10, time_to_work);
    prev_time_to_work = time_to_work;
}
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
@bort707, красиво, но с комментариями было бы лучше, мне то понятно, но другим новичкам не факт, особенно вот этот статик....

и да, проверку на раз в 1 секунду я бы как то иначе сделал, здесь прям несколько опросов разных модулей, можно перескакивать миллисекунды, теперь мне понятно, почему у автора раз в 15 секунд время выдавало (видать код для вывода времени был взять с примеров библиотеки)

if (millis() - myTimer > 1000) { //Чтобы действительно читать данные 1 раз в заданный интервал времени (1 сек)
myTimer = millis();
Вся программа
}
 
Изменено:

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
C++:
static bool prev_time_to_work = false; // Объявляем переменную и делаем её false, но это будет ровно 1 раз, так как статик

bool time_to_work = (time.Hours >= 06 && time.Hours <=22 ); // здесь будет новое состояние 10того выхода, 1 при попадание времени в интервал от 6 от 22 включительно, во все остальные промежутки будет 0
if { prev_time_to_work != time_to_work) {  //Здесь написано, если предыдущее состояние 10 выхода не равно вышеупомянутому, то изменить состояние
    digitalWrite(10, time_to_work);        //Устанавливаем необходимое состояние
    prev_time_to_work = time_to_work;      //Запоминаем состояние
}
 

bort707

★★★★★★✩
21 Сен 2020
3,067
916
но с комментариями было бы лучше, мне то понятно, но другим новичкам не факт, особенно вот этот статик....
ну а чо там комментировать? :)
Общая идея - у нас есть логическая переменная time_to_work, указывающая, нужно включать нагрузку, или нет.
В каждом цикле мы заново проверяем это условие (стр 3), - и сравниваем результат с тем, что был в прошлом цикле (строка 4)
Если результаты не совпадают - значит пора включить или выключить реле
Таким образом мы переключаем реле только тогда, когда состояние изменилось...

Хотя вообще-то нет ничего страшного, если условие будет долбить сотни раз в секунду digitalWrite() - пину от записи в него того же состояния не убудет, а контроллеру все равно от 6 утра до 10 вечера заняться нечем :))))
 

SUPERNYAMSTER

✩✩✩✩✩✩✩
19 Дек 2020
27
1
Спасибо всем за наставление на путь истинный, а не прямое тыканье котенком в куда надо.
больше ардуйня у меня не долбится в digitalWrite и не сосет часто инфу от темп влаж датчика. надеюсь ей будет хорошо. скоро китай обрадует новыми игрушками для ардуйни.
а покат еперь пошло в дело именно то, изза чего я полез в ардуино. мне нужно подружить с переключатель света от автомобиля вольскваген(ВАГмус далее по тексту) с лада\уаз\газ\мяз и подобной техникой.
забава в том что у ВАГмус выход с проводов ближний и габарит, звонится мультиметром на питание, но по факту при включении в ардуину, выходит там шим какой то(в камеру телефона видно мерцание), а при включении полный HIGH. вот нужно как то опустить этот шим, может что то типа антидребезга кнопки задействовать. я правильно понял?
и второе, это выход на птф идет аки резистивная клавиша в три состояния (выкл - зад птф - перед птф) значения в мониторе считал. оставил на потом, сперва с первым научится надо.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Спасибо всем за наставление на путь истинный, а не прямое тыканье котенком в куда надо.
больше ардуйня у меня не долбится в digitalWrite и не сосет часто инфу от темп влаж датчика. надеюсь ей будет хорошо. скоро китай обрадует новыми игрушками для ардуйни.
а покат еперь пошло в дело именно то, изза чего я полез в ардуино. мне нужно подружить с переключатель света от автомобиля вольскваген(ВАГмус далее по тексту) с лада\уаз\газ\мяз и подобной техникой.
забава в том что у ВАГмус выход с проводов ближний и габарит, звонится мультиметром на питание, но по факту при включении в ардуину, выходит там шим какой то(в камеру телефона видно мерцание), а при включении полный HIGH. вот нужно как то опустить этот шим, может что то типа антидребезга кнопки задействовать. я правильно понял?
и второе, это выход на птф идет аки резистивная клавиша в три состояния (выкл - зад птф - перед птф) значения в мониторе считал. оставил на потом, сперва с первым научится надо.
Почему бы не считывать данные с переключателя света, а не лезть в питание на фишке лампы. На лексусах и тойотах иногда кан шина подходит к фарам, то есть на фару идёт постоянное питание и линия управления. Вот тут следует научится читать кан шину автомобиля.
 

SUPERNYAMSTER

✩✩✩✩✩✩✩
19 Дек 2020
27
1
У вагов идёт с переключателя на экий некий "блок управления машиной"
Этот самый некий шим присутствует для "диагностических" целей. Что если вдруг переключатель неисправен, то он выдаёт на панель приборов ошибку и включает дальний и габарит в зависимости от состояния замка зажигания. У исправного ВАГмус, на каждом (габарит, ближний, ДневнойХодовойОгонь) присутствует не вкл/выкл. А шим/вкл.
В болимене новых мерседеса на фары идёт кан шина. Там и пробег ламп и пробег машин записан в фаре.
 

DAK

★★★✩✩✩✩
8 Окт 2020
517
137
Хотел бы понять конечную цель, ардуина должна принять ШИМ и что с ним сделать, какое действие надо сделать? Я уже писал про схемотехнику, может сгладить фильтром ШИМ в более менее ровный сигнал и потом уже его анализировать МК?
 

SUPERNYAMSTER

✩✩✩✩✩✩✩
19 Дек 2020
27
1
Конечная цель - из ВАГмус принять сигнал включения нагрузок(шим/вкл и резистивный птф) , переварить их адруинкой, и выдать наши христианские HIGH и LOW. Дабы наши православные реле щёлкать.
Ну и по возможности поиграть какими то плюшками.
Шим вообще надо исключить.