Вопрос по синтаксису

freeman86
Offline
Зарегистрирован: 07.09.2016

Вот в том то и прикол, что синтаксис ардуино это как бы не Си, но как бы и Си. И чтобы на ней нормально писать, надо хорошо знать Си, а если ты хорошо знаешь Си, то ты уже серьезный программист. ))) Как-то не вяжется с "конструктором для детей и их родителей" ))))

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

freeman86 пишет:

Вот в том то и прикол, что синтаксис ардуино это как бы не Си, но как бы и Си. И чтобы на ней нормально писать, надо хорошо знать Си, а если ты хорошо знаешь Си, то ты уже серьезный программист. ))) Как-то не вяжется с "конструктором для детей и их родителей" ))))

Вот самый большой парадокс. Смотрят люди глазами, а видят почему-то мозгом. Точнее многие не видят, потому что мозг уже атрофировался. Так и здесь. Для одних Ардуино Мозайка- сложил и МОЛОДЕЦ. А для других это момент исследования мира, а Ардуино просто один из инструментов. Вот где бы вы применили знание языка Си, если бы не занялись Ардуиной.

freeman86
Offline
Зарегистрирован: 07.09.2016

Лично для меня Ардуино стал единственным входом в программирование, поскольку ты видишь в реальности глазами то, что ты программируешь, и как оно физически работает :)

SLKH
Offline
Зарегистрирован: 17.08.2015

ЕвгенийП пишет:

Ну, блин, набросились. Ну тогда ещё расскажите про ленивую логику и различие в порядке вычисления операндов :)

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

Поэтому предпочтительна запись вида

if((val >= 341) && (val <= 681)) 
 

 

 

 

 

 

SLKH
Offline
Зарегистрирован: 17.08.2015

qwone пишет:

Вот самый большой парадокс. Смотрят люди глазами, а видят почему-то мозгом.

А для выноса этого мозга разработан надёжный высокоэффективный инструмент: язык Си.

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

AlexeySh пишет:

bool и boolean

Не помню точно какого, но переменная одного из этих типов может быть неопреденной null, а другого только true и false. В описании Ардуино упоминается только boolean. bool Ардуино унаследовал от языка C, там и ищите описание различий.

В этих Ваших интернетах и не такого напишут. А на деле, открываем файл arduino.h и видим там:

typedef bool boolean;

Так, что, как видите, синонимы полные. В языке есть тип bool, но для ардуинщиков доопределили паскалевское ключевое слово. Не знаю, зачем.

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

SLKH я не о приоритетах операций, а о порядке вычисления операндов.

Вот Вы написали

SLKH пишет:
Поэтому предпочтительна запись вида
if((val >= 341) && (val <= 681)) 

И что? Что вперёд будет вычисляться? "val >= 341" или  "val <= 681"? Беда с этим делом.

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

freeman86 пишет:

Вот в том то и прикол, что синтаксис ардуино это как бы не Си, но как бы и Си.

Вот в этом то и прикол, что у Вас каша в голове. Язык Ардуино, это не "как бы", а чистый, стопроцентный С++ безо всяких "как бы". Понимаете?

freeman86 пишет:

Как-то не вяжется с "конструктором для детей и их родителей" ))))

А что такого? Что есть такого в полутора десятках конструкций, чего не может освоить человек, который сумел (хватило мозгов)  научиться разговаривать, читать и вытирать попу?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

ЕвгенийП пишет:

SLKH пишет:
Поэтому предпочтительна запись вида

if((val >= 341) && (val <= 681)) 

И что? Что вперёд будет вычисляться? "val >= 341" или  "val <= 681"? Беда с этим делом.

1-(val >= 341)

2-(val <= 681)

3 &&

А что может быть иначе?

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

qwone пишет:

1-(val >= 341)

2-(val <= 681)

3 &&

А что может быть иначе?

Конечно, может. Тут нюансов миллион.

Стандарт языка (раздел 5.14) специально подчёркивает разницу в порядке вычисления операндов между && и &, а также тот факт, что в && (как и в ||) используется (всегда) ленивая логика.

В данном примере порядок вычисления операндов всегда слева направо (а вот в случае & порядок не определён и оставляется на откуп реализации).

