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

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

добрый день . 

Машина опять меня победила... 

вот кусок кода:

#include <Servo.h>
#include <iarduino_RTC.h>
iarduino_RTC Time (RTC_DS1302, A0, A2, A1); //назначение пинов обмена данными RST, CLK, DAT
Servo servo;                          //имя сервопривода
int pos = 0;                          //переменная хранящая угол поворота сервопривода
unsigned long newCycle,TimeWait,r,TimeWork,TimsWorker =7850;    //1)переменная хранящая время прошедшее с момента нажатия кнопки. 2)переменная хранящаявремя с момента последнего вывода текущего значения времени с RTC модуля в серийный порт. 3)переменная хранящая время включения сервопривода
const char LED = A3;                  //номер пина светодиода(стадия разработки)
boolean control,qr,QR=true;                   //переменная меняющая значение в момент включения и выключения сервопривода 1:(служит для ограничения срабатывания по времени с RTC до одного раза за секунду)2:не смог сформулировать.
byte c = 0;                           //переменная хранящая количество раз нажатия кнопки
int I,i,W=1;                            //1:переменная меняющая свое значение в момент нажатия кнопки(защита от дребезга)2:переменная хранящая статус положения сервопривода(защита от дребезга)
void setup() {
  delay(300);                          //время на подумать
  Time.begin();                        //инициализация работы часов
  servo.attach(A4);                    //назначение пина управления сервоприводом
  Serial.begin(9600);                  //инициализация порта
  //Time.settime(35,41,16,18,02,2020,2);  // 0  сек, 51 мин, 21 час, 27, октября, 2015 года, вторник
  pinMode(LED, OUTPUT);                //назначение пина светодиода выходом (индикация работы)
  r = millis();
  pinMode(7, INPUT_PULLUP);
  pinMode(A5, INPUT_PULLUP);
  newCycle = 0;
}
void loop() {
  control=!digitalRead(7);
  if(I==1&&control==HIGH){
    TimsWorker-=1000;
    I=0;
    Serial.println(TimsWorker);
    if(TimsWorker<1000){
      TimsWorker=7850;
      digitalWrite (LED,HIGH);
      newCycle=millis(); 
      
    } 
  }
  if(millis()-newCycle>=1000){
  digitalWrite(LED,LOW);
  newCycle = 0;
  Serial.println("в новом проблема");
 }
 if(control==LOW){
  I=1;
  delay(20);
 }

не могу понять - почему оператор if из 36й строки срабатывает в каждом цикле... подскажите пожалуйста

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

Из за 38 строчки, видимо.

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

DetSimen пишет:

Из за 38 строчки, видимо.

не, там же наоборот переменной присваивается значение нуля после чего оно меняется только в 32й строчке в новом цикле и то только если условие оператора из 29ой позволит да и тот выполняется только после нажатия кнопки...а когда newCycle меньше 1000 оператор из 36й не должен же выполнять тело...

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Posol88 пишет:

DetSimen пишет:

Из за 38 строчки, видимо.

не, там же наоборот переменной присваивается значение нуля после чего оно меняется только в 32й строчке в новом цикле и то только если условие оператора из 29ой позволит да и тот выполняется только после нажатия кнопки...а когда newCycle меньше 1000 оператор из 36й не должен же выполнять тело...

Кто то просто настолько далёк от программирования, что за полгода так и не разобрался с millis()

У тебя там должно быть:
NewCycle=millis();
А не
NewCycle=0;

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Когда Вы научитесь Serial для дебага использовать?
millis = 500, newCycle = 0, millis - newCycle = ?
millis = 1000, newCycle = 0, millis - newCycle = ?
millis = 1001, newCycle = 0, millis - newCycle = ?
millis = 1002, newCycle = 0, millis - newCycle = ?
...
millis = 9000, newCycle = 0, millis - newCycle = ?

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

Kakmyc пишет:
Posol88 пишет:

DetSimen пишет:

Из за 38 строчки, видимо.

не, там же наоборот переменной присваивается значение нуля после чего оно меняется только в 32й строчке в новом цикле и то только если условие оператора из 29ой позволит да и тот выполняется только после нажатия кнопки...а когда newCycle меньше 1000 оператор из 36й не должен же выполнять тело...

Кто то просто настолько далёк от программирования, что за полгода так и не разобрался с millis() У тебя там должно быть: NewCycle=millis(); А не NewCycle=0;

не согласен. если я в 38й строчке напишу"NewCycle=millis();" , то оператор из 36 будет срабатывать каждую секунду, а он должен выполнять тело цикла через секунду после выполнения строки 32.

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

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

Posol88
Offline
Зарегистрирован: 14.11.2019
  if(millis()-newCycle>=1000,millis()-newCycle<=1200){
  digitalWrite(LED,LOW);
  Serial.println("в новом проблема");
 }

вот, дошло... 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Давай зачётку...

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

Posol88 пишет:

Машина опять меня победила... 

И почему никто не удивляется? :-)

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

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

