A hands-free automatic dispenser with portion control and RTOS.

Dependencies:   Servo

Committer:
sprasann
Date:
Wed May 05 14:36:02 2021 +0000
Revision:
0:03bd0f0136f8
final project

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sprasann 0:03bd0f0136f8 1 #include "mbed.h"
sprasann 0:03bd0f0136f8 2 #include "Servo.h"
sprasann 0:03bd0f0136f8 3 #include "hcsr04.h"
sprasann 0:03bd0f0136f8 4 #include "Thread.h"
sprasann 0:03bd0f0136f8 5
sprasann 0:03bd0f0136f8 6 //pin connections
sprasann 0:03bd0f0136f8 7 Serial pc(USBTX, USBRX);
sprasann 0:03bd0f0136f8 8 Servo myservo(PTA1);
sprasann 0:03bd0f0136f8 9 AnalogIn force(A0);
sprasann 0:03bd0f0136f8 10 HCSR04 usensor(D8,D9); //ECHO Pin=D9, TRIG Pin=D8
sprasann 0:03bd0f0136f8 11 DigitalOut red(LED1);
sprasann 0:03bd0f0136f8 12 Serial HC06(PTC15, PTC14); //BT TX, RX
sprasann 0:03bd0f0136f8 13
sprasann 0:03bd0f0136f8 14 Thread t1;
sprasann 0:03bd0f0136f8 15 Thread t2;
sprasann 0:03bd0f0136f8 16 Thread t3;
sprasann 0:03bd0f0136f8 17
sprasann 0:03bd0f0136f8 18 Mutex open; //mutex for door
sprasann 0:03bd0f0136f8 19
sprasann 0:03bd0f0136f8 20 //force sensor thread
sprasann 0:03bd0f0136f8 21 void force_open() {
sprasann 0:03bd0f0136f8 22 float weight;
sprasann 0:03bd0f0136f8 23 int door = 0;
sprasann 0:03bd0f0136f8 24
sprasann 0:03bd0f0136f8 25 while(1) {
sprasann 0:03bd0f0136f8 26 //read analog pin
sprasann 0:03bd0f0136f8 27 weight = force.read();
sprasann 0:03bd0f0136f8 28 printf("force = %f\r\n", weight * 1000);
sprasann 0:03bd0f0136f8 29
sprasann 0:03bd0f0136f8 30 //if object detected or user asks for serving and door closed, then open
sprasann 0:03bd0f0136f8 31 if((weight*1000) >= 200 && door == 0) {
sprasann 0:03bd0f0136f8 32 open.lock(); //lock
sprasann 0:03bd0f0136f8 33
sprasann 0:03bd0f0136f8 34 myservo.write(0.0);
sprasann 0:03bd0f0136f8 35 door = 1;
sprasann 0:03bd0f0136f8 36
sprasann 0:03bd0f0136f8 37 wait(0.25);
sprasann 0:03bd0f0136f8 38 //if open for .25 seconds, close - portion control
sprasann 0:03bd0f0136f8 39 myservo.write(0.75);
sprasann 0:03bd0f0136f8 40
sprasann 0:03bd0f0136f8 41 open.unlock(); //unlock
sprasann 0:03bd0f0136f8 42 door = 0;
sprasann 0:03bd0f0136f8 43 }
sprasann 0:03bd0f0136f8 44
sprasann 0:03bd0f0136f8 45 wait(5); //look for bowl every 5 seconds
sprasann 0:03bd0f0136f8 46 }
sprasann 0:03bd0f0136f8 47 }
sprasann 0:03bd0f0136f8 48
sprasann 0:03bd0f0136f8 49 //bluetooth control thread
sprasann 0:03bd0f0136f8 50 void bt_open() {
sprasann 0:03bd0f0136f8 51
sprasann 0:03bd0f0136f8 52 char bt;
sprasann 0:03bd0f0136f8 53 int door = 0;
sprasann 0:03bd0f0136f8 54
sprasann 0:03bd0f0136f8 55 while(1) {
sprasann 0:03bd0f0136f8 56
sprasann 0:03bd0f0136f8 57 //data from BT
sprasann 0:03bd0f0136f8 58 if(HC06.readable())
sprasann 0:03bd0f0136f8 59 {
sprasann 0:03bd0f0136f8 60 //read
sprasann 0:03bd0f0136f8 61 bt = HC06.getc();
sprasann 0:03bd0f0136f8 62 printf("BT=%c\n\r", bt);
sprasann 0:03bd0f0136f8 63 //open
sprasann 0:03bd0f0136f8 64 if(bt == '3' && door == 0) {
sprasann 0:03bd0f0136f8 65 open.lock(); //lock
sprasann 0:03bd0f0136f8 66
sprasann 0:03bd0f0136f8 67 myservo.write(0.0);
sprasann 0:03bd0f0136f8 68 door = 1;
sprasann 0:03bd0f0136f8 69 printf("BT START\n\r");
sprasann 0:03bd0f0136f8 70 }
sprasann 0:03bd0f0136f8 71 //close - no timer!
sprasann 0:03bd0f0136f8 72 else if(bt == '4' && door == 1) {
sprasann 0:03bd0f0136f8 73 myservo.write(0.75);
sprasann 0:03bd0f0136f8 74 door = 0;
sprasann 0:03bd0f0136f8 75 open.unlock(); //unlock
sprasann 0:03bd0f0136f8 76
sprasann 0:03bd0f0136f8 77 printf("BT STOP\n\r");
sprasann 0:03bd0f0136f8 78 }
sprasann 0:03bd0f0136f8 79 }
sprasann 0:03bd0f0136f8 80 }
sprasann 0:03bd0f0136f8 81 }
sprasann 0:03bd0f0136f8 82
sprasann 0:03bd0f0136f8 83 //ultrasonic thread
sprasann 0:03bd0f0136f8 84 void empty_detect() {
sprasann 0:03bd0f0136f8 85 int dist;
sprasann 0:03bd0f0136f8 86 int count = 0;
sprasann 0:03bd0f0136f8 87
sprasann 0:03bd0f0136f8 88 while(1) {
sprasann 0:03bd0f0136f8 89 usensor.start();
sprasann 0:03bd0f0136f8 90
sprasann 0:03bd0f0136f8 91 wait_ms(500);
sprasann 0:03bd0f0136f8 92 dist = usensor.get_dist_cm(); //read
sprasann 0:03bd0f0136f8 93 printf("distance = %d\n\r", dist);
sprasann 0:03bd0f0136f8 94
sprasann 0:03bd0f0136f8 95 //food is there
sprasann 0:03bd0f0136f8 96 if(dist > 0 && dist < 28) {
sprasann 0:03bd0f0136f8 97 red = 1;
sprasann 0:03bd0f0136f8 98 HC06.printf("0");
sprasann 0:03bd0f0136f8 99 }
sprasann 0:03bd0f0136f8 100 else { //empty
sprasann 0:03bd0f0136f8 101 red = 0; //turn on red light
sprasann 0:03bd0f0136f8 102
sprasann 0:03bd0f0136f8 103 if(count % 10 == 0)
sprasann 0:03bd0f0136f8 104 {
sprasann 0:03bd0f0136f8 105 //bluetooth message
sprasann 0:03bd0f0136f8 106 HC06.printf("1");
sprasann 0:03bd0f0136f8 107 printf("----------------------------------------------\n\r");
sprasann 0:03bd0f0136f8 108 printf("Notifying user that refill is needed\n\r");
sprasann 0:03bd0f0136f8 109 printf("----------------------------------------------\n\r");
sprasann 0:03bd0f0136f8 110 }
sprasann 0:03bd0f0136f8 111 count++; //for frequent notification
sprasann 0:03bd0f0136f8 112 }
sprasann 0:03bd0f0136f8 113 }
sprasann 0:03bd0f0136f8 114 }
sprasann 0:03bd0f0136f8 115
sprasann 0:03bd0f0136f8 116 int main()
sprasann 0:03bd0f0136f8 117 {
sprasann 0:03bd0f0136f8 118 printf("Welcome to Cereal Dispenser\n\r");
sprasann 0:03bd0f0136f8 119 usensor.start();
sprasann 0:03bd0f0136f8 120
sprasann 0:03bd0f0136f8 121 red = 1; //LED off
sprasann 0:03bd0f0136f8 122
sprasann 0:03bd0f0136f8 123 while(1) {
sprasann 0:03bd0f0136f8 124
sprasann 0:03bd0f0136f8 125 //start threads
sprasann 0:03bd0f0136f8 126 t1.start(force_open);
sprasann 0:03bd0f0136f8 127 t2.start(bt_open);
sprasann 0:03bd0f0136f8 128 t3.start(empty_detect);
sprasann 0:03bd0f0136f8 129 }
sprasann 0:03bd0f0136f8 130 }