Ви не увійшли.
Сторінки 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