Posol88 пишет:

Машина опять меня победила... 

И почему никто не удивляется? :-)

А чему удивляться? Терпению в познании? Так Садман уже отметил, грит давай зачётку )))

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

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

  пол года изучал, смотрел, читал, вникал... ну сделал я эту кормушку,и кнопки управления сделал, и экран на неё повесил... а куда теперь все эти знания девать? похоронить пол года стараний что ли?! 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

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

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

Posol88 пишет:

а куда теперь все эти знания девать? похоронить пол года стараний что ли?! 

на самом деле - это и правдв проблема. Я вот часто что-то изучу - а применять негде. Ну вот совсем...

Зато как увлекателен процесс :)))

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

b707 пишет:

Posol88 пишет:

а куда теперь все эти знания девать? похоронить пол года стараний что ли?! 

на самом деле - это и правдв проблема. Я вот часто что-то изучу - а применять негде. Ну вот совсем...

Зато как увлекателен процесс :)))

это да))

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

sadman41 пишет:

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


Ну почему же! Может чел-у нравится дурачком себя выставлять. Есть ведь что то такое по Фрейду.)

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

Это просто жесть как все забывается менее чем за год... сижу смотрю на #define ... полез в интернет смотреть что это значит XD.

Всем СдрасЬти)))

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

Posol88 пишет:

Это просто жесть как все забывается менее чем за год... сижу смотрю на #define ... полез в интернет смотреть что это значит XD.

Всем СдрасЬти)))

раза четыре выучите с нуля - запомните

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

b707 пишет:

раза четыре выучите с нуля - запомните

Осталось 2 раза выходит))

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Posol88 пишет:

b707 пишет:

раза четыре выучите с нуля - запомните

Осталось 2 раза выходит))


4-0=4
Так что никаких не два

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

Здравствуйте товарищи!я как всегда с уникальным вопросом - 

#include "iarduino_DHT.h" 
const byte ventilation=9 ,heater=8 ;
iarduino_DHT sensor(A1);   // Объявляем объект, указывая номер вывода, к которому подключён модуль
unsigned long updating_data = millis() ;

void setup(){
  delay(1000);            // Приостанавливаем выполнение скетча на 1 секунду, для перехода датчика в активное состояние
  Serial.begin(9600);     // Инициируем передачу данных в монитор последовательного порта, на скорости 9600 бод
  pinMode(ventilation,OUTPUT);
  pinMode(heater,OUTPUT);
  digitalWrite(ventilation,HIGH);
  digitalWrite(heater, HIGH);  
}
void loop(){                 
  
  if (millis() - updating_data >= 2000ul){
    Serial.print  ("Показания датчика: ");
      int humidity,temperature;
      switch(sensor.read()){  // Читаем показания датчика
        case DHT_OK: Serial.println((String) sensor.hum + "% - " + sensor.tem + "°C"); 
            humidity=sensor.hum;
            temperature=sensor.tem;
            if (humidity>=60.00&&ventilation == LOW){
              digitalWrite (ventilation,HIGH);
              Serial.println("9-HIGH");}
            else{ 
              Serial.println("0");
               }
             
            if (humidity<=40.00&&ventilation == HIGH) {
               digitalWrite (ventilation,LOW);
                Serial.println("9-LOW");
            }           
              else{ 
              Serial.println("1");
               }
              if (temperature>=22.00&&heater == HIGH){
               digitalWrite (heater,LOW);
                Serial.println("8,LOW");
                } 
              else{ 
              Serial.println("2");
               }
              if (temperature<=15.00&&heater == LOW) {
               digitalWrite (heater,HIGH);
                Serial.println("8,HIGH");
            }
            else{ 
              Serial.println("3");
               }          
        break;          
        case DHT_ERROR_CHECKSUM: Serial.println("HE PABEHCTBO KC");                                break;
        case DHT_ERROR_DATA:     Serial.println("OTBET HE COOTBETCTB. CEHCOPAM 'DHT'");            break;
        case DHT_ERROR_NO_REPLY: Serial.println("HET OTBETA");                                     break;
        default:                 Serial.println("ERROR"); digitalWrite (ventilation,LOW);digitalWrite (heater,LOW); break;
      } 
    updating_data = millis();
  }
}

 

