Měření aktuálního objemu vody v nádrži

Měření aktuálního objemu vody v nádrži

V tomto článku si ukážeme, jak lze řešit měření výšky hladiny vody v nádrži (např. zásobník dešťové vody). Hodnoty si budeme přepočítávat na objem v litrech.

Hardware

Ultrazvukový voděodolný senzor vzdálenosti JSN-SR04T

Pi-Home - pokud nemáte, viz sekci Jak na to

Software

OpenHAB

Aplikace

Tento senzor se skládá ze dvou částí, elektronické desky a voděodolného senzoru. Elektronickou část je tedy nutné uložit také do voděodolného pouzdra. Senzor pracuje na základě akustických vln. Více o funkci naleznete například zde: https://wiki.eprolabs.com/index.php?title=Ultrasonic_Sensor_SRF-04. Senzor dokáže měřit od cca 20 cm do 450 cm v úhlu cca 45 °. Je proto nutné, aby v blízkosti senzoru a také po stranách nebyly překážky, kde by mohlo dojít k rušení. Ideální je mít vlastní senzor v plastové trubce a umístit jej cca 25 cm nad maximem vodní hladiny doprostřed nádrže.

Senzor hladiny vodni nadrze

Postup

Senzor osadíme do libovolné trubky. Hlava senzoru má průměr 25 mm, případně lze zvolit trubku s větším vnitřním průměrem a vypolstrovat, aby v ní senzor držel. Kabel pak vede do elektronické desky. Naše krabička je osazena těsnicí průchodkou pro UTP kabel. Zapojte čtyři libovolné žíly dle toho, jak to vypadá v zapojení na desce Arduina dle sketche. Do Arduina nahrajeme sketch, který bude odečítávat hodnoty vzdálenosti. Dále je zde přepočet na objem nádrže a frekvence odečtu hodnoty. Zaměřte se a editujte tuto část sketche dle vaší nádrže. Kód je samozřejmě možné kombinovat a na jednom Arduinu sbírat hodnoty vzdálenosti, teplot, pir a dalších užitečných senzorů.

Výpočet objedmu nádrže dešťové vody

Celý sketch:

/*
Script to read volume of liquid medium in water tank

- connect to MQTT server
- publishes "Hello world - Arduino XYZ" to the topic
- read sensor value, calculate volume and filter results
- multiple arduino's with same generic sketch can run parallel to each other
- multiple arduino's need each to have a unique ip-addres, unique mac address and unique MQTT client-ID
- tested on arduino-mega with W5100 ethernet shield

*/


//MQTT
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
//Tank level
#include <NewPing.h>
#include <MedianFilter.h>
#include <Wire.h>

//Tank Level
#define TRIGGER_PIN 3
#define ECHO_PIN 4
#define MAX_DISTANCE 200 // (in centimeters). Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
MedianFilter filter(31,0);

//Time variable
unsigned long time_now = 0;

//Char strings for MQTT
char tankDV[10];


//---------------------------------------------------------------------------

// Arduino MAC address must be unique for every node in same network
byte mac[] = { 0xCC, 0xFA, 0x00, 0x1B, 0x19, 0x77 };

// Unique static IP address of Arduino
IPAddress ip(192,168,4,101);

// IP Address of your MQTT broker (OpenHAB server)
byte server[] = { 192,168,4,30 };

// Handle and convert incoming MQTT messages ----------------------------------------
void callback(char* topic, byte * payload, unsigned int length) {

}

// Initiate instances -----------------------------------
EthernetClient arduino_XYZ;
PubSubClient client(server, 1883, callback, arduino_XYZ);
//-------------------------------------------------------


void setup()
{


// Setup ethernet connection to MQTT broker
Ethernet.begin(mac, ip);
if (client.connect("arduino_XYZ", "openhabian", "openhabian")) { // change as desired - clientname must be unique for MQTT broker
client.publish("sensors","Hello world - here Arduino XYZ with IP 192.168.4.101");
}
}


//-----------------------------------------------
long lastReconnectAttempt = 0;

boolean reconnect() {
if (client.connect("arduino_XYZ", "openhabian", "openhabian")) {
// Once connected, publish an announcement...
client.publish("sensors","Arduino XYZ - reconnected");
// ... and resubscribe
client.subscribe("sensors");
}
return client.connected();
}
//----------------------------------------------

void loop()
{

if (!client.connected()) {
long now = millis();
if (now - lastReconnectAttempt > 5000) {
lastReconnectAttempt = now;
// Attempt to reconnect
if (reconnect()) {
lastReconnectAttempt = 0;
}
}
} else {
// Client connected

client.loop();
}

// Collect sensor data every 30 seconds. Change value 30000 ms to another if you want
if(millis() >= time_now + 30000){
time_now += 30000;

//============TANK LEVEL SENSOR============================
unsigned int otank1,uStank1 = sonar.ping(); // Send ping, get ping time in microseconds (uStank1).
filter.in(uStank1);
otank1 = filter.out();
//Calculate volume in litres (add values in centimeters): ((sensor height from bottom - sensor value) * pi * r2)/1000
float cmtank1 = ((160-(otank1 / US_ROUNDTRIP_CM))*3.14*6400)/1000;
//Filter value - we should get only values between maximum volume of tank and minimum volume
if ((cmtank1 <=2700) && (cmtank1 >= 50)){
dtostrf(cmtank1,3, 0, tankDV);
client.publish("tank/dv", tankDV);
}
}
delay(1000);

}

