Arduino Ultrasonische Afstands- & Temperatuurmeter met LCD Alarm voor Watertanks
Onderdelen en Benodigdheden
| Arduino UNO | × | 1 |
| Adafruit Standaard LCD 16×2 (wit op blauw) | × | 1 |
| Ultrasonische sensor HC-SR04 | × | 1 |
| DS18B20 1-Wire digitale temperatuursensor (Maxim Integrated) | × | 1 |
| Weerstand 4,75 kΩ (pull-up voor DS18B20) | × | 1 |
| Drukknop 12mm (SparkFun) | × | 1 |
| Potentiometer 10 kΩ (enkelvoudig, voor LCD-contrast) | × | 1 |
| Buzzer (piezo, 8mA) | × | 1 |
| LEDs: Groen, Geel, Rood | × | 3 |
| Weerstanden 221 Ω (voor LEDs) | × | 3 |
| Breadboard | × | 1 |
| Jumper wires | × | 1 set |
Apps en Online Diensten
Over dit Project

Deze monitor geeft me de informatie die ik nodig heb over het waterpeil in een watertank. Het systeem werkt als volgt:
- Groene LED aan: Waterpeil laag (afstand > 40 cm)
- Gele LED aan: Waterpeil medium (afstand 20–40 cm)
- Rode LED knippert + buzzer: Waterpeil hoog (afstand < 20 cm)
De afstand van de sensor tot het wateroppervlak wordt gemeten met de ultrasoon sensor en op de LCD getoond, samen met de temperatuur in de tank (gemeten met de DS18B20).
Dit project is deel 1 van een groter project:
- Deze monitor (afstand + temperatuur + alarm)
- 6 "chasing" LEDs in een cirkel om aan te geven dat de pomp actief is – zie: Projecthub link
- Automatische pompstart bij hoog waterpeil, stop bij laag waterpeil (in ontwikkeling) – gerealiseerd met magnetische contacten
Let op: Voor het echte project gebruik ik een waterdichte ultrasoon sensor; dit verandert niets aan de bedrading of code. Ik weet niet hoe de metingen beïnvloed worden door vocht/condensatie op de sensor, dus deze versie is puur informatief. De pompbesturing (deel 3) wordt gedaan met magnetische contacten.
Code
#include <LiquidCrystal.h> // LCD bibliotheek
#include <OneWire.h> // 1-Wire bibliotheek voor DS18B20
#include <DallasTemperature.h> // Dallas Temperature bibliotheek
#define ONE_WIRE_BUS 6 // Data pin DS18B20 op Arduino pin 6
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal LCD(12, 11, 5, 4, 3, 2); // LCD pennen: RS, E, D4, D5, D6, D7
int trigPin = 9; // Trigger pin HC-SR04
int echoPin = 7; // Echo pin HC-SR04
int myCounter = 0;
float pingTime;
float targetDistance;
float speedOfSound = 776.5; // Snelheid van geluid in miles/uur (originele code)
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); // Gele LED
pinMode(10, OUTPUT); // Rode LED + Buzzer
pinMode(13, OUTPUT); // Groene LED
}
void loop() {
// Trigger puls genereren
digitalWrite(trigPin, LOW);
delayMicroseconds(2000);
digitalWrite(trigPin, HIGH);
delayMicroseconds(15); // 10µs is standaard, 15µs werkt ook
digitalWrite(trigPin, LOW);
delayMicroseconds(10);
// Echo puls meten
pingTime = pulseIn(echoPin, HIGH); // Tijd in microseconden
pingTime = pingTime / 1000000.0; // Naar seconden
pingTime = pingTime / 3600.0; // Naar uren
targetDistance = speedOfSound * pingTime; // Afstand in miles
targetDistance = targetDistance / 2.0; // Heen-en-terug, dus delen door 2
targetDistance = targetDistance * 160934.4; // Miles naar centimeters
// Temperatuur opvragen
sensors.requestTemperatures();
// Afstand tonen op LCD (rij 0, kolom 10)
LCD.setCursor(10, 0);
LCD.print(" "); // Wis vorige waarde
LCD.setCursor(10, 0);
LCD.print((int)(targetDistance + 0.5)); // Afgerond op cm
LCD.print("cm ");
// Tweede rij: waterpeil status + temperatuur
LCD.setCursor(0, 1);
LCD.print(" "); // Wis rij
LCD.setCursor(0, 1);
if (targetDistance > 40) {
LCD.print("LEV LOW ");
LCD.print(sensors.getTempCByIndex(0));
LCD.print((char)223); // Graad-teken
LCD.print("C");
} else if (targetDistance < 40 && targetDistance > 20) {
LCD.print("LEV MED ");
LCD.print(sensors.getTempCByIndex(0));
LCD.print((char)223);
LCD.print("C");
} else { // targetDistance < 20
LCD.print("LEV HIGH ");
LCD.print(sensors.getTempCByIndex(0));
LCD.print((char)223);
LCD.print("C");
}
delay(2000); // Update-interval
// LED & Buzzer besturing
if (targetDistance > 40) {
digitalWrite(13, HIGH); // Groen aan
} else {
digitalWrite(13, LOW);
}
if (targetDistance < 40 && targetDistance > 20) {
digitalWrite(8, HIGH); // Geel aan
} else {
digitalWrite(8, LOW);
}
if (targetDistance < 20) {
digitalWrite(10, HIGH); // Rood aan
delay(2000);
digitalWrite(10, LOW); // Rood uit (knippert effect)
} else {
digitalWrite(10, LOW);
}
}
Opmerking: De originele code gebruikte speedOfSound = 776.5 (miles/uur) en een omrekenfactor naar cm. Dit werkt, maar is onconventioneel. Standaarder is om de geluidssnelheid in cm/µs te gebruiken (0.0343 cm/µs bij 20°C) en de berekening te vereenvoudigen tot: targetDistance = pingTime * 0.01715 (pingTime in µs, resultaat in cm). De bovenstaande code is functioneel equivalent maar behoudt de originele logica.
Schema's
Fritzing-bestand: lcd_pot_led_buzz_pb_distsens_temp_EHVdF6S1L7.fzz (bijgevoegd in originele project)
Productieproces
- Geïntegreerde QR, RFID en Temperatuurverificatie Toegangscontrolesysteem
- Meerdere DS18B20 1-Wire Sensoren Aan Een Raspberry Pi Koppelen Voor Nauwkeurige Temperatuurmonitoring
- Een externe temperatuursensor bouwen met Raspberry Pi en Python – Stap-voor-stap handleiding
- Een Multi-sensor Temperatuur- & Lichtmonitoringssysteem Bouwen met Raspberry Pi & DS18B20
- Een geautomatiseerd aeroponisch systeem bouwen met Raspberry Pi en vochtigheidssensor
- Een Raspberry Pi thuistemperatuurmonitor bouwen met MCP9808, InfluxDB & Grafana
- Integreren van een thermocouple-sensor met de Arduino Portenta H7 via de MAX6675 IC
- DHT11 Temperatuur- & Vochtigheidsensor Project met LED-indicatoren en Piezo-luidspreker
- Meerpositie-temperatuursensorsysteem voor slimme thuisintegratie
- Bouw een betrouwbare wekker met DS1302 RTC en Arduino UNO
- NASA Goddard's Lab-on-Chip sensor levert realtime stroom- en temperatuurmonitoring