Riešenie vyžaduje vlastný webserver

Monitor výšky hladiny vody v studni - Vyskúšajte online TU!!!


Monitor výšky hladiny vody umožňuje:
  • Snímať výšku hladiny vody od úrovne veka. Vzdialenosť dna môže byť maximálne 4 metre.
  • Výpočtom je možné určiť výšku hladiny vody od dna a pri známej šírke studne (polomer) je možné určiť aj objem v litroch. Na základe výšky možné reprezentovať v metroch, alebo centimetroch.
  • Namerané dáta sú odosielané do MySQL databázy, ktorá ich archivuje s časovou značkou pridania.
  • Dáta sú reprezentované v real-time tabuľke, ktorá je obnovovaná cez AJAX, bez real-time refreshu sú vykreslené aj do grafov. Najnovšie dáta v grafoch sa zobrazia po refreshi.
  • Grafy ukazujú priebeh výšky vody za: posledné 2 hodiny, posledných 24 hodín, posledných 7 dní, 30 dní.
  • Dáta z databázy sú automaticky premazávané po 60+ dňoch.
  • Súčasťou systému sú aj budíkové reprezentácie poslednej hodnoty, maximálnej, minimálnej hodnoty za 24h, 7 dní, 30 dní.
  • Použitý hardvér:
  • Arduino Uno/MegaArduino Uno R3
  • Ethernet shield W5100Ethernet Shield Wiznet W5100
  • alebo Ethernet modul W5500Ethernet Module Wiznet W5500
  • Ultrazvukový senzor vzdialenosti - HC-SR04HC SR 04
  • Systém je možné použiť na ďalšie doplnkové merania aj iných vzdialeností, napríklad: Výška snehu, vzdialenosť objektu a pod.
  • Možné aplikovať aj na platformy ESP8266, ESP32, Raspberry, Micro:bit a iné.
  • Pri Arduine sú dáta cez Ethernet odosielané po HTTP protokole. Pri ESP doskách je možné vytvoriť aj šifrované HTTPS spojenie pre odosielanie dát.
  • Možnosť implementovať aj IoT prenos cez sieť Sigfox.
  • Screenshoty systému:
    HC-SR04 lib: Github

    Arduino + Ethernet Wiznet W5100

    #include <avr\wdt.h>
    #include <SPI.h>
    #include <Ethernet.h>
    #include <NewPing.h>
    #define pinTrigger    3
    #define pinEcho       4
    #define maxVzdialenost 450
    NewPing sonar(pinTrigger, pinEcho, maxVzdialenost);
    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    char server[] = "www.arduino.php5.sk";
    IPAddress ip(192, 168, 1, 101);
    EthernetClient client;
    void setup() {
      Serial.begin(9600);
      if (Ethernet.begin(mac) == 0) {
        Serial.println("Failed to configure Ethernet using DHCP");
        Ethernet.begin(mac, ip);
      }
      wdt_enable(WDTO_8S);
    }
    
    void loop() {
      wdt_reset();
      int vzdialenost = sonar.ping_cm();
      delay(50);
      if (vzdialenost > 0) {
        vzdialenost = 0;
        for (int i = 0; i < 5; i++) {
          vzdialenost += sonar.ping_cm();
          delay(50);
        }
        vzdialenost = vzdialenost / 5;
        Serial.print("Vzdialenost medzi senzorom a predmetom je: ");
        Serial.print(vzdialenost);
        Serial.println(" cm.");
        if (client.connect(server, 80)) {
          String hodnota = String(vzdialenost);
          Serial.println("Pripojenie uspesne na webserver, vykonavam request... ");
          client.print("GET /studna/data.php?hodnota=");
          client.print(hodnota);
          client.println(" HTTP/1.1");
          client.println("Host: www.arduino.php5.sk");
          client.println("Connection: close");
          client.println();
          Serial.println("Data uspesne odoslane na web");
          client.stop();
        } else {
          Serial.println("Pripojenie zlyhalo...");
        }
      }
      else {
        Serial.println("Vzdialenost medzi predmetom a senzorom je mimo rozsah.");
        wdt_reset();
        delay(500);
      }
      for (int i = 0; i <= 300; i++) {
        delay(1000);
        wdt_reset();
      }
    }
    

    ESP8266:

    #include <ESP8266WiFi.h>
    #include <NewPing.h>
    #define pinTrigger    5 //D1
    #define pinEcho       4 //D2
    #define maxVzdialenost 450
    NewPing sonar(pinTrigger, pinEcho, maxVzdialenost);
    
    
    const char * ssid = "wifi_meno"; //meno wifi siete
    const char * password = "wifi_heslo"; //heslo na wifi siet
    const char * host = "www.arduino.php5.sk"; //bez https a bez www
    
    const int httpPort = 80;
    WiFiClient client;
    void setup() {
      Serial.begin(115200);
      WiFi.begin(ssid, password); //pripoj sa na wifi siet s heslom
      while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.print(".");
      }
      Serial.println("");
      Serial.println("Wifi pripojene s IP:");
      Serial.println(WiFi.localIP());
    }
    
    void loop() {
      if (WiFi.status() != WL_CONNECTED) {
        WiFi.begin(ssid, password); //pripoj sa na wifi siet s heslom
      }
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      int vzdialenost = sonar.ping_cm();
      delay(50);
      if (vzdialenost > 0) {
        vzdialenost = 0;
        for (int i = 0; i < 5; i++) {
          vzdialenost += sonar.ping_cm();
          delay(50);
        }
        vzdialenost = vzdialenost / 5;
        Serial.print("Vzdialenost medzi senzorom a predmetom je: ");
        Serial.print(vzdialenost);
        Serial.println(" cm.");
        if (client.connect(host, httpPort)) {
          String hodnota = String(vzdialenost);
          Serial.println("Pripojenie uspesne na webserver, vykonavam request... ");
          String url = "/studna/data.php?hodnota=" + hodnota;
          client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "User-Agent: NodeMCU\r\n" + "Connection: close\r\n\r\n");
          Serial.println("Hodnoty do databazy uspesne odoslane");
          client.stop();
        } else {
          Serial.println("Pripojenie zlyhalo...");
        }
      }
      else {
        Serial.println("Vzdialenost medzi predmetom a senzorom je mimo rozsah.");
        delay(500);
      }
      for (int i = 0; i <= 300; i++) {
        delay(1000);
      }
    }
    

    ESP32

    #include <WiFi.h>
    #include <NewPing.h>
    #define pinTrigger    5 //D1
    #define pinEcho       4 //D2
    #define maxVzdialenost 450
    NewPing sonar(pinTrigger, pinEcho, maxVzdialenost);
    
    
    const char * ssid = "wifi_meno"; //meno wifi siete
    const char * password = "wifi_heslo"; //heslo na wifi siet
    const char * host = "www.arduino.php5.sk"; //bez https a bez www
    
    const int httpPort = 80;
    WiFiClient client;
    void setup() {
      Serial.begin(115200);
      WiFi.begin(ssid, password); //pripoj sa na wifi siet s heslom
      while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.print(".");
      }
      Serial.println("");
      Serial.println("Wifi pripojene s IP:");
      Serial.println(WiFi.localIP());
    }
    
    void loop() {
      if (WiFi.status() != WL_CONNECTED) {
        WiFi.begin(ssid, password); //pripoj sa na wifi siet s heslom
      }
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      int vzdialenost = sonar.ping_cm();
      delay(50);
      if (vzdialenost > 0) {
        vzdialenost = 0;
        for (int i = 0; i < 5; i++) {
          vzdialenost += sonar.ping_cm();
          delay(50);
        }
        vzdialenost = vzdialenost / 5;
        Serial.print("Vzdialenost medzi senzorom a predmetom je: ");
        Serial.print(vzdialenost);
        Serial.println(" cm.");
        if (client.connect(host, httpPort)) {
          String hodnota = String(vzdialenost);
          Serial.println("Pripojenie uspesne na webserver, vykonavam request... ");
          String url = "/studna/data.php?hodnota=" + hodnota;
          client.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "User-Agent: NodeMCU\r\n" + "Connection: close\r\n\r\n");
          Serial.println("Hodnoty do databazy uspesne odoslane");
          client.stop();
        } else {
          Serial.println("Pripojenie zlyhalo...");
        }
      }
      else {
        Serial.println("Vzdialenost medzi predmetom a senzorom je mimo rozsah.");
        delay(500);
      }
      for (int i = 0; i <= 300; i++) {
        delay(1000);
      }
    }
    

    GSM:

    #include <GSM.h<
    #include <NewPing.h<
    #define pinTrigger    3
    #define pinEcho       4
    #define maxVzdialenost 450
    NewPing sonar(pinTrigger, pinEcho, maxVzdialenost);
    // PIN Number
    #define PINNUMBER ""
    
    // APN data
    #define GPRS_APN       "GPRS_APN" // replace your GPRS APN
    #define GPRS_LOGIN     "login"    // replace with your GPRS login
    #define GPRS_PASSWORD  "password" // replace with your GPRS password
    
    GSMClient client;
    GPRS gprs;
    GSM gsmAccess;
    char server[] = "www.arduino.php5.sk";
    int port = 80; // port 80 is the default for HTTP
    
    void setup() {
      // initialize serial communications and wait for port to open:
      Serial.begin(9600);
      Serial.println("Starting Arduino web client.");
    
      boolean notConnected = true;
    
      // After starting the modem with GSM.begin()
      // attach the shield to the GPRS network with the APN, login and password
      while (notConnected) {
        if ((gsmAccess.begin(PINNUMBER) == GSM_READY) &
            (gprs.attachGPRS(GPRS_APN, GPRS_LOGIN, GPRS_PASSWORD) == GPRS_READY)) {
          notConnected = false;
        } else {
          Serial.println("Not connected");
          delay(1000);
        }
      }
    }
    
    void loop() {
      int vzdialenost = sonar.ping_cm();
      delay(50);
      if (vzdialenost > 0) {
        vzdialenost = 0;
        for (int i = 0; i < 5; i++) {
          vzdialenost += sonar.ping_cm();
          delay(50);
        }
        vzdialenost = vzdialenost / 5;
        Serial.print("Vzdialenost medzi senzorom a predmetom je: ");
        Serial.print(vzdialenost);
        Serial.println(" cm.");
      if (client.connect(server, 80)) {
        String hodnota = String(vzdialenost);
        Serial.println("Pripojenie uspesne na webserver, vykonavam request... ");
        client.print("GET /studna/data.php?hodnota=");
        client.print(hodnota);
        client.println(" HTTP/1.1");
        client.println("Host: www.arduino.php5.sk");
        client.println("Connection: close");
        client.println();
        Serial.println("Data uspesne odoslane na web");
        client.stop();
      } else {
        Serial.println("Pripojenie zlyhalo...");
      }
    }