Помогите разобраться

Rustam7
Offline
Зарегистрирован: 28.05.2018

Решил, на днях, смастерить замер влажности почвы. Нашел подходящий проект, собрал. Использовал Ардуино Уно, вместо датчика влажности земли использовал два гвоздя как электроды, подтянул их к земле через сопротивление в 10КОм. Но почему-то не верно загораются светодиоды, хотя монитор порта показывает правильные значения. Так при проверке работы, если опустить электроды в воду показывает 1023, но загорается зеленый светодиод на Pin3, а если электроды вынуть из воды, то монитор показывает 0-3, а горит желтый светодиод Pin4, который должен гореть при 100-499. Не могу понять в чем дело, почему загораются не те светодиоды? Я начинающий, не судите строго))

int led1 = 2; // LED1 - Green на PIN2
int led2 = 3; // LED2 - Green на PIN3
int led3 = 4; // LED3 - YELLOW на PIN4
int led4 = 5; // LED4 - RED на PIN5
//initialize variables for sensor pins (инициализация переменных для выводов датчиков)
int mostureSensor = 0; // mosture Sensor на PIN0
 
//initialize variables to store readings from sensors (инициализация переменных для хранения показаний датчиков)
int mostureSensorVal = 0;
void setup() {
  // Serial Begin so we can see the data from the mosture sensor in our serial input window.поэтому мы можем увидеть данные от датчика mosture в нашем серийном окне входного сигнала.
  Serial.begin(9600);
  // setting the led pins to outputs
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(mostureSensor, INPUT);
}
// the loop routine runs over and over again forever: процедура цикла выполняется снова и снова навсегда
void loop() {
  // read the input on analog pin 0
  mostureSensorVal = analogRead(mostureSensor); //int sensorValue = analogRead(mostureSensor);
  // print out the value you read
  Serial.println(mostureSensorVal);
 
  if (mostureSensorVal >= 800) //Very soggy soil -  moisture between 800 and 1023 (Очень сырая почва-Влажность от 800 до 1023)
  {
    digitalWrite(led1, HIGH);// LED1 - Green
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    }
  else if (mostureSensorVal >= 500  && mostureSensorVal < 799) //Soggy soil -  moisture between 500 and 799 (Сырая почва-Влажность от 500 до 799)
  {
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);// LED2 - Green
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
  }
  else if (mostureSensorVal >= 100 && mostureSensorVal < 499) //Wet soil - moisture between 100 and 499 (Влажная почва-Влажность от 100 до 499)
  {
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, HIGH);// LED3 - YELLOW
    digitalWrite(led4, LOW);
  }
  else if (mostureSensorVal >= 99 && mostureSensorVal < 0) //Dry soil - moisture between 99-0 (Сухая почва-влажность между 99-0)
  {
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, HIGH);// LED4 - RED
  }
 
  delay(1000);        // delay 1 second between reads
 
}
 
 
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Щас набигут, пджд. 

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

Вы когда код вставляли, там красненькую такую иконку с синенькой надписью code видели?

А так чего ... ошибка с втроке № ХЗ, также в строка №№ XЗ, ХЗ и ХЗ :(((

bizzon
Offline
Зарегистрирован: 29.03.2016

Сейчас прольётся чья-то кровь...:))

Нуидела
Offline
Зарегистрирован: 31.01.2017

условия проверьте

Rustam7
Offline
Зарегистрирован: 28.05.2018
int led1 = 2; // LED1 - Green на PIN2
int led2 = 3; // LED2 - Green на PIN3
int led3 = 4; // LED3 - YELLOW на PIN4
int led4 = 5; // LED4 - RED на PIN5
//initialize variables for sensor pins (инициализация переменных для выводов датчиков)
int mostureSensor = 0; // mosture Sensor на PIN0

//initialize variables to store readings from sensors (инициализация переменных для хранения показаний датчиков)
int mostureSensorVal = 0;
void setup() {
  // Serial Begin so we can see the data from the mosture sensor in our serial input window.поэтому мы можем увидеть данные от датчика mosture в нашем серийном окне входного сигнала.
  Serial.begin(9600);
  // setting the led pins to outputs
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(mostureSensor, INPUT);
}
// the loop routine runs over and over again forever: процедура цикла выполняется снова и снова навсегда
void loop() {
  // read the input on analog pin 0
  mostureSensorVal = analogRead(mostureSensor); 
  // print out the value you read
  Serial.println(mostureSensorVal);

  if (mostureSensorVal >= 800) //Very soggy soil -  moisture between 800 and 1023 (Очень сырая почва-Влажность от 800 до 1023)
  {
    digitalWrite(led1, HIGH);// LED1 - Green
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    }
  else if (mostureSensorVal >= 500  && mostureSensorVal < 799) //Soggy soil -  moisture between 500 and 799 (Сырая почва-Влажность от 500 до 799)
  {
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);// LED2 - Green
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
  }
  else if (mostureSensorVal >= 100 && mostureSensorVal < 499) //Wet soil - moisture between 100 and 499 (Влажная почва-Влажность от 100 до 499)
  {
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, HIGH);// LED3 - YELLOW
    digitalWrite(led4, LOW);
  }
  else if (mostureSensorVal >= 99 && mostureSensorVal < 0) //Dry soil - moisture between 99-0 (Сухая почва-влажность между 99-0)
  {
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, HIGH);// LED4 - RED
  }

  delay(1000);        // delay 1 second between reads

}

 