// End of sketch ---------------------------------

 

OpenHAB

Hodnoty lehce dostaneme do OpenHAB vytvořením položky v items. Například soubor water.items by vypadal takto

/*Tank Level Dešťovka*/
/*Hodnota 2600 L je teoreteická vypočtená hodnota maxima plné nádrže. Změnte si dle potřeby.*/
Number Tank_RainWater "Objem vody v nádrži [ %.0f L / 2600 L]" <water> (Senzory) {mqtt="<[mosquitto:tank/dv:state:default]"}

V Rules části se pak můžete vyřádit co s hodnotou objemu dělat, například:

  • je-li nižší než 300, doplnit vodu z řádu
  • je-li vyšší než 2500, přečerpat do další nádrže
  • je-li nižší než 1000, nepoužívat k zálevce atd. atd.

Co dál?

Pomocí persistance v OpenHAB můžete ukládat hodnoty odečtu do databáze a hodnoty pak v HABpanelu zobrazit v grafu.  Na to je nejlepším nástrojem Grafana. Může to pak vypadat nějak takto.

Historie objemu vody v nádrži

Můžete také zobrazovat dynamické ikonky naplněnosti nádrže. Obrázky k SVG co používám, volně ke stažení níže. Takto nějak to vypadá.

Stav vodní hladiny nádrže

Package iconicons_tankwater.zip

Hodnotit článek:

4
Average: 4 (1 vote)

Přidat komentář:

Komentáře

Your profile picture

Dekuji za navod. Presne tohle jsem pred nedavnem resil.

Patrik

Přidat komentář

Nejlépe hodnocené příspěvky

Centrální tablet pro chytrý dům
Centrální tablet pro ovládání chytrého domuHodnocení: 
80%

Centrální tablet nebo starší smartphone se perfektně hodí jako centrální ukazatel informací o stavu v domě a také k jeho ovládání. Zpravidla nahrazuje videovrátného a můžete si na něm pustit například oblíbenou hudbu při vaření nebo číst recepty. V článku popíšeme funkční příklad takového "wall" tabletu a jeho nastavení v tzv. kiosk módu, aby nesvítíl po nocích a reagoval jenom když je někdo poblíž.

Persistent linux live USB
Vytvoření persistent live USB LinuxuHodnocení: 
0%

Většina distribucí linuxu existuje v "live" provedení, tz. že po rozbalení jej můžete používat přímo z flash disku nebe externiho SSD. Po uložení práce se vám ale klasická live distribuce znovu uvede to výchozího nastavení. Toto řeší tzv. persistent live instalace. Ukážeme si jak jej vytvořit na Linuxu nebo Windows.

Jabltron propojení s chytrou domácností
Propojení Jablotronu s OpenHABHodnocení: 
0%

V tomto článku si představíme užitečný "binding" pro OpenHAB hlavně v tuzemských instalacích kde je hodně zastoupen alarm od firmy Jablotron. Propojení alarmu s chytrou domácností nám umožní reagovat na stav zakódování/odkodování domu. Typicky při zákodování domu zhasnout všechna světla, zavřít přívod vody, vypnout cirkulaci TUV, vypnout spínáne zásuvky a cokoliv dalšího co nepotřebujete v provozu nejste-li doma.

Thunderbird vs Exchange email and calendar
Thunderbird vs MS ExchangeHodnocení: 
0%

V tomto článku si ukážeme jak provozovat firemní poštu a kalendář postavenou na MS Exchange 20xx s Thunderbirdem na jakḱoliv distribuci Linuxu. Používám toto řešení k spokojenosti přes 8 let od verze Exchange 2013 - 2016 - 2019.

Arduino PIR - možnost deaktivace, časovač a denní doba
Pokročilé nastavení PIR čidel pro řízení světel v OpenHABHodnocení: 
100%

PIR čidlo HC-SR501 obsahuje mechanické nastavení dosahu záběru a délky sepnutí. V inteligentním domě ale chceme mít možnost variabilně parametry PIR měnit. Ukážeme jak PIR čidlo nastavit tak, aby šlo v aplikaci nebo vypínačem deaktivovat a volitelně nastavovat délku svícení.

Konfigurace OpenVPN na MikroTiku
OpenVPN na routerech MikroTikHodnocení: 
90%

Máte-li doma smart-home, NAS atp., je dobré myslet na bezpečný přístup do vaší sítě zvenku. Zde bych aktuálně volil komerční router jako Turris, nebo levnější variantu routerů MikroTik. V tomto článku ukážeme postup, jak si zřídit zabezpečený přístup do domácí sítě z venku jak z počítače tak z mobilu pomocí OpenVPN na routerech MikroTik.

Nastavení OpenVPN v iOS
Nastavení OpenVPN připojení v iOSHodnocení: 
100%

V tomto článku najdete podrobný návod, jak se připojit k OpenVPN v iOS.

Nastavení OpenVPN na Androidu
Nastavení OpenVPN připojení v AndroiduHodnocení: 
100%

V tomto článku najdete podrobný návod, jak se připojit k OpenVPN na Androidu.