


Привет! Сегодня соберем небольшой проект с использованием датчика влажности почвы. Он достаточно чувствительный, так что хорошо подойдет чтобы измерить уровень воды в емкости.
Так же сделаем визуализацию в processing программе. И сигнальную лампочку для обозначения опасного уровня воды.
Содержание
Сегодня будем использовать датчик влажности YL-38. Урок по нему уже есть на сайте. Посмотрите его, если уже забыли или пропустили.
Для того, чтобы выполнить этот урок нам понадобиться.
- Ардуино UNO
- Макетная плата
- Перемычки
- Датчик влажности почвы
- Светодиод
- Резистор 220 Ом
- Кабель USB
- Стакан воды
Программа и схема
Соберем схему на макетной плате. Она будет почти такой же, как в прошлый раз. Но используем только один светодиод.



Датчик хорошо реагирует на погружение в воду и изменяет сигнал на контакте AO от 1023 до 0. Соответственно, если значение будет больше 1000, значит датчик не находится в воде. А при приближении к 0 мы будем считать, что стакан заполняется водой.
В программе ардуино будем считывать данные от датчика. Отправлять их в последовательный порт. А программе на processing принимать эти данные и схематично изображать уровень воды в емкости.
Processing программа
Подключим нужные библиотеки для работы с последовательным портом. И создадим необходимые переменные.
import processing.serial.*;
Serial port;
float dataFloat = 0;
В функции setup() Создадим окно программы и инициализируем последовательный порт. Не забудьте посмотреть на каком порту подключилась плата Ардуино. В моем случае, это COM7.
void setup(){
size(600, 600);
background(255);
port = new Serial(this, "COM7", 9600); // порт ардуино
port.bufferUntil('\n');
}
В функции draw() будем рисовать один прямоугольник серого цвета. Он будет обозначать пустой стакан. Он всегда должен быть одного размера и начинаться в одних и тех же координатах. А второй прямоугольник будет отвечать за уровень воды. Его координаты зависят от данных принятых от датчика.
void draw(){
fill(192);
rect(200, 100, 200, 400);
fill(#30ACED);
rect(200, 100+dataFloat, 200, 400-dataFloat);
delay(50);
}
Когда на последовательном порту появляются данные, программа их считывает и передает в функцию draw() для перерисовки прямоугольника.
void serialEvent(Serial port) {
dataFloat = float(port.readStringUntil('\n'));
println( dataFloat );
}



Полный текст программы
import processing.serial.*;
Serial port;
float dataFloat = 0;
void setup(){
size(600, 600);
background(255);
port = new Serial(this, "COM7", 9600);
port.bufferUntil('\n');
}
void draw(){
float r = random(400);
fill(192);
rect(200, 100, 200, 400);
fill(#30ACED);
rect(200, 100+dataFloat, 200, 400-dataFloat);
delay(50);
}
void serialEvent(Serial port) {
dataFloat = float(port.readStringUntil('\n'));
println( dataFloat );
}
Ардуино программа
В программе для Ардуино все еще проще. Мы считываем данные на контакте А0 и записываем их в последовательный порт с переводом строки. Если уровень воды приближается к 0, включаем сигнальный светодиод. Пороговое значение можно подобрать вручную.
int RED = 2;
int val;
void setup(){
Serial.begin(9600);
pinMode(A0, INPUT);
pinMode(RED, OUTPUT);
digitalWrite(RED,LOW);
}
void loop(){
val = map(analogRead(A0), 0, 1023, 0, 400);
Serial.println(val);
if( val <= 400 ){
digitalWrite(RED,HIGH);
} else {
digitalWrite(RED,LOW);
}
delay(50);
}
Не забудем сделать небольшую паузу, чтобы processing программа успела считать данные корректно.
Теперь все готово для эксперимента.






Заключение
Сегодня мы собрали простой проект для слежения за уровнем воды. И простую программу на языке processing для визуализации показаний датчика.