Rustam7
Offline
Зарегистрирован: 28.05.2018

Говорю ж, новичок))) вставлял как текст, сорян))) Так в каком месте косяк?

 

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

В коде грубых ошибок не вижу , кроме последнего условия. Предположу, что вы просто перепутали пины светиков. что не мудрено, когда переменные названы так неудачно led2 =3 и led3=4 :)

Rustam7
Offline
Зарегистрирован: 28.05.2018

b707 "В коде грубых ошибок не вижу , кроме последнего условия. Предположу, что вы просто перепутали пины светиков. что не мудрено, когда переменные названы так неудачно led2 =3 и led3=4 :)"

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

Нуидела
Offline
Зарегистрирован: 31.01.2017

Попробуйте погасить все светики в сетапе и исправьте последнее условие (ерунда там полная - никогда не выполнится) - 48 строка

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Строка 48, внимательно посмотри на условия.

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

Ну, почему, грубых ошибко достаточно.

1.
Начнём с посленего условия. В строке № 48 записано что-то странное. Никакое ичсло не может быть одновременно и >= 99 и <0. думаю, что 0 и 99 перепутаны местами.

2.
Сравните строки №№ 27 и 34 и скажите, какое из условий окажется верным, если значение равно 799? Ответ никакое - это значение Вы потеряли.

3.
тоже самое со строками №№ 34 и 41 - значение 499 Вы потеряли

Теперь про мелкие ошибки.

4.
Строка № 18 не нужна. Не уверен мешает ли она (думаю, нет), но то, что не помогает - это точно.

5.
в строка №№ 34, 41 и 48 присутствуют лишние условия (неэффективность). Разберу на одном примере - строка 34 (в остальных всё также). Вот скажите, зачем в строке 34 проверяется условие "mostureSensorVal < 799" (даже если мы исправим на <=, чтобы не терять значение). Дле чего его проверять? Если бы mostureSensorVal была >=800, то сработал бы предыдущий if, и сюда бы программа просто не попала. А если она сюда попала, значит mostureSensorVal и так стопудово меньше 800. Так нафига это ещё раз проверять?

По попвду странного поведения светодиодов. Ну, почему странно вела себя при нуле - Вы уже поняли, - это из-за ошибки в строке № 48.

Остальное не так очевдино. Давайте Вы исправите всё, перепроверите подключение, а потом посмотрим. Если будут проблемы, выложите

1) свежий код
2) лог (копипасту) сериал-порта с комментариями после каждой печати "светится такой-то светодиод".

Тогда посмотрим.

Rustam7
Offline
Зарегистрирован: 28.05.2018

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

Rustam7
Offline
Зарегистрирован: 28.05.2018

Ошибки исправил. Все работаеткак надо, спасибо за помощь (подсказку)!

Rustam7
Offline
Зарегистрирован: 28.05.2018

Исправленный код 

int led1 = 2; // LED1 - Green на PIN2
int led2 = 3; // LED2 - Green на PIN3
int led3 = 4; // LED3 - YELLOW на PIN4
int led4 = 5; // LED4 - RED на PIN5
//initialize variables for sensor pins (инициализация переменных для выводов датчиков)
int mostureSensor = 0; // mosture Sensor на PIN0

//initialize variables to store readings from sensors (инициализация переменных для хранения показаний датчиков)
int mostureSensorVal = 0;
void setup() {
  // Serial Begin so we can see the data from the mosture sensor in our serial input window.поэтому мы можем увидеть данные от датчика mosture в нашем серийном окне входного сигнала.
  Serial.begin(9600);
  // setting the led pins to outputs
  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);

}
// the loop routine runs over and over again forever: процедура цикла выполняется снова и снова, всегда
void loop() {
  // read the input on analog pin 0
  mostureSensorVal = analogRead(mostureSensor);
  // print out the value you read
  Serial.println(mostureSensorVal);

  if (mostureSensorVal >= 800) //Very soggy soil -  moisture between 800 and 1023 (Очень сырая почва-Влажность от 800 до 1023)
  {
    digitalWrite(led1, HIGH);// LED1 - Green
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    }
  else if (mostureSensorVal >= 500) //Soggy soil -  moisture between 500 and 799 (Сырая почва-Влажность от 500 до 799)
  {
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);// LED2 - Green
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
  }
  else if (mostureSensorVal >= 100) //Wet soil - moisture between 100 and 499 (Влажная почва-Влажность от 100 до 499)
  {
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, HIGH);// LED3 - YELLOW
    digitalWrite(led4, LOW);
  }
  else if (mostureSensorVal >= 0) //Dry soil - moisture between 99-0 (Сухая почва-влажность между 99-0)
  {
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, HIGH);// LED4 - RED
  }

  delay(1000);        // delay 1 second between reads

 

ВН
Offline
Зарегистрирован: 25.02.2016

последний  if лишний 

поскольку у АЦП нет отрицательных значений, то и для хранения  

разумно использовать не знаковую, а беззнаковую   mostureSensorVal