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
main.cpp@2:7e92aed03424, 2016-08-24 (annotated)
- 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?
User | Revision | Line number | New 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 | } |