People Counter / Mbed 2 deprecated person_counter

Dependencies:   mbed mbed-rtos 4DGL-uLCD-SE HC_SR04_Ultrasonic_Library

Committer:
rmalik8
Date:
Sun Apr 26 13:32:42 2020 +0000
Revision:
16:5250c9fe0408
Parent:
15:827fbc2e07d6
Child:
17:b8b68ff5e33a
added comments

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mmarine3 2:1ec843c95914 1 #include "mbed.h"
rmalik8 4:7d02b3f3bee6 2 #include "rtos.h"
rmalik8 12:bebfef8d229f 3 //#include "SDFileSystem.h"
mmarine3 2:1ec843c95914 4 #include "uLCD_4DGL.h"
rmalik8 4:7d02b3f3bee6 5 #include "ultrasonic.h"
rmalik8 12:bebfef8d229f 6 //#include "wave_player.h"
rmalik8 12:bebfef8d229f 7 #include "SongPlayer.h"
rmalik8 4:7d02b3f3bee6 8
rmalik8 3:b5cdd40e99e9 9 //#include <stdio.h>
mmarine3 2:1ec843c95914 10 #include <string>
mmarine3 2:1ec843c95914 11
rmalik8 4:7d02b3f3bee6 12
mmarine3 9:f4f03767acc0 13 uLCD_4DGL uLCD(p13, p14, p12); // Initialize uLCD serial tx, serial rx, reset pin;
rmalik8 15:827fbc2e07d6 14 //SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
rmalik8 10:7a939a54515e 15 RawSerial blue(p9,p10); //Initialize Blutooth
rmalik8 12:bebfef8d229f 16 //Serial BT(p9,p10);
rmalik8 12:bebfef8d229f 17
rmalik8 12:bebfef8d229f 18 //waiting to figure out if sd card works
rmalik8 12:bebfef8d229f 19 //AnalogOut speaker(p18); //Initialize speaker
rmalik8 12:bebfef8d229f 20 //wave_player waver(&speaker); //Initialize Waveplayer
rmalik8 12:bebfef8d229f 21
rmalik8 10:7a939a54515e 22 Mutex serial_mutex;
mmarine3 8:c0a6a3363e43 23 Mutex dist;
mmarine3 2:1ec843c95914 24 DigitalOut MyLED(LED1);
mmarine3 2:1ec843c95914 25
rmalik8 10:7a939a54515e 26 volatile int musicChoice = 0;
rmalik8 10:7a939a54515e 27 //musicChoice can be values 0 to 3
rmalik8 11:f5d0c8bf1849 28 volatile int sdist = 0;
rmalik8 12:bebfef8d229f 29 volatile int counter = 0;
rmalik8 12:bebfef8d229f 30
rmalik8 12:bebfef8d229f 31 float note1[2]= {1568.0, 0.0
rmalik8 12:bebfef8d229f 32 };
rmalik8 13:3ba367bc16bc 33 float note2[2]= {1396.9, 0.0
rmalik8 12:bebfef8d229f 34 };
rmalik8 13:3ba367bc16bc 35 float note3[2]= {1244.5, 0.0
rmalik8 12:bebfef8d229f 36 };
rmalik8 12:bebfef8d229f 37 float duration[2]= {1, 0.0
rmalik8 12:bebfef8d229f 38 };
rmalik8 15:827fbc2e07d6 39
rmalik8 15:827fbc2e07d6 40 volatile int values[5] = {0,0,0,0,0};
rmalik8 15:827fbc2e07d6 41 volatile int index = 0;
rmalik8 15:827fbc2e07d6 42 volatile bool allZero = true;
rmalik8 15:827fbc2e07d6 43 int state = 0;
rmalik8 12:bebfef8d229f 44
rmalik8 12:bebfef8d229f 45
mmarine3 9:f4f03767acc0 46 void sonar(int distance)
rmalik8 4:7d02b3f3bee6 47 {
rmalik8 4:7d02b3f3bee6 48 //put code here to execute when the sonar distance has changed
mmarine3 9:f4f03767acc0 49 dist.lock();
mmarine3 9:f4f03767acc0 50 sdist = distance;
rmalik8 15:827fbc2e07d6 51 values[index] = distance;
mmarine3 9:f4f03767acc0 52 dist.unlock();
rmalik8 15:827fbc2e07d6 53
rmalik8 16:5250c9fe0408 54 //fill array with 5 values
rmalik8 15:827fbc2e07d6 55 index++;
rmalik8 15:827fbc2e07d6 56 if (index > 4)
rmalik8 15:827fbc2e07d6 57 {
rmalik8 15:827fbc2e07d6 58 index = 0;
rmalik8 15:827fbc2e07d6 59 }
rmalik8 15:827fbc2e07d6 60
rmalik8 16:5250c9fe0408 61 //check if all the values are zero
rmalik8 15:827fbc2e07d6 62 allZero = true;
rmalik8 15:827fbc2e07d6 63 for (int i = 0; i < 5; i++){
rmalik8 15:827fbc2e07d6 64 if (values[i] != 0)
rmalik8 15:827fbc2e07d6 65 {
rmalik8 15:827fbc2e07d6 66 allZero = false;
rmalik8 15:827fbc2e07d6 67 }
rmalik8 15:827fbc2e07d6 68 }
rmalik8 12:bebfef8d229f 69 //printf("Sonar Distance:\r\n %d", sdist);
mmarine3 9:f4f03767acc0 70 }
rmalik8 4:7d02b3f3bee6 71
mmarine3 9:f4f03767acc0 72 ultrasonic mu(p30, p29, .1, 1, &sonar); //Set the trigger pin to p30 and the echo pin to p29
rmalik8 12:bebfef8d229f 73 //have updates every .1 seconds and a timeout after 1
rmalik8 12:bebfef8d229f 74 //second, and call sonar when the distance changes
mmarine3 9:f4f03767acc0 75
mmarine3 9:f4f03767acc0 76 void Sonar(void const* arguments)
mmarine3 9:f4f03767acc0 77 {
mmarine3 9:f4f03767acc0 78 mu.startUpdates();//start measuring the distance
rmalik8 12:bebfef8d229f 79 while(1) {
mmarine3 9:f4f03767acc0 80 //Do something else here
mmarine3 9:f4f03767acc0 81 mu.checkDistance(); //call checkDistance() as much as possible, as this is where
rmalik8 12:bebfef8d229f 82 //the class checks if dist needs to be called.
mmarine3 9:f4f03767acc0 83 Thread::wait(10);
rmalik8 4:7d02b3f3bee6 84 }
rmalik8 4:7d02b3f3bee6 85 }
mmarine3 2:1ec843c95914 86
mmarine3 8:c0a6a3363e43 87 //Thread to print the TOF and Sonar Values to the LCD
mmarine3 8:c0a6a3363e43 88 void LCD(void const *arguments)
mmarine3 8:c0a6a3363e43 89 {
mmarine3 8:c0a6a3363e43 90 Thread::wait(1000); //Wait for lidar and sonar setup
rmalik8 12:bebfef8d229f 91 serial_mutex.lock();
rmalik8 12:bebfef8d229f 92 uLCD.cls();
rmalik8 12:bebfef8d229f 93 uLCD.baudrate(BAUD_3000000);
rmalik8 12:bebfef8d229f 94 serial_mutex.unlock();
rmalik8 12:bebfef8d229f 95 while(1) {
rmalik8 10:7a939a54515e 96 serial_mutex.lock();
mmarine3 8:c0a6a3363e43 97 uLCD.cls();
mmarine3 8:c0a6a3363e43 98 dist.lock();
rmalik8 12:bebfef8d229f 99 uLCD.printf("Sonar Distance:\n %d", sdist);
mmarine3 8:c0a6a3363e43 100 dist.unlock();
rmalik8 10:7a939a54515e 101 serial_mutex.unlock();
mmarine3 8:c0a6a3363e43 102 Thread::wait(1000); //Allow time to read value before reprint
rmalik8 12:bebfef8d229f 103
rmalik8 12:bebfef8d229f 104 }
rmalik8 12:bebfef8d229f 105 }
rmalik8 12:bebfef8d229f 106
rmalik8 12:bebfef8d229f 107 void sounds(void const *arguments)
rmalik8 12:bebfef8d229f 108 {
rmalik8 12:bebfef8d229f 109 int last_counter = 0;
rmalik8 12:bebfef8d229f 110 // setup instance of new SongPlayer class, mySpeaker using pin 26
rmalik8 12:bebfef8d229f 111 // the pin must be a PWM output pin
rmalik8 12:bebfef8d229f 112 SongPlayer mySpeaker(p26);
rmalik8 12:bebfef8d229f 113 // Start song and return once playing starts
rmalik8 12:bebfef8d229f 114 //mySpeaker.PlaySong(note1,duration);
rmalik8 12:bebfef8d229f 115 while(1) {
rmalik8 12:bebfef8d229f 116 if (counter > last_counter) {
rmalik8 12:bebfef8d229f 117 switch (musicChoice) {
rmalik8 12:bebfef8d229f 118 case '0':
rmalik8 12:bebfef8d229f 119 //do nothing
rmalik8 12:bebfef8d229f 120 break;
rmalik8 12:bebfef8d229f 121 case '1':
rmalik8 12:bebfef8d229f 122 mySpeaker.PlaySong(note1,duration);
rmalik8 12:bebfef8d229f 123 break;
rmalik8 12:bebfef8d229f 124 case '2':
rmalik8 12:bebfef8d229f 125 mySpeaker.PlaySong(note2,duration);
rmalik8 12:bebfef8d229f 126 break;
rmalik8 12:bebfef8d229f 127 case '3':
rmalik8 12:bebfef8d229f 128 mySpeaker.PlaySong(note3,duration);
rmalik8 12:bebfef8d229f 129 break;
rmalik8 12:bebfef8d229f 130 default:
rmalik8 12:bebfef8d229f 131 break;
rmalik8 12:bebfef8d229f 132 }
rmalik8 12:bebfef8d229f 133 }
rmalik8 12:bebfef8d229f 134 last_counter = counter;
rmalik8 12:bebfef8d229f 135 Thread::wait(100);
mmarine3 8:c0a6a3363e43 136 }
mmarine3 8:c0a6a3363e43 137 }
mmarine3 8:c0a6a3363e43 138
rmalik8 10:7a939a54515e 139 void bluetooth(void const *arguments)
rmalik8 10:7a939a54515e 140 {
rmalik8 10:7a939a54515e 141 char bnum=0;
rmalik8 10:7a939a54515e 142 char bhit=0;
rmalik8 12:bebfef8d229f 143 while(1) {
rmalik8 10:7a939a54515e 144 serial_mutex.lock();
rmalik8 12:bebfef8d229f 145 if(!blue.readable()) {
rmalik8 12:bebfef8d229f 146 Thread::yield();
rmalik8 10:7a939a54515e 147 } else {
rmalik8 12:bebfef8d229f 148 if (blue.getc()=='!') {
rmalik8 12:bebfef8d229f 149 if (blue.getc()=='B') { //button data packet
rmalik8 12:bebfef8d229f 150 bnum = blue.getc(); //button number
rmalik8 12:bebfef8d229f 151 bhit = blue.getc(); //1=hit, 0=release
rmalik8 12:bebfef8d229f 152 if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
rmalik8 12:bebfef8d229f 153
rmalik8 12:bebfef8d229f 154 switch (bnum) {
rmalik8 12:bebfef8d229f 155 case '1': //number button 1
rmalik8 12:bebfef8d229f 156 if (bhit=='1') {
rmalik8 12:bebfef8d229f 157 musicChoice = 0;
rmalik8 12:bebfef8d229f 158 } else {
rmalik8 12:bebfef8d229f 159 //add release code here
rmalik8 12:bebfef8d229f 160 }
rmalik8 12:bebfef8d229f 161 break;
rmalik8 12:bebfef8d229f 162 case '2': //number button 2
rmalik8 12:bebfef8d229f 163 if (bhit=='1') {
rmalik8 12:bebfef8d229f 164 musicChoice = 1;
rmalik8 12:bebfef8d229f 165 } else {
rmalik8 12:bebfef8d229f 166 //add release code here
rmalik8 12:bebfef8d229f 167 }
rmalik8 12:bebfef8d229f 168 break;
rmalik8 12:bebfef8d229f 169 case '3': //number button 3
rmalik8 12:bebfef8d229f 170 if (bhit=='1') {
rmalik8 12:bebfef8d229f 171 musicChoice = 2;
rmalik8 12:bebfef8d229f 172 } else {
rmalik8 12:bebfef8d229f 173 //add release code here
rmalik8 12:bebfef8d229f 174 }
rmalik8 12:bebfef8d229f 175 break;
rmalik8 12:bebfef8d229f 176 case '4': //number button 4
rmalik8 12:bebfef8d229f 177 if (bhit=='1') {
rmalik8 12:bebfef8d229f 178 //add hit code here
rmalik8 12:bebfef8d229f 179 } else {
rmalik8 12:bebfef8d229f 180 //add release code here
rmalik8 12:bebfef8d229f 181 }
rmalik8 12:bebfef8d229f 182 break;
rmalik8 12:bebfef8d229f 183 case '5': //button 5 up arrow
rmalik8 12:bebfef8d229f 184 if (bhit=='1') {
rmalik8 12:bebfef8d229f 185 musicChoice = 3;
rmalik8 12:bebfef8d229f 186 } else {
rmalik8 12:bebfef8d229f 187 //add release code here
rmalik8 12:bebfef8d229f 188 }
rmalik8 12:bebfef8d229f 189 break;
rmalik8 12:bebfef8d229f 190 case '6': //button 6 down arrow
rmalik8 12:bebfef8d229f 191 if (bhit=='1') {
rmalik8 12:bebfef8d229f 192 //add hit code here
rmalik8 12:bebfef8d229f 193 } else {
rmalik8 12:bebfef8d229f 194 //add release code here
rmalik8 12:bebfef8d229f 195 }
rmalik8 12:bebfef8d229f 196 break;
rmalik8 12:bebfef8d229f 197 case '7': //button 7 left arrow
rmalik8 12:bebfef8d229f 198 if (bhit=='1') {
rmalik8 12:bebfef8d229f 199 //add hit code here
rmalik8 12:bebfef8d229f 200 } else {
rmalik8 12:bebfef8d229f 201 //add release code here
rmalik8 12:bebfef8d229f 202 }
rmalik8 12:bebfef8d229f 203 break;
rmalik8 12:bebfef8d229f 204 case '8': //button 8 right arrow
rmalik8 12:bebfef8d229f 205 if (bhit=='1') {
rmalik8 12:bebfef8d229f 206 //add hit code here
rmalik8 12:bebfef8d229f 207 } else {
rmalik8 12:bebfef8d229f 208 //add release code here
rmalik8 12:bebfef8d229f 209 }
rmalik8 12:bebfef8d229f 210 break;
rmalik8 12:bebfef8d229f 211 default:
rmalik8 12:bebfef8d229f 212 break;
rmalik8 12:bebfef8d229f 213 }
rmalik8 10:7a939a54515e 214 }
rmalik8 10:7a939a54515e 215 }
rmalik8 10:7a939a54515e 216 }
rmalik8 10:7a939a54515e 217 }
rmalik8 10:7a939a54515e 218 serial_mutex.unlock();
rmalik8 10:7a939a54515e 219 }
rmalik8 10:7a939a54515e 220 }
rmalik8 10:7a939a54515e 221
mmarine3 2:1ec843c95914 222 int main()
mmarine3 2:1ec843c95914 223 {
rmalik8 12:bebfef8d229f 224
mmarine3 7:85d42006e380 225 //wait(1.0);
mmarine3 7:85d42006e380 226
mmarine3 7:85d42006e380 227 //blu.attach(&parse_message,Serial::RxIrq);
rmalik8 12:bebfef8d229f 228 //Was used in lab 3 to interupt if reading in a blutooth command
mmarine3 7:85d42006e380 229 //Thread t#(name_of_thread_function);
mmarine3 8:c0a6a3363e43 230 Thread t1(LCD);//Initialize LCD thread
mmarine3 9:f4f03767acc0 231 Thread t2(Sonar);//Initialize Sonar thread
rmalik8 14:88c09f96bdda 232 Thread t3(sounds);//Initialize sound thread
rmalik8 14:88c09f96bdda 233 Thread t4(bluetooth);//Initialize bluetooth thread
rmalik8 12:bebfef8d229f 234
rmalik8 12:bebfef8d229f 235
mmarine3 8:c0a6a3363e43 236 /* //Code to read and play a file
mmarine3 7:85d42006e380 237 FILE *wave_file;
mmarine3 7:85d42006e380 238 //printf("Hello World");
mmarine3 7:85d42006e380 239 Thread::wait(1000);
mmarine3 7:85d42006e380 240 wave_file=fopen("/sd/test.wav","r");
mmarine3 7:85d42006e380 241 //serial_mutex.lock();
mmarine3 7:85d42006e380 242 if(wave_file==NULL) printf("file open error!\n\n\r");
mmarine3 7:85d42006e380 243 //serial_mutex.unlock();
mmarine3 7:85d42006e380 244 waver.play(wave_file);
mmarine3 7:85d42006e380 245 fclose(wave_file);
mmarine3 8:c0a6a3363e43 246 */
rmalik8 12:bebfef8d229f 247
mmarine3 8:c0a6a3363e43 248 //Loop to validate the main loop is executing
rmalik8 12:bebfef8d229f 249 while(1) {
rmalik8 15:827fbc2e07d6 250
rmalik8 15:827fbc2e07d6 251 //this 'state machine' should make sure that individuals are only counted once
rmalik8 15:827fbc2e07d6 252 if ((state != 1) && !allZero){
rmalik8 15:827fbc2e07d6 253 state = 1;
rmalik8 15:827fbc2e07d6 254 //do logic to figure out direction
rmalik8 15:827fbc2e07d6 255 //right now just adding to main counter
rmalik8 15:827fbc2e07d6 256 counter++;
rmalik8 15:827fbc2e07d6 257 }
rmalik8 15:827fbc2e07d6 258 if (state == 1 && allZero){
rmalik8 15:827fbc2e07d6 259 state = 0;
rmalik8 15:827fbc2e07d6 260 }
mmarine3 9:f4f03767acc0 261 //MyLED = !MyLED;
rmalik8 15:827fbc2e07d6 262 Thread::wait(100);
mmarine3 8:c0a6a3363e43 263 }
mmarine3 2:1ec843c95914 264 }