
The purpose of this code is to rotate an HC-SR04 and measure the perimeter of a room. The measurements will then be sent to ThingSpeak to record the data.
Dependencies: mbed mbed-http TextLCD ESP8266 ULN2003_StepperDriver
Diff: main.cpp
- Revision:
- 12:701ea1b1d513
- Parent:
- 11:756321f0b0cd
--- a/main.cpp Sat Aug 28 22:17:23 2021 +0000 +++ b/main.cpp Mon Dec 13 15:14:02 2021 +0000 @@ -1,131 +1,145 @@ -/** -Electronically Controlled Intelligent Shelves -Developed by: Priyank Kalgaonkar -**/ +/* +Perimeter detection +John Emberson/Tercio Junker + +The purpose of this code is to rotate an HC-SR04 and measure the perimeter of a room. +The measurements will then be sent to ThingSpeak to record the data. + +*/ #include "mbed.h" #include "hcsr04.h" #include "ESP8266.h" -#include "math.h" -#define CloudIP "184.106.153.149" //Raw IP Address of ThingSpeak Cloud Server +#include "ULN2003.h" +#include "TextLCD.h" + + -DigitalOut RLed(LED1); //Onboard Red LED = Shelf Out of Stock -DigitalOut GLed(LED2); //Onboard Green LED = All OK -DigitalOut BLed(LED3); //Onboard Blue LED for Wifi Tx Indication -HCSR04 usensor1(D8,D9); //ECHO Pin=D9, TRIG Pin=D8 -HCSR04 usensor2(D7,D6); //ECHO Pin=D7, TRIG Pin=D6 +#define IP "184.106.153.149" +#define spr 4096 + +#define SSID "IU PublicNet" +#define PW "" + + Serial pc(USBTX,USBRX); //Serial Communication with PC ESP8266 wifi(PTC17, PTC16, 115200); //Tx Pin:PTC17; Rx Pin:PTC17; Baud rate:115200 +ULN2003 sm(D13,D12,D11,D10,spr); //SM motor (In1,In2,In3,In4,StepsPerRotation=4096) +HCSR04 us(D7,D6); //Trig:D7 Echo:D6 +TextLCD lcd(D9,D8,D2,D3,D4,D5); //Rs,E,D4,D5,D6,D7 -void wifi_send(void);; //Connect and Push Data Channel to Cloud Server +char snd[255]; //snd: send command to ESP8266 +char resp[1000]; //resp: receive response from ESP8266 + +int dist[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; + +char* API = "Q34TJD14E68FMA7A"; //API key + +char comm[300]; //WIFI command +int timeout = 8000; //timeout for wifi commands + + +int mp=16; //The amount of measurements per rotation +int hmp=mp/2; //Half a rotation +int delta=spr/mp; //setting up 16 points to take a measurment This is the amount of steps per measurement +int speed=500; //speed in steps per second +int delay=(delta/speed)/1000; //(steps % (steps per second))/1000 = milliseconds + +void MotorFront(){ //Move motor forward half a rotation + for (int i=1;i<(hmp+1);i++){ + sm.moveForward(delta,speed); + wait_ms(delay); + us.start(); + wait_ms(500); + dist[i]=us.get_dist_cm(); + pc.printf("dist%d=%d\r\n",i,dist[i]); + } + } + void MotorBack(){ //Move motor reverse half a rotations + for (int i=mp;i>(hmp);i--){ + sm.moveForward(delta,speed); + wait_ms(delay); + us.start(); + wait_ms(500); + dist[i]=us.get_dist_cm(); + pc.printf("dist%d=%d\r\n",i,dist[i]); + } + } -int num = 0; -int distance1, distance2; -float dist_remaining1, dist_percent1, dist_remaining2, dist_percent2; -char snd[255],rcv[1000]; //snd: send command to ESP8266 - //rcv: receive response from ESP8266 - +void ConnWIFI(){ //Connect to wifi + wifi.SetMode(1); + wifi.SendCMD(snd); + wifi.RcvReply(resp, 5000); + wait(1); + pc.printf("%s\r", resp); + wifi.Join(SSID,PW); + wifi.RcvReply(resp, 5000); + wait(1); + pc.printf("%s\r\n", resp); + pc.printf("Connecting to WIFI..."); + lcd.cls(); + lcd.printf("Connecting to WIFI"); + wifi.setTransparent(); + wait(1); + pc.printf("..."); + lcd.printf("..."); + wifi.SetSingle(); + wifi.RcvReply(resp, timeout); + wait(1); + } + +void ConnTS1(){ //Connect to ThingSpeak + pc.printf("\r\nConnecting to ThingSpeak\r\n"); + lcd.cls(); + lcd.printf("Connecting to ThingSpreak"); + wifi.startTCPConn(IP,80); //cipstart + wifi.RcvReply(resp, timeout); + wait(1); + sprintf(snd,"https://api.thingspeak.com/update?api_key=%s&field1=%d&field2=%d&field3=%d&field4=%d&field5=%d&field6=%d&field7=%d&field8=%d\r\n",API,dist[1],dist[2],dist[3],dist[4],dist[5],dist[6],dist[7],dist[8]); + pc.printf("Sending data to ThingSpeak\r\n"); + lcd.cls(); + lcd.printf("Sending data to ThingSpeak"); + wifi.sendURL(snd, comm); //cipsend and get command + if (wifi.RcvReply(resp, timeout)) + pc.printf("%s",resp); + else + pc.printf("No response while sending URL \r\n"); + wait_ms(5000); + } + +void ConnTS2(){ //Connect to ThingSpeak for second back of data + pc.printf("\r\nSending second batch of data..."); + lcd.cls(); + lcd.printf("Sending second batch of data"); + wifi.startTCPConn(IP,80); //cipstart + wifi.RcvReply(resp, timeout); + wait(1); + sprintf(snd,"https://api.thingspeak.com/update?api_key=%s&field1=%d&field2=%d&field3=%d&field4=%d&field5=%d&field6=%d&field7=%d&field8=%d\r\n",API,dist[9],dist[10],dist[11],dist[12],dist[13],dist[14],dist[15],dist[16]); + pc.printf("...\r\n"); + lcd.printf("..."); + wifi.sendURL(snd, comm); //cipsend and get command + if (wifi.RcvReply(resp, timeout)) + pc.printf("%s",resp); + else + pc.printf("No response while sending URL \r\n"); +} + + int main() { pc.baud(115200); //Baud Rate of 115200 for Tera Term - - pc.printf("######## ###### #### ###### ###### ## ## ###### ######## ######## ## ##\n\r"); - pc.printf("## ## ## ## ## ## ## ## ## ## ## ## ## ## ### ###\n\r"); - pc.printf("## ## ## ## ## #### ## ## ## #### ####\n\r"); - pc.printf("###### ## ## ###### ###### ## ###### ## ###### ## ### ##\n\r"); - pc.printf("## ## ## ## ## ## ## ## ## ## ##\n\r"); - pc.printf("## ## ## ## ## ## ## ## ## ## ## ## ## ## ##\n\r"); - pc.printf("######## ###### #### ###### ###### ## ###### ## ######## ## ##\n\r"); - pc.printf("-----------------------------------------------------------------------------------------\n\r"); - pc.printf("Developed By: Priyank Kalgaonkar\n\r"); - pc.printf("-----------------------------------------------------------------------------------------\n\r\n\r"); - - pc.printf("Initial Setup\r\n"); - wifi.SetMode(1); //Set ESP mode to 1 - wifi.RcvReply(rcv, 1000); //Receive a response from ESP - pc.printf("%s\r", rcv); - - pc.printf("Connecting to WiFi\r\n"); //AP Setup Initialization - wifi.Join("Z", "12345678");//Put your Wifi SSID followed by Password WiFi_SSID WiFi_Password - wifi.RcvReply(rcv, 1000); - pc.printf("%s\n", rcv); - wait(8); - - wifi.GetIP(rcv); //Obtains an IP address from the AP - - while (1) - { - wifi_send(); - - RLed = 1; - GLed = 1; - BLed = 0; - wait(2.0f); - } -} - -void wifi_send(void) -{ - while(num<1000000000000) - { - num=num+1; - pc.printf("\nCloud Sync Instance #: %d\n\r", num); - pc.printf("Syncing Data with Cloud, Please Wait.\n\r"); - - //Ultrasound Sensor (HC-SR04) #1 Initialization - int a = 30; - usensor1.start(); - wait_ms(500); - - //Calculating Distance Percentage Remaining for Sensor # 1 - distance1 = usensor1.get_dist_cm(); - dist_remaining1 = a-distance1; - dist_percent1 = (dist_remaining1/30)*100; - - //LED and Tera Term Output - if (distance1<30 && distance2<30) { - RLed = 1; - BLed = 1; - GLed = 0; - //printf("Percent remaining: %f\r", dist_percent1 && dist_percent2); - } else { - GLed = 1; - BLed = 1; - RLed = 0; - printf("Shelves Empty! Replenish Stock.\n\r"); - } - - //Sending Data to the Cloud Server via ESP8266 WiFi Module - strcpy(snd,"AT+CIPMUX=0\n\r"); //AT+CIPMUX: Enabling Single Channel Mode - wifi.SendCMD(snd); - wait(1); - wifi.RcvReply(rcv, 1000); - wait(1); - - //Establish TCP connection w/ Cloud Server - sprintf(snd,"AT+CIPSTART=4,\"TCP\",\"%s\",80\n",CloudIP); - wait(1); - wifi.RcvReply(rcv, 1000); - wait(1); - - //Set length of the data that will be sent - strcpy(snd,"AT+CIPSEND=100\n\r"); - wifi.SendCMD(snd); - pc.printf("%s\r", rcv); - wait(1); - wifi.RcvReply(rcv, 1000); - pc.printf("%s\r", rcv); - wait(1); - - //Pushing the data acquired from HC-SR04 Ultrasonic Sensor to Cloud Server via API - //Replace with your own API Request - Write a Channel Feed below - pc.printf("Product X - Sensor 1: \n\r"); - sprintf(snd,"\r ***Replace with your own API Request - Write a Channel Feed below*** \r", dist_percent1); - printf("Percent Stock X Remaining: %f\n\r", dist_percent1); - wifi.SendCMD(snd); - pc.printf("%s\r",snd); - wait(0.5); - wifi.RcvReply(rcv, 1000); - pc.printf("%s\r", rcv); - } + pc.printf("Scanning measurments of room"); + lcd.cls(); //Clear LCD Screen + lcd.printf("Scanning measurments of room"); + wait_ms(2000); + MotorFront(); //Scan first 8 steps + sm.moveReverse(spr,600); //Rotates camera opposite to prevent wire tangle + wait_ms(250); + MotorBack(); //Scan last 8 steps + ConnWIFI(); //Connecting to WIFI + ConnTS1(); //Sending first 8 steps to ThingSpeak + ConnTS2(); //Sending last 8 steps to ThingSpeak + pc.printf("Done"); + lcd.cls(); + lcd.printf("Done"); } \ No newline at end of file