в строках 23,30,37,44. если убрать вторую часть условия, например "&&ventilation == LOW", то все прекрасно работает. а в оригинальном виде, оператор "if" считает условие ложным. не могу понять - почему?

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

Ты знаешь что значит int 

int humidity,temperature;

и что значит 60.00?

if (humidity>=60.00&&ventilation == LOW)

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

DetSimen пишет:

Ты знаешь что значит int 

int humidity,temperature;

и что значит 60.00?

if (humidity>=60.00&&ventilation == LOW)

я понял тебя) но как ни странно на эту часть условия нареканий пока не было 

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

DetSimen пишет:

Ты знаешь что значит int 

исправил этот косяк

#include "iarduino_DHT.h" 
const byte ventilation=9 ,heater=8 ;
iarduino_DHT sensor(A1);   // Объявляем объект, указывая номер вывода, к которому подключён модуль
unsigned long updating_data = millis() ;

void setup(){
  delay(1000);            // Приостанавливаем выполнение скетча на 1 секунду, для перехода датчика в активное состояние
  Serial.begin(9600);     // Инициируем передачу данных в монитор последовательного порта, на скорости 9600 бод
  pinMode(ventilation,OUTPUT);
  pinMode(heater,OUTPUT);
  digitalWrite(ventilation,HIGH);
  digitalWrite(heater, HIGH);  
}
void loop(){                 
  
  if (millis() - updating_data >= 2000ul){
    Serial.print  ("Показания датчика: ");
      float humidity,temperature;
      switch(sensor.read()){  // Читаем показания датчика
        case DHT_OK: Serial.println((String) sensor.hum + "% - " + sensor.tem + "°C"); 
            humidity=sensor.hum;
            temperature=sensor.tem;
            if (humidity>=60.00&&ventilation == LOW){
              digitalWrite (ventilation,HIGH);
              Serial.println("9-HIGH");}
            else{ 
              Serial.println("0");
               }
             
            if (humidity<=40.00&&ventilation == HIGH) {
               digitalWrite (ventilation,LOW);
                Serial.println("9-LOW");
            }           
              else{ 
              Serial.println("1");
               }
              if (temperature>=22.00&&heater == HIGH){
               digitalWrite (heater,LOW);
                Serial.println("8,LOW");
                } 
              else{ 
              Serial.println("2");
               }
              if (temperature<=15.00&&heater == LOW) {
               digitalWrite (heater,HIGH);
                Serial.println("8,HIGH");
            }
            else{ 
              Serial.println("3");
               }          
        break;          
        case DHT_ERROR_CHECKSUM: Serial.println("HE PABEHCTBO KC");                                break;
        case DHT_ERROR_DATA:     Serial.println("OTBET HE COOTBETCTB. CEHCOPAM 'DHT'");            break;
        case DHT_ERROR_NO_REPLY: Serial.println("HET OTBETA");                                     break;
        default:                 Serial.println("ERROR"); digitalWrite (ventilation,LOW);digitalWrite (heater,LOW); break;
      } 
    updating_data = millis();
  }
}

вопрос актуален

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

DetSimen пишет:

и что значит 60.00?

это значение в том виде, в котором приходят показания с датчика влажности воздуха.

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

Posol88 пишет:
оператор "if" считает условие ложным.

Ну, а каким ему его считать, если ventilation является константой, равной 9  (см. строку 2)?

Т.е. условие

ventilation == LOW

эквивалентно условию

9 == 0