А вот с ленивой логикой могут быть сюрпризы. Например п.2 из Вашей росписи может не выполниться вовсе (если в п.1 false получилось). В таком-то виде, как в примере, это без разницы, но у выражения могут же быть и побочные эффекты. Например, если Вы напишете (val++ <= 681), То согласитесь, Вам отнюдь не всё равно выполнится оно или нет.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну да . Я пытаюсь избегать таких стремных конструкций. Код должен работать надежно, а потом уже быстро. А то если быстро, но с пиколами, не очень приятно ловить глюки программы.

SLKH
Offline
Зарегистрирован: 17.08.2015

ЕвгенийП пишет:

SLKH я не о приоритетах операций, а о порядке вычисления операндов.

Вот Вы написали

SLKH пишет:
Поэтому предпочтительна запись вида
if((val >= 341) && (val <= 681)) 

И что? Что вперёд будет вычисляться? "val >= 341" или  "val <= 681"? Беда с этим делом.

исполняемый код (в конкретном случае) будет тот же, что и без доп. скобок. компилятору всё равно.

при соотв. препроцессоре - он и на BrainFuck'е накомпилит.

а человеку (особенно начинающему программировать) - не всё равно. вариант с доп. скобками читается понятнее. 

freeman86
Offline
Зарегистрирован: 07.09.2016

Что за BrainFuck тут периодически упоминают? 

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

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

SLKH
Offline
Зарегистрирован: 17.08.2015

freeman86 пишет:

Что за BrainFuck тут периодически упоминают? 

Язык программирования. Ещё проще, чем С.

И столь же эффективен для постижения дзен.

См. http://arduino.ru/forum/programmirovanie/razrabotka-sketchei-na-yazyke-brainfuck

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

freeman86 пишет:

Что за BrainFuck тут периодически упоминают? 

Ну когда-то в глубокой древности, когда калькуляторы были программируемые было что-то подобное https://goo.gl/Dvn9dH

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

del

freeman86
Offline
Зарегистрирован: 07.09.2016

Почему-то вариант с val = analogRead(R) у меня не работает. Загорается перый светодиод и ничего не происходит с поворотом потенциометра. Вот скетч, может увидите ошибку 

int Resist = 0;
int LED_1 = 11;
int LED_2 = 9;
int LED_3 = 7;
int R = analogRead(Resist);
void setup() {
  pinMode(Resist, INPUT);
  pinMode(LED_1, OUTPUT);
  pinMode(LED_2, OUTPUT);
  pinMode(LED_3, OUTPUT);
}

void loop() {

 if(R <= 340){
  digitalWrite(LED_1, HIGH);
  }
  else{
    digitalWrite(LED_1, LOW);
  }
if(R >= 341 && R <= 681 ){
  digitalWrite(LED_2, HIGH);
  }
   else {
    digitalWrite(LED_2, LOW);
    }
 
if(R >= 682){
  digitalWrite(LED_3, HIGH);
}

else{
  digitalWrite(LED_3, LOW);
}
}

 

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015
int Resist = 0;
int LED_1 = 11;
int LED_2 = 9;
int LED_3 = 7;
void setup() {
  pinMode(Resist, INPUT);
  pinMode(LED_1, OUTPUT);
  pinMode(LED_2, OUTPUT);
  pinMode(LED_3, OUTPUT);
}

void loop() {
int R = analogRead(Resist);
 if(R <= 340){
  digitalWrite(LED_1, HIGH);
  }
  else{
    digitalWrite(LED_1, LOW);
  }
if(R >= 341 && R <= 681 ){
  digitalWrite(LED_2, HIGH);
  }
   else {
    digitalWrite(LED_2, LOW);
    }
 
if(R >= 682){
  digitalWrite(LED_3, HIGH);
}

else{
  digitalWrite(LED_3, LOW);
}
}

 

freeman86
Offline
Зарегистрирован: 07.09.2016

Сегодня написал скетч с реальным датчиком воды и влажности, и тремя светодиодами, которые отображают один из вариантов действий. Скетч полностью рабочий "на железе". Теперь возник вопрос как это офрмить с помощью switch...case. Я попытался, но получилась ерунда и она не работает. Скетч выложу в следующем сообщении 

