Индикатор уровня воды c помощью arduino nano

Модуль ультразвукового датчика

Его внешний вид представлен на следующем рисунке.

Ультразвуковой датчик HC-SR04 используется для измерения расстояний в диапазоне 2-400 см с точностью 3 мм. Модуль датчика состоит из ультразвукового передатчика, приемника и схемы управления. Принцип действия датчика показан на следующих диаграммах. Более подробно о работе данного датчика можно прочитать в статье про измерение расстояния с помощью Arduino.

Для того чтобы датчик начал работу на него необходимо подать импульс длительностью 10 мкс. После этого датчик автоматически излучает 8 импульсов с частотой 40 кГц и затем проверяет вернулись ли они обратно (эхо). Если отраженные импульсы вернулись, то они принимаются приемником. После этого расстояние до препятствия можно рассчитать по формуле:

Distance= (time x speed)/2.

Произведение времени и скорости в этой формуле делится на 2 потому что общее время распространения звуковой волны в нашем случае состоит из времени когда она распространялась до препятствия и возвращалась обратно.

Пример для Espruino

В качестве мозга для считывания показаний с датчика рассмотрим платформы из серии Espruino, например, Iskra JS.

Схема устройства

  1. Подключите измерительный pH-щуп к плате обработки сигнала.
  2. Выберите один из вариантов коммуникации:
    1. Подключите датчик кислотности жидкости к аналоговому пину платформы Iskra JS. Для коммуникации понадобятся соединительные провода «мама-папа».
    2. Для быстрой сборки и отладки устройства возьмите плату расширения Troyka Shield, которая одевается сверху на Iskra JS методом бутерброда. Для коммуникации используйте трёхпроводной шлейф «мама-мама», который идёт в комплекте с датчиком.
    3. С Troyka Slot Shield провода не понадобятся вовсе.

Исходный код

Прошейте платформу Iskra JS скриптом, приведённым ниже.

troyka-ph-sensor-example-espruino-read-data.js
// Коэффициент смещения нуля
var zeroShift = 1.1;
// Коэффициент для вычисления pH
var calibrationFactor = 3.5;
// Назначаем пин для подключения датчика
var pinSensor = A0;
 
// Выводим показания датчика каждую секунду
setInterval(function() {
  // Считываем аналоговое значение с датчика кислотности жидкости
  var adcSensor = analogRead(pinSensor);
  // Переводим данные сенсора в напряжение
  var voltageSensor = adcSensor * 3.3;
  // Конвертируем напряжение в концентрацию pH
  var pHSensor = (voltageSensor + zeroShift) * calibrationFactor;
  // Выводим данные в консоль
  print('Voltage:', voltageSensor.toFixed(2), 'V', 'Value:', pHSensor.toFixed(2), 'pH');
}, 1000);

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

Пример для Raspberry Pi

В качестве мозга для считывания показаний с датчика рассмотрим одноплатные компьютеры Raspberry Pi, например, Raspberry Pi 4.

Схема устройства

К сожалению в компьютере Raspberry Pi нет встроеенного аналого-цифрового преобразователя. Используйте плату расширение Troyka Cap, которое добавит малине аналоговые пины.

  1. Подключите измерительный щуп к датчику солей.
  2. Подключите TDS-датчик к Raspberry Pi через плату расширения Troyka Cap к пину . Для коммуникации используйте трёхпроводной шлейф «мама-мама», который идёт в комплекте с датчиком.
  3. Опустите измерительный щуп в воду.

Исходный код

Запустите на малине скрипт, приведённый ниже.

troyka-tds-sensor-example-raspberry-pi-read-data.py
# библиотека для работы со временем и задержками
import time
# библиотека для работы с расширителем портов GPIO Expander на плате Troyka Cap
import gpioexp
# создаём объект для работы с расширителем портов
exp = gpioexp.gpioexp()
 
# пин к которому подключен TDS-датчик
# любой GPIO пин платы расширения Troyka Cap
pinSensor = 3
 
