#1 2023-05-20 00:32:28

Антончик
Учасник
Зареєстрований: 2023-05-18
Повідомлень: 19

не можу розібратися з millis()

проект автоматичного поливу, ардуїно зчитує дані з сенсора вологості грунту, і відносноно результатів послідовно запускає 2 релле.
так от, з delay все працює коректно, але планую в подальшому збільшити функціонал програми що не можливо з делей.
тому якщо я правильно розумію як працює міліс то (

digitalWrite(vbochku, LOW);

if (millis() - last_time == 50000) {
  last_time = millis();
digitalWrite(vbochku, HIGH);
}
) ось цей кусок коду повинен працювати на мою думку так:  релле включається, і через 50 секунд виключається(доречі там де в коді пише подати низький рівень чомусь подається високий тому там де мені потрыбно подати напругу пишу low) але натомість релле просто безперервно включається та виключається



int sensor = A0;
int vbochku = A1;
int zbochki = A2;

void setup() {
  Serial.begin(9600);
pinMode(sensor, INPUT);
pinMode(vbochku, OUTPUT);
pinMode(zbochki, OUTPUT);

}
void loop() {

int result = analogRead(sensor);
Serial.println(result);
digitalWrite(vbochku, HIGH);
digitalWrite(zbochki, HIGH);

if (result <= 260) {polyv();};
}


void polyv() {
  unsigned long last_time;
digitalWrite(vbochku, LOW);

if (millis() - last_time == 50000) {
  last_time = millis();
digitalWrite(vbochku, HIGH);
}


digitalWrite(zbochki, LOW);
if (millis() - last_time == 50000) {
last_time = millis();
digitalWrite(zbochki, HIGH);
}
}

Неактивний

#2 2023-05-20 09:10:52

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 412

Re: не можу розібратися з millis()

Програмування - це не копіпейст, щоб перейти до millis розберіться з теорією

Неактивний

#3 2023-05-20 09:14:39

г0сть
Учасник
Зареєстрований: 2022-06-09
Повідомлень: 45

Re: не можу розібратися з millis()

Антончик пише:

там де мені потрыбно подати напругу пишу low)

Якщо ви використовуєте модулі китайських реле - то це нормально. Вони вмикаються низьким рівнем, а вимикаються високим

Неактивний

#4 2023-05-20 09:18:06

г0сть
Учасник
Зареєстрований: 2022-06-09
Повідомлень: 45

Re: не можу розібратися з millis()

Антончик пише:

якщо я правильно розумію як працює міліс то (

digitalWrite(vbochku, LOW);

if (millis() - last_time == 50000) {
  last_time = millis();
digitalWrite(vbochku, HIGH);
}
) ось цей кусок коду повинен працювати на мою думку так:  релле включається, і через 50 секунд виключається

Ні, ви не зовсім правильно розумієте роботу мілліс. Коли ви вмикаєте реле вам необхідно запам’ятати цей час і потім перевіряти чи не пройшов заданий інтервал. А ви робите навпаки

Неактивний

#5 2023-05-20 10:04:39

Honey
Учасник
З Київ
Зареєстрований: 2020-09-26
Повідомлень: 412

Re: не можу розібратися з millis()

Скінченний автомат з трьома вашими станами:

loop() {
 static byte state = 0;
 static unsigned long start_time;
 unsigned long cur_time = millis();
 switch (state) {
 case 0:
  if (analogRead() <= 260) {
   digitalWrite(vbochku, LOW);
   state = 1;
   start_time = cur_time;
  }
  break;
 case 1:
  if (cur_time - start_time >= 50000) {
   digitalWrite(vbochku, HIGH);
   digitalWrite(zbochki, LOW);
   state = 2;
   start_time = cur_time;
  }
  break;
 case 2:
  if (cur_time - start_time >= 50000) {
   digitalWrite(zbochki, HIGH);
   state = 0;
  }
  break;
 }
}

Остання редакція Honey (2023-05-20 10:06:01)

Неактивний

#6 2023-05-20 10:51:43

Васятко
Гість

Re: не можу розібратися з millis()

Вот что чатGPT животворящий делает!  smile  Honey начал бесплатно коды выдавать

#7 2023-05-20 12:13:46

Антончик
Учасник
Зареєстрований: 2023-05-18
Повідомлень: 19

Re: не можу розібратися з millis()

Honey пише:

Програмування - це не копіпейст, щоб перейти до millis розберіться з теорією

ну я власне щоб розібратись звернувся на цей форум

Неактивний

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

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

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