Mercurial > code > home > repos > homeauto
view service/bedroomArduino/bed/bed.pde @ 37:8e55a6a9c425
add shiftbrites to bedroom arduino
Ignore-this: c0ce65f20b52679af58b9e31bcc3cf2e
author | drewp@bigasterisk.com |
---|---|
date | Sat, 25 Aug 2012 14:20:45 -0700 |
parents | 5fef0b7db346 |
children |
line wrap: on
line source
/* board is like a diecimila '168 shopping: volume knob 4x http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_776386_-1 pretty metal button 4x http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_2131274_-1 music selector http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_317850_-1 alarm check green button 1x http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_315678_-1 similar red: http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_315660_-1 similar black: http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_315651_-1 illuminated red: http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_315820_-1 momentary on/on switch for lighting or audio selector 2x http://www.jameco.com/webapp/wcs/stores/servlet/ProductDisplay?langId=-1&sub_attr_name=Switch+Configuration&position=1&productId=317252&catalogId=10001&refineType=1&refineValue=%28ON%29-OFF-%28ON%29&storeId=10001&refine=1&history=22t4lgkv%7CsubCategoryName%7ESwitches%5Ecategory%7E3540%5EcategoryName%7Ecat_35%5EprodPage%7E50%5Epage%7ESEARCH%252BNAV%40f2zj2rdd%7Ccategory%7E354070%5EcategoryName%7Ecat_3540%5Eposition%7E1%5Erefine%7E1%5EsubCategoryName%7ESwitches%2B%252F%2BToggle%5EprodPage%7E50%5Epage%7ESEARCH%252BNAV&ddkey=http:StoreCatalogDrillDownView demultiplexer http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_894024_-1 http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_12909_-1 stereo out jack 4x http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_2095437_-1 audio switch relay http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_139977_-1 need two channels of relay or ssr for audio PIR reset switch motion music volume knob, maybe two of them on each side of the bed alarm check drive the rgb leds switch the main speakers or just pillow speaker Control corner light and red ball light Alternate light switch at door and repeated at each side of the bed */ #define SWITCH_X 3 #define SWITCH_Y 4 #define SWITCH_SELECT_A 7 #define SWITCH_SELECT_B 9 #define SWITCH_SELECT_C 8 #define SPEAKER_CHOICE 13 #define SHIFTBRITE_L 5 #define SHIFTBRITE_D 11 #define SHIFTBRITE_C 12 unsigned long SB_CommandPacket; int SB_CommandMode; int SB_BlueCommand; int SB_RedCommand; int SB_GreenCommand; #define LEDCHANS 5 int vals[LEDCHANS * 3]; #define SHIFT(val) shiftOut(SHIFTBRITE_D, SHIFTBRITE_C, MSBFIRST, val) void SB_SendPacket() { SB_CommandPacket = SB_CommandMode & B11; SB_CommandPacket = (SB_CommandPacket << 10) | (SB_BlueCommand & 1023); SB_CommandPacket = (SB_CommandPacket << 10) | (SB_RedCommand & 1023); SB_CommandPacket = (SB_CommandPacket << 10) | (SB_GreenCommand & 1023); SHIFT(SB_CommandPacket >> 24); SHIFT(SB_CommandPacket >> 16); SHIFT(SB_CommandPacket >> 8); SHIFT(SB_CommandPacket); } void latch() { delayMicroseconds(100); digitalWrite(SHIFTBRITE_L, HIGH); // latch data into registers delayMicroseconds(100); digitalWrite(SHIFTBRITE_L, LOW); } void refresh() { /* send all pixels */ SB_CommandMode = B00; for (int pixel=0; pixel < LEDCHANS; pixel++) { SB_RedCommand = vals[pixel * 3 + 0]; SB_GreenCommand = vals[pixel * 3 + 1]; SB_BlueCommand = vals[pixel * 3 + 2]; SB_SendPacket(); } latch(); } void setCurrent(unsigned char r, unsigned char g, unsigned char b) { /* 127 = max */ SB_CommandMode = B01; // Write to current control registers SB_RedCommand = r; SB_GreenCommand = g; SB_BlueCommand = b; SB_SendPacket(); latch(); } void setup() { pinMode(2, INPUT); digitalWrite(2, LOW); // PIR sensor DC-SS015 from http://www.gadgettown.com/Pyroelectric-Infrared-PIR-Motion-Sensor-Detector-Module-E2013.html but that didn't work well, so I got one from dealextreme that does. It's on analog 4 right now, not D2. pinMode(SWITCH_X, INPUT); digitalWrite(SWITCH_X, LOW); pinMode(SWITCH_Y, INPUT); digitalWrite(SWITCH_Y, LOW); pinMode(SWITCH_SELECT_A, OUTPUT); pinMode(SWITCH_SELECT_B, OUTPUT); pinMode(SWITCH_SELECT_C, OUTPUT); pinMode(SPEAKER_CHOICE, OUTPUT); pinMode(SHIFTBRITE_L, OUTPUT); pinMode(SHIFTBRITE_D, OUTPUT); pinMode(SHIFTBRITE_C, OUTPUT); for (int i=0; i < LEDCHANS; i++) { setCurrent(127, 127, 127); } Serial.begin(115200); } #define setSelect(a,b,c) \ digitalWrite(SWITCH_SELECT_A, a); \ digitalWrite(SWITCH_SELECT_B, b); \ digitalWrite(SWITCH_SELECT_C, c); void loop() { unsigned char head, cmd, arg, i; if (Serial.available() >= 3) { head = Serial.read(); if (head != 0x60) { Serial.flush(); return; } cmd = Serial.read(); arg = Serial.read(); Serial.flush(); if (cmd == 0x00) { Serial.print("{\"ok\":true}\n"); } else if (cmd == 0x01) { // poll Serial.print("{\"motion\":"); Serial.print(analogRead(4)); #define printXy \ Serial.print(digitalRead(SWITCH_X)); \ Serial.print(","); \ Serial.print(digitalRead(SWITCH_Y)); \ Serial.print(", \"spkrL\":["); setSelect(0,0,0); delay(2); printXy Serial.print("], \"volR\":["); setSelect(1,0,0); delay(2); printXy Serial.print("], \"lightL\":["); setSelect(0,1,0); delay(2); printXy Serial.print("], \"lightR\":["); setSelect(1,1,0); delay(2); printXy Serial.print("], \"volL\":["); setSelect(0,0,1); delay(2); printXy Serial.print("], \"alarmCheck\":"); setSelect(1,1,1); Serial.print(digitalRead(SWITCH_X)); Serial.print(", \"door\":"); Serial.print(digitalRead(SWITCH_Y)); Serial.print(",\"led\":\"v2\"}\n"); } else if (cmd == 0x02) { // speaker digitalWrite(SPEAKER_CHOICE, arg); Serial.print("{\"speakerChoice\":"); Serial.print((int)arg); Serial.print("}\n"); } else if (cmd == 0x03) { // set leds. arg is the number of data bytes coming while (arg--) { while (Serial.available() < 1) NULL; SHIFT(Serial.read()); } latch(); Serial.print("{\"ok\":1}\n"); } } }