while True:
    # считываем состояние датчика влажности почвы
    valueSensor = exp.analogRead(pinSensor)
    # переводим данные с датчика в напряжение
    voltageSensor = valueSensor * 3.3
    # конвертируем напряжение в концентрацию
    tdsSensor = (133.42 * pow(voltageSensor, 3) - 255.86 * pow(voltageSensor, 2) + 857.39 * voltageSensor) * 0.5;
    # выводим показания датчика
    print('Value sensor: ', round(tdsSensor), ' ppm')
    # ждём 100 мс
    time.sleep(0.1)

После загрузки скрипта, в консоль малины будут выводиться текущие показания примиссей воды в .

Исходный код

irrigator.ino
// Подключаем библиотеку для работы с дисплеем
#include "QuadDisplay2.h"
// даём разумное для пина, к которому подключена помпа
#define POMP_PIN        4
// даём разумное для пина, к которому подключён датчик влажности почвы
#define HUMIDITY_PIN    A0
// минимальный порог влажности почвы
#define HUMIDITY_MIN    200
// максимальный порог влажности почвы
#define HUMIDITY_MAX    700
// интервал между проверкой на полив растения
#define INTERVAL        60000 * 3   
// переменная для хранения показания влажности почвы
unsigned int humidity = ;
 
// статическая переменная для хранения времени
unsigned long waitTime = ;
 
// создаём объект класса QuadDisplay и передаём номер пина CS
QuadDisplay qd(9);
 
void setup(void)
{
  // начало работы с дисплеем
  qd.begin();
  // пин помпы в режим выхода
  pinMode(POMP_PIN, OUTPUT);
  // выводим 0 на дисплей
  qd.displayInt();
}
 
void loop(void)
{
  // считываем текущее показания датчика влажности почвы
  int humidityNow = analogRead(HUMIDITY_PIN);
  // если показания текущей влажности почвы
  // не равняется предыдущему запросу 
  if(humidityNow != humidity) {
    // сохраняем текущие показания влажности
    humidity= humidityNow;
    // и выводим показания влажности на дисплей
    qd.displayInt(humidityNow);
  }
  // если прошёл заданный интервал времени
  // и значения датчика влажности меньше допустимой границы
  if ((waitTime ==  || millis() - waitTime > INTERVAL) && humidity < HUMIDITY_MIN ) {
    // включаем помпу
    digitalWrite(POMP_PIN, HIGH);
    // ждём 2 секунды
    delay(2000);
    // выключаем помпу
    digitalWrite(POMP_PIN, LOW);
    // приравниваем переменной waitTime
    // значение текущего времени плюс 3 минуты 
    waitTime = millis();
  }
}

Исходный код программы (скетча)

Arduino

