![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
update
Dependencies: 4DGL-uLCD-SE mbed-rtos mbed wave_player
Fork of Lab3 by
Part2.cpp
- Committer:
- aismail1997
- Date:
- 2016-10-13
- Revision:
- 0:8af0a4200bd0
- Child:
- 1:3af15e979565
File content as of revision 0:8af0a4200bd0:
#include "mbed.h" #include "rtos.h" #include "uLCD_4DGL.h" #include "SDFileSystem.h" #include "wave_player.h" #include <mpr121.h> // mutex to make the lcd lib thread safe Mutex lcd_mutex; //SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card //AnalogOut speaker(p26); //wave_player waver(&speaker); uLCD_4DGL uLCD(p28,p27,p30); // serial tx, serial rx, reset pin; //BusIn joy(p15,p12,p13,p16); BusOut leds(LED1,LED2,LED3,LED4); DigitalIn joyfire(p14); // Shiftbrite stuff DigitalOut latch(p15); DigitalOut enable(p16); SPI spi(p11, p12, p13); // Create the interrupt receiver object on pin 26 InterruptIn interrupt(p26); // Setup the i2c bus on pins 9 and 10 I2C i2c(p9, p10); // Setup the Mpr121: // constructor(i2c object, i2c address of the mpr121) Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); DigitalOut led1(LED1); DigitalOut led2(LED2); DigitalOut led3(LED3); DigitalOut led4(LED4); // global variables int light = 0; // to keep track of lighting int sound = 0; // to keep track of sound // led lights //int red; //int green; //int blue; //AnalogIn photocell(p15); PwmOut myled(LED1); class microphone { public : microphone(PinName pin); float read(); operator float (); private : AnalogIn _pin; }; microphone::microphone (PinName pin): _pin(pin) { } float microphone::read() { return _pin.read(); } inline microphone::operator float () { return _pin.read(); } //microphone mymicrophone(p16); void RGB_LED(int red, int green, int blue) { unsigned int low_color=0; unsigned int high_color=0; high_color=(blue<<4)|((red&0x3C0)>>6); low_color=(((red&0x3F)<<10)|(green)); spi.write(high_color); spi.write(low_color); latch=1; latch=0; } // create threads // first thread dealing with LCD void LCD_thread1(void const *args) { while(true) { // thread loop lcd_mutex.lock(); if (light == 0 && sound == 1) { // display red siren uLCD.filled_circle(SIZE_X/2, SIZE_Y/2, 10, RED); uLCD.filled_rectangle(SIZE_X/2 - 10, SIZE_Y/2, SIZE_X/2 + 10, SIZE_Y/2 + 30, RED); } else if (light == 1 ) { // display white siren uLCD.filled_circle(SIZE_X/2, SIZE_Y/2, 10, WHITE); uLCD.filled_rectangle(SIZE_X/2 - 10, SIZE_Y/2, SIZE_X/2 + 10, SIZE_Y/2 + 30, WHITE); } else if (light == 2 && sound == 1) { // display blue siren uLCD.filled_circle(SIZE_X/2, SIZE_Y/2, 10, BLUE); uLCD.filled_rectangle(SIZE_X/2 - 10, SIZE_Y/2, SIZE_X/2 + 10, SIZE_Y/2 + 30, BLUE); } lcd_mutex.unlock(); Thread::wait(5); // wait till thread is done } } // second thread dealing with LCD void LCD_thread2(void const *args) { while(true) { // thread loop lcd_mutex.lock(); if (sound == 1) { // some indication there is audio // text saying "!ALERT!" uLCD.color(0xFF0000); uLCD.locate(6,1); uLCD.set_font_size(7, 7); uLCD.printf("!ALERT !"); } else if (sound == 0) { uLCD.color(0x000000); uLCD.locate(6,1); uLCD.set_font_size(7, 7); uLCD.printf("!ALERT !"); // no indication // text removed } lcd_mutex.unlock(); Thread::wait(5); // wait till thread is done } } // thread dealing with speaker void speaker_thread(void const *args) { /* FILE *wave_file; wave_file = fopen("/sd/police_siren.wav","r"); // play siren while(true) { // thread loop sound = 1; //wait(5); waver.play(wave_file); // generate a 500Hz tone using PWM hardware output //speaker.period(1.0/500.0); // 500hz period //speaker =0.5; //50% duty cycle - max volume //wait(3); //speaker=0.0; // turn off audio //wait(2); speaker = 0; wait(5); Thread::wait(1000); // wait 1s //speaker=0.0; // off } //Thread::wait(100); // wait 1s fclose(wave_file);*/ } // thread reading from - ultrasonic sensor to do XYZ // thread reading from - tactile switch to control RGB/sound/lcd void switchthread(void const *args) { while(true) { // thread loop /* if (joyfire) { leds = 0xf; } else { leds = joy; } Thread::wait(1000); // wait 0.25s*/ } } // thread reading from - touch keypad same void touchpad_thread(void const *args) { while(true) { // thread loop int key_code=0; int i=0; int value=mpr121.read(0x00); value +=mpr121.read(0x01)<<8; // LED demo mod i=0; // puts key number out to LEDs for demo for (i=0; i<12; i++) { if (((value>>i)&0x01)==1) key_code=i+1; } led4=key_code & 0x01; led3=(key_code>>1) & 0x01; led2=(key_code>>2) & 0x01; led1=(key_code>>3) & 0x01; Thread::wait(1000); // wait 0.25s } } // thread reading from - light sensor to do something void lightsensor_thread(void const *args) { while(true) { // thread loop /* myled = photocell; wait(0.1); Thread::wait(1000); // wait 0.25s*/ } } // thread reading from - microphone to control rgb void mic_thread(void const *args) { /* while(true) { // thread loop //read in, subtract 0.67 DC bias, take absolute value, and scale up .1Vpp to 15 for builtin LED display leds = int(abs((mymicrophone - (0.67/3.3)))*500.0); //Use an 8kHz audio sample rate (phone quality audio); wait(1.0/8000.0); Thread::wait(1000); // wait 0.25s }*/ } int main() { //uLCD.cls(); wait(1); // shiftbrite stuff int red=0; int green=0; int blue=0; spi.format(16,0); spi.frequency(500000); enable=0; latch=0; wait(2); // draw police car base // call threads here Thread t1(LCD_thread1); //start thread1 Thread t2(LCD_thread2); //start thread2 //Thread t4(speaker_thread); //start thread4 //Thread t5(switchthread); //start thread5 //Thread t6(touchpad_thread); //start thread6 //Thread t7(lightsensor_thread); //start thread7 //Thread t8(mic_thread); //start thread8 while(1) { if (sound == 0) { RGB_LED(0,0,0); //Thread::wait(500); } else { light = 0; red = 200; // flash red light green = 0; blue = 0; RGB_LED(red, green, blue); wait(0.5); RGB_LED(0,0,0); wait(0.5); light = 1; red = 200; // flash white light green = 200; blue = 200; RGB_LED( red, green, blue); wait(0.5); RGB_LED(0,0,0); wait(0.5); light = 2; red = 0; // flash blue light green = 0; blue = 200; RGB_LED( red, green, blue); wait(0.5); RGB_LED(0,0,0); wait(0.5); light = 1; red = 200; // flash white light green = 200; blue = 200; RGB_LED( red, green, blue); wait(0.5); RGB_LED(0,0,0); } Thread::wait(500); } }