Ви не увійшли.
Сторінки 1

Привіт усім. Не можу зрозуміти, чому не працює вкладена функція 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)
Неактивний

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

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

#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)
Неактивний

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