/*
YF‐ S201 Water Flow Sensor
Water Flow Sensor output processed to read in litres/hour
Adaptation Courtesy: hobbytronics.co.uk
*/
volatile int flow_frequency; // с помощью этой переменной мы будем подсчитывать импульсы от датчика расходы воды
// Calculated litres/hour
float vol = 0.0,l_minute;
unsigned char flowsensor = 2; // Sensor Input
unsigned long currentTime;
unsigned long cloopTime;
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 9);
void flow () // функция обработки прерывания
{
flow_frequency++;
}
void setup()
{
pinMode(flowsensor, INPUT);
digitalWrite(flowsensor, HIGH); // Optional Internal Pull-Up
Serial.begin(9600);
lcd.begin(16, 2);
attachInterrupt(digitalPinToInterrupt(flowsensor), flow, RISING); // Setup Interrupt
lcd.clear();
lcd.setCursor(0,0);
lcd.print(«Water Flow Meter»);
lcd.setCursor(0,1);
lcd.print(«Circuit Digest»);
currentTime = millis();
cloopTime = currentTime;
}
void loop ()
{
currentTime = millis();
// каждую секунду рассчитываем и выводим на экран ЖК дисплея скорость потока воды в литрах в минуту
if(currentTime >= (cloopTime + 1000))
{
cloopTime = currentTime; // Updates cloopTime
if(flow_frequency != 0){
// Pulse frequency (Hz) = 7.5Q, Q is flow rate in L/min.
l_minute = (flow_frequency / 7.5); // (Pulse frequency x 60 min) / 7.5Q = flowrate in L/hour
lcd.clear();
lcd.setCursor(0,0);
lcd.print(«Rate: «);
lcd.print(l_minute);
lcd.print(» L/M»);
l_minute = l_minute/60;
lcd.setCursor(0,1);
vol = vol +l_minute;
lcd.print(«Vol:»);
lcd.print(vol);
lcd.print(» L»);
flow_frequency = 0; // сбрасываем счетчик
Serial.print(l_minute, DEC); // Print litres/hour
Serial.println(» L/Sec»);
}
else {
Serial.println(» flow rate = 0 «);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(«Rate: «);
lcd.print( flow_frequency );
lcd.print(» L/M»);
lcd.setCursor(0,1);
lcd.print(«Vol:»);
lcd.print(vol);
lcd.print(» L»);
}
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71

/*
YF‐ S201 Water Flow Sensor
Water Flow Sensor output processed to read in litres/hour
Adaptation Courtesy: hobbytronics.co.uk
*/

volatileintflow_frequency;// с помощью этой переменной мы будем подсчитывать импульсы от датчика расходы воды

// Calculated litres/hour

floatvol=0.0,l_minute;

unsignedcharflowsensor=2;// Sensor Input

unsignedlongcurrentTime;

unsignedlongcloopTime;

#include <LiquidCrystal.h>

LiquidCrystallcd(12,11,5,4,3,9);

voidflow()// функция обработки прерывания

{

flow_frequency++;

}

voidsetup()

{

pinMode(flowsensor,INPUT);

digitalWrite(flowsensor,HIGH);// Optional Internal Pull-Up

Serial.begin(9600);

lcd.begin(16,2);

attachInterrupt(digitalPinToInterrupt(flowsensor),flow,RISING);// Setup Interrupt

lcd.clear();

lcd.setCursor(,);

lcd.print(«Water Flow Meter»);

lcd.setCursor(,1);

lcd.print(«Circuit Digest»);

currentTime=millis();

cloopTime=currentTime;

}

voidloop()

{

currentTime=millis();

// каждую секунду рассчитываем и выводим на экран ЖК дисплея скорость потока воды в литрах в минуту

if(currentTime>=(cloopTime+1000))

{

cloopTime=currentTime;// Updates cloopTime

if(flow_frequency!=){

// Pulse frequency (Hz) = 7.5Q, Q is flow rate in L/min.

l_minute=(flow_frequency7.5);// (Pulse frequency x 60 min) / 7.5Q = flowrate in L/hour

lcd.clear();

lcd.setCursor(,);

lcd.print(«Rate: «);

lcd.print(l_minute);

lcd.print(» L/M»);

l_minute=l_minute60;

lcd.setCursor(,1);

vol=vol+l_minute;

lcd.print(«Vol:»);

lcd.print(vol);

lcd.print(» L»);

flow_frequency=;// сбрасываем счетчик

Serial.print(l_minute,DEC);// Print litres/hour

Serial.println(» L/Sec»);

}

else{

Serial.println(» flow rate = 0 «);

lcd.clear();

lcd.setCursor(,);

lcd.print(«Rate: «);

lcd.print(flow_frequency);

lcd.print(» L/M»);

lcd.setCursor(,1);

lcd.print(«Vol:»);

lcd.print(vol);

lcd.print(» L»);

}

}

}

Элементы платы

Измерительные электроды

Для контакта с почвой на датчике расположены два электрода, которые для проведения измерений необходимо воткнуть в измеряемую среду. Но в отличии от резистивного датчика, электроды скрыты под токоизолирующей маской и защищены от коррозии.

Сами электроды представляют из себя обкладки конденсатора, который при изменении влажности почвы меняет свою ёмкость, что приводит к повышению или понижению выходного сигнала датчика.

Операционный усилитель MCP6002

По умолчанию выходной сигнал схемы ёмкостного датчика, обратно пропорционален уровню влажности почвы. Для удобства и совместимости с резистивной моделью сенсора, на плате расположен операционный усилитель, который инвертирует аналоговый сигнал. В итоге на выходе датчика сигнал прямо пропорциональный влажности почвы.

Регулятор напряжения 3V3

Линейный понижающий регулятор напряжения TPS73033DBVR обеспечивает питание микросхемы 555 и других компонентов сенсора. Диапазон входного напряжения от 3,3 до 5 вольт. Выходное напряжение 3,3 В с максимальным выходным током 200 мА.

Troyka-контакты

Датчик подключается к управляющей электронике через три провода.

  • Сигнальный (S) — выходной сигнал сенсора. Напряжение на выходе датчика прямо пропорционально уровню измеренной электропроводности: чем выше влажность почвы, тем выше уровень сигнала на выходе датчика и соответственно наоборот. Максимальное выходное значения 3,3 вольта. Подключите к аналоговому пину микроконтроллера.
  • Питание (V) — соедините с рабочим напряжением микроконтроллера.
  • Земля (G) — соедините с землёй микроконтроллера.

Схемы подключения датчика давления жидкости

Среди множества схем, демонстрирующих работу Arduino с датчиком давления жидкости, была выбрана наиболее простая, использующая минимум радиодеталей. С ее помощью можно проводить измерение глубины погружения или уровня заполнения сосуда водой. Итак, понадобится:

Элемент Наименование/характеристики Количество
Микроконтроллер Arduino Nano/Uno или любой клон 1
Экран Display 2×16 ST7032 1
Датчик MS5803 1
Резистор 10 кОм 2
Конденсатор 0.1 мкФ 1
Кнопка Любая, без фиксации нажатия 1

Библиотека работы с датчиком давления берется здесь: https://github.com/millerlp/MS5803_05

С экраном тут: https://yadi.sk/d/KKJwJ1VtDx9PCw

Принципиальная схема

Кнопка нужна для выбора режима отображения — однократное нажатие переключает вывод абсолютных и относительных данных, с сохранением состояния на последующих опросах датчика.

Скетч

Достаточно простая программа для микроконтроллера, заливаемая в него при помощи Arduino IDE:

#DEFINE fButton_pin 2 #DEFINE LED_pin 13 #DEFINE DISPLAY_height 2 #DEFINE DISPLAY_width 16 #DEFINE DISPLAY_contrast 63 // Подключение библиотек и инициализация датчика вместе с дисплеем #include #include // Wire.h подключать не нужно он уже вызван в TroykaTextLCD.h MS_5803 S = MS_5803(512); TroykaTextLCD DISPLAY; // переменные программы float mmWater = 0; float TechAtmosphere = 0; float dObtainedValue = 0; float ObtainedValue = 0; void setup() // параметры экрана DISPLAY.setContrast(DISPLAY_contrast); DISPLAY.begin(DISPLAY_width, DISPLAY_height); // Установка датчика в 0, FALSE функции блокирует отправку технической информации в консоль S.initializeMS_5803(FALSE); delay(1000); // ждем, пока он выполнит инициализацию // кнопка и светодиод показывающий режимы pinMode(fButton_pin, INPUT_PULLUP); pinMode(LED_pin, OUTPUT); > void loop() // Инициировать сенсор в режим взятия показаний S.readSensor(); DISPLAY.setCursor(0, 0); // получить и высветить значения в верхней строчке экрана ObtainedValue = S.pressure(); DISPLAY.print(ObtainedValue); DISPLAY.print(«mbar «); DISPLAY.print(S.temperature()); DISPLAY.print(«C»); // действия при нажатии кнопки if (!digitalRead(fButton_pin)) // Изменение режима работы светодиода на противоположный digitalWrite(LED_pin, !digitalRead(LED_pin)); dObtainedValue = ObtainedValue; > if (!digitalRead(LED_pin)) // абсолютные значения mmWater = ObtainedValue * 1.019744288922 * 10; TechAtmosphere = ObtainedValue * 0.001019716212978; > else // относительные значения mmWater = ((ObtainedValue — dObtainedValue) * 1.019744288922) * 10; TechAtmosphere = (ObtainedValue — dObtainedValue) * 0.001019716212978; > // отображаем на экране значения в технических атмосферах и см воды DISPLAY.setCursor(0, 1); DISPLAY.print(TechAtmosphere,3); DISPLAY.print(«TA «); DISPLAY.print(mmWater,0); DISPLAY.print(«mm»); delay(1000); DISPLAY.clear(); >

Принцип работы датчика расхода воды

Чтобы объяснить, как работает поток воды, давайте откроем крышку и посмотрим.

Все компоненты YF-402

Принцип работы датчика расхода воды довольно простой. Основными компонентами являются датчик Холла, колесо
турбины и магнит. Вода поступает через входное отверстие и выходит через выходное отверстие. Водяной поток
заставлял колесо вращаться, и магнит на колесе вращался вместе с ним. Вращение магнитного поля запускает датчик
Холла, который выдает прямоугольные волны высокого и низкого уровня (импульс).

На каждый оборот колеса объем протекающей воды составляет определенное количество, как и количество выходных
прямоугольных волн. Следовательно, мы можем рассчитать расход воды, посчитав количество прямоугольных волн
(импульсов).

Изготовление растворов[править | править код]

Раствор изготавливается путем всыпания в тарированную емкость расчетного веса соли с точностью до 0.01 грамма (потребуются соответствующие весы). Наиболее точно процедуру можно выполнять так:

  1. Ставим на весы тару с некоторым количеством соли.
  2. Сбрасываем весы на 0
  3. Сухой мелкой ложечкой или лопаткой берем из тары соль и пересыпаем мелкими порциями в калибровочную тару, весы будут показывать, какое количество соли уже выбрано из тары и продолжаем, пока не будет отвешен точный вес.
  4. Вливаем дистиллированную воду в калибровочную тару до половины объема и тщательно перемешиваем соль
  5. Доводим уровень до метки 1 литр.

Представленные на рынке модели

Датчики Arduino, относящиеся к давлению, делятся согласно средам применения и конструктивным особенностям, непосредственно связанным с получением конечного результата. Есть модели, защищенные от влаги и предназначенные для применения в жидкостях, другие работают только в качестве анероидов атмосферы, иные устанавливаются в разрыв движения потока, четвертые в качестве определителей внутреннего давления наполняющего емкость газа. Их всех объединяет наличие общих интерфейсов подключения к микроконтроллеру и низкое, не более нескольких милливатт (реже Ватт), потребление энергии.

Наименование Питание (V) Точность Разрешение
(hPa)
Диапазон (hPa) Рабочая температура
(°C)
Интерфейсы Примечание
SPI I2C UEXT
Атмосферные
MOD-BMP085 1.8–3.6 0.03 hPa 0.01 300–1100 (от 500 м ниже уровня моря до 9 км. высоты –40..+85 + + Измерение температуры
GY-BMP280 3.3 0.12 hPa 0.0016 300–1100 –40..+85 + + Измерение температуры до +65, с точностью 0.01
MD-PS002 5V ±0.2% –100–+150 –40..+125 + Только не агрессивные среды
Жидкостные
MS5803-02BA 1.8–3.6 20 см жидкости 30–1100
(10–2000)
–40..+85 + +
MS5803-07BA 1.8–3.6 0–7 мбар
(70 м погружения)
–20..+85 + +
Open-Smart 5V G1/4 0-1.2 MPa Hydraulic Pressure Sensor for Non-Corrosive Water 5 1.5 % 1–2.4 мбар (max 3) 0..+85 Собственный коннектор, соединяемый к I2C через резистор, датчик оснащен термометром

Конечно, в приведенном списке числятся далеко не все существующие модели. В нем указаны только те, которые обладают определенной популярностью и затребованы пользователями.

Проект определения уровня воды

Для нашего следующего примера мы собираемся создать портативный датчик уровня воды, который будет зажигать светодиоды в зависимости от уровня воды.

Схема соединений

Мы будем использовать схему из предыдущего примера. Но на этот раз нам нужно просто добавить несколько светодиодов.

Подключите три светодиода к цифровым выводам 2, 3 и 4 через токоограничивающие резисторы 220 Ом.

Соберите схему, как показано ниже:

Рисунок 7 – Индикация уровня воды с помощью светодиодов

Код Arduino

После того, как схема будет собрана, загрузите в Arduino следующий скетч.

В этом скетче объявлены две переменные, а именно lowerThreshold и upperThreshold. Эти переменные представляют наши пороговые уровни.

Всё, что ниже нижнего порога, включает красный светодиод. Всё, что выше верхнего порога, включает зеленый светодиод. Всё, что находится между ними, включает желтый светодиод.

/* Измените эти значения, основываясь на своих значениях калибровки */ int lowerThreshold = 420; int upperThreshold = 520; // Выводы, подключенные к датчику #define sensorPower 7 #define sensorPin A0 // Переменная для хранения значения уровня воды int val = 0; // Объявляем выводы, к которым подключены светодиоды int redLED = 2; int yellowLED = 3; int greenLED = 4; void setup() { Serial.begin(9600); pinMode(sensorPower, OUTPUT); digitalWrite(sensorPower, LOW); // Настроить выводы светодиодов на выход pinMode(redLED, OUTPUT); pinMode(yellowLED, OUTPUT); pinMode(greenLED, OUTPUT); // Изначально выключить все светодиоды digitalWrite(redLED, LOW); digitalWrite(yellowLED, LOW); digitalWrite(greenLED, LOW); } void loop() { int level = readSensor(); if (level == 0) { Serial.println(«Water Level: Empty»); digitalWrite(redLED, LOW); digitalWrite(yellowLED, LOW); digitalWrite(greenLED, LOW); } else if (level > 0 && level <= lowerThreshold) { Serial.println(«Water Level: Low»); digitalWrite(redLED, HIGH); digitalWrite(yellowLED, LOW); digitalWrite(greenLED, LOW); } else if (level > lowerThreshold && level <= upperThreshold) { Serial.println(«Water Level: Medium»); digitalWrite(redLED, LOW); digitalWrite(yellowLED, HIGH); digitalWrite(greenLED, LOW); } else if (level > upperThreshold) { Serial.println(«Water Level: High»); digitalWrite(redLED, LOW); digitalWrite(yellowLED, LOW); digitalWrite(greenLED, HIGH); } delay(1000); } // Данная функция используется для получения показаний int readSensor() { digitalWrite(sensorPower, HIGH); delay(10); val = analogRead(sensorPin); digitalWrite(sensorPower, LOW); return val; }

Оригинал статьи:

How Water Level Sensor Works and Interface it with Arduino

Как собрать датчик протечки своими руками

Для изготовления датчика протечки Arduino нам понадобится:

  • Плата Arduino Uno;
  • плата макетная;
  • USB-кабель;
  • датчик воды самодельный;
  • один светодиод;
  • один резистор на 220 Ом;
  • Провод «папа-папа» и «папа-мама».

Для сборки датчика от протечек воды также понадобится небольшой набор электромонтажного инструмента.

  1. От колодки отрезаем три клеммника. Клеммники делаются из негорючего пластика и служат для соединения проводов металлическими винтовыми зажимами. Контактами нужно соединить гвозди с проводами, а также резистором. Каркасом датчика при этом будет служить корпус клеммника.
  2. Ослабляем контакты, открутив винты, и в крайние клеммники вставляем гвозди и предварительно зачищенные концы проводов.
  3. Остается подготовить контакты проводов для подключения полученного водяного датчика к плате Ардуино. 
  4. Чтобы проверить правильность работы собранного датчика, необходимо собрать электрическую схему со светодиодом, который включается и выключается автоматически после подключения датчика воды к Ардуино.
  5. Собрав схему, подключите плату Arduino к компьютеру и загрузите соответствующий скетч. В конце статьи есть подробная видео инструкция по сборке такого датчика.

Использование датчика протечки

Датчик протечки (он же датчик дождя или датчик воды) может быть выполнен в виде одного или двух модулей:

        

Рассмотрим использование двухмодульного датчика как наиболее универсального. Во-первых, с него можно получить как цифровой, так и аналоговый сигнал, а, во-вторых, так как модули разнесены, проще изолировать от попадания воды все части датчика, которые не рассчитаны на ее попадание.

Итак, датчик состоит из двух модулей:

  • плата, которая рассчитана на попадание на нее капель воды, состоящая из «змейки» непересекающихся между собой токопроводящих дорожек, расположенных на обеих сторонах
  • модуль с микросхемой LM393 (могут также использоваться LM293 и LM193) с «обвязкой», преобразующий сигнал с первого модуля в аналоговый

Для работы модуля необходимо соединить модули двумя проводами, а второй модуль подключить к плате Arduino:

  • контакт VCC модуля к контакту +5 или +3.3 вольта платы Arduino (датчик умеет работать с обоими напряжениями)
  • контакт GND соответственно к контакту GND платы Arduino
  • контакт D0 — к любому свободному цивровому пину
  • контакт A0 — к любому свободному аналоговому пину

Подключение, как видно, очень простое и не требует схемы.

Простейший код работы с датчиком, подключенным к 8 цифровому пину, выглядит так:

Этот код позволяет определить, есть ли вода на поверхности датчика или нет. Самый простой вариант сигнализации — подключить к плате спикер (пищалку) и включать звук при попадании воды на датчик, а при отсутствии — отключать:

Ну и последний вариант: использование аналогового сигнала с датчика.

При отсутствии воды мы будем получать значение 1023, а при наличии — значение будет уменьшаться обратнопропорционально количеству жидкости на датчике. Таким образом, можно не только проверить, есть ли протечка, но также понять, насколько она сильная. Или же контролировать какой-то объект, наличие небольшого количества воды для которого — это нормально, и запускать сигнализацию только при превышении некоторого порогового значения.

Можно проделать интересный эксперимент: запустить код и смочить датчик небольшим количеством воды. Мы увидим, как значение сначала опустится, а потом, по мере испарения воды с датчика, будет возрастать, пока не станет равным 1023.

Ну и самое приятное: такой датчик стоит копейки по сравнению со стоимостью готовых сигнализаций протечки. А при желании его можно легко подключить к умному дому, тогда он сможет отправлять сигнал например вам на почту или в мессенджер, когда вас нет поблизости.

Купить датчик можно тут, тут или тут, а также еще несколько ссылок есть в соответствующем разделе каталога.

Пример работы для Arduino и XOD

В качестве мозга для считывания показаний с датчика рассмотрим платформу из серии Arduino, например, Arduino Uno.

  • Как начать работу с Arduino?

  • Как начать работу с XOD?

Схема устройства

  1. Подключите измерительный pH-щуп к плате обработки сигнала через BNC-разъём.
  2. Выберите один из вариантов коммуникации:
    1. Подключите датчик кислотности с щупом к аналоговому пину платформы Arduino. Для коммуникации понадобятся соединительные провода «мама-папа».
    2. Для быстрой сборки и отладки устройства возьмите плату расширения Troyka Shield, которая одевается сверху на Arduino Uno методом бутерброда. Для коммуникации используйте трёхпроводной шлейф «мама-мама», который идёт в комплекте с датчиком.
    3. С Troyka Slot Shield провода не понадобятся вовсе.

Код для Arduino IDE

Прошейте платформу Arduino скетчем, приведённым ниже.

troyka-ph-sensor-example-arduino-read-data.ino
// Определяем ядро платы Arduino
// для установки рабочего напряжения и
// коэффициента смещения нуля
#if defined(__AVR__)
#define OPERATING_VOLTAGE   5.0
#define ZERO_SHIFT          0
#else
#define OPERATING_VOLTAGE   3.3
#define ZERO_SHIFT          1.1
#endif
 
// Коэффициент перевода напряжения в концентрацию pH
#define CALIBRATION_FACTOR  3.5
 
// Назначаем пин для подключения датчика
constexpr auto pinSensor = A0;
 
void setup() {
  // Открываем Serial-порт
  Serial.begin(9600);
}
 
void loop() {
  // Считываем аналоговое значение с датчика кислотности жидкости
  int adcSensor = analogRead(pinSensor);
  // Переводим данные сенсора в напряжение
  float voltageSensor = adcSensor * OPERATING_VOLTAGE  1023;
  // Конвертируем напряжение в концентрацию pH
  float pHSensor = CALIBRATION_FACTOR * (voltageSensor + ZERO_SHIFT);
  // Выводим данные в Serial-порт
  Serial.print("Voltage: ");
  Serial.print(voltageSensor);
  Serial.print(" V");
  Serial.print("\t");
  Serial.print("Value: ");
  Serial.print(pHSensor);
  Serial.println(" pH");
  delay(1000);
}

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

Измерение влажности почвы с помощью аналогового выхода

Поскольку модуль предоставляет как аналоговый, так и цифровой выходные сигналы, то для нашего первого эксперимента мы будем измерять влажность почвы, считывая аналоговые показания.

Подключение

Давайте подключим наш датчик влажности почвы к плате Arduino.

Сначала вам нужно подать питание на датчик. Для этого вы можете подключить вывод VCC на модуле к выводу 5V на Arduino.

Однако одной из широко известных проблем с этими датчиками является их короткий срок службы при воздействии влажной среды. При постоянной подаче питания на зонд скорость коррозии значительно увеличивается.

Чтобы преодолеть эту проблему, мы рекомендуем не подавать питание на датчик постоянно, а включать его только тогда, когда вы снимаете показания.

Самый простой способ сделать это – подключить вывод VCC к цифровому выводу Arduino и устанавливать на нем высокий или низкий логический уровень, когда это необходимо.

Кроме того, итоговая мощность, потребляемая модулем (оба светодиода горят), составляет около 8 мА, поэтому можно запитать модуль от цифрового вывода на Arduino.

Итак, давайте подключим вывод VCC модуля к цифровому выводу 7 Arduino, а вывод GND модуля к выводу GND Arduino.

И, наконец, подключите вывод AO модуля к выводу A0 аналого-цифрового преобразователя Arduino.

Схема соединений показана на рисунке ниже.

Рисунок 6 – Подключение датчика влажности почвы к Arduino для считывания показаний на аналоговом выходе

Калибровка

Чтобы получить точные показания с датчика влажности почвы, рекомендуется сначала откалибровать его для конкретного типа почвы, которую вы планируете контролировать.

Различные типы почвы могут по-разному влиять на показания датчика, поэтому ваш датчик в зависимости от типа используемой почвы может быть более или менее чувствительным.

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

Чтобы отметить, какие значения выводит ваш датчик, когда почва максимально сухая, и когда она полностью насыщена влагой, воспользуйтесь скетчем, приведенным ниже.

Когда вы запустите этот скетч, вы увидите похожие значения в мониторе последовательного порта:

  • ~ 850, когда почва сухая;
  • ~ 400, когда почва полностью насыщена влагой.

Рисунок 7 – Калибровка датчика влажности почвы

Этот тест может потребовать несколько проб и ошибок. Как только вы получите хороший контроль над этими показаниями, вы сможете использовать их в качестве пороговых значений, если намерены инициировать какое-либо действие.

Финальная сборка

Основываясь на значениях калибровки, программа, приведенная ниже, задает следующие диапазоны для определения состояния почвы:

  • <500 – слишком влажная;
  • 500-750 – это целевой диапазон;
  • >750 – достаточно сухая для полива.

Если все в порядке, вы должны увидеть вывод в мониторе последовательного порта, похожий на приведенный ниже.

Рисунок 8 – Вывод аналоговых показаний датчика влажности почвы

Какие существуют светодиодные ленты для авто

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий