Применение millis для нескольких процессов

sadman41
Offline
Зарегистрирован: 19.10.2016

Мошт он устал без резистора гореть?

Posol88
Offline
Зарегистрирован: 14.11.2019

пляяяяя... я дурачок по ходу. Не обращайте на меня внимания))

b707
Offline
Зарегистрирован: 26.05.2017

Posol88 пишет:

пляяяяя... я дурачок по ходу. Не обращайте на меня внимания))

да как же не обращать-то? Только забудем про вас, расслабимся - вы тут же с кучей новых вопросов...

Что там с диодом было, расскажите, а то сегодня не засну...

Posol88
Offline
Зарегистрирован: 14.11.2019

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

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

Господи, ну TimeWork у Вас какого типа? А millis какого? И как Вы ловко одно из другого вычитаете?

Кстати,

iarduino_RTC.h == брось каку и никогда не подбирай с помойки что попало.

Posol88
Offline
Зарегистрирован: 14.11.2019

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

 TimeWork у Вас какого типа? А millis какого? И как Вы ловко одно из другого вычитаете?

Кстати,

iarduino_RTC.h == брось каку и никогда не подбирай с помойки что попало.

В смысле из unsigned long нельзя вычитать int? и в книгах об этом наверняка написано. честно говоря я думал что так как и там и там числовые значения то тип не важен))

Posol88
Offline
Зарегистрирован: 14.11.2019
#include <iarduino_RTC.h> 
iarduino_RTC Time (RTC_DS1302,7,6,5);
char LED = 12; 
unsigned long TimeWork ;            
void setup(){
 delay(300);
 Serial.begin(9600);
 Time.begin();
 pinMode(LED, INPUT);
}
void loop(){
  if(millis()%1000==0){ 
    Serial.println (Time.gettime("d-m-Y, H:i:s, D")); // выводим время
}  
  if (Time.seconds==30){ 
      digitalWrite(LED,HIGH); 
      TimeWork = millis() ;
 }
  if (millis() - TimeWork >= 1000){
     digitalWrite(LED,LOW);
 }
 delay(1);
}

вот значит посмотрел, что millis имеет тип unsigned long и с этим учетом изменил тип переменной TimeWork. так эже на всякий случай узнал что значение с RTC модуля приходит в  uint8_t а это тип unsigned char,  но тут уж я не придумал ни чего исправить(да и эта часть кода вроде бы работает нормально).

но где то я  что то еще напортачил, так как слишком уж сильно загружен микроконтроллер (бывает даже в порт пропускает вывод строчки(через секунду прыгает))

ах да, на счет библиотеки - сейчас займусь)

Posol88
Offline
Зарегистрирован: 14.11.2019

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

iarduino_RTC.h == брось каку и никогда не подбирай с помойки что попало.

#include <DS1302.h>

вот где настоящее г

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

Posol88 пишет:

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

iarduino_RTC.h == брось каку и никогда не подбирай с помойки что попало.

#include <DS1302.h>

вот где настоящее г

Вам виднее.

Только проблемы у Вас, а не у меня :-)

Posol88
Offline
Зарегистрирован: 14.11.2019

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

sadman41
Offline
Зарегистрирован: 19.10.2016

И это только начало. Через полгода найдете нормальную библиотеку, но поймёте, что этот чип RTC - отстой.

Posol88
Offline
Зарегистрирован: 14.11.2019

sadman41 пишет:
И это только начало. Через полгода найдете нормальную библиотеку, но поймёте, что этот чип RTC - отстой.

от спасибо)) утешил так утешил)))))) XD

Green
Offline
Зарегистрирован: 01.10.2015

sadman41 пишет:
И это только начало. Через полгода найдете нормальную библиотеку, но поймёте, что этот чип RTC - отстой.

Ну, отстой - не отстой, лишь бы функции свои выполнял. У меня работает как первый советский трактор.)

sadman41
Offline
Зарегистрирован: 19.10.2016

"Первый советский" трактор был американским ;))

Posol88
Offline
Зарегистрирован: 14.11.2019

здравствуйте товарищи. 

попробовал другую библиотеку. может ардуинка из за нее пропускать вывод времени в порт? (промежутки аж по 10 сек бывают) или это от большого кол - ва команд serial.print?

#include <DS1302.h>
DS1302 rtc(7, 6, 5);
unsigned long TimeWork;
boolean LED = 12;
void setup()
{
  pinMode(LED,INPUT);
  Serial.begin(9600);
}
void loop()
{
 Time t = rtc.getTime();
  if(millis()%1000==0){ 
    Serial.print(t.year);Serial.print(".");
    Serial.print(t.date);Serial.print(".");
    Serial.print(t.mon);Serial.print(" ");
    Serial.print(t.hour);Serial.print(":");
    Serial.print(t.min);Serial.print(":");
    Serial.println(t.sec);
}
  if (t.sec==10){ 
      digitalWrite(LED,HIGH); 
      TimeWork = millis() ;
 }
 if (millis() - TimeWork >= 1000){
     digitalWrite(LED,LOW);
 }
  delay(1);
}

 

Posol88
Offline
Зарегистрирован: 14.11.2019

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

 

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

Posol88 пишет:
или это от большого кол - ва команд serial.print?

Это лишь "вишенку на торт" добавляет (но, действительно, добавляет).

Основная же проблема в том, что сравнение в строке №13 категорически несовместимо со строкой №28.

b707
Offline
Зарегистрирован: 26.05.2017

Посол, сравнение в строке 13 - это бредятина, кочующая из примера в пример, о ней писалось на форуме многократно. Секунды так отмерять нельзя

Posol88
Offline
Зарегистрирован: 14.11.2019

b707 пишет:

Что там с диодом было, расскажите, а то сегодня не засну...

pinMode(LED, OUTPUT);

я на кой то фиг сначала просто удалил, а потом переписал в pinMode(LED, INPUT);

в общем, проблему с яркостью только что решил.

осталась проблема с 

 if (millis() - TimeWork >= 1000){
     digitalWrite(LED,LOW);

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

Posol88
Offline
Зарегистрирован: 14.11.2019
void loop(){
  
  if(millis()-r >= 1000ul){ 
    Serial.println (Time.gettime("d-m-Y, H:i:s, D")); 
    r=millis();
}  
  
  if ( Time.seconds == 30){ 
      digitalWrite(LED,HIGH); 
      TimeWork = millis();
      Serial.println("BK");
 }
  if (millis()- TimeWork >= 1000ul){
     digitalWrite(LED,LOW);
     Serial.println("BblK");
 }

я разобрался по чему светодиод работает 2 секунды.  когда время становится равно 30сек программа вновь и вновь переписывает переменной TimeWork значение  millis, пока время не станет равно 31сек дальше идет отсчет одной секунды, что бы выключить светодиод,  тоесть отсчет начинается не с начала 30й а с конца и + 1 сек. хотя светодиод включается с начала 30й)) жесть. а стоит ли ограничевать количество выполнения функций "if"?

P.S. мне кажется стоит, что бы не ело ресурс. а вы , форумчане, как думаете?

