Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Монитор уровня и температуры воды на Arduino: ультразвук, LCD и тревога

Компоненты и материалы

Arduino UNO×1
LCD 16×2 (белый на синем)×1
Ультразвуковой датчик HC-SR04×1
Цифровой термометр DS18B20 (1-Wire)×1
Резистор 4.75 кОм (подтяжка для DS18B20)×1
Тактовая кнопка 12 мм×1
Потенциометр 10 кОм (контраст LCD)×1
Пьезоизлучатель (buzzer, 8 мА)×1
Светодиоды: зеленый, желтый, красный×1 каждого
Резисторы 221 Ом (для LED)×3
Беспаечная макетная плата×1
Провода-перемычки×1 комплект

Приложения

О проекте

Монитор уровня и температуры воды на Arduino: ультразвук, LCD и тревога

Проект показывает уровень воды в баке и температуру. Ультразвуковой датчик измеряет расстояние до поверхности воды, DS18B20 — температуру в баке. На LCD выводятся расстояние и температура. Три светодиода индицируют уровень: зеленый — низкий (>40 см), желтый — средний (20–40 см), красный мигает + buzzer — высокий (<20 см).

Это часть крупного проекта: вторая часть — 6 бегущих LED в кольце для индикации работы насоса, третья — автоматический запуск/остановка насоса по магнитным контактам (в разработке). Для реальной установки используется водонепроницаемый ультразвуковой датчик — код и схема не меняются. Показания при высокой влажности могут дрейфовать, поэтому этот блок — только информационный, управление насосом — отдельно.

Программный код

#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 6

OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

LiquidCrystal LCD(12, 11, 5, 4, 3, 2);

int trigPin = 9;
int echoPin = 7;
int myCounter = 0;
float pingTime;
float targetDistance;
float speedOfSound = 776.5; // миль/ч (в коде используется для расчета в см)

void setup() {
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  LCD.begin(16, 2);
  LCD.setCursor(0, 0);
  LCD.print("Distance:");
  sensors.begin();
  pinMode(8, OUTPUT);  // Желтый LED
  pinMode(10, OUTPUT); // Красный LED + buzzer
  pinMode(13, OUTPUT); // Зеленый LED
}

void loop() {
  // Измерение расстояния
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2000);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(15);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(10);
  pingTime = pulseIn(echoPin, HIGH); // мкс
  pingTime = pingTime / 1000000.0;   // секунды
  pingTime = pingTime / 3600.0;      // часы
  targetDistance = speedOfSound * pingTime; // мили
  targetDistance = targetDistance / 2.0;    // туда-обратно
  targetDistance = targetDistance * 160934.4; // мили → см

  // Температура
  sensors.requestTemperatures();

  // Вывод на LCD
  LCD.setCursor(10, 0);
  LCD.print("    "); // очистка
  LCD.setCursor(10, 0);
  LCD.print((int)(targetDistance + 0.5));
  LCD.print("cm ");

  LCD.setCursor(0, 1);
  LCD.print("                "); // очистка строки
  LCD.setCursor(0, 1);

  if (targetDistance > 40) {
    LCD.print("LEV LOW ");
    LCD.print(sensors.getTempCByIndex(0));
    LCD.print((char)223);
    LCD.print("C");
  } else if (targetDistance > 20) { // 20-40 см
    LCD.print("LEV MED ");
    LCD.print(sensors.getTempCByIndex(0));
    LCD.print((char)223);
    LCD.print("C");
  } else { // < 20 см
    LCD.print("LEV HIGH ");
    LCD.print(sensors.getTempCByIndex(0));
    LCD.print((char)223);
    LCD.print("C");
  }

  delay(2000);

  // Управление индикаторами
  if (targetDistance > 40) {
    digitalWrite(13, HIGH); // Зеленый
  } else {
    digitalWrite(13, LOW);
  }

  if (targetDistance > 20 && targetDistance <= 40) {
    digitalWrite(8, HIGH); // Желтый
  } else {
    digitalWrite(8, LOW);
  }

  if (targetDistance < 20) {
    digitalWrite(10, HIGH); // Красный + buzzer
    delay(2000);
    digitalWrite(10, LOW);
  } else {
    digitalWrite(10, LOW);
  }
}
Примечание: В оригинале формула скорости звука в милях/ч с последующим переводом в см работает, но неочевидна. Стандартный расчет: distance = pulseIn * 0.01715 (см). Используйте тот вариант, который понятнее.

Схемы

Файл схемы для Fritzing: lcd_pot_led_buzz_pb_distsens_temp_EHVdF6S1L7.fzz

Производственный процесс

  1. Интегрированная система контроля доступа с QR, RFID и верификацией температуры
  2. Подключение нескольких DS18B20 1-Wire датчиков к Raspberry Pi для точного мониторинга температуры
  3. Создание удалённого датчика температуры на Raspberry Pi и Python — пошаговое руководство
  4. Создание многодатчиковой системы мониторинга температуры и света с Raspberry Pi и DS18B20
  5. Создайте автоматизированную аэропоническую систему с Raspberry Pi и датчиком влажности
  6. Создайте домашний монитор температуры на Raspberry Pi с MCP9808, InfluxDB и Grafana
  7. Интеграция термопары с Arduino Portenta H7 через MAX6675
  8. Проект с датчиком DHT11: индикация температуры светодиодами и пьезо-динамиком на Arduino
  9. Надёжные будильник на DS1302 RTC и Arduino UNO — сборка и код
  10. Лабораторный чип NASA Goddard обеспечивает мониторинг потока и температуры в реальном времени