int Water_pin = 0; // датчик воды
int Humid_pin = 2; // датчик влажности
int STANDBY = 11;  // режим ожидания
int WATERING = 9;  // режим полива
int NO_WATER = 7;  // режим "нет воды"

void setup() {
  pinMode(Humid_pin, INPUT);
  pinMode(Water_pin, INPUT);
  pinMode(STANDBY, OUTPUT);
  pinMode(WATERING, OUTPUT);
  pinMode(NO_WATER, OUTPUT);
}

bool WaterTank() {
  if(analogRead(Water_pin) >= 30){
    return HIGH;
  }
  else{
    return LOW;
    }
}
bool Humidity(){
 if(digitalRead(Humid_pin) == HIGH){
  return HIGH;
 }
  else{
    return LOW;
  }
}
void loop() {

 if(WaterTank() == LOW ){
    digitalWrite(NO_WATER, HIGH);
    digitalWrite(STANDBY, LOW);
    digitalWrite(WATERING, LOW);
    }
  
 else if(WaterTank() == HIGH && Humidity() == HIGH){
    digitalWrite(WATERING, HIGH);
    digitalWrite(STANDBY, LOW);
     digitalWrite(NO_WATER, LOW);
  }
  else if(WaterTank() == HIGH && Humidity() == LOW){
    digitalWrite(WATERING, LOW);
    digitalWrite(STANDBY, HIGH);
    digitalWrite(NO_WATER, LOW);
  }
}


 

freeman86
Offline
Зарегистрирован: 07.09.2016

вот мой нерабочий вариант switch...case

Компилятор выдавал предупреждения на ОС ХР, но компилировался. На 10 вообще ничего не выдает и компилируется. Хотя как мы выяснили это еще ни о чем не говорит... :)

#define STANDBY 0
#define WATERING 1
#define NO_WATER 2

int Water_pin = 0;
int Humid_pin = 2;
int Standby_pin = 11;
int Watering_pin = 9;
int No_water_pin = 7;
int state = STANDBY;
void setup() {
  pinMode(Humid_pin, INPUT);
  pinMode(Water_pin, INPUT);
  pinMode(Standby_pin, OUTPUT);
  pinMode(Watering_pin, OUTPUT);
  pinMode(No_water_pin, OUTPUT);
}

bool WaterTank() {
  if(analogRead(Water_pin) >= 30){
    return HIGH;
  }
  else{
    return LOW;
    }
}
bool Humidity(){
 if(digitalRead(Humid_pin) == LOW){
  return LOW;
 }
  else{
    return HIGH;
  }
}
void Standby(){
  if(WaterTank() == HIGH && Humidity() == LOW){
    digitalWrite(Watering_pin, LOW);
    digitalWrite(Standby_pin, HIGH);
    digitalWrite(No_water_pin, LOW); 
  }
}
void No_water(){
  if(WaterTank() == LOW){
   digitalWrite(No_water_pin, HIGH);
    digitalWrite(Standby_pin, LOW);
    digitalWrite(Watering_pin, LOW);
    }
}
void Watering(){
  if(WaterTank() == HIGH && Humidity() == HIGH){
    digitalWrite(Watering_pin, HIGH);
    digitalWrite(Standby_pin, LOW);
    digitalWrite(No_water_pin, LOW);
  }
}

void loop() {
switch (state){
  case STANDBY:
  Standby();
  if(WaterTank() == LOW);
  state = NO_WATER;
  if(WaterTank() == HIGH && Humidity() == LOW);
  state = WATERING;
  break;

  case NO_WATER:
  No_water();
  state = STANDBY;
    break;

  case WATERING:
  Watering();
  state = STANDBY;
    break;
  }
}

 

freeman86
Offline
Зарегистрирован: 07.09.2016

Valera19701, спасибо! Теперь все работает. R надо было в цикл занести потому-что на нее постоянно разные данные приходят и ее надо постоянно обновлять? 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

freeman86, это одинаковые операторы, но для разных типов. Проблема в том, что в С не различаются целые и логический тип, поэтому компилятору надо явно указать, с чем мы хотим работать: с отдельными битами или с логическими выражениями.

freeman86
Offline
Зарегистрирован: 07.09.2016

Собрал поливалку в виде схемы, теперь программа. И сразу возникла сложность. Сам текст программы ниже. Подскажите почему выполняется только то, что в теле void loop, а другой "void" игнорируется? Пробовал менять местами. 

 

int Water_pin = A0; // датчик воды
int Humid_pin1 = 10; // датчик влажности 1
int PUMP12_1 = 2; // насос 12 вольт полная мощность
int RED_LED = 9; // красный светик "нет воды"
int GREEN_LED = 8; // зеленый светик "режим ожидания"

void setup() {
  pinMode(Water_pin, INPUT);
  pinMode(Humid_pin1, INPUT);
  pinMode(PUMP12_1, OUTPUT);
  pinMode(RED_LED, OUTPUT);
  pinMode(GREEN_LED, OUTPUT);
  
}

// проверка уровня воды
bool WaterTank() {
  if(analogRead(Water_pin) >= 30){ 
    return HIGH;
  }
  else{
    return LOW;
    }
}

// проверка влажности на датчике 1
bool Humid1(){
 if(digitalRead(Humid_pin1) == HIGH){ 
  return HIGH;
 }
 else {
  return LOW;
 }
}

// полив горшка номер 3, 12 вольт, полная мощность
void Watering3(){
  if(WaterTank() == HIGH && Humid1()== HIGH){
    digitalWrite(PUMP12_1, HIGH);
    }
  else if(WaterTank() == HIGH && Humid1()== LOW){ 
    digitalWrite(PUMP12_1, LOW);   
  }
}
// режим при отсутствии воды
void loop() {
  if(WaterTank()== LOW){
  digitalWrite(RED_LED, HIGH);
  digitalWrite(GREEN_LED, LOW);  
  }
  else if(WaterTank()== HIGH){
    digitalWrite(RED_LED, LOW);
    digitalWrite(GREEN_LED, HIGH);
  }
}

 

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

freeman86 пишет:

Подскажите почему выполняется только то, что в теле void loop, а другой "void" игнорируется? Пробовал менять местами. 

Потому, что Вы даже примерно, от слова "совсем", не понимаете, что там написано.

Ваша функция не исполняется потому. что Вы её не вызываете. Вы не задумывались, почему автомобиль никуда не едет, в то время, когда он стоит в гараже на ручнике, а ключ зажигания в кармане у владельца? Вот поэтому же не работает Ваша функция.

Читать, запускать примеры и разбираться до полного просветвления - http://people.toiit.sgu.ru/Sinelnikov/PT/C/Kern_Ritch.pdf

freeman86
Offline
Зарегистрирован: 07.09.2016

Я не спорю, что я не знаю С, поэтому и спрашиваю на форуме помощи в написании примитивного скетча. Можете сказать, в каких строках в данной теме автор называет свои функции? http://arduino.ru/forum/proekty/avtozapusk-pervyi-proekt

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

freeman86 пишет:

Можете сказать, в каких строках в данной теме автор называет свои функции?

Не могу. Я много и с удовольствием трачу время на помощь тем, кто пишет сам. У Вас же свосем другой случай - Вы сами не пишете. А делать работу вместо Вас ... с какого перепугу? У меня и другие занятия есть.

Считаю, что я уже Вам помог - посоветовал правильную книгу. Это реальная помощь. Если Вам такая помощь не нужна и учиться Вы не хотите - дело Ваше, продолжайте побираться по форумам, авось кто и подаст. Или же идите в профильный раздел и заказывайте работу там, кто-нибудь обязательно сделает.

freeman86
Offline
Зарегистрирован: 07.09.2016

Я не знаю что вы имеете ввиду под фразой "пишет сам". То, что я выкладывал и выкладываю я пишу сам и скажу за каждую строчку, зачем она здесь нужна. Я прошу помощи по синтаксису, как иностранец у носителей языка спршивает зачем нужно то или это. Если бы я знал С, я бы не создавал эту тему. 

В первом сообщении я приложил скетч, который не компилировался. Уже потом, своим умом я допер, что "void" не обявляется, обявляются char, short, int, long и т.д. Именно этого я пытался добиться, создавая эту тему, чтобы просто указали пальцем. Это чисто синтаксический вопрос, это просто надо знать как факт. Но вместо этого меня все дружно потролили. Кстати, я начал читать эту книгу тогда, на 31 странице Функции не сказано что функции надо называть или объявлять, к тому же в ардуино есть свои setup и loop, но нет обязательного main как в С, и как их вызывать. На странице 45 Объявления говорится только о типах  char, short, int, long и т.д. Не думайте что я не читал. Дальше углубляться не стал, так как непонятно уже на этом этапе.

Если не трудно, посоветуйте на чем запускать примеры из этой книги, чтобы оно работало на XP.

Я сам нашел где автор того скетча вызывает функции. Опять же, ничего сложного, просто объяснить, что следующая за loop функция вызывается в loop и так далее как матрешка.

sadman41
Offline
Зарегистрирован: 19.10.2016

freeman86 пишет:

что функции надо называть или объявлять, к тому же в ардуино есть свои setup и loop, но нет обязательного main как в С, и как их вызывать.

Есть, но уже объявленная за вас. Находится тут: C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp 

freeman86 пишет:

Если не трудно, посоветуйте на чем запускать примеры из этой книги, чтобы оно работало на XP.

https://codelite.org/

sadman41
Offline
Зарегистрирован: 19.10.2016

freeman86 пишет:
Именно этого я пытался добиться, создавая эту тему, чтобы просто указали пальцем. Это чисто синтаксический вопрос, это просто надо знать как факт. Но вместо этого меня все дружно потролили.

Представьте: приходите вы в ординаторскую хирургического отделения и говорите: я хочу научиться оперировать, для начала решил соседу гланды удалить. В принципе как махать ножом я знаю, но скальпель в руках не держал еще. Объясните, мол, мне в двух словах как им резать. Это же чисто технический вопрос, ничего сложного быть не может.

Какую реакцию ожидаете получить?

freeman86
Offline
Зарегистрирован: 07.09.2016

Вы же понимаете, что это не корректный пример. Я для себя на своей ардуине со воими моторами и клапанами пишу кривую программу. От ее кривости никто не пострадает, не погибгнет и так далее. 

А писать программы для авиации или космоса мне никто не позволит даже если я захочу. 

Так что пример с врачеванием не совсем корректный в данном случае. :)

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

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

ПС: Я даже разучился писать "типичные ардуиновские программы", а потом ковырять их для поиска в них глюков.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

freeman86 пишет:

Вы же понимаете, что это не корректный пример. Я для себя на своей ардуине со воими моторами и клапанами пишу кривую программу. От ее кривости никто не пострадает, не погибгнет и так далее. 

А писать программы для авиации или космоса мне никто не позволит даже если я захочу. 

Так что пример с врачеванием не совсем корректный в данном случае. :)

Сравнение вполне корректное. И смысл его в том, что прежде, чем что-то пытаться сделать, следует сперва чему-то научиться. Даже в том случае, если от Вашего неумения никто не умрет.

 

Но проблема существует. Примерно она выглядит так: Вам посоветовали книжку, предназначенную не для начинающих, а для программистов, которые уже вледеют, минимум, каким-то одним языком программирования и, главное, - умеют программировать.

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

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

Если для Вас этот путь представляется слишком сложным, рекомендую начать с того, чтобы научиться программировать. Лучше всего это сделать по книге Фаронова Turbo Pascal.

sadman41
Offline
Зарегистрирован: 19.10.2016

freeman86 пишет:

Я для себя на своей ардуине со воими моторами и клапанами пишу кривую программу. От ее кривости никто не пострадает, не погибгнет и так далее. 

Окей, вот вам фраза:

"Неделю назад купил ардуину, уже освоил светодиод и пощелкал релюшкой, правда не совсем понял, что такое >>. Теперь я на своей ардуине..."

Выберите опасный вариант ее окончания:

- для себя делаю управление поворотниками на свой автомобиль;

- для своей бабушки делаю аппарат по выдаче таблеток;

- для себя делаю управление своим газовым котлом.

 

lean_74
Offline
Зарегистрирован: 22.12.2015

сейчас даже читать не особо нужно, хотя бы видео посмотреть и повторить, что там делают начиная с этого https://www.youtube.com/watch?v=bO_jN0Lpz3Q

потом уже умные книжки Уважаемого ЕвгениемП можно почитать и все получиться.

freeman86
Offline
Зарегистрирован: 07.09.2016

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

freeman86
Offline
Зарегистрирован: 07.09.2016

