Автополив

Defiant
Offline
Зарегистрирован: 17.01.2020

Мой первый скетч. Покритикуйте. Как улучшить?

 

Moderator : пожалуйста, вставьте код правильно (возможно, новым сообщением в тему), 

 
 

 

nik182
Offline
Зарегистрирован: 04.05.2015

Вставить по правилам форума для начала. http://arduino.ru/forum/obshchii/pesochnitsa-dlya-vsekh-novichkov

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Нечего критиковать

Defiant
Offline
Зарегистрирован: 17.01.2020
Прошу прощения за невнимательность.

int RELE_POMPA1 = 1; // пин помпы 1 
int RELE_POMPA2 = 3; // пин помпы 2
int RELE_KLAPAN1 = 2; // пин э/м. клапана 1
int RELE_KLAPAN2 = 4; // пин э/м. клапана 2
int Humidity1 = A0; // пин датчика влажности 1
int Humidity2 = A1; // пин датчика влажности 2
int Humidity1_MIN = 200; //мин. значение влажности датчика 1
int Humidity1_MAX = 700;  //мах. значение влажности датчика 1
int Humidity2_MIN = 300; //мин. значение влажности датчика 2
int Humidity2_MAX = 700; //мах. значение влажности датчика 2
unsigned long period_time1 = (long)4*60*60*1000;
unsigned long my_timer;

void setup() {
 my_timer = millis;
pinMode(RELE_POMPA1, OUTPUT);
pinMode(RELE_POMPA2, OUTPUT);
pinMode(RELE_KLAPAN1, OUTPUT);
pinMode(RELE_KLAPAN2, OUTPUT);

}
void loop() {
 if (Humidity1<=200 || Humidity2<=300){
{
digitalWrite(RELE_KLAPAN1, HIGH);
digitalWrite(RELE_KLAPAN2, HIGH);
digitalWrite(RELE_POMPA1, HIGH);
digitalWrite(RELE_POMPA2, HIGH);
delay(5000);
digitalWrite(RELE_POMPA1, LOW);
digitalWrite(RELE_POMPA2, LOW);
digitalWrite(RELE_KLAPAN1, LOW);
digitalWrite(RELE_KLAPAN2, LOW);
}
}
if (millis() - my_timer >=period_time1){ 
  my_timer = millis();}
if (Humidity1<=200 || Humidity2<=300){
{
digitalWrite(RELE_KLAPAN1, HIGH);
digitalWrite(RELE_KLAPAN2, HIGH);
digitalWrite(RELE_POMPA1, HIGH);
digitalWrite(RELE_POMPA2, HIGH);
delay(5000);
digitalWrite(RELE_POMPA1, LOW);
digitalWrite(RELE_POMPA2, LOW);
digitalWrite(RELE_KLAPAN1, LOW);
digitalWrite(RELE_KLAPAN2, LOW);}
}
}
sadman41
Offline
Зарегистрирован: 19.10.2016

Тут ничего не улучшишь... он просто неработоспособен.

b707
Offline
Зарегистрирован: 26.05.2017

"Улучшить" можно то, что работает. Тут надо писать "исправить".

Пробовали запускать?

Defiant
Offline
Зарегистрирован: 17.01.2020

Хм, а если не затруднит, можно чуточку по-подробнее?

Defiant
Offline
Зарегистрирован: 17.01.2020

Нет, пока не на чем запускать, тренируюсь, так сказать, "на кошках".

nik182
Offline
Зарегистрирован: 04.05.2015

Опишите словами что делает этот скетч. Только представьте себе, что это делает процессор, который умеет делать шаги по одному. И что происходит на каждом шаге. Потом нужно сделать тоже самое для алгоритма, который должен превратится в программу. При этом должны забыть слово "подразумевается". Должно быть описано всё, до мелкого шага. Все если - то должны давать что то полезное. Например что делает если в строке 38?

Defiant
Offline
Зарегистрирован: 17.01.2020

А почему, в Arduino IDE - Скетч - Проверить/Компилировать, программа не ругается, не подчёркивает ничего?

b707
Offline
Зарегистрирован: 26.05.2017

Defiant пишет:

А почему, в Arduino IDE - Скетч - Проверить/Компилировать, программа не ругается, не подчёркивает ничего?

так там нет синтаксических ошибок - просто там контроля влажности нет

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Defiant пишет:

Хм, а если не затруднит, можно чуточку по-подробнее?

Так это мы от Вас ждём поподробнее. Запускали? Что делает? Всё ли делает как задумывалось? Что не так?

Defiant пишет:

Нет, пока не на чем запускать, тренируюсь, так сказать, "на кошках".

А, так Вы рассчитываете, что это мы вместо Вас запустим, догадаемся, что именно Вы хотели сделать и ответим на все вопросы, приведённые выше, а заодно и расскажем Вам что делать дальше? Не вопрос, - $300 и я честно работаю на Вас один час. Согласны?

nik182
Offline
Зарегистрирован: 04.05.2015

Орфографических ошибок нет. Логические компилятор не проверяет. И даже работать будет, но не так, как Вам хочется.

Defiant
Offline
Зарегистрирован: 17.01.2020
int RELE_POMPA1 = 1; // пин помпы 1 
int RELE_POMPA2 = 3; // пин помпы 2
int RELE_KLAPAN1 = 2; // пин э/м. клапана 1
int RELE_KLAPAN2 = 4; // пин э/м. клапана 2
int Humidity1 = A0; // пин датчика влажности 1
int Humidity2 = A1; // пин датчика влажности 2
int Humidity1_MIN = 200; //мин. значение влажности датчика 1
int Humidity1_MAX = 700;  //мах. значение влажности датчика 1
int Humidity2_MIN = 300; //мин. значение влажности датчика 2
int Humidity2_MAX = 700; //мах. значение влажности датчика 2
unsigned long period_time1 = (long)4*60*60*1000; //интервал времени, через который должна проводиться проверка датчиков влажности
unsigned long my_timer; // значение времени, с момента начала работы программы

void setup() {
 my_timer = millis; // точка отсчёта
pinMode(RELE_POMPA1, OUTPUT); //сигнальный выход на реле помпы 1
pinMode(RELE_POMPA2, OUTPUT); //сигнальный выход на реле помпы 2
pinMode(RELE_KLAPAN1, OUTPUT); //сигнальный выход на реле клапана 1
pinMode(RELE_KLAPAN2, OUTPUT); //сигнальный выход на реле клапана 2

}
void loop() {
 if (Humidity1<=200 || Humidity2<=300){ //программа считывает значения с датчиков влажности, если на 1-м <=200, а на 2-м <=300, подает сигналы на включениеклапанов и помп, на 5 секунд, потом сигнал на отключение. 
 }
{
digitalWrite(RELE_KLAPAN1, HIGH);
digitalWrite(RELE_KLAPAN2, HIGH);
digitalWrite(RELE_POMPA1, HIGH);
digitalWrite(RELE_POMPA2, HIGH);
delay(5000);
digitalWrite(RELE_POMPA1, LOW);
digitalWrite(RELE_POMPA2, LOW);
digitalWrite(RELE_KLAPAN1, LOW);
digitalWrite(RELE_KLAPAN2, LOW);
}

if (millis() - my_timer >=period_time1){ //если с момента включения программы прошло больше или равно заданного интервала времени, и при опросе датчиков, с ниже минимальными параметрами, всё повторяется снова.
  my_timer = millis();}
  
   if (Humidity1<=200 || Humidity2<=300){
    {
digitalWrite(RELE_KLAPAN1, HIGH);
digitalWrite(RELE_KLAPAN2, HIGH);
digitalWrite(RELE_POMPA1, HIGH);
digitalWrite(RELE_POMPA2, HIGH);
delay(5000);
digitalWrite(RELE_POMPA1, LOW);
digitalWrite(RELE_POMPA2, LOW);
digitalWrite(RELE_KLAPAN1, LOW);
digitalWrite(RELE_KLAPAN2, LOW);}
   }
}

 

Defiant
Offline
Зарегистрирован: 17.01.2020

Уважаемый Евгений П, если бы я хотел получить готовый продукт, то вряд ли был бы сейчас здесь. Мне хочется разобраться, понять, научиться, в конце-концов. И делать за меня не надо! Тут как в школе, пока у доски сам не решишь...

b707
Offline
Зарегистрирован: 26.05.2017

да ничего не изменилось.

Несмотря на комментарий "программа считывает с датчиков влажности..." - ничего она не считывает

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

почитайте, какой командой читается значение с аналогового порта

nik182
Offline
Зарегистрирован: 04.05.2015

ua6em пишет:

почитайте, какой командой читается значение с аналогового порта

