#1 Re: Програмування Arduino » не коректно працює реле » 2023-09-30 21:01:40

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

digitalWrite(vbochku, HIGH);
digitalWrite(zbochki, HIGH);
перенесіть із loop в setup, вони і дають "ШІМ"

це і справді допомогло, але ви незнаєте чому це не заважало коду який написав до перериву?

Тому, що:

analogRead(sensor);
digitalWrite(vbochku, HIGH);
digitalWrite(zbochki, HIGH);
...
digitalWrite(vbochku, LOW);

дає ШІМ з більшим коефіцієнтом заповнення нулем (це відповідає замкненому реле), ніж:

digitalWrite(vbochku, HIGH);
digitalWrite(zbochki, HIGH);
analogRead(sensor);
...
digitalWrite(vbochku, LOW);

по причині того, що analogRead(sensor); дає значну затримку в часі.
Тобто і там також була та ж проблема з ШІМ, але реле не встигало розмикатись.

дякую

#2 Re: Програмування Arduino » не коректно працює реле » 2023-09-28 20:03:18

Honey пише:

digitalWrite(vbochku, HIGH);
digitalWrite(zbochki, HIGH);
перенесіть із loop в setup, вони і дають "ШІМ"

це і справді допомогло, але ви незнаєте чому це не заважало коду який написав до перериву?

#3 Re: Програмування Arduino » не коректно працює реле » 2023-09-28 19:58:32

ncux пише:

На вокви реле с активацией по HIGH, так что HIGH<>LOW
после запуска скетча можно ткнуть на датчик и менять показания.

https://wokwi.com/projects/377019990555021313

#define sensor A0
#define vbochku A1
#define zbochki A2

uint8_t polyv = 1;
uint16_t vologist = 0;
uint32_t last_time;

void setup() {
  Serial.begin(19200);

  pinMode(sensor, INPUT);

  pinMode(vbochku, OUTPUT);
  pinMode(zbochki, OUTPUT);

  digitalWrite(vbochku, LOW);
  digitalWrite(zbochki, LOW);
}

void loop() {

  vologist = analogRead(sensor);

  switch (polyv) {
  case 1:
    Serial.println("case1 fired");
    if (vologist <= 300) {
      digitalWrite(vbochku, HIGH);
      polyv = 2;
      last_time = millis();
    }
    break;
  case 2:
    Serial.println("case 2 fired");
    if (millis() - last_time >= 5000) {
      digitalWrite(vbochku, LOW);
      polyv = 3;
    }
    break;
  case 3:
    Serial.println("case 3 fired");
    digitalWrite(zbochki, HIGH);
    polyv = 4;
    last_time = millis();
    break;
  case 4:
    Serial.println("case 4 fired");
    if (millis() - last_time >= 5000) {
      digitalWrite(zbochki, LOW);
      polyv = 1;
    }
    break;
  }
  Serial.println(vologist);
  Serial.println(polyv);
  Serial.println(millis() - last_time);
  delay(1000);
}

спасибо большое, но не могли б вы прочитать один из моих ответов на коментарий учасника(там где я привёл 2 кода) просто я пытаюсь именно разобраться что не так

#4 Re: Програмування Arduino » не коректно працює реле » 2023-09-28 19:43:15

г0cть пише:

Кстати эти две строки из лупа нужно бы перенести в сетап

digitalWrite(vbochku, HIGH);
digitalWrite(zbochki, HIGH);
если вы про эти то да, спасибо сто заметили

#5 Re: Програмування Arduino » не коректно працює реле » 2023-09-28 19:42:10

г0cть пише:
renoshnik пише:

Ни кого не напрягает - digitalWrite(А1, HIGH); ?

Поначалу напрягло, но симуляторы типа протеуса и вовки успокоили. Одинаковов работают что с А1 что с 15. Хотя может в реальном железе это и не так. Но ТС (судя по его молчанию) это уже наверное вообще не напрягает

обьясните что не так пожалуйста, и по поводу не коректной работы в целом я ответил одному учаснику посмотрите пожалуйста, чтобы не писать дважды

#6 Re: Програмування Arduino » не коректно працює реле » 2023-09-28 19:39:20

renoshnik пише:

Ни кого не напрягает - digitalWrite(А1, HIGH); ?

реле с али, оно запускаеться низким сигналом, и выключается высоким, если вы об этом

#7 Re: Програмування Arduino » не коректно працює реле » 2023-09-28 19:37:47

ncux пише:

там нет датчика влажности, а по выходному сигналу они по сути идентичны

есть, с али заказал

#8 Re: Програмування Arduino » не коректно працює реле » 2023-09-28 19:33:47

Васятко пише:

А зачем там датчик температуры?

это датчик влажности

#10 Re: Програмування Arduino » не коректно працює реле » 2023-09-28 19:30:13

Васятко пише:
гоcть пише:

Проблема здесь:

polyv = 0;

И в чем именно?
По вышеприведенному коду реле включится и тут же выключится один раз, а ТС утверждает что это происходит бесконечно

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

#11 Re: Програмування Arduino » не коректно працює реле » 2023-09-28 19:25:34

vvr пише:

Якщо хочете допомоги, то намалюйте схему.
Та и хто знае, що у вас за реле...

прочитайте будьласка мій коментар який написав одному з учасників, просто щоб не писати двічі