lean_74, вы не поверите, но именно с этих и еще одних русскоязычных уроков я и начал знакомство с ардуино, еще до того как заказал плату на Али. Но там я не нашел нужного мне по данной теме. 

freeman86
Offline
Зарегистрирован: 07.09.2016

Сегодня изменил скетч. Он скомпилировался и работает на железе как и задумано. Глюков пока не выявил. Теперь думаю как реализовать задержки между поливами и отключения после нескольких попыток подряд, на случай если сорвет трубку и т.п. Если есть конструктивные замечания или советы как оптимизировать нижеизложенную программу, пожалуйста напишите. А так, всем спасибо за помощь и участие. 

int Water_pin = 0; // датчик воды
int Humid_pin1 = 10; // датчик влажности 1
int Humid_pin2 = 11; // датчик влажности 2
int Humid_pin3 = 12; // датчик влажности 3
int Humid_pin4 = 13; // датчик влажности 4
int PUMP6_1 = 6; // насос 6 вольт полная мощность
int PUMP6_1_2 = 7; // насос 6 вольт неполная мощность 
int PUMP12_1 = 2; // насос 12 вольт полная мощность
int PUMP12_1_2 = 3; // насос 12 вольт неполная мощность
int VALVE_6 = 5; // клапан насоса 6 вольт 
int VALVE_12 = 4; // клапан насоса 12 вольт
int RED_LED = 9; // красный светик "нет воды"
int GREEN_LED = 8; // зеленый светик "режим ожидания"

void setup() {
  pinMode(Humid_pin1, INPUT);
  pinMode(Humid_pin2, INPUT);
  pinMode(Humid_pin3, INPUT);
  pinMode(Humid_pin4, INPUT);
  pinMode(Water_pin, INPUT);
  pinMode(PUMP6_1, OUTPUT);
  pinMode(PUMP6_1_2, OUTPUT);
  pinMode(PUMP12_1, OUTPUT);
  pinMode(PUMP12_1_2, OUTPUT);
  pinMode(VALVE_6, OUTPUT);
  pinMode(VALVE_12, OUTPUT);
  pinMode(RED_LED, OUTPUT);
  pinMode(GREEN_LED, OUTPUT);
}

// проверка уровня воды
bool WaterTank() {
  if(analogRead(Water_pin) >= 30){ 
   return HIGH;
  }
  else{
   return LOW;
    }
}

// проверка влажности на датчике 1
bool Humid1(){
 if(digitalRead(Humid_pin1) == HIGH){ 
  return HIGH;
 }
 else {
  return LOW;
 }
}
// проверка влажности на датчике 2
bool Humid2(){ 
  if(digitalRead(Humid_pin2) == HIGH){ 
  return HIGH;
 }
 else{
  return LOW;
 }
}
// проверка влажности на датчике 3
bool Humid3(){ 
  if(digitalRead(Humid_pin3) == HIGH){ 
  return HIGH;
 }
 else{
  return LOW;
 }
}
// проверка влажности на датчике 4
bool Humid4(){ 
  if(digitalRead(Humid_pin4) == HIGH){ 
  return HIGH;
 }
 else{
  return LOW;
 }
} 
// режим "нет воды"
void ChekWater(){
  if(WaterTank() == HIGH){
  digitalWrite(RED_LED, LOW);
  digitalWrite(GREEN_LED, HIGH);
  }
  else if(WaterTank() == LOW){
   digitalWrite(PUMP6_1, LOW);  // принудительная блокировка моторов если нет воды
   digitalWrite(PUMP6_1_2, LOW);
   digitalWrite(VALVE_6, LOW);
   digitalWrite(PUMP12_1_2, LOW);
   digitalWrite(VALVE_12, LOW);  
   digitalWrite(PUMP12_1, LOW); // принудительная блокировка моторов если нет воды
   digitalWrite(RED_LED, HIGH);
   digitalWrite(GREEN_LED, LOW);
  }
}
// полив горшка номер 1, 6 вольт, полная мощность
void Watering1(){
  if(WaterTank() == HIGH && Humid1()== HIGH){
    digitalWrite(PUMP6_1, HIGH);  
    }
  else if(WaterTank() == HIGH && Humid1()== LOW){ 
    digitalWrite(PUMP6_1, LOW);   
  }
}
// полив горшка номер 2, 6 вольт, неполная мощность, клапан
void Watering2(){
  if(WaterTank() == HIGH && Humid2()== HIGH){
    digitalWrite(PUMP6_1_2, HIGH);
    digitalWrite(VALVE_6, HIGH);  
    }
  else if(WaterTank() == HIGH && Humid2()== LOW){ 
    digitalWrite(PUMP6_1_2, LOW);
    digitalWrite(VALVE_6, LOW);    
  }
}
// полив горшка номер 3, 12 вольт, полная мощность
void Watering3(){
  if(WaterTank() == HIGH && Humid3()== HIGH){
    digitalWrite(PUMP12_1, HIGH);
    }
  else if(WaterTank() == HIGH && Humid3()== LOW){ 
    digitalWrite(PUMP12_1, LOW);   
  }
}
// полив горшка номер 4, 12 вольт, неполная мощность, клапан
void Watering4(){
  if(WaterTank() == HIGH && Humid4()== HIGH){
    digitalWrite(PUMP12_1_2, HIGH);
    digitalWrite(VALVE_12, HIGH);   
    }
  else if(WaterTank() == HIGH && Humid4()== LOW){ 
    digitalWrite(PUMP12_1_2, LOW);
    digitalWrite(VALVE_12, LOW);      
  }
}
void loop() {
  {
  ChekWater();  
  Watering1();
  Watering2();
  Watering3();
  Watering4(); 
  }
}

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

