![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
project
Dependencies: mbed HTTPClient LM75B mbed-rtos EthernetInterface MMA7660
Diff: main.cpp
- Revision:
- 3:e68b56ffa127
- Parent:
- 2:f7645c6a85f3
- Child:
- 4:88613477855a
diff -r f7645c6a85f3 -r e68b56ffa127 main.cpp --- a/main.cpp Mon Aug 16 16:06:35 2021 +0000 +++ b/main.cpp Thu Dec 30 15:22:40 2021 +0000 @@ -1,3 +1,266 @@ +/* mbed Microcontroller Library + * Copyright (c) 2019 ARM Limited + * SPDX-License-Identifier: Apache-2.0 + */ +#include "mbed.h" +#include "FP.h"//header file for function pointer +#include "HTTPClient.h" +#include "EthernetInterface.h" + + +#define TRIGGER_HAND PTB18//setting trigger pin of ultrasonic sensor near hand +#define ECHO_HAND PTB19//setting echo pin of ultrasonic sensor near hand + +#define TRIGGER_BOTTLE PTC1//setting trigger pin of ultrasonic sensor inside bottle +#define ECHO_BOTTLE PTC8//setting echo pin of ultrasonic sensor inside bottle + +#define PUMP_SIGNAL PTC9//stting the signal pin of the relay pin connected to pump + +#define BOTTLE_FULL 9// +#define ON 1 +#define OFF 0 +Serial pc(USBTX, USBRX); //Create Serial interface +DigitalOut RED(LED1, 1);//alert light when sanitizer is empty +DigitalOut GREEN(LED2, 1);//user present station on +DigitalOut BLUE(LED3, 1);//station free +int hand_distance = 0;//variable to update feild 1 in thingsspeak +int santizer_lev = 0;//variable to update feild 1 in thingsspeak +long userCount = 0;//variable to update feild 1 in thingsspeak + +//Ethernet Interface +EthernetInterface eth; +//HTTP Client for interfacing to web services +HTTPClient http; +#define IP "184.106.153.149" // thingspeak.com IP Address + +char resp[1024];// response from http post +int ret = 0;// error feed back from + +HTTPText inText(resp, 1024); + +void post_field1(){ + HTTPMap map; + char buf[10]; + char buf1[10]; + sprintf(buf,"%d",userCount);//Convert UserCount to char* + sprintf(buf1,"%d",santizer_lev);//Convert SanitizerLevel to char* + map.put("api_key","JPZYYS7J18NX4XV5"); //Fill your thingspeak API KEY + map.put("field1", buf); // Add UserCount to HTTPMap + map.put("field2", buf1);// Add SanitizerLevel to HTTPMap + pc.printf("\r\nPosting Data..."); + ret = http.post("https://api.thingspeak.com/update", map, &inText); //Publish Field1 and Field2 to Thingspeak + if (!ret){ + pc.printf("\r\nPOST successfully - read %d characters", strlen(resp)); + pc.printf("\r\nResult: %s\n", resp); + }else{ + pc.printf("\r\nError Connecting to ethernet port - ret = %d - HTTP return code = %d", ret, http.getHTTPResponseCode()); + } +} + +void set_red()//funtion to set red led +{ + RED=0; GREEN = 1; BLUE = 1; +} +void set_green()//funtion to set green led +{ + RED = 1; GREEN = 0; BLUE = 1; +} +void set_blue()//funtion to set blue led +{ + RED = 1; GREEN = 1; BLUE = 0; +} + +class ultrasonic{ + private: + DigitalOut trigger;//trigger pin for UltarSonic sensor + InterruptIn echo; //Echo pin for water_level measurement. Uses as Interrupt to avoid code execution blocking. + Ticker measure; //Ticker to trigger water_level measurement periodically. + Timeout trigger_low; //Timeout interrupt to set trigger pin low after 10us of HIGH. + Timer echoTimer; //Timer to get the time elapsed between echo sent and echo received back + int echo_time_us; + int meas_gap; //1sec + volatile bool measuring; + FP<void,int> fp; + + void set_trigger_high(){ //Function to set Trigger Pin HIGH for 10us and set measuring = true + measuring = true; + trigger = ON; + trigger_low.attach_us(this, &ultrasonic::set_trigger_low, 10); //set trigger pin OFF after 10us + } + + void set_trigger_low(void){ //Function to set trigger pin LOW to fiish trigger after 10us. This will be called by low timer object. + trigger = OFF; + } + + void start_echo(void){//Function to start listening for echo back. This will start timer echoTimer. Will be based on Echo Pin RISE(or HIGH) + if(!measuring) return; //avoid fluctuations on echo pin if any. Continue echo calculation only if measuring is TRUE. + echoTimer.reset(); + echoTimer.start(); //Timer start since Echo pin is HIGH + } + void stop_echo(void){//Function to stop echoTimer after echo received back. Will be based on Echo Pin FALL(or LOW). + if (!measuring)return; //avoid fluctuations on echo pin if any + echoTimer.stop(); //stop timer since echo pin back to LOW + echo_time_us = echoTimer.read_us(); //Calculate time for ultrasonic wave RTT. + if(echo_time_us > 2000 || echo_time_us < 125)return; //ignore reading in case abnormally high or low RTT time + measuring = false; //Marke measurement completed + fp(echo_time_us / (29 * 2)); + } +public: + ultrasonic(PinName _trigger, PinName _echo, int _meas_gap):trigger(_trigger), echo(_echo){ //Constructor: initialize trigger(default value OFF) & echo pin + + echo.rise(this, &ultrasonic::start_echo); //Attach function to Interrupt on Echo pin Rise + echo.fall(this, &ultrasonic::stop_echo); //Attach function to Interrupt on Echo pin Fall + meas_gap = _meas_gap; + measuring = false; + } + + void start_measure(){ //function to Set Trigger Pin high repeatedly every 'time' seconds + measure.attach(this, &ultrasonic::set_trigger_high,meas_gap);//ticker to trigger measurement with callback function + } + void stop_measure(void){ //Dettach from Ticker and stop measurements + //signal = OFF; + measuring = false; + measure.detach(); + } + void req_callBack(FP<void, int> _fp){ + fp = _fp; + } +}; + + +class _pump{ + private: + DigitalOut signal; //pin for controlling relay + const int pump_timeout = 400000;//the amount of sanitizer pumping into the hand + Timeout time_out;//interrupt based timer + + public: + _pump(PinName _signal):signal(_signal,OFF){ + } + + void switch_on(){//switch on the punp + signal = ON; + time_out.attach_us(this, &_pump::switch_off, pump_timeout); //set trigger pin OFF after 10us + } + void switch_off(){//switch off the pump + signal = OFF; + } + + int get_state(){//return the signal state of pump + return signal.read(); + } +}; + +class _station{ + private: + ultrasonic hand_sensor; + ultrasonic bottle_sensor; + _pump pump; + FP<void,int> detect_hand_fp;//to find the user hand using function pointer detect hand fp + FP<void,int> santizer_level_fp;//to find the level of sanitizer using this function + const int threshold = 14;//the max value hand to be detected + const int bottle_empty = 13;// the max value bottle level to get empty + bool user_served;//variable to check the user served + bool station_on;//varible to keep the sanitizing station on + public: + _station(PinName _trigger,PinName _echo, PinName __trigger,PinName __echo, PinName _signal):hand_sensor(_trigger, _echo, 1),bottle_sensor(__trigger, __echo, 10),pump(_signal){ + + bool user_served= false;//initialize user serve + bool station_on = true;//initialize the station to start + } + + void start_station(){//This section the station will check the hand and bottle distance detection + start_measure_bottle();//start to measure the bottle sanitizer level + } + + void start_detect_hand(){//start detecting the hand + detect_hand_fp.attach(this, &_station::detect_hand);//attach the function pointer detect hand + hand_sensor.req_callBack(detect_hand_fp);//pass function pointer to ultrasonic function + hand_sensor.start_measure();//start hand sensor + } + void stop_detect_hand(){//stop detecting the hand + hand_sensor.stop_measure();//stop ultrasonic sensor + detect_hand_fp.detach();//detach the function pointer + } + + void start_measure_bottle(){//start measuring the level of sanitizer + santizer_level_fp.attach(this, &_station::santizer_level);//attach the function pointer sanitizer level + bottle_sensor.req_callBack(santizer_level_fp);//pass function pointer to ultrasonic function + bottle_sensor.start_measure();//start calculating level of sanitizer + } + void stop_measure_bottle(){//stop measuring the level + stop_detect_hand();//stop detecting hand + bottle_sensor.stop_measure();//stop the ultrasonic sensor + santizer_level_fp.detach();//detach the function pointer + } + + void santizer_level(int d){ + //int x = d - BOTTLE_FULL; + //santizer_lev = BOTTLE_FULL - x; + santizer_lev = d; + char field[50]; + if (d <= bottle_empty){ //Bottle Empty + set_red();//sanitizer empty red light alert + station_on = false;//make the station off + stop_detect_hand();//stop sensing the hand + } + if (d > bottle_empty){ //Bottle still have sanitizer + set_blue();//sanitizer present and users are welcome + if(!station_on){// if no user is using the station + start_detect_hand();// start hand detection + station_on = true;// on the station for pumping + } + } + } + void detect_hand(int d){//hand detection + hand_distance = d; + if (d <= threshold && user_served){ //hand Detected when user is served and the threshold is greater than the distance + set_green();//green led glows when hand is detected + pump.switch_on();//switch the pump on + userCount++;//count the user number + user_served= false;//stop the pumping after one pump of sanitizer + + } + if (d > threshold){ //hand not Detected + set_blue();//station is free ready to serve user + user_served= true;//start checking for the user + } + } +}; + + + +int main() +{ + int ret = 0; + char field[50]; + _station station(TRIGGER_HAND, ECHO_HAND, TRIGGER_BOTTLE, ECHO_BOTTLE, PUMP_SIGNAL); + station.start_station(); + + eth.init(); //Use DHCP + ret= eth.connect(); + + if (!ret){ + pc.printf("\r\nConnected, IP: %s, MASK: %s, GW: %s", + eth.getIPAddress(), eth.getNetworkMask(), eth.getGateway()); + } else { + pc.printf("\r\nError eth.connect() - ret = %d", ret); + } + + + while (true) { + pc.printf("Hand Distance = %d\n\r", hand_distance);//print the hand distance calculated + pc.printf("Sanitizer = %d\n\r", santizer_lev);//print the sanitizer level detected + wait(5); + post_field1();//callin the post feild1 to post the information to thingspaek + + } +} + + + + +/* #include "mbed.h" #include "HTTPClient.h" #include "LM75B.h" @@ -40,8 +303,14 @@ while(1){ pc.printf("\r\nWriting to thingspeak"); map.put("api_key","xxx"); /* Fill your thingspeak API KEY*/ +/* sprintf(val[0],"%4.1f",sensor.read()); map.put("field1", val[0]); + map.put("field1", val[0]); + map.put("field1", val[0]); + + + pc.printf("\r\nPosting Data..."); ret = http.post("https://api.thingspeak.com/update", map, &inText); //writing data to Thingspeak if (!ret){ @@ -52,3 +321,4 @@ } } } +*/ \ No newline at end of file