Согласен с коллегой. Я предлагал забыть слово "подразумевается". Если по шагам процессора посмотреть, то должен быть шаг  : получить значение влажности. Где по Вашему он?

Defiant
Offline
Зарегистрирован: 17.01.2020

Спасибо за замечание! Надеюсь, теперь лучше! 

int RELE_POMPA1 = 1; // пин помпы 1 
int RELE_POMPA2 = 3; // пин помпы 2
int RELE_KLAPAN1 = 2; // пин э/м. клапана 1
int RELE_KLAPAN2 = 4; // пин э/м. клапана 2
int Humidity1 = A0; // пин датчика влажности 1
int Humidity2 = A1; // пин датчика влажности 2
int Humidity1_MIN = 200; //мин. значение влажности датчика 1
int Humidity1_MAX = 700;  //мах. значение влажности датчика 1
int Humidity2_MIN = 300; //мин. значение влажности датчика 2
int Humidity2_MAX = 700; //мах. значение влажности датчика 2
unsigned long period_time1 = (long)4*60*60*1000; //интервал времени, через который должна проводиться проверка датчиков влажности
unsigned long my_timer; // значение времени, с момента начала работы программы

void setup() {
 my_timer = millis; // точка отсчёта
pinMode(RELE_POMPA1, OUTPUT); //сигнальный выход на реле помпы 1
pinMode(RELE_POMPA2, OUTPUT); //сигнальный выход на реле помпы 2
pinMode(RELE_KLAPAN1, OUTPUT); //сигнальный выход на реле клапана 1
pinMode(RELE_KLAPAN2, OUTPUT); //сигнальный выход на реле клапана 2

}
void loop() {
  analogRead(Humidity1); //считывание показания с датчика 1
if(Humidity1<=200){
  digitalWrite(RELE_KLAPAN1, HIGH);
  digitalWrite(RELE_POMPA1,HIGH);
  delay(5000);
  digitalWrite(RELE_POMPA1,LOW);
  digitalWrite(RELE_KLAPAN1, LOW);
  
  analogRead(Humidity2); //считывание показания с датчика 2
if(Humidity2<=300){
  digitalWrite(RELE_KLAPAN2, HIGH);
  digitalWrite(RELE_POMPA2,HIGH);
  delay(5000);
  digitalWrite(RELE_POMPA2,LOW);
  digitalWrite(RELE_KLAPAN2, LOW);
}
 }

if (millis() - my_timer >=period_time1){ //если с момента включения программы прошло больше или равно заданного интервала времени, и при опросе датчиков, с ниже минимальными параметрами, всё повторяется снова.
  my_timer = millis();}
  analogRead(Humidity1);
if(Humidity1<=200){
  digitalWrite(RELE_KLAPAN1, HIGH);
  digitalWrite(RELE_POMPA1,HIGH);
  delay(5000);
  digitalWrite(RELE_POMPA1,LOW);
  digitalWrite(RELE_KLAPAN1, LOW);
  
  analogRead(Humidity2);
if(Humidity2<=300){
  digitalWrite(RELE_KLAPAN2, HIGH);
  digitalWrite(RELE_POMPA2,HIGH);
  delay(5000);
  digitalWrite(RELE_POMPA2,LOW);
  digitalWrite(RELE_KLAPAN2, LOW);
}
 }
  
}

 

nik182
Offline
Зарегистрирован: 04.05.2015

Хуже. почитайте, как командой читается значение с аналогового порта. Там есть примеры.

b707
Offline
Зарегистрирован: 26.05.2017

Defiant пишет:

Спасибо за замечание! Надеюсь, теперь лучше!

не-а...

Defiant - может вы, возьмете таймаут, почитаете умные книжки с недельку - и тогда придете снова. А то знаете, сейчас у вас просто какая-то "угадайка" получается, так программы не пишут.

 

Defiant
Offline
Зарегистрирован: 17.01.2020

Последняя попытка, и таймаут ))

int sensorValue=analogRead(Humidity1); //считывание показания с датчика 1

Пошёл читать )

genia1991
Offline
Зарегистрирован: 25.12.2019
int RELE_POMPA1 = 1; // пин помпы 1 
int RELE_POMPA2 = 3; // пин помпы 2
int RELE_KLAPAN1 = 2; // пин э/м. клапана 1
int RELE_KLAPAN2 = 4; // пин э/м. клапана 2
int Humidity1 = A0; // пин датчика влажности 1
int Humidity2 = A1; // пин датчика влажности 2
int Humidity1_MIN = 200; //мин. значение влажности датчика 1
int Humidity1_MAX = 700;  //мах. значение влажности датчика 1
int Humidity2_MIN = 300; //мин. значение влажности датчика 2
int Humidity2_MAX = 700; //мах. значение влажности датчика 2
unsigned long period_time1 = (long)4*60*60*1000; //интервал времени, через который должна проводиться проверка датчиков влажности
unsigned long my_timer; // значение времени, с момента начала работы программы

void setup() {
 my_timer = millis; // точка отсчёта
pinMode(RELE_POMPA1, OUTPUT); //сигнальный выход на реле помпы 1
pinMode(RELE_POMPA2, OUTPUT); //сигнальный выход на реле помпы 2
pinMode(RELE_KLAPAN1, OUTPUT); //сигнальный выход на реле клапана 1
pinMode(RELE_KLAPAN2, OUTPUT); //сигнальный выход на реле клапана 2

}
void loop() {
int sensorValue = analogRead(Humidity1);
int sensorValue2 = analogRead(Humidity2);
  
if (sensorValue >= 200 || sensorValue2 >= 300){ 

digitalWrite(RELE_KLAPAN1, HIGH);
digitalWrite(RELE_KLAPAN2, HIGH);
digitalWrite(RELE_POMPA1, HIGH);
digitalWrite(RELE_POMPA2, HIGH);
delay(5000);
digitalWrite(RELE_POMPA1, LOW);
digitalWrite(RELE_POMPA2, LOW);
digitalWrite(RELE_KLAPAN1, LOW);
digitalWrite(RELE_KLAPAN2, LOW);
}                    



if (millis() - my_timer >=period_time1){ //если с момента включения программы прошло больше или равно заданного интервала времени, и при опросе датчиков, с ниже минимальными параметрами, всё повторяется снова.
my_timer = millis;
digitalWrite(RELE_KLAPAN1, HIGH);
digitalWrite(RELE_KLAPAN2, HIGH);
digitalWrite(RELE_POMPA1, HIGH);
digitalWrite(RELE_POMPA2, HIGH);
delay(5000);
digitalWrite(RELE_POMPA1, LOW);
digitalWrite(RELE_POMPA2, LOW);
digitalWrite(RELE_KLAPAN1, LOW);
digitalWrite(RELE_KLAPAN2, LOW);
}


}


 

genia1991
Offline
Зарегистрирован: 25.12.2019

а так работает ?

с датчиков если значение больше 200 или 300 должно быть?

genia1991
Offline
Зарегистрирован: 25.12.2019

исправил код выше. ошибку сделал

b707
Offline
Зарегистрирован: 26.05.2017

genia1991 пишет:

а так работает ?

нет, так потоп будет

genia1991
Offline
Зарегистрирован: 25.12.2019

b707 пишет:

genia1991 пишет:

а так работает ?

нет, так потоп будет

просто кроме скетча в первом посте ничего больше нет:)

как вообще это устройство должно работать? :)

нет тех. задания

b707
Offline
Зарегистрирован: 26.05.2017

genia1991 пишет:

просто кроме скетча в первом посте ничего больше нет:)

тут больше ничего и не надо. Если хотите подсказку - посмотрите как вы работаете с интервалом.

Кстати, у ТС в самом первом скетче было движение в правильном направлении - видимо где-то списал -  но поскольку он не понимает смысла операторов - он потом эту часть выкинул.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Defiant пишет:

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

Боже упаси! Вы что думаете, то была цена за готовый продукт? Таки нет! Только за то, что запущу, посмотрю (т.е. сделаю Вашу работу) и выскажу замечания. А дальше делайте сами.

Defiant пишет:

И делать за меня не надо! 

Вы ж сказали, что не запускали. Значит, запускать за Вас должен я. Или я что-то не так понял? Вы уж определитесь :-)

Гриша
Offline
Зарегистрирован: 27.04.2014

коммент к посту 22

условия (строка 26 и строка 41) пересекаются - на мой взгляд это не допустимо, но учитывая отсутствие ТЗ может оно так и задумано...? 

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

вариант решения: скопировать строку 42 в нужное место...   

Defiant
Offline
Зарегистрирован: 17.01.2020

На всякий случай )

