Bouncing Betty Halloween Prop. A prop skull mounted with an mbed microcontroller armed to scare anyone who comes close to it. This project uses an infrared sonar, speaker, and, shiftbrite LEDs.
Dependencies: mbed wave_player
Diff: main.cpp
- Revision:
- 0:92661f51fe68
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Oct 27 07:19:10 2011 +0000 @@ -0,0 +1,160 @@ +// Bouncing Betty Halloween Effect +// By: Michael Fischler +// Residence Hall Association 2011-2012 + +#include "mbed.h" // Built for Mbed NXP LPC1768 Microprocessor +#include "PowerControl/PowerControl.h" // for power mgmt +#include "PowerControl/EthernetPowerControl.h" // for power mgmt +#include "wave_player.h" // for speakers +#define USR_POWERDOWN (0x104) +int semihost_powerdown() { + uint32_t arg; + return __semihost(USR_POWERDOWN, &arg); +} + +DigitalOut latch1(p15); // Latch on RGB LED 1 +DigitalOut enable1(p16); // Enable on RGB LED 1 +SPI spi1(p11, p12, p13); // SPI for RGB LED 1 + +DigitalOut latch2(p8); // Latch on RGB LED 2 +DigitalOut enable2(p9); // Enable on RGB LED 2 +SPI spi2(p5, p6, p7); // SPI for RGB LED 2 + +AnalogOut DACout(p18); +wave_player waver(&DACout); + +AnalogIn sonar(p20); // Sonar Input +DigitalIn pushbutton(p24); // Pushbutton Input + +DigitalOut wdtLED(LED4);//WatchDog Indicator + +LocalFileSystem local("local"); + +float distance; // distance for sonar analog input +float j = 0; // Alternate Variable for Blue/Green +bool j_increase = 1; // Direction of Blue/Green Alternating + +class Watchdog { +public: +// Load timeout value in watchdog timer and enable + void kick(float s) { + LPC_WDT->WDCLKSEL = 0x1; // Set CLK src to PCLK + uint32_t clk = SystemCoreClock / 16; // WD has a fixed /4 prescaler, PCLK default is /4 + LPC_WDT->WDTC = s * (float)clk; + LPC_WDT->WDMOD = 0x3; // Enabled and Reset + kick(); + } +// "kick" or "feed" the dog - reset the watchdog timer +// by writing this required bit pattern + void kick() { + LPC_WDT->WDFEED = 0xAA; + LPC_WDT->WDFEED = 0x55; + } +}; + +Watchdog wdt; + +void RGB_LED(int red1, int green1, int blue1, int red2, int green2, int blue2) { //Use SPI hardware to write color values to LED driver chip + unsigned int low_color1=0; + unsigned int high_color1=0; + unsigned int low_color2=0; + unsigned int high_color2=0; + high_color1=(blue1<<4)|((red1&0x3C0)>>6); + low_color1=(((red1&0x3F)<<10)|(green1)); + high_color2=(blue2<<4)|((red2&0x3C0)>>6); + low_color2=(((red2&0x3F)<<10)|(green2)); + spi1.write(high_color1); + spi1.write(low_color1); + spi2.write(high_color2); + spi2.write(low_color2); + latch1=1; + latch2=1; + wait(0.1); + latch1=0; + latch2=0; +} + +void RGB_LED1(int red1, int green1, int blue1) { //Use SPI hardware to write color values to LED driver chip + unsigned int low_color1=0; + unsigned int high_color1=0; + high_color1=(blue1<<4)|((red1&0x3C0)>>6); + low_color1=(((red1&0x3F)<<10)|(green1)); + spi1.write(high_color1); + spi1.write(low_color1); + latch1=1; + wait(0.1); + latch1=0; +} + +void RGB_LED2(int red2, int green2, int blue2) { //Use SPI hardware to write color values to LED driver chip + unsigned int low_color2=0; + unsigned int high_color2=0; + high_color2=(blue2<<4)|((red2&0x3C0)>>6); + low_color2=(((red2&0x3F)<<10)|(green2)); + spi2.write(high_color2); + spi2.write(low_color2); + latch2=1; + wait(0.1); + latch2=0; +} + +int main() { + + int result = 0; + if ((LPC_WDT->WDMOD >> 2) & 1) + wdtLED = 1; + else wdtLED = 0; + + // 30 second timeout on watchdog timer hardware + wdt.kick(10.0); + + //Power Management + PHY_PowerDown(); // Power Down Ethernet + result = semihost_powerdown(); // Power Down USB Interface Chip (blue status LED) + + + + pushbutton.mode(PullUp); + spi1.format(16,0); + spi1.frequency(500000); + spi2.format(16,0); + spi2.frequency(500000); + enable1=0; + latch1=0; + enable2=0; + latch2=0; + wait(2); + + RGB_LED(50,50,50,50,50,50); + + wait(5); + + while (1) { + //Analog Input + distance = 11.261/sonar; //0.4 (80cm) to 0.98 (6cm) + + if ((distance < 40)||(pushbutton == 0)) { + FILE *wave_file; // create pointer + wave_file = fopen("/local/scream.wav","r"); // Open wave file + RGB_LED(50,0,0,50,0,0); // LEDS to Red + waver.play(wave_file); // Play Sound + fclose(wave_file); // Close File + } else { + if (j_increase) { + j = j + 2; + if (j > 48) { + j_increase = 0; + } + } else { + j=j - 2; + if (j < 2) { + j_increase = 1; + } + } + RGB_LED(0,50-j,j,0,50-j,j); // Fade between blue and green + + } + wdt.kick(); + } + +}