Ви не увійшли.
Сторінки 1
Антончик пише: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); дає значну затримку в часі.
Тобто і там також була та ж проблема з ШІМ, але реле не встигало розмикатись.
дякую
digitalWrite(vbochku, HIGH);
digitalWrite(zbochki, HIGH);
перенесіть із loop в setup, вони і дають "ШІМ"
це і справді допомогло, але ви незнаєте чому це не заважало коду який написав до перериву?
На вокви реле с активацией по 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 кода) просто я пытаюсь именно разобраться что не так
Кстати эти две строки из лупа нужно бы перенести в сетап
digitalWrite(vbochku, HIGH);
digitalWrite(zbochki, HIGH);
если вы про эти то да, спасибо сто заметили
renoshnik пише:Ни кого не напрягает - digitalWrite(А1, HIGH); ?
Поначалу напрягло, но симуляторы типа протеуса и вовки успокоили. Одинаковов работают что с А1 что с 15. Хотя может в реальном железе это и не так. Но ТС (судя по его молчанию) это уже наверное вообще не напрягает
обьясните что не так пожалуйста, и по поводу не коректной работы в целом я ответил одному учаснику посмотрите пожалуйста, чтобы не писать дважды
Ни кого не напрягает - digitalWrite(А1, HIGH); ?
реле с али, оно запускаеться низким сигналом, и выключается высоким, если вы об этом
там нет датчика влажности, а по выходному сигналу они по сути идентичны
есть, с али заказал
А зачем там датчик температуры?
это датчик влажности
Проблема здесь:
polyv = 0;
обьясните пожалуйста
гоcть пише:Проблема здесь:
polyv = 0;
И в чем именно?
По вышеприведенному коду реле включится и тут же выключится один раз, а ТС утверждает что это происходит бесконечно
бесконечно это происходило потому что я допутил ошибку с временем, но там другая проблема, если можете помочь посмотрите пожалуйста на этой теме мой ответ на коментарий другого учасника, просто чтобы не писать дважды
Якщо хочете допомоги, то намалюйте схему.
Та и хто знае, що у вас за реле...
прочитайте будьласка мій коментар який написав одному з учасників, просто щоб не писати двічі
Антончик пише:г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;
}
}
Схема де?
можу детальніше пояснити
Схема де?
для чого? все ж і з коду понятно, і проблема в ньому
система що запускає полив відповідно до вологості грунту
проблема: реле запускається ти виключається моментально безкінечно до поки 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;
}
}
помилка 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;
}
}
проект автоматичного поливу, ардуїно зчитує дані з сенсора вологості грунту, і відносноно результатів послідовно запускає 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 релле, натомість при запуску ардуїно незалежно від показників 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);
}
Сторінки 1