freeman86 пишет:

lean_74, вы не поверите, но именно с этих и еще одних русскоязычных уроков я и начал знакомство с ардуино, еще до того как заказал плату на Али. Но там я не нашел нужного мне по данной теме. 

с этого нужно было начинать http://make.kosakalab.com/arduino/obaka/project-5/index_en.html

3964128701_4c1633f8c3.jpg

sadman41
Offline
Зарегистрирован: 19.10.2016
Для начала как-то так:
byte Humid(_pinNumber) {
  return (digitalRead(_pinNumber) ? HIGH : LOW);
}
...
void Watering1(){
  if (HIGH == WaterTank()) {
     digitalWrite(PUMP6_1, Humid(Humid_pin1)); 
  }
}
..

Естественно - переписать нужно все похожие функции. 

По логике работы не скажу - алгоритм только у вас в голове существует.

 

 

freeman86
Offline
Зарегистрирован: 07.09.2016

Спасибо! 

Алгоритм простой, четыре датчика влажности, один датчик воды. Два насоса, два клапана. Рассчитано на четыре цветка. По мере высыхания почвы включается насос с\без клапаном и поливает. По достижению влажности отключает. При сигнале от датчика воды, что воды нет, блокировка всего. )

sadman41
Offline
Зарегистрирован: 19.10.2016

Господи, я с таким кодом даже сам затупил. Вот так же надо:

void Watering1(){
  if (HIGH == WaterTank()) {
     digitalWrite(PUMP6_1, digitalRead(Humid_pin1);
  }
}

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

if (HIGH - WaterTank() == 0) {

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Если в Танке нет воды...

sadman41
Offline
Зарегистрирован: 19.10.2016

Клапауций как всегда какой-то козырь в рукаве держит. Конструкция с вычитанием работает надежней? Что-то у меня под вечер некоторое завихрение в голове начинается.

sadman41
Offline
Зарегистрирован: 19.10.2016

freeman86 пишет:
По мере высыхания почвы включается насос с\без клапаном и поливает. По достижению влажности отключает. При сигнале от датчика воды, что воды нет, блокировка всего. )

Про гистерезис почитайте, а то будет ваша конструкция беспрестанно зубами клацать и в цветок сикать.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

sadman41 пишет:

Конструкция с вычитанием работает надежней?

сколько у тебя по математике в школе было?

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

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

qwone пишет:

Если в Танке нет воды...

Неужели и здесь приложились?

sadman41
Offline
Зарегистрирован: 19.10.2016

Клапауций 112 пишет:

сколько у тебя по математике в школе было?

А сколько нужно?

Клапауций 112 пишет:
тебя коммунистические перподаватели не учили, что отбирать и делить - всегда надёжней, чем складывать и приумножать?

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

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

freeman86 пишет:
Рассчитано на четыре цветка.

Hydroponical honey? ))