Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Slimme Waterlekdetectie en Kraanbesturingssysteem

Onderdelen en benodigdheden

Onderdeel Aantal
Aluminium behuizing 1
Arduino UNO 1
Arduino Ethernet Shield 2 1
Voeding 1
AC-behuizing 1
Set LEDs met weerstanden 1
Relais (1 dubbel 5V en 1 dubbel 12V) 1
Gemotoriseerde kraan 1
JST-connectors 1
Watersensor 1

Over dit project

Overzicht

Tijdens een gesprek met een vriend realiseerde ik me dat waterlekken een groot probleem zijn. Mijn vriend moest alle meubels in zijn kelder vervangen, omdat een pijp was gebroken terwijl hij op werk was.

Dit project lijkt op de eerdere inzending voor de Microsoft IoT-wedstrijd, maar is gebaseerd op Arduino in plaats van Raspberry Pi. Mijn filosofie is: in plaats van veel verantwoordelijkheden te centraliseren op een groot platform (zoals RasPi, DragonBoard of een pc), geef ik eenvoudige taken aan eenvoudige apparaten (zoals Arduino). Ze voeren hun taak uit en kunnen optioneel via het netwerk verbinden met andere apparaten voor geavanceerde diensten. Bij netwerkstoring blijven ze hun basistaak uitvoeren.

Het systeem monitort waterlekken en activeert acties zoals het sluiten van de hoofdkraan, afhankelijk van de gedetecteerde fout. Daarnaast publiceert het berichten naar een MQTT-broker. Het apparaat beheert water lokaal, maar neemt ook deel aan een groter huisautomatiseringssysteem.

Hoe het eruitziet

Slimme Waterlekdetectie en Kraanbesturingssysteem

De hoofdkraan bevindt zich onderaan. Het eerste apparaat is geïnstalleerd door de stadswatervoorziening om de waterdruk te regelen. Ik heb het bovenste deel geïnstalleerd. De gemotoriseerde kraan (in het blauw) is parallel aan een handmatige kraan geplaatst. In de tekening is de handmatige kraan open en de gemotoriseerde kraan dus overbrugd. Dit is handig bij stroomuitval. In normale modus moet de handmatige kraan dicht zijn.

De kraan bevat een 12V DC-motor die kloksgewijs of tegen de klok in draait, afhankelijk van de polariteit. Er is een terugkoppellus die aangeeft of de kraan open of dicht is. Om hem open te zetten, legt u een positieve spanning aan op de linkerbovenste aansluiting.

De controller

Slimme Waterlekdetectie en Kraanbesturingssysteem

Van links naar rechts: de AC-stekker, een resetknop, status-LED's, connectors (voor sensoren, motor), een Ethernet- en een USB-interface.

  • LED1 (Rood): Brandend = lokaal water gedetecteerd, Knipperend = extern water gedetecteerd, Uit = geen lekkage
  • LED2 (Geel): Brandend = kan motorized valve niet besturen, Knipperend = MQTT-broker onbereikbaar, Uit = alles OK
  • LED3 (Blauw): Brandend = alles OK, Kraan open en monitoring actief, Knipperend = kraan gesloten, Uit = systeem uitgeschakeld of zonder stroom
Slimme Waterlekdetectie en Kraanbesturingssysteem

Hier is een sensor, geplaatst waar waterlekken kunnen optreden.

Slimme Waterlekdetectie en Kraanbesturingssysteem

Hier is wat er onder de motorkap zit.

WAARSCHUWING!

De AC/DC-voeding die ik gebruik heeft twee uitgangen: de eerste is 12V DC voor de gemotoriseerde kraan (gestuurd door twee relais die de motorrichting regelen) en de tweede is precies 5V DC voor de Arduino. Daarom voed ik direct op het 5V-circuit, niet op de Vin-pin die minimaal 6V DC vereist. Zodra de AC/DC-voeding is aangesloten, mag u nooit (ik herhaal: NOOIT) de Arduino DC-jack of USB-kabel aansluiten. Als u toch via USB wilt debuggen, maak dan een eigen kabel zonder de voedingslijnen, behoud alleen de datalijnen. Overigens is de verbinding tussen de AC-behuizing en de AC/DC-voeding 110V. Raak dit nooit aan!

Code

Waterlekdetectie en motorized valve besturing

#include <PubSubClient.h>
#include <Network.h>
#include <Timer.h>
#include <SPI.h>
#include <Ethernet.h>
#include <Dns.h>
#include <avr/wdt.h>

/* Hardware werking:
- Hoofdbox: Arduino Uno met Ethernet shield
- Rode LED: vast bij lokaal water, knipperend bij extern water, uit anders
- Gele LED: vast bij kraanprobleem, knipperend bij MQTT onbereikbaar, uit anders
- Blauwe LED: vast bij kraan open en monitoring, knipperend bij kraan dicht, uit bij systeem down
- Drukknop: activeert selftest
- Dubbel relais voor motorized valve besturing
- Dubbel relais voor uitlezen limietschakelaars op kraan
- Watersensoren (allemaal parallel, alle 3 connectors op frontpaneel parallel)
Motorized valve aansluitingen:
- Geel & Blauw: DC voeding motor
- Zwart: limietschakelaar input (wordt GND in ons circuit)
- Rood: wordt GND bij volledig dicht (geen garantie voor continuïteit na uitgeschakeld)
- Groen: wordt GND bij volledig open (geen garantie voor continuïteit na uitgeschakeld)
*/