Т.З.: Есть ёмкость с водой, в ней 2 помпы. 2 датчика влажности почвы, каждый в своей культуре, со своим водопотреблением. На каждой помпе по клапану. Интервал между проверками влажности почвы 4 часа.

Принцип работы: контроллер, опросив 1-й датчик, решает поливать, или нет (<=200 – поливать, если больше, ничего не делать). Тот же принцип и со вторым датчиком. Ну и как сказал, интервал между проверками 4 часа.

int RELE_POMPA1 = 1; // пин помпы 1 
int RELE_POMPA2 = 3; // пин помпы 2
int RELE_KLAPAN1 = 2; // пин э/м. клапана 1
int RELE_KLAPAN2 = 4; // пин э/м. клапана 2
int Humidity1 = A0; // пин датчика влажности 1
int Humidity2 = A1; // пин датчика влажности 2
int Humidity1_MIN = 200; //мин. значение влажности датчика 1
int Humidity1_MAX = 700;  //мах. значение влажности датчика 1
int Humidity2_MIN = 300; //мин. значение влажности датчика 2
int Humidity2_MAX = 700; //мах. значение влажности датчика 2
unsigned long period_time1 = (long)4*60*60*1000; //интервал времени, через который должна проводиться проверка датчиков влажности
unsigned long my_timer; // значение времени, с момента начала работы программы

void setup() {
 my_timer = millis; // точка отсчёта
pinMode(RELE_POMPA1, OUTPUT); //сигнальный выход на реле помпы 1
pinMode(RELE_POMPA2, OUTPUT); //сигнальный выход на реле помпы 2
pinMode(RELE_KLAPAN1, OUTPUT); //сигнальный выход на реле клапана 1
pinMode(RELE_KLAPAN2, OUTPUT); //сигнальный выход на реле клапана 2

}
void loop() {
  int sensorVal=analogRead(Humidity1); //считывание показания с датчика 1
if(Humidity1<=200){
  digitalWrite(RELE_KLAPAN1, HIGH);
  digitalWrite(RELE_POMPA1,HIGH);
  delay(5000);
  digitalWrite(RELE_POMPA1,LOW);
  digitalWrite(RELE_KLAPAN1, LOW);
  
  int sensorValue=analogRead(Humidity2); //считывание показания с датчика 2
if(Humidity2<=300){
  digitalWrite(RELE_KLAPAN2, HIGH);
  digitalWrite(RELE_POMPA2,HIGH);
  delay(5000);
  digitalWrite(RELE_POMPA2,LOW);
  digitalWrite(RELE_KLAPAN2, LOW);
}
 }

if (millis() - my_timer >=period_time1){ //если с момента включения программы прошло больше или равно заданного интервала времени, и при опросе датчиков, с ниже минимальными параметрами, всё повторяется снова.
  my_timer = millis();}
  int sensorValue=analogRead(Humidity1);
if(Humidity1<=200){
  digitalWrite(RELE_KLAPAN1, HIGH);
  digitalWrite(RELE_POMPA1,HIGH);
  delay(5000);
  digitalWrite(RELE_POMPA1,LOW);
  digitalWrite(RELE_KLAPAN1, LOW);
  
  int sensorValue=analogRead(Humidity2);
if(Humidity2<=300){
  digitalWrite(RELE_KLAPAN2, HIGH);
  digitalWrite(RELE_POMPA2,HIGH);
  delay(5000);
  digitalWrite(RELE_POMPA2,LOW);
  digitalWrite(RELE_KLAPAN2, LOW);
}
 }
  
}

Опять ушёл читать ))

genia1991
Offline
Зарегистрирован: 25.12.2019

A1 пин не может быть меньше или равно 300 :)

 

и здесь ошибки. датчика 2 а не 1

sensorValue

nik182
Offline
Зарегистрирован: 04.05.2015

У Вас со строки 22 может литься пока вода дойдёт до датчика. Время оборота программы при срабатывании датчика 5 секунд. Логику надо менять. К тому же полив дело не спешное. Ну сработал датчик 1 раз так сразу лить? Надо набрать статистику, что точно сухо, а не наводка от сети значение приподняла. Да и датчики очень быстро окисляются под напряжением. Их нужно подключать только на время замера. Есть ещё куча подводных камней. В сети много проектов полива. Почитайте. Посмотрите сколько проблем надо решить. Ваш скетч это даже не начало. Для начала диодом помигать бы в заданные интервалы времени.