Датчик уровня воды на Arduino
Датчик уровня воды будет использоваться в бане в емкостях для холодной и горячей воды. Устройство расчитано на глубину до 5 метров и имеет точность 0,5 см. Основой является датчик давления MPXV5050 расчитанный на 50кПа. Это эквивалентно водяному столбу высотой 5 метров.
Принцип действия
Обычно датчик монтурют внизу бочки, сверлят отверстие и навинчивают штуцер. Но если не хочется сверлить бочку и возиться с герметизацией, то можно поступить другим способом.
В воду опускается медная трубка маленького диаметра почти до самого дна. Нижний срез открыт, а к верхнему подключается датчик давления. В итоге датчик фиксирует давление водяного столба на нижнем срезе трубы. 1 кПа = 10 см
На самом деле воздух сжимается и вода немного заходит внутрь трубы. Поэтому датчик будет фиксировать давление не по нижнему срезу трубы, а по вровню H1
. Но т.к. мы знаем на сколько увеличилось давление внутри трубы по сравнению с атмосферным, то можно точно вычислить высоту эту поправку. Нужно
- чтобы труба была постоянного сечения
- знать длину трубы
P - измеренное давление внутри турбы.
Pa - изначальное атмосферное давление
Т.к. кол-во воздуха в трубе не меняется, а температуру считаем постоянной, то
Pa * V1 = P * V2
, где
V1 - изначальный обхем воздуха
V2 - объем после погружения
Т.к. сечение (площадь) трубы постоянно, то можно перейти к длинам.
Pa * L1 = P * L2
, где
L1 - длина всей трубы
L2 - длина трубы от сенсора до H1
L2 = (Pa * L)/P
Посчитаем, на сколько сожмется воздух если опустить трубку длиной 1 метр, на глубину 1 метр. Атмосферное давление 100кПа. Давление водяного столба высотой 1 метра равено 10кПа (плюс атмосфера сверху, итого 110 кПа). Получаем:
L2 = (100*1м)/(100 + 10) = 0.9 м
Т.е. вода зайдет на 10 см.
Но хватит теории, давайте к практике.
Подключение MPXV5050 к Arduino
Datasheet
Пины
- 2 - Vcc
- 3 - Gnd
- 4 - Signal
Скетч
double L = 100.0; // длина трубки в см
void setup() {
Serial.begin(9600);
}
void loop() {
double p = analogRead(A0);
// Давление водяного столба в кПа
double h = (p/1024 - 0.04)/0.018; // kPa
// Расчитываем поправку в см
// double l = L - L * 100 / (100 + h);
double l = L * h / (100 + h);
double total = h * 10 + l;
Serial.println(total);
}