Итак, мне нужен датчик, срабатывающий при движении воды в трубе. Решил переделать для этого списанный водосчетчик. Для этого нужно выкинуть из него механизм подсчета и встроить датчик, реагирующий на изменение магнитного поля, так называемый датчик Холла.
Старый водосчётчик у меня был (и не один), а вот где взять датчик Холла? Порывшись в интернете наткнулся на статью, где такой датчик добывался из старого ненужного "флоповода".
Однако ничего путнего из этого у меня не получилось - выдранный датчик не хотел реагировать на изменение магнитного поля (хотя возможно просто у меня руки кривые).
Дальнейшие поиски вывели меня на датчик, который сможет добыть абсолютно любой, у кого дома есть компьютер - из любого старого компьютерного вентилятора. Снимаем крыльчатку вентилятора и видим датчик.
Выпаиваем датчик и подключаем по такой схеме. Резистор любой в пределах 1-10 Ком. Я использовал резистор номиналом 4.7 Ком который подвернулся под руку.
Если к подключенному по такой схеме датчику поднести магнит мы должны увидеть чёткое изменение сигнала на выходе.
Теперь будем встраивать датчик в корпус водосчётчика. Просто покажу фотографии...
На последнем снимке можно видеть к чему я этот датчик подключаю. Это плата на микроконтроллере из семейства Arduino. Они бывают разные, но в данном случае я использовал плату
Arduino Nano Цена такой платы у китайцев рублей 150. Программируется она элементарно без всякого программатора.
Программу для этой задачи я написал следующую.
code:// ============== код управления проточным нагревателем ====================
// в качестве датчика потока воды используется старый переделанный водосчетчик
int pulse = 0; // цифровое состояние датчика
int sum_pulse = 0; // количество импульсов
unsigned long flash_interval = 0; // таймер времени
const int light_out = 13; // D13 - встроенный светодиод
const int relay_out = 19; // A5 - управление реле
const int sensor_in = 6; // A6 - вход с датчика воды
void setup()
{
Serial.begin(9600);
pinMode(light_out, OUTPUT); // устанавливает A5 как выход
digitalWrite(light_out, LOW); // устанавливаем выход в "0"
pinMode(relay_out, OUTPUT); // устанавливает A5 как выход
digitalWrite(relay_out, LOW); // устанавливаем выход в "0"
}
void loop()
{
// Serial.println(analogRead(sensor_in));
counter_pls ();
if (millis() - flash_interval > 1000L)
{
flash_interval = millis();
Serial.println(sum_pulse);
if (sum_pulse>2) {digitalWrite(relay_out, HIGH); digitalWrite(light_out, HIGH);}
else if (sum_pulse<2) {digitalWrite (relay_out, LOW); digitalWrite (light_out, LOW);}
sum_pulse=0;
}
}
void counter_pls ()
{
if (analogRead(sensor_in)>200 && pulse==0) {pulse=1; sum_pulse=sum_pulse+1;}
else if (analogRead(sensor_in)<100 && pulse==1) {pulse=0; sum_pulse=sum_pulse+1;}
}
Контролер отслеживает наличие хотя бы двух импульсов в секунду на входе (я использовал контакт A6) и в случае их наличия формирует высокий выходной сигнал (контакт A5), к которому через ключевой транзистор я подключил исполнительное силовое реле.
В конечном итоге получилось вот такое чудо.
Фото неважное, т.к. снимал на свой жутко бюджетный смартфон при плохом освещении.