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

Committer:
tasnet
Date:
Wed Aug 24 17:01:21 2016 +0000
Revision:
2:7e92aed03424
Parent:
1:4a5586eb1765
Erste lauff?hige Version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ejteb 0:1704ea055c4f 1 #include "mbed.h"
ejteb 0:1704ea055c4f 2 #include "ultrasonic.h"
ejteb 0:1704ea055c4f 3
tasnet 2:7e92aed03424 4 Serial pc(USBTX, USBRX);
tasnet 2:7e92aed03424 5 Serial esp(PC_10, PC_11); // tx, rx
tasnet 2:7e92aed03424 6 DigitalOut myled(LED1);
tasnet 2:7e92aed03424 7
tasnet 2:7e92aed03424 8 Timer t;
tasnet 2:7e92aed03424 9
tasnet 2:7e92aed03424 10 int count,ended,timeout;
tasnet 2:7e92aed03424 11 float globaldist;
tasnet 2:7e92aed03424 12 char buf[1024];
tasnet 2:7e92aed03424 13 char sendbuf[255];
tasnet 2:7e92aed03424 14 char snd[255];
tasnet 2:7e92aed03424 15
tasnet 2:7e92aed03424 16 float dist0 = 11.0; // Abstand Ultraschallsensor zur vollen Oberfläche [cm]
tasnet 2:7e92aed03424 17 float iLeng = 147.0; // Länge des Wassertanks [cm]
tasnet 2:7e92aed03424 18 float iBrei = 67.0; // Breite des Wassertanks [cm]
tasnet 2:7e92aed03424 19 float iHoeh = 140.0; // Höhe des Wassertanks [cm]
tasnet 2:7e92aed03424 20 int maximumRange = 200; // Maximum Messbereich 200 cm
tasnet 2:7e92aed03424 21 int minimumRange = 0; // Minimum Messbereich 0 cm
tasnet 2:7e92aed03424 22 unsigned int numsamples = 0, avgsamples=99; // Mittelung über 100 Abstandsmessungen
tasnet 2:7e92aed03424 23 int avgsamplesarr[100];
tasnet 2:7e92aed03424 24
tasnet 2:7e92aed03424 25 // Volumen Füllstand [l] des vollen Tanks
tasnet 2:7e92aed03424 26 float volmax = iLeng * iBrei * iHoeh / 1000.0;
tasnet 2:7e92aed03424 27 float volakt; // aktueller Füllstand [m3]
tasnet 2:7e92aed03424 28
tasnet 2:7e92aed03424 29 void SendCMD(),getreply(),ESPconfig(),ESPsetbaudrate();
tasnet 2:7e92aed03424 30 float median(int n, int x[]);
tasnet 2:7e92aed03424 31
ejteb 0:1704ea055c4f 32 void dist(int distance)
ejteb 0:1704ea055c4f 33 {
ejteb 1:4a5586eb1765 34 //put code here to happen when the distance is changed
tasnet 2:7e92aed03424 35
tasnet 2:7e92aed03424 36 if (numsamples < avgsamples) {
tasnet 2:7e92aed03424 37 avgsamplesarr[numsamples] = distance/10;
tasnet 2:7e92aed03424 38 printf("Distance changed to %dmm\r\n", distance);
tasnet 2:7e92aed03424 39 numsamples++;
tasnet 2:7e92aed03424 40 }
tasnet 2:7e92aed03424 41
tasnet 2:7e92aed03424 42 /*
tasnet 2:7e92aed03424 43 globaldist = distance/10; // convert distance from mm to cm
tasnet 2:7e92aed03424 44 printf("Distance changed to %dcm\r\n", globaldist);
tasnet 2:7e92aed03424 45
tasnet 2:7e92aed03424 46 if ((globaldist<(iHoeh+dist0)) && (globaldist >= dist0)) {
tasnet 2:7e92aed03424 47 // gemessene Entfernung ist kleiner als Abstand zum Boden des Tanks
tasnet 2:7e92aed03424 48 // und gemessene Entfernung ist größer als Überlauf
tasnet 2:7e92aed03424 49 volakt = (iHoeh + dist0 - globaldist) * iLeng * iBrei / 1000.0;
tasnet 2:7e92aed03424 50 } else {
tasnet 2:7e92aed03424 51 volakt = -1;
tasnet 2:7e92aed03424 52 }
tasnet 2:7e92aed03424 53 */
tasnet 2:7e92aed03424 54
ejteb 0:1704ea055c4f 55 }
ejteb 0:1704ea055c4f 56
tasnet 2:7e92aed03424 57 ultrasonic mu(PC_0, PC_1, .1, 1, &dist); //Set the trigger pin to PC_0 and the echo pin to PC_1
ejteb 1:4a5586eb1765 58 //have updates every .1 seconds and a timeout after 1
ejteb 1:4a5586eb1765 59 //second, and call dist when the distance changes
ejteb 0:1704ea055c4f 60
ejteb 0:1704ea055c4f 61 int main()
ejteb 0:1704ea055c4f 62 {
tasnet 2:7e92aed03424 63 pc.baud(115200);
tasnet 2:7e92aed03424 64 esp.baud(115200); // change this to the new ESP8266 baudrate if it is changed at any time.
tasnet 2:7e92aed03424 65
ejteb 0:1704ea055c4f 66 while(1)
ejteb 0:1704ea055c4f 67 {
tasnet 2:7e92aed03424 68 mu.startUpdates();//start mesuring the distance
tasnet 2:7e92aed03424 69 while(numsamples<avgsamples)
tasnet 2:7e92aed03424 70 {
tasnet 2:7e92aed03424 71 mu.checkDistance(); //call checkDistance() as much as possible, as this is where
tasnet 2:7e92aed03424 72 //the class checks if dist needs to be called.
tasnet 2:7e92aed03424 73 wait(0.01);
tasnet 2:7e92aed03424 74 }
tasnet 2:7e92aed03424 75 //mu.pauseUpdates(); //stop measure
tasnet 2:7e92aed03424 76
tasnet 2:7e92aed03424 77 globaldist = median(100,avgsamplesarr);
tasnet 2:7e92aed03424 78 pc.printf("Median ist %f\r\n",globaldist);
tasnet 2:7e92aed03424 79
tasnet 2:7e92aed03424 80 if ((globaldist<(iHoeh+dist0)) && (globaldist >= dist0)) {
tasnet 2:7e92aed03424 81 // gemessene Entfernung ist kleiner als Abstand zum Boden des Tanks
tasnet 2:7e92aed03424 82 // und gemessene Entfernung ist größer als Überlauf
tasnet 2:7e92aed03424 83 volakt = (iHoeh + dist0 - globaldist) * iLeng * iBrei / 1000.0;
tasnet 2:7e92aed03424 84 } else {
tasnet 2:7e92aed03424 85 volakt = -1;
tasnet 2:7e92aed03424 86 }
tasnet 2:7e92aed03424 87
tasnet 2:7e92aed03424 88 numsamples = 0;
tasnet 2:7e92aed03424 89
tasnet 2:7e92aed03424 90 strcpy(snd,"AT+CIPSTART=\"TCP\",\"192.168.3.60\",7072\r\n");
tasnet 2:7e92aed03424 91 SendCMD();
tasnet 2:7e92aed03424 92 timeout=2;
tasnet 2:7e92aed03424 93 getreply();
tasnet 2:7e92aed03424 94 pc.printf(buf);
tasnet 2:7e92aed03424 95
tasnet 2:7e92aed03424 96 //AT+CIPSEND=<length>;
tasnet 2:7e92aed03424 97 //sprintf(buf,"setreading wassertank state %d\r\n",globaldist);
tasnet 2:7e92aed03424 98 sprintf(sendbuf,"setreading wassertank state D:%fcm V:%fm3\r\n\0",globaldist,volakt);
tasnet 2:7e92aed03424 99
tasnet 2:7e92aed03424 100 sprintf(snd,"AT+CIPSEND=%d\r\n",strlen(sendbuf));
tasnet 2:7e92aed03424 101 //pc.printf(snd);
tasnet 2:7e92aed03424 102 SendCMD();
tasnet 2:7e92aed03424 103 timeout=2;
tasnet 2:7e92aed03424 104 getreply();
tasnet 2:7e92aed03424 105 pc.printf(buf);
tasnet 2:7e92aed03424 106
tasnet 2:7e92aed03424 107 strcpy(snd,sendbuf);
tasnet 2:7e92aed03424 108 pc.printf(snd);
tasnet 2:7e92aed03424 109 SendCMD();
tasnet 2:7e92aed03424 110 timeout=2;
tasnet 2:7e92aed03424 111 getreply();
tasnet 2:7e92aed03424 112 pc.printf(buf);
tasnet 2:7e92aed03424 113
tasnet 2:7e92aed03424 114 strcpy(snd,"AT+CIPCLOSE\r\n");
tasnet 2:7e92aed03424 115 SendCMD();
tasnet 2:7e92aed03424 116 timeout=2;
tasnet 2:7e92aed03424 117 getreply();
tasnet 2:7e92aed03424 118 pc.printf(buf);
tasnet 2:7e92aed03424 119
tasnet 2:7e92aed03424 120 wait(10);
ejteb 0:1704ea055c4f 121 }
ejteb 0:1704ea055c4f 122 }
tasnet 2:7e92aed03424 123
tasnet 2:7e92aed03424 124
tasnet 2:7e92aed03424 125 void SendCMD()
tasnet 2:7e92aed03424 126 {
tasnet 2:7e92aed03424 127 esp.printf("%s", snd);
tasnet 2:7e92aed03424 128 }
tasnet 2:7e92aed03424 129
tasnet 2:7e92aed03424 130 void getreply()
tasnet 2:7e92aed03424 131 {
tasnet 2:7e92aed03424 132 memset(buf, '\0', sizeof(buf));
tasnet 2:7e92aed03424 133 t.start();
tasnet 2:7e92aed03424 134 ended=0;count=0;
tasnet 2:7e92aed03424 135 while(!ended) {
tasnet 2:7e92aed03424 136 if(esp.readable()) {
tasnet 2:7e92aed03424 137 buf[count] = esp.getc();count++;
tasnet 2:7e92aed03424 138 }
tasnet 2:7e92aed03424 139 if(t.read() > timeout) {
tasnet 2:7e92aed03424 140 ended = 1;t.stop();t.reset();
tasnet 2:7e92aed03424 141 }
tasnet 2:7e92aed03424 142 }
tasnet 2:7e92aed03424 143 }
tasnet 2:7e92aed03424 144
tasnet 2:7e92aed03424 145 float median(int n, int x[]) {
tasnet 2:7e92aed03424 146 float temp;
tasnet 2:7e92aed03424 147 int i, j;
tasnet 2:7e92aed03424 148 // the following two loops sort the array x in ascending order
tasnet 2:7e92aed03424 149 for(i=0; i<n-1; i++) {
tasnet 2:7e92aed03424 150 for(j=i+1; j<n; j++) {
tasnet 2:7e92aed03424 151 if(x[j] < x[i]) {
tasnet 2:7e92aed03424 152 // swap elements
tasnet 2:7e92aed03424 153 temp = x[i];
tasnet 2:7e92aed03424 154 x[i] = x[j];
tasnet 2:7e92aed03424 155 x[j] = temp;
tasnet 2:7e92aed03424 156 }
tasnet 2:7e92aed03424 157 }
tasnet 2:7e92aed03424 158 }
tasnet 2:7e92aed03424 159
tasnet 2:7e92aed03424 160 if(n%2==0) {
tasnet 2:7e92aed03424 161 // if there is an even number of elements, return mean of the two elements in the middle
tasnet 2:7e92aed03424 162 return((x[n/2] + x[n/2 - 1]) / 2.0);
tasnet 2:7e92aed03424 163 } else {
tasnet 2:7e92aed03424 164 // else return the element in the middle
tasnet 2:7e92aed03424 165 return x[n/2];
tasnet 2:7e92aed03424 166 }
tasnet 2:7e92aed03424 167 }