Вас удивляет, что оно всегда ложно? Во "не можете понять почему"?

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

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

Вас удивляет, что оно всегда ложно? Во "не можете понять почему"?

меня удивляет что я за столько времени не научился искать ошибки во всем коде)

СПАСИБО!

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

Posol88 пишет:

DetSimen пишет:

Ты знаешь что значит int 

исправил этот косяк

лучше было исправить "в другую сторону", int сохранить, а вместо этого в условиях везде заменить 60.00, 40.00... на целые

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

b707 пишет:

лучше было исправить "в другую сторону", int сохранить, а вместо этого в условиях везде заменить 60.00, 40.00... на целые

а как быть со сравнением? с датчика то показания приходят с точкой

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

Posol88 пишет:

а как быть со сравнением? с датчика то показания приходят с точкой

когда вы их присваиваете своим переменным типа int. никакой точки там уже нет.

 

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

Posol88
Offline
Зарегистрирован: 14.11.2019
 
Показания датчика: 95.00% - 29.00°C
0
1
2
3
Показания датчика: 86.00% - 29.00°C
0
1
2
3
Показания датчика: 43.00% - 29.00°C
0
1
2
3
Показания датчика: 40.00% - 29.00°C
0
1
2
3
Показания датчика: 37.00% - 29.00°C
0
1
2
3
#include "iarduino_DHT.h" 
int ventilation=9 ,heater=8 ;
iarduino_DHT sensor(A1);   // Объявляем объект, указывая номер вывода, к которому подключён модуль
unsigned long updating_data = millis() ;

void setup(){
  delay(1000);            // Приостанавливаем выполнение скетча на 1 секунду, для перехода датчика в активное состояние
  Serial.begin(9600);     // Инициируем передачу данных в монитор последовательного порта, на скорости 9600 бод
  pinMode(ventilation,OUTPUT);
  pinMode(heater,OUTPUT);
  digitalWrite(ventilation,HIGH);
  digitalWrite(heater, HIGH);  
}
void loop(){                 
  
  if (millis() - updating_data >= 2000ul){
    Serial.print  ("Показания датчика: ");
      float humidity,temperature;
      switch(sensor.read()){  // Читаем показания датчика
        case DHT_OK: Serial.println((String) sensor.hum + "% - " + sensor.tem + "°C"); 
            humidity=sensor.hum;
            temperature=sensor.tem;
            if (humidity>=60.00&&ventilation == LOW){
              digitalWrite (ventilation,HIGH);
              Serial.println("9-HIGH");}
            else{ 
              Serial.println("0");
               }
             
            if (humidity<=40.00&&ventilation == HIGH) {
               digitalWrite (ventilation,LOW);
                Serial.println("9-LOW");
            }           
              else{ 
              Serial.println("1");
               }
              if (temperature>=22.00&&heater == HIGH){
               digitalWrite (heater,LOW);
                Serial.println("8,LOW");
                } 
              else{ 
              Serial.println("2");
               }
              if (temperature<=15.00&&heater == LOW) {
               digitalWrite (heater,HIGH);
                Serial.println("8,HIGH");
            }
            else{ 
              Serial.println("3");
               }          
        break;          
        case DHT_ERROR_CHECKSUM: Serial.println("HE PABEHCTBO KC");                                break;
        case DHT_ERROR_DATA:     Serial.println("OTBET HE COOTBETCTB. CEHCOPAM 'DHT'");            break;
        case DHT_ERROR_NO_REPLY: Serial.println("HET OTBETA");                                     break;
        default:                 Serial.println("ERROR"); digitalWrite (ventilation,LOW);digitalWrite (heater,LOW); break;
      } 
    updating_data = millis();
  }
}

монитор порта:

Показания датчика: 95.00% - 29.00°C
0
1
2
3
Показания датчика: 86.00% - 29.00°C
0
1
2
3
Показания датчика: 43.00% - 29.00°C
0
1
2
3
Показания датчика: 40.00% - 29.00°C
0
1
2
3
Показания датчика: 37.00% - 29.00°C
0
1
2
3

при этом оба светодиода(те что вместо нагрузки на 8 и 9 пинах) работают постоянно в не зависимости от показаний датчика(что и видно по показаниям в мониторе).

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

