People Counter / Mbed 2 deprecated person_counter

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

Committer:
rmalik8
Date:
Sun Apr 26 04:16:17 2020 +0000
Revision:
15:827fbc2e07d6
Parent:
14:88c09f96bdda
Child:
16:5250c9fe0408
hopefully added logic to increment counter when individuals are in front of the sensor. It should only count individuals once.

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