#1 2020-10-07 21:31:04

VictorZ
Учасник
Зареєстрований: 2020-07-29
Повідомлень: 7

Не працює вкладена функція millis()

Привіт усім. Не можу зрозуміти, чому не працює вкладена функція millis(), тобто одна функція millis() є вкладена в іншу millis().
Проблема така - є датчик вологи, підключений до аналогового входу. Дані з датчика читаються, наприклад, 1 раз в 10 хв., живлення на датчик подається в момент читання даних, але там повинна бути затримка мінімум 50-60 мс, для чого і служить друга функція millis(). По одинці ці дві функції працюють нормально, дві - ніяк. Питання, можливо, трохи дурне, за що прошу не дуже сварити )))
deay(60) допомагає одразу, але хотілося б обійтись без неї...

#define  SENSOR   A1                     ..
#define  Vcc      A2                     

#define  MIN        747                    // мінімальні показники вологості
#define  MAX        330                   //  максимальні   ----/ -----------
uint16_t sensor;
unsigned long stat_time;
unsigned long previousMillis = 0;
unsigned long previousMillis2 = 0;
void setup(){
  Serial.begin(57600);                   
  pinMode     (Vcc,    OUTPUT);           //   вивід для живлення датчика вологості
digitalWrite(Vcc,    LOW   );           
}
void loop(){
  unsigned long currentMillis = millis();
  unsigned long currentMillis2 = millis();
  if(currentMillis-previousMillis>=5000){                // замість delay 5 хв = 300 000 мс
  previousMillis = currentMillis;

  digitalWrite(Vcc,    HIGH  );           //   Включаємо датчик
  if(currentMillis2-previousMillis2>=60){                // замість delay
  previousMillis2 = currentMillis2;

//  delay(60);           
    sensor = analogRead(SENSOR);             // Читаємо дані з датчика,
 
   sensor = map(sensor, MIN, MAX, 0, 100);  // адаптуємо значення від 0 до 100,

  Serial.println(sensor); 
 
  digitalWrite(Vcc,    LOW   );           //   Виключаємо датчик
  }
  }

Якщо розкоментувати делей, то показники - такі, як треба, напр. 45. Без делей - 171.

Вибачте за багато тексту. Прошу допомогти.

Остання редакція VictorZ (2020-10-07 21:32:15)

Неактивний

#2 2020-10-08 08:03:07

YK
Учасник
Зареєстрований: 2020-02-26
Повідомлень: 27

Re: Не працює вкладена функція millis()

У тебя при первом цикле previousMillis2=0 , соотв. первый цикл не дает никакую задержку
сделай  инициализацию previousMillis2  в начале loop например
if(previousMillis2  ==0)
   previousMillis2=millis();

Хотя конечно накручено но идея правильная уйти от delay()

Неактивний

#3 2020-10-08 16:54:06

VictorZ
Учасник
Зареєстрований: 2020-07-29
Повідомлень: 7

Re: Не працює вкладена функція millis()

Дякую за допомогу! Спробував. Не помогло.... Тільки священний delay() працює так, як треба... Якщо розкоментовую делей - вологість така,як треба. 40
Без делей якогось милого 174 -175, навіть не зважаючи на  sensor = map(sensor, MIN, MAX, 0, 100). І не працюєякраз отой другий, вкладений мілліс()...

Може це такий баг Ардуіно IDE ??

Остання редакція VictorZ (2020-10-08 16:55:44)

Неактивний

#4 2020-10-08 19:39:15

tsar_
Учасник
Зареєстрований: 2018-09-09
Повідомлень: 8

Re: Не працює вкладена функція millis()

#define SENSOR A1                  
#define Vcc A2                     

#define MIN 747                    
#define MAX 330                   

//Час затримки між вмиканнями
#define SWITCH_ON_DELAY 5000 
 //Час затримки між вимірюваннями = час затримки між вмиканнями + 60 мс                
#define MEASURE_DELAY SWITCH_ON_DELAY + 60   

uint16_t sensor;
unsigned long previousMillis;

void setup(){
  Serial.begin(57600);
  
  pinMode(Vcc, OUTPUT);           
  digitalWrite(Vcc, LOW);

  previousMillis = millis();
}

void loop(){
  unsigned long currentMillis = millis();

  //Чекаємо час затримки між вмиканнями
  if ((currentMillis - previousMillis) >= SWITCH_ON_DELAY) {
    digitalWrite(Vcc, HIGH);  //Вмикаємо
  }

  //Чекаємо час затримки між вимірюваннями 
  if ((currentMillis - previousMillis) >= MEASURE_DELAY) {
    sensor = analogRead(SENSOR);             
    sensor = map(sensor, MIN, MAX, 0, 100);  

    Serial.println(sensor); 
 
    digitalWrite(Vcc, LOW);  //Вимикаємо

    previousMillis = currentMillis;
  }
}  

Остання редакція tsar_ (2020-10-08 19:44:27)

Неактивний

#5 2020-10-08 20:16:24

VictorZ
Учасник
Зареєстрований: 2020-07-29
Повідомлень: 7

Re: Не працює вкладена функція millis()

Дійсно.... як елегантно і просто...Велике ДЯКУЮ !
Працює все так,як треба ,і зовсім не обов'язково городити цілу купу тих вкладених міллісів...
Вчитися! Скільки мені ще треба вчитися!  Але добре, що є на форумі добрі люди smile  smile
Дякую.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму