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

main.cpp

Committer:
tasnet
Date:
2016-08-24
Revision:
2:7e92aed03424
Parent:
1:4a5586eb1765

File content as of revision 2:7e92aed03424:

#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
    
    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(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()
{
    pc.baud(115200);
    esp.baud(115200);   // change this to the new ESP8266 baudrate if it is changed at any time.    
        
    while(1)
    {
        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];
    }
}