Posol88 пишет:

 
Показания датчика: 95.00% - 29.00°C

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

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

Posol88 пишет:

при этом оба светодиода(те что вместо нагрузки на 8 и 9 пинах) работают постоянно в не зависимости

вам Евгений уже написал выше, почему так происходит. У вас ventillation =9 и, сл-но, ventillation == LOW никогда не станет истинно

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

Долго, за то доходит)) (18-19)

#include "iarduino_DHT.h" 
#define ventilation 9  
#define heater 8
iarduino_DHT sensor(A1);   // Объявляем объект, указывая номер вывода, к которому подключён модуль
unsigned long updating_data = millis() ;

void setup(){
  delay(1000);            // Приостанавливаем выполнение скетча на 1 секунду, для перехода датчика в активное состояние
  Serial.begin(9600);     // Инициируем передачу данных в монитор последовательного порта, на скорости 9600 бод
  pinMode(ventilation,OUTPUT);
  pinMode(heater,OUTPUT);
  digitalWrite(ventilation,HIGH);
  digitalWrite(heater, HIGH);  
}
void loop(){                 
  
  if (millis() - updating_data >= 2000ul){
    boolean N=digitalRead(ventilation);
    boolean N1=digitalRead(heater);
    Serial.print  ("Показания датчика: ");
      float humidity,temperature;
      switch(sensor.read()){  // Читаем показания датчика
        case DHT_OK: Serial.println((String) sensor.hum + "% - " + sensor.tem + "°C"); 
            humidity=sensor.hum;
            temperature=sensor.tem;
            if (humidity>=60.00&&N == LOW){
              digitalWrite (ventilation,HIGH);
              Serial.println("9-HIGH");}
            else{ 
              Serial.println("0");
               }
             
            if (humidity<=40.00&&N == HIGH) {
               digitalWrite (ventilation,LOW);
                Serial.println("9-LOW");
            }           
              else{ 
              Serial.println("1");
               }
              if (temperature>=22.00&&N1 == HIGH){
               digitalWrite (heater,LOW);
                Serial.println("8,LOW");
                } 
              else{ 
              Serial.println("2");
               }
              if (temperature<=15.00&&N1== LOW) {
               digitalWrite (heater,HIGH);
                Serial.println("8,HIGH");
            }
            else{ 
              Serial.println("3");
               }          
        break;          
        case DHT_ERROR_CHECKSUM: Serial.println("HE PABEHCTBO KC");                                break;
        case DHT_ERROR_DATA:     Serial.println("OTBET HE COOTBETCTB. CEHCOPAM 'DHT'");            break;
        case DHT_ERROR_NO_REPLY: Serial.println("HET OTBETA");                                     break;
        default:                 Serial.println("ERROR"); digitalWrite (ventilation,LOW);digitalWrite (heater,LOW); break;
      } 
    updating_data = millis();
  }
}

пойду массивы мучать... благодарю, что все еще отвечаете мне))))

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

Здравствуйте, о великие гуру программирования и безвозмездной помощи, отрокам еще не знающим и не умеющим)))

Поменяли мне операционку с 7ки на 10ку. поставил я на нее версию arduino IDE для семерки (что бы библиотеками ее пополнять без проблем) и теперь сама программа, "arduino IDE", не видит подключаемые к компу платы ардуино. При чем винда видит подключенное устройство и определяет его ком порт. 

  Наверняка есть какой то нюанс на этот случай. Подскажите куда идти XD 

P.S. на каком то форуме говорили про драйвера, которые нужно скачать с сайта ардуино, и даже ссылку оставляли, но как я там не пытался найти хоть что то связанное с драйверами - не получилось... 

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

Posol88 пишет:

 не видит подключаемые к компу платы ардуино

при выборе COM порта показывает только первый, а плата тем временем весит на 3м или 5ом

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

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

 для тех у кого та же проблема - https://alexgyver.ru/lessons/first-flash/  тут описано максимальное количество подобных проблем и пути их решения.

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

Posol88 пишет:

 для тех у кого та же проблема - https://alexgyver.ru/lessons/first-flash/  тут описано максимальное количество подобных проблем и пути их решения.

Спасибо!

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

Ну вот как бы мы жили без ЧЮ!)