// Netwerk
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xCF, 0xFC, 0xEE };
IPAddress ip(192, 168, 12, 215);
IPAddress server(192, 168, 12, 130);
EthernetClient ethClient;
PubSubClient client(ethClient);

#define mqttClientPrefix "GLX"
#define mqttClientLocation "BASEMENT"
#define mqttClientUID "001"
#define mqttClientStatusTopic "Status"
#define mqttClientFaultTopic "Fault"
const int mqttInterval = 20;
int mqttIntervalCnt = 0;
int isConnectedToBroker = -1;

// Pin-out
const int SystemLedPin = A0;
const int FaultLedPin = A1;
const int AlarmLedPin = A2;
const int WaterDetectorPin = 2;
const int ToggleButtonPin = 3;
const int SdCardPin = 4;
const int ValveClosedPin = 5;
const int ValveOpenedPin = 6;
const int ValveControl1 = 8;
const int ValveControl2 = 7;

// Variabelen
int isWaterDetected = 0;
int isWaterDetectedRemotely = 0;
int isValveClosed = -1;
const int valveTimeOut = 15;
int isConnectedToValve = -1;
volatile boolean isResetRequested = 0;
const int mainLoopDelay = 500;
void(* resetFunc) (void) = 0;

void setup() {
  wdt_disable();
  Serial.begin(9600);
  Serial.println(F("Begin of setup"));

  pinMode(SystemLedPin, OUTPUT);
  pinMode(FaultLedPin, OUTPUT);
  pinMode(AlarmLedPin, OUTPUT);
  pinMode(WaterDetectorPin, INPUT);
  pinMode(ToggleButtonPin, INPUT);
  pinMode(ValveOpenedPin, INPUT);
  pinMode(ValveClosedPin, INPUT);
  pinMode(ValveControl1, OUTPUT); digitalWrite(ValveControl1, HIGH);
  pinMode(ValveControl2, OUTPUT); digitalWrite(ValveControl2, HIGH);
  pinMode(SdCardPin, OUTPUT); digitalWrite(SdCardPin, HIGH);

  testLeds();

  client.setServer(server, 1883);
  client.setCallback(MQTTBrokerCallback);
  Ethernet.begin(mac, ip);
  Serial.print(F("Current IP is : "));
  Serial.print(Ethernet.localIP());
  Serial.print(F(" - MQTT broker IP is : "));
  Serial.println(server);

  if (openValve() == 0) {
    Serial.println(F("Valve is open and system is now monitoring"));
    subscribeToRemoteWaterSensors();
  } else {
    Serial.println(F("Unable to open valve, system is out of order. Please use plumbing bypass"));
  }
  enableInterruptOnResetButton();
  delay(1500);
  Serial.println(F("End of setup"));
}

void loop() {
  configureLedsWithInitialStates();

  if (isResetRequested == 1) {
    Serial.println(F("Someone pushed on the button to reset this device"));
    publishStatus();
    wdt_enable(WDTO_1S);
    delay(5000);
    Serial.println(F("this message should never appear"));
  }

  readLocalWaterSensor();
  if (isWaterDetected == 1 || isWaterDetectedRemotely == 1) {
    if (isValveClosed == 0) closeValve();
  }

  if (mqttIntervalCnt == 0) {
    if (isWaterDetected == 1) publishFault();
    publishStatus();
    mqttIntervalCnt = mqttInterval;
  } else {
    if (isConnectedToValve == 0) {
      Serial.println(F("System is out of order - unable to control motorized valve. No monitoring in place"));
    } else {
      Serial.print(F("."));
    }
    mqttIntervalCnt--;
  }

  delay(mainLoopDelay / 2);
  client.loop();
  configureLedsWithFinalStates();
  delay(mainLoopDelay / 2);
}

// Functies voor sensor, knop, kraanbesturing, relais, debouncing, LED's, MQTT
// ... (volledige code in origineel)

MQTT bibliotheek

Indien nodig: PubSubClient bibliotheek

Schema's

Slimme Waterlekdetectie en Kraanbesturingssysteem

Productieproces

  1. Raspberry Pi-sensor- en actuatorbeheersing onder de knie: versnellingsmeter, servo en datastreaming
  2. Geautomatiseerd Zwembadvul- en Monitoringssysteem
  3. Debuggen van het Arduino Portenta H7 Dual-Core-systeem met Segger J-Link
  4. Universele Android-afstandsbediening bouwen met Arduino, 1Sheeld en IR-besturing
  5. Bouw Boeiende LCD Animaties & Games met Arduino UNO
  6. Slimme spaarpot bouwen: Muntenacceptor besturen met Arduino Nano
  7. Arduino Power Control Center: N-FET, P-FET, Relais & RTC Kit
  8. Arduino Audio Frequentie Detector – Meet de luidste geluidspieken met hoge gevoeligheid
  9. Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
  10. Bestuur een Arduino-rover naadloos met Firmata en een Xbox One-controller
  11. Klemkleppen & peristaltische pompen: gouden standaard voor abrasieve kalkslurrysystemen