Posol88
Offline
Зарегистрирован: 14.11.2019
#include <iarduino_RTC.h> 
iarduino_RTC Time (RTC_DS1302,7,6,5);
unsigned long TimeWork;
char LED = 12;           
unsigned char r;
void setup(){
 delay(300);
 Serial.begin(9600);
 Time.begin();
 pinMode(LED, OUTPUT);
 r = millis();
}
void loop(){
  
  if( millis()- r >= 1000){ 
    Serial.println (Time.gettime("d-m-Y, H:i:s, D")); 
    r=millis();
}

5,15 = ох и дурень...

Posol88
Offline
Зарегистрирован: 14.11.2019
void setup(){
 delay(300);
 Serial.begin(9600);
 Time.begin();
 pinMode(LED, OUTPUT);
 r = millis();
}
void loop(){
  
  if( millis()- r >= 1000){ 
    Serial.println (Time.gettime("d-m-Y, H:i:s, D")); 
    r=millis();
}    
 
 if ( Time.seconds == 30){ 
      digitalWrite(LED,HIGH); 
      TimeWork = millis();
      Serial.println("BK");
 }
  if (millis()- TimeWork == 1000ul){
     digitalWrite(LED,LOW);
     Serial.println("BblK");
 }
 delay(1);
}

не хватает ума что бы придумать как сделать так, что бы функция в 15 строке выполнялась только 1 раз в минуту.

Posol88
Offline
Зарегистрирован: 14.11.2019
b707
Offline
Зарегистрирован: 26.05.2017

Posol88 пишет:

не хватает ума что бы придумать как сделать так, что бы функция в 15 строке выполнялась только 1 раз в минуту.

а зачем для этого RTC ? - это можно сделать на миллис, читайте в сотый раз пример блинк без делей...

Posol88
Offline
Зарегистрирован: 14.11.2019

b707 пишет:

а зачем для этого RTC ? 

по тому, что этот код пока просто отладка части основного кода, в котором нужны будут показания с RTC

b707
Offline
Зарегистрирован: 26.05.2017

Posol88 пишет:
не хватает ума что бы придумать как сделать так, что бы функция в 15 строке выполнялась только 1 раз в минуту.

именно проверка условия (строка 15)? - Если это сделать, оно перестанет выполнять свою функцию

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

Posol88
Offline
Зарегистрирован: 14.11.2019
#include <iarduino_RTC.h> 
iarduino_RTC Time (RTC_DS1302,7,6,5);
unsigned long TimeWork;
char LED = 12;           
unsigned long r;
boolean qr = true; 
void setup(){
 delay(300);
 Serial.begin(9600);
 Time.begin();
 pinMode(LED, OUTPUT);
 r = millis();
}
void loop(){
  
  if( millis()- r >= 1000ul){ 
    Serial.println (Time.gettime("d-m-Y, H:i:s, D")); 
    r=millis();
}    
 if (qr = true && Time.seconds == 30){ 
      digitalWrite(LED,HIGH); 
      TimeWork = millis();
      qr = false;
      Serial.println("BK");
      }
 if (millis()- TimeWork == 1000ul){
     digitalWrite(LED,LOW);
     qr =true;
}
 delay(1);
}

 

вот что получилось. проблемка вроде бы должна быть решена(светодиод работаетать как нужно ровно секунду) но все равно его время работы -2сек. + все время пока длятся эти 2  секунды циклично работает оператор if стр21, (всё время печатается надпись "ВК")  ни как не пойму почему? вход в него должна закрывать переменная "qr"

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

Внимательно, очень внимательно, very carefully смотрим на вот эту строчку

if (qr = true && Time.seconds == 30)

Если не помогает, перечитываем "Операторы сравнения" и смотрим снова.

Posol88
Offline
Зарегистрирован: 14.11.2019

Внимание!

Следите, чтобы случайно не использовать знак простого равенства (например, if (x = 10)). Знак простого равенства – это оператор присваивания, и устанавливает значение х равное 10 (заносит значение 10 в переменную х).

Спасибо!!!

Posol88
Offline
Зарегистрирован: 14.11.2019
#include <iarduino_RTC.h> 
iarduino_RTC Time (RTC_DS1302,7,6,5);
unsigned long TimeWork;
char LED = 12;           
unsigned long r;
boolean qr = true; 
void setup(){
 delay(300);
 Serial.begin(9600);
 Time.begin();
 pinMode(LED, OUTPUT);
 r = millis();
}
void loop(){
  
  if( millis()-r>=1000ul){ 
    Serial.println (Time.gettime("d-m-Y, H:i:s, D")); 
    r=millis();
}    
 if (qr==true&&Time.seconds==30){ 
      qr=false;   
      TimeWork=millis();    
      digitalWrite(LED,HIGH); 
      Serial.println("BKЛ");
      } 
  if (millis()-TimeWork>=1000ul&&qr==false){
     qr=true;
     digitalWrite(LED,LOW);
     Serial.println("BыKл");
 }
}

заработало №2        !!! Спасибо за помощь!

b707
Offline
Зарегистрирован: 26.05.2017

Posol88 пишет:

стоит ли ограничевать количество выполнения функций "if"?

P.S. мне кажется стоит, что бы не ело ресурс

Это правильно, ресурс оператора if нужно экономить, его запас на планете не безграничен!

sadman41
Offline
Зарегистрирован: 19.10.2016

Posol88 пишет:

Внимание!

Следите, чтобы случайно не использовать знак простого равенства (например, if (x = 10)). Знак простого равенства – это оператор присваивания, и устанавливает значение х равное 10 (заносит значение 10 в переменную х).

Спасибо!!!

Совет: пиши условие так if (10 = x) и компилятор остановится в месте, где юзер недоглядел.

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

Posol88 пишет:

Внимание!

Следите, чтобы случайно не использовать знак простого равенства (например, if (x = 10)). Знак простого равенства – это оператор присваивания, и устанавливает значение х равное 10 (заносит значение 10 в переменную х).

Ну, спасибо, что сказали, будем знать.

Posol88
Offline
Зарегистрирован: 14.11.2019

Да нет, это была цитата из правил использования операторов. И написал я ее к тому, что нашел то, зачем Вы меня туда посылали)))

Posol88
Offline
Зарегистрирован: 14.11.2019

я сделал!)))

#include <Servo.h>
#include <iarduino_RTC.h> 
iarduino_RTC Time (RTC_DS1302,7,6,5); //назначение пинов обмена данными RST, CLK, DAT
Servo servo;                          //имя сервопривода
int pos = 0;                          //переменная хранящая угол поворота сервопривода 
unsigned long TimeWork;               //переменная хранящая время включения сервопривода
const char LED = 12;                  //номер пина светодиода(стадия разработки)
unsigned long r;                      //переменная хранящая время прошедшее с момента вывода даты и времени с RTC в порт
boolean qr = true;                    //переменная меняющая значение в момент включения и выключения сервопривода(служит для ограничения срабатывания по времени с RTC до одного раза за секунду)
void setup(){
   Time.begin();                        //инициализация работы часов
   servo.attach(4);                     //назначение пина управления сервоприводом
   delay(300);                          //время на подумать
   Serial.begin(9600);                  //инициализация порта
   //Time.settime(0,05,10,02,02,2020,7);  // 0  сек, 51 мин, 21 час, 27, октября, 2015 года, вторник
   pinMode(LED, OUTPUT);                //назначение пина светодиода выходом (индикация работы)
   r = millis();                        
servoOpen();                            //выполнить функцию для изначального позицианирования
servoToClose();                         //выполнить функцию для изначального позицианирования
}
void loop(){
   if( millis()-r>=1000ul){             //оператор для настройки(выполнять раз в секунду)
      Serial.println (Time.gettime("H:i:s")); //выводить в серийный порт значения Час:Мин:Сек
      r=millis();                             //присвоить переменной значение millis
}    
   if (qr==true&&Time.Hours==15&&Time.minutes==28&&Time.seconds==30){ // если переменная qr имеет значение true и время 15:28:30 то
      qr=false;                                                       //присвоить переменной значение false
      TimeWork=millis();                                              //присвоить переменной значение millis
      digitalWrite(LED,HIGH);                                         //включить светодиод
      servoOpen();                                                    //выполнить функцию
      Serial.println("BKЛ");                                          //вывести в серийный порт надпись ВКЛ (стадия настройки, отладки)
   }
  if (qr==true&&Time.Hours==15&&Time.minutes==28&&Time.seconds==10){  //если переменная qr имеет значение true и время 15:28:10 то
      qr=false;                                                       //присвоить переменной значение false
      TimeWork=millis();                                              //присвоить переменной значение millis
      digitalWrite(LED,HIGH);                                         //включить светодиод
      servoOpen();                                                    //выполнить функцию
      Serial.println("BKЛ");                                          //вывести в серийный порт надпись ВКЛ (стадия настройки, отладки)
   }
  if (millis()-TimeWork>=5000ul&&qr==false){                          //если переменная qr имеет значение false, а с момента присвоения переменной TimeWork значения millis прошло 5 сек то
     qr=true;                                                         //присвоить переменной значение true
     digitalWrite(LED,LOW);                                           //вsключить светодиод
     servoToClose();                                                  //выполнить функцию
     Serial.println("BыKл");                                          //вывести в серийный порт надпись ВыКл (стадия настройки, отладки)
   }
 }
 void servoOpen(){                                                    //создать функцию
      for (pos = 0; pos <= 90; pos += 1){                             //оператор:если переменная pos ровна нулю то: это меньше или ровно 90?: если да то прибавить к значению переменной pos единицу и выполнить функцию 
           servo.write(pos);                                          //повернуть вал сервопривода на градус равный значению переменной pos
           delay(5);                                                  //перерыв в работе 0.005сек
      }
}
void servoToClose(){                                                  //создать функцию
      for (pos = 90; pos >= 0; pos -= 1) {                            //оператор:если переменная pos ровна 90 то: это больше или ровно 0?: если да то отнять от значения переменной pos единицу и выполнить функцию
           servo.write(pos);                                          //повернуть вал сервопривода на градус равный значению переменной pos
           delay(5);                                                  //перерыв в работе 0.005сек
     }
}

Ваши замечания , товарищи эксперты?

Posol88
Offline
Зарегистрирован: 14.11.2019

С изучения какого языка программирования нужно начать, что бы максимально быстро разобраться с операторами? Понять как они работают? Например - когда ставлю в одном условии больше одного оператора "||" Скетч уже не работает как нужно.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Posol88 пишет:
С изучения какого языка программирования нужно начать, что бы максимально быстро разобраться с операторами? Понять как они работают? Например - когда ставлю в одном условии больше одного оператора "||" Скетч уже не работает как нужно.

не может быть!!!

b707
Offline
Зарегистрирован: 26.05.2017

Posol88 пишет:
С изучения какого языка программирования нужно начать, что бы максимально быстро разобраться с операторами?

зачем вам начинать с какого иного языка, если вам нужен С/С++ ? - его и изучайте сразу

Цитата:
Например - когда ставлю в одном условии больше одного оператора "||" Скетч уже не работает как нужно.

не верю, показывайте код

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

b707 пишет:

Цитата:
Например - когда ставлю в одном условии больше одного оператора "||" Скетч уже не работает как нужно.

не верю, показывайте код

Не верите в то, что ТС может написать простейшее условие так, чтобы оно не работало?

Недооцениваете Вы людей! А кадры - они "решают всё"!

Posol88
Offline
Зарегистрирован: 14.11.2019

b707 пишет:

не верю, показывайте код

ужо точно не помню, но что то вроде этого 

if (qr==true&&Time.Hours==18||8||9&&Time.minutes==49||10||15&&Time.seconds==30||50||20)

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Даже Javascript таких фокусов показывать не умеет.

Posol88
Offline
Зарегистрирован: 14.11.2019

b707 пишет:

зачем вам начинать с какого иного языка, если вам нужен С/С++ ? - его и изучайте сразу

а С и С++ это разве не разные языки? книги вроде разные...

sadman41
Offline
Зарегистрирован: 19.10.2016

Английский и американский языки - разные? 

Posol88
Offline
Зарегистрирован: 14.11.2019

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, вот примерно так же между C и C++

b707
Offline
Зарегистрирован: 26.05.2017

Posol88 пишет:

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

сдается мне, что английский вы знаете примерно на том же уровне, что и Си :)

b707
Offline
Зарегистрирован: 26.05.2017

Posol88 пишет:

ужо точно не помню, но что то вроде этого 

if (qr==true&&Time.Hours==18||8||9&&Time.minutes==49||10||15&&Time.seconds==30||50||20)

 

неудивительно, что это не работает.

Если вы думаете, что запись

if (Time.Hours==18||8||9) 

означает

"если часы равны восемналцать, или часы равны восемь или часы равны девять"

- то вы жесткого ошибаетесь

 

Когда вы учебник начнете читать? - полтора месяца прошло - а вы все спрашиваете, с чего начать... Начните уже с чего-нибудь

Posol88
Offline
Зарегистрирован: 14.11.2019

b707 пишет:

Posol88 пишет:

ужо точно не помню, но что то вроде этого 

if (qr==true&&Time.Hours==18||8||9&&Time.minutes==49||10||15&&Time.seconds==30||50||20)

 

неудивительно, что это не работает.

Если вы думаете, что запись

if (Time.Hours==18||8||9) 

означает

"если часы равны восемналцать, или часы равны восемь или часы равны девять"

- то вы жесткого ошибаетесь

именно так я и думал... потом решил в скобочки взять(qr==true&&((Time.Hours==18||8||9)&&(Time.minutes==49||10||15)&&(Time.seconds==30||50||20)))

но это так тоже не работает))

а английский я знаю не хуже яндекс переводчика))  (за то у меня супруга педагог по английскому, вот я на счет своих знаний и не заморачивался никогда)

b707
Offline
Зарегистрирован: 26.05.2017

Posol88 пишет:

именно так я и думал... потом решил в скобочки взять(qr==true&&((Time.Hours==18||8||9)&&(Time.minutes==49||10||15)&&(Time.seconds==30||50||20)))

но это так тоже не работает))

я вам повторяю, что даже в одной скобочке

(Time.minutes==49||10||15)

- у вас уже чушь написана

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

я вам повторяю, что даже в одной скобочке

(Time.minutes==49||10||15)

- у вас уже чушь написана

(Time.minutes==49 || Time.minutes==10 || Time.minutes==15)