Ultrasonic water level meter with HC-SR04 ultrasonic sensor, ESP8266 WiFi module and Telnet interface to FHEM

Dependencies:   HC_SR04_Ultrasonic_Library mbed

Fork of Nucleo_UltrasonicHelloWorld by EJ Teb

Files at this revision

API Documentation at this revision

Comitter:
tasnet
Date:
Wed Aug 24 17:01:21 2016 +0000
Parent:
1:4a5586eb1765
Commit message:
Erste lauff?hige Version

Changed in this revision

main.cpp Show annotated file Show diff for this revision Revisions of this file
diff -r 4a5586eb1765 -r 7e92aed03424 main.cpp
--- a/main.cpp	Thu Dec 04 08:04:55 2014 +0000
+++ b/main.cpp	Wed Aug 24 17:01:21 2016 +0000
@@ -1,23 +1,167 @@
 #include "mbed.h"
 #include "ultrasonic.h"
 
+Serial pc(USBTX, USBRX);
+Serial esp(PC_10, PC_11); // tx, rx 
+DigitalOut myled(LED1);
+
+Timer t;
+
+int  count,ended,timeout;
+float globaldist;
+char buf[1024];
+char sendbuf[255];
+char snd[255];
+
+float dist0 =  11.0;                        // Abstand Ultraschallsensor zur vollen Oberfläche [cm]
+float iLeng = 147.0;                        // Länge des Wassertanks [cm]
+float iBrei =  67.0;                        // Breite des Wassertanks [cm]
+float iHoeh = 140.0;                        // Höhe des Wassertanks [cm]
+int maximumRange = 200;                   // Maximum Messbereich 200 cm
+int minimumRange = 0;                     // Minimum Messbereich   0 cm
+unsigned int numsamples = 0, avgsamples=99; // Mittelung über 100 Abstandsmessungen
+int avgsamplesarr[100];
+
+                                          // Volumen Füllstand [l] des vollen Tanks
+float volmax = iLeng * iBrei * iHoeh / 1000.0;
+float volakt;                             // aktueller Füllstand [m3]
+
+void SendCMD(),getreply(),ESPconfig(),ESPsetbaudrate();
+float median(int n, int x[]);
+
  void dist(int distance)
 {
     //put code here to happen when the distance is changed
-    printf("Distance changed to %dmm\r\n", distance);
+    
+    if (numsamples < avgsamples) {
+        avgsamplesarr[numsamples] = distance/10;
+        printf("Distance changed to %dmm\r\n", distance);
+        numsamples++;
+        }
+    
+    /*    
+    globaldist = distance/10; // convert distance from mm to cm
+    printf("Distance changed to %dcm\r\n", globaldist);
+    
+    if ((globaldist<(iHoeh+dist0)) && (globaldist >= dist0)) {
+        // gemessene Entfernung ist kleiner als Abstand zum Boden des Tanks
+        // und gemessene Entfernung ist größer als Überlauf
+        volakt = (iHoeh + dist0 - globaldist) * iLeng * iBrei / 1000.0;
+    } else {
+        volakt = -1;
+    }
+    */    
+    
 }
 
-ultrasonic mu(D8, D9, .1, 1, &dist);    //Set the trigger pin to D8 and the echo pin to D9
+ultrasonic mu(PC_0, PC_1, .1, 1, &dist);    //Set the trigger pin to PC_0 and the echo pin to PC_1
                                         //have updates every .1 seconds and a timeout after 1
                                         //second, and call dist when the distance changes
 
 int main()
 {
-    mu.startUpdates();//start mesuring the distance
+    pc.baud(115200);
+    esp.baud(115200);   // change this to the new ESP8266 baudrate if it is changed at any time.    
+        
     while(1)
     {
-        //Do something else here
-        mu.checkDistance();     //call checkDistance() as much as possible, as this is where
-                                //the class checks if dist needs to be called.
+        mu.startUpdates();//start mesuring the distance
+        while(numsamples<avgsamples)
+        {
+            mu.checkDistance();     //call checkDistance() as much as possible, as this is where
+                                    //the class checks if dist needs to be called.
+            wait(0.01);
+        }
+        //mu.pauseUpdates(); //stop measure
+        
+        globaldist = median(100,avgsamplesarr);
+        pc.printf("Median ist %f\r\n",globaldist);
+        
+        if ((globaldist<(iHoeh+dist0)) && (globaldist >= dist0)) {
+            // gemessene Entfernung ist kleiner als Abstand zum Boden des Tanks
+            // und gemessene Entfernung ist größer als Überlauf
+            volakt = (iHoeh + dist0 - globaldist) * iLeng * iBrei / 1000.0;
+        } else {
+            volakt = -1;
+        }
+        
+        numsamples = 0;
+        
+        strcpy(snd,"AT+CIPSTART=\"TCP\",\"192.168.3.60\",7072\r\n");
+        SendCMD();
+        timeout=2;
+        getreply();
+        pc.printf(buf);
+        
+        //AT+CIPSEND=<length>;
+        //sprintf(buf,"setreading wassertank state %d\r\n",globaldist);
+        sprintf(sendbuf,"setreading wassertank state D:%fcm V:%fm3\r\n\0",globaldist,volakt);
+        
+        sprintf(snd,"AT+CIPSEND=%d\r\n",strlen(sendbuf));
+        //pc.printf(snd);
+        SendCMD();
+        timeout=2;
+        getreply();
+        pc.printf(buf);
+        
+        strcpy(snd,sendbuf);
+        pc.printf(snd);
+        SendCMD();
+        timeout=2;
+        getreply();
+        pc.printf(buf);
+        
+        strcpy(snd,"AT+CIPCLOSE\r\n");
+        SendCMD();
+        timeout=2;
+        getreply();
+        pc.printf(buf);
+        
+        wait(10);
     }
 }
+
+
+void SendCMD()
+{    
+    esp.printf("%s", snd);    
+} 
+
+void getreply()
+{    
+    memset(buf, '\0', sizeof(buf));
+    t.start();
+    ended=0;count=0;
+    while(!ended) {
+        if(esp.readable()) {
+            buf[count] = esp.getc();count++;
+            }
+        if(t.read() > timeout) {
+                ended = 1;t.stop();t.reset();
+            }
+        }   
+}     
+
+float median(int n, int x[]) {
+    float temp;
+    int i, j;
+    // the following two loops sort the array x in ascending order
+    for(i=0; i<n-1; i++) {
+        for(j=i+1; j<n; j++) {
+            if(x[j] < x[i]) {
+                // swap elements
+                temp = x[i];
+                x[i] = x[j];
+                x[j] = temp;
+            }
+        }
+    }
+
+    if(n%2==0) {
+        // if there is an even number of elements, return mean of the two elements in the middle
+        return((x[n/2] + x[n/2 - 1]) / 2.0);
+    } else {
+        // else return the element in the middle
+        return x[n/2];
+    }
+}
\ No newline at end of file