#12 Re: Програмування Arduino » не коректно працює реле » 2023-09-28 19:23:40

г0cть пише:
Антончик пише:
г0cть пише:

Схема де?

для чого? все ж і з коду понятно, і проблема в ньому

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

я вибачаюсь, але справді не особо маю часу і вмінь малювати схему, але можу привести ось це:

це мій старий код який я писав з такою ж метою(прийшлося тоді взяти перерив на декілька місяців) і він працює так як повинний

unsigned long last_time;

byte state;


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 <= 300) {
  last_time = millis();
  state = 0;

};

switch (state) {
  case 0:
  digitalWrite(vbochku, LOW);
    if (millis() - last_time >= 5000) {
    digitalWrite(vbochku, HIGH);
    last_time = millis();
    state = 1;
  }
  break;

  case 1:
  digitalWrite(zbochki, LOW);
 
  if (millis() - last_time >= 5000) {
    digitalWrite(zbochki, HIGH);
    state = 2;
  }
  break;
 

}
}


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

він трохи відрізняється (в попередній версії були трабли з часом) він працює добре, за винятком того що всі 5 секунд часу які ардуїно подає сигнал він занадто малий і вистачає тільки щоб ледь засвітити світлодіод неначе подається шим сигнал

byte polyv = 0;
unsigned long last_time;


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

void setup() {
  Serial.begin(9600);
pinMode(sensor, INPUT);
pinMode(vbochku, OUTPUT);
pinMode(zbochki,OUTPUT);
}
void loop() {
digitalWrite(vbochku, HIGH);
digitalWrite(zbochki, HIGH);
int vologist = analogRead(sensor);
Serial.println(vologist);

switch(polyv) {
  case 0:
    if (vologist <=300) {
     last_time = millis();
     polyv = 1;
     }
  break;

  case 1:
   digitalWrite(vbochku, LOW);
    if(millis() - last_time >= 5000) {
     digitalWrite(vbochku, HIGH);
     last_time = millis();
     polyv = 2;
    }
 
  break;

  case 2:
   digitalWrite(zbochki, LOW);
    if(millis() - last_time >= 5000) {
     digitalWrite(zbochki, HIGH);
     polyv = 0;
    }
  break;


 

}
}

#14 Re: Програмування Arduino » не коректно працює реле » 2023-09-25 20:12:49

г0cть пише:

Схема де?

для чого? все ж і з коду понятно, і проблема в ньому

#15 Програмування Arduino » не коректно працює реле » 2023-09-24 20:34:41

Антончик
відповідей: 29

система що запускає полив відповідно до вологості грунту

проблема: реле запускається ти виключається моментально безкінечно до поки vologist <=300








int polyv = 1;
unsigned long last_time;


#define sensor A0
#define vbochku A1
#define zbochki A2

void setup() {
  Serial.begin(9600);
pinMode(sensor, INPUT);
pinMode(vbochku, OUTPUT);
pinMode(zbochki,OUTPUT);
}
void loop() {
digitalWrite(vbochku, HIGH);
digitalWrite(zbochki, HIGH);
int vologist = analogRead(sensor);
Serial.println(vologist);


switch(polyv) {
  case 1:
  if (vologist <=300) {
    digitalWrite(vbochku, LOW);
   last_time = millis();
   polyv = 2;
  }
  break;

  case 2:
  if(millis() - last_time >= 5000) {
    digitalWrite(vbochku, HIGH);
    polyv = 3;
    }
  break;

  case 3:
   last_time = millis();
   digitalWrite(zbochki, LOW);
   polyv = 4;
  break;

  case 4:
   if(millis() - last_time >= 5000) {
   digitalWrite(zbochki, HIGH);
   polyv = 0;
   }
   break;
}
}

#16 Програмування Arduino » помилка компіляції » 2023-05-22 01:48:07

Антончик
відповідей: 3

помилка expected ';' before '}' token
на моменті if (result <= 260) {state = 0};




весь код:

unsigned long last_time;
unsigned long cure_time;

byte state;


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) {state = 0};

switch (state) {
  case 0:
  digitalWrite(vbochku, LOW);
  last_time = cure_time;
  if (cure_time - last_time >= 5000) {
    digitalWrite(vbochku, HIGH);
    state = 1;
  }
  break;

  case 1:
  digitalWrite(zbochki, LOW);
  last_time = cure_time;
  if (cure_time - last_time >= 5000) {
    digitalWrite(zbochki, HIGH);
    state = 2;
  }
  break;
 

}
}

#17 Re: Програмування Arduino » не можу розібратися з millis() » 2023-05-20 12:13:46

Honey пише:

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

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

#18 Програмування Arduino » не можу розібратися з millis() » 2023-05-20 00:32:28

Антончик
відповідей: 6

проект автоматичного поливу, ардуїно зчитує дані з сенсора вологості грунту, і відносноно результатів послідовно запускає 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);
}
}

#19 Програмування Arduino » код компілюється але не працює коректно » 2023-05-18 21:57:58

Антончик
відповідей: 7

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





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);
if (result <= 150) {polyv();};
}


void polyv() {
   analogWrite(vbochku, HIGH);
  delay(1200000);
analogWrite(vbochku, LOW);
analogWrite(zbochki, HIGH);
  delay(1200000);
analogWrite(zbochki, LOW);
}

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