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
- 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];
}
}
