Помогите разобраться
- Войдите на сайт для отправки комментариев
Пнд, 28/05/2018 - 13:55
Решил, на днях, смастерить замер влажности почвы. Нашел подходящий проект, собрал. Использовал Ардуино Уно, вместо датчика влажности земли использовал два гвоздя как электроды, подтянул их к земле через сопротивление в 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
}
Щас набигут, пджд.
Вы когда код вставляли, там красненькую такую иконку с синенькой надписью code видели?
А так чего ... ошибка с втроке № ХЗ, также в строка №№ XЗ, ХЗ и ХЗ :(((
Сейчас прольётся чья-то кровь...:))
условия проверьте
Говорю ж, новичок))) вставлял как текст, сорян))) Так в каком месте косяк?
В коде грубых ошибок не вижу , кроме последнего условия. Предположу, что вы просто перепутали пины светиков. что не мудрено, когда переменные названы так неудачно led2 =3 и led3=4 :)
b707 "В коде грубых ошибок не вижу , кроме последнего условия. Предположу, что вы просто перепутали пины светиков. что не мудрено, когда переменные названы так неудачно led2 =3 и led3=4 :)"
Согласен, название пинов не удачное. Перепроверил наверно уж раз пять, но пины соединены как положено.
Попробуйте погасить все светики в сетапе и исправьте последнее условие (ерунда там полная - никогда не выполнится) - 48 строка
Строка 48, внимательно посмотри на условия.
Ну, почему, грубых ошибко достаточно.
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) лог (копипасту) сериал-порта с комментариями после каждой печати "светится такой-то светодиод".
Тогда посмотрим.
Спасибо, я чего-то так и не смог заметить довольно очевидные ошибки. Всем большое спасибо, исправлю отпишусь.)))
Ошибки исправил. Все работаеткак надо, спасибо за помощь (подсказку)!
Исправленный код
последний
if лишний
поскольку у АЦП нет отрицательных значений, то и для хранения
разумно использовать не знаковую, а беззнаковую
mostureSensorVal