Sheetal Prasanna / Mbed OS Cereal_Dispenser

Dependencies:   Servo

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "Servo.h"
00003 #include "hcsr04.h"
00004 #include "Thread.h"
00005 
00006 //pin connections
00007 Serial pc(USBTX, USBRX);
00008 Servo myservo(PTA1);
00009 AnalogIn force(A0);
00010 HCSR04 usensor(D8,D9);                     //ECHO Pin=D9, TRIG Pin=D8
00011 DigitalOut red(LED1);
00012 Serial HC06(PTC15, PTC14); //BT TX, RX
00013 
00014 Thread t1;
00015 Thread t2;
00016 Thread t3;
00017 
00018 Mutex open; //mutex for door
00019 
00020 //force sensor thread
00021 void force_open() {
00022     float weight;
00023     int door = 0;
00024     
00025     while(1) {  
00026         //read analog pin
00027         weight = force.read();
00028         printf("force = %f\r\n", weight * 1000);
00029     
00030         //if object detected or user asks for serving and door closed, then open
00031         if((weight*1000) >= 200 && door == 0) { 
00032             open.lock();    //lock
00033             
00034             myservo.write(0.0);
00035             door = 1;
00036     
00037             wait(0.25);
00038             //if open for .25 seconds, close - portion control
00039             myservo.write(0.75);
00040             
00041             open.unlock();  //unlock
00042             door = 0;
00043         }
00044         
00045         wait(5); //look for bowl every 5 seconds 
00046     }
00047 }
00048 
00049 //bluetooth control thread
00050 void bt_open() {
00051     
00052     char bt;
00053     int door = 0;
00054     
00055     while(1) {
00056         
00057         //data from BT
00058         if(HC06.readable())
00059         {
00060             //read
00061             bt = HC06.getc();
00062             printf("BT=%c\n\r", bt);
00063             //open
00064             if(bt == '3' && door == 0) {
00065                 open.lock();    //lock
00066                 
00067                 myservo.write(0.0);
00068                 door = 1;
00069                 printf("BT START\n\r");
00070             }
00071             //close - no timer!
00072             else if(bt == '4' && door == 1) {
00073                 myservo.write(0.75); 
00074                 door = 0;
00075                 open.unlock(); //unlock
00076                 
00077                 printf("BT STOP\n\r");
00078             }   
00079         }
00080     }
00081 }
00082 
00083 //ultrasonic thread
00084 void empty_detect() {
00085     int dist;
00086     int count = 0;
00087     
00088     while(1) {
00089         usensor.start();
00090     
00091         wait_ms(500);
00092         dist = usensor.get_dist_cm();   //read
00093         printf("distance = %d\n\r", dist);
00094         
00095         //food is there
00096         if(dist > 0 && dist < 28) {
00097             red = 1;
00098             HC06.printf("0");
00099         }
00100         else {  //empty
00101             red = 0;    //turn on red light
00102             
00103             if(count % 10 == 0)
00104             {
00105                 //bluetooth message
00106                 HC06.printf("1");
00107                 printf("----------------------------------------------\n\r");
00108                 printf("Notifying user that refill is needed\n\r");
00109                 printf("----------------------------------------------\n\r");
00110             }
00111             count++;    //for frequent notification
00112         }
00113     }
00114 }
00115 
00116 int main()
00117 {
00118     printf("Welcome to Cereal Dispenser\n\r");
00119     usensor.start();
00120     
00121     red = 1;    //LED off
00122     
00123     while(1) {
00124     
00125         //start threads
00126         t1.start(force_open);
00127         t2.start(bt_open);
00128         t3.start(empty_detect);
00129     }
00130 }