Xbee-Smart-Home-Inside RX Test
Dependencies: Si7021 mbed-rtos JPEGCamera mbed
Fork of Xbee-Smart-Home-Inside by
main.cpp@6:6a43e2fdb8aa, 2017-05-02 (annotated)
- Committer:
- pkoirala3
- Date:
- Tue May 02 20:39:15 2017 +0000
- Revision:
- 6:6a43e2fdb8aa
- Parent:
- 5:81a1920e5f3d
- Child:
- 7:fdfe30cea3c2
Final Version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pkoirala3 | 1:e9068d048f58 | 1 | #include "mbed.h" |
pkoirala3 | 1:e9068d048f58 | 2 | #include "rtos.h" |
pkoirala3 | 1:e9068d048f58 | 3 | #include "JPEGCamera.h" |
pkoirala3 | 3:415ccd1f7ae1 | 4 | #include "Si7021.h" |
pkoirala3 | 3:415ccd1f7ae1 | 5 | #include "mpr121.h" |
pkoirala3 | 6:6a43e2fdb8aa | 6 | #include "math.h" |
pkoirala3 | 1:e9068d048f58 | 7 | |
pkoirala3 | 3:415ccd1f7ae1 | 8 | Serial xbee(p9, p10); |
pkoirala3 | 3:415ccd1f7ae1 | 9 | Serial pc(USBTX, USBRX); |
pkoirala3 | 6:6a43e2fdb8aa | 10 | JPEGCamera camera(p13, p14); // RED, Brown, pwr: Gray, gnd: Purple |
pkoirala3 | 6:6a43e2fdb8aa | 11 | LocalFileSystem local("local"); //save images on mbed |
pkoirala3 | 6:6a43e2fdb8aa | 12 | |
pkoirala3 | 3:415ccd1f7ae1 | 13 | DigitalOut rst1(p8); |
pkoirala3 | 6:6a43e2fdb8aa | 14 | |
pkoirala3 | 4:df159b3382e3 | 15 | AnalogIn ambient(p16); |
pkoirala3 | 6:6a43e2fdb8aa | 16 | PwmOut light(p21); |
pkoirala3 | 3:415ccd1f7ae1 | 17 | Si7021 tempHum(p28, p27); |
pkoirala3 | 0:5b1386641010 | 18 | |
pkoirala3 | 6:6a43e2fdb8aa | 19 | InterruptIn interrupt(p26); |
pkoirala3 | 6:6a43e2fdb8aa | 20 | I2C i2c(p28, p27); // Note here we don't need PullsUp coz Si7021 board has |
pkoirala3 | 6:6a43e2fdb8aa | 21 | Mpr121 mpr121(&i2c, Mpr121::ADD_VSS); |
pkoirala3 | 6:6a43e2fdb8aa | 22 | |
pkoirala3 | 6:6a43e2fdb8aa | 23 | AnalogIn photocell(p15); |
pkoirala3 | 6:6a43e2fdb8aa | 24 | |
pkoirala3 | 3:415ccd1f7ae1 | 25 | DigitalOut led1(LED1); |
pkoirala3 | 3:415ccd1f7ae1 | 26 | DigitalOut led2(LED2); |
pkoirala3 | 6:6a43e2fdb8aa | 27 | DigitalOut led3(LED3); |
pkoirala3 | 6:6a43e2fdb8aa | 28 | DigitalOut led4(LED4); |
pkoirala3 | 6:6a43e2fdb8aa | 29 | |
pkoirala3 | 6:6a43e2fdb8aa | 30 | int Nums[4] = {0,0,0,0}; |
pkoirala3 | 6:6a43e2fdb8aa | 31 | int counter = 0; |
pkoirala3 | 6:6a43e2fdb8aa | 32 | int attempts = 0; |
pkoirala3 | 0:5b1386641010 | 33 | |
pkoirala3 | 3:415ccd1f7ae1 | 34 | char outBuffer[50]; |
pkoirala3 | 6:6a43e2fdb8aa | 35 | volatile char inBuffer; |
pkoirala3 | 6:6a43e2fdb8aa | 36 | volatile bool lightOnOff = true; |
pkoirala3 | 3:415ccd1f7ae1 | 37 | volatile bool requestIn = false; |
pkoirala3 | 5:81a1920e5f3d | 38 | volatile bool intrusion = false; |
pkoirala3 | 6:6a43e2fdb8aa | 39 | volatile bool unlockstatus = false; |
pkoirala3 | 6:6a43e2fdb8aa | 40 | volatile float photoval = 0.0; |
pkoirala3 | 6:6a43e2fdb8aa | 41 | int fileIndex = 0; |
pkoirala3 | 0:5b1386641010 | 42 | |
pkoirala3 | 3:415ccd1f7ae1 | 43 | Thread t1; |
pkoirala3 | 5:81a1920e5f3d | 44 | Thread t2; |
pkoirala3 | 0:5b1386641010 | 45 | |
pkoirala3 | 3:415ccd1f7ae1 | 46 | void getcommand() |
pkoirala3 | 3:415ccd1f7ae1 | 47 | { |
pkoirala3 | 3:415ccd1f7ae1 | 48 | while(1) { |
pkoirala3 | 3:415ccd1f7ae1 | 49 | if(xbee.readable()) { |
pkoirala3 | 3:415ccd1f7ae1 | 50 | inBuffer = xbee.getc(); |
pkoirala3 | 3:415ccd1f7ae1 | 51 | requestIn = true; |
pkoirala3 | 3:415ccd1f7ae1 | 52 | } |
pkoirala3 | 3:415ccd1f7ae1 | 53 | Thread::wait(1000); |
pkoirala3 | 3:415ccd1f7ae1 | 54 | } |
pkoirala3 | 1:e9068d048f58 | 55 | } |
pkoirala3 | 1:e9068d048f58 | 56 | |
pkoirala3 | 3:415ccd1f7ae1 | 57 | void sendcommand(char outBuff[]) |
pkoirala3 | 3:415ccd1f7ae1 | 58 | { |
pkoirala3 | 6:6a43e2fdb8aa | 59 | if(xbee.writeable()) { |
pkoirala3 | 3:415ccd1f7ae1 | 60 | int i = 0; |
pkoirala3 | 6:6a43e2fdb8aa | 61 | while(outBuff[i] != ',') { |
pkoirala3 | 3:415ccd1f7ae1 | 62 | xbee.putc(outBuff[i]); |
pkoirala3 | 3:415ccd1f7ae1 | 63 | i++; |
pkoirala3 | 3:415ccd1f7ae1 | 64 | } |
pkoirala3 | 3:415ccd1f7ae1 | 65 | } |
pkoirala3 | 1:e9068d048f58 | 66 | } |
pkoirala3 | 5:81a1920e5f3d | 67 | |
pkoirala3 | 6:6a43e2fdb8aa | 68 | void statusUpdate() |
pkoirala3 | 6:6a43e2fdb8aa | 69 | { |
pkoirala3 | 5:81a1920e5f3d | 70 | tempHum.measure(); |
pkoirala3 | 5:81a1920e5f3d | 71 | float temp = (tempHum.get_temperature()/1000.00); |
pkoirala3 | 5:81a1920e5f3d | 72 | float hum = (tempHum.get_humidity()/1000.00); |
pkoirala3 | 6:6a43e2fdb8aa | 73 | float lightStatus = light; |
pkoirala3 | 5:81a1920e5f3d | 74 | char delimit = '|'; |
pkoirala3 | 5:81a1920e5f3d | 75 | char terminate = ','; |
pkoirala3 | 6:6a43e2fdb8aa | 76 | sprintf(outBuffer, "%c%2.2f%c%2.2f%c%0.2f%c",delimit, temp, delimit, hum, delimit, lightStatus, terminate); |
pkoirala3 | 5:81a1920e5f3d | 77 | sendcommand(outBuffer); |
pkoirala3 | 5:81a1920e5f3d | 78 | } |
pkoirala3 | 5:81a1920e5f3d | 79 | |
pkoirala3 | 6:6a43e2fdb8aa | 80 | void checkUnlock(); |
pkoirala3 | 6:6a43e2fdb8aa | 81 | |
pkoirala3 | 6:6a43e2fdb8aa | 82 | void fallInterrupt() |
pkoirala3 | 6:6a43e2fdb8aa | 83 | { |
pkoirala3 | 6:6a43e2fdb8aa | 84 | int key_code=0; |
pkoirala3 | 6:6a43e2fdb8aa | 85 | int i=0; |
pkoirala3 | 6:6a43e2fdb8aa | 86 | int value=mpr121.read(0x00); |
pkoirala3 | 6:6a43e2fdb8aa | 87 | value +=mpr121.read(0x01)<<8; |
pkoirala3 | 6:6a43e2fdb8aa | 88 | i=0; |
pkoirala3 | 6:6a43e2fdb8aa | 89 | for (i=0; i<12; i++) { |
pkoirala3 | 6:6a43e2fdb8aa | 90 | if (((value>>i)&0x01)==1) { |
pkoirala3 | 6:6a43e2fdb8aa | 91 | key_code=i; |
pkoirala3 | 6:6a43e2fdb8aa | 92 | Nums[counter] = key_code; |
pkoirala3 | 6:6a43e2fdb8aa | 93 | counter++; |
pkoirala3 | 6:6a43e2fdb8aa | 94 | } |
pkoirala3 | 6:6a43e2fdb8aa | 95 | } |
pkoirala3 | 6:6a43e2fdb8aa | 96 | |
pkoirala3 | 6:6a43e2fdb8aa | 97 | led4=key_code & 0x01; |
pkoirala3 | 6:6a43e2fdb8aa | 98 | led3=(key_code>>1) & 0x01; |
pkoirala3 | 6:6a43e2fdb8aa | 99 | led2=(key_code>>2) & 0x01; |
pkoirala3 | 6:6a43e2fdb8aa | 100 | led1=(key_code>>3) & 0x01; |
pkoirala3 | 6:6a43e2fdb8aa | 101 | if(counter == 4) { |
pkoirala3 | 6:6a43e2fdb8aa | 102 | checkUnlock(); |
pkoirala3 | 6:6a43e2fdb8aa | 103 | } |
pkoirala3 | 6:6a43e2fdb8aa | 104 | } |
pkoirala3 | 6:6a43e2fdb8aa | 105 | |
pkoirala3 | 6:6a43e2fdb8aa | 106 | void checkUnlock() |
pkoirala3 | 6:6a43e2fdb8aa | 107 | { |
pkoirala3 | 6:6a43e2fdb8aa | 108 | if(Nums[0] == 4 && Nums[1] == 1 && Nums[2] == 8 && Nums[3] == 0) { |
pkoirala3 | 6:6a43e2fdb8aa | 109 | unlockstatus = true; |
pkoirala3 | 6:6a43e2fdb8aa | 110 | attempts = 0; |
pkoirala3 | 6:6a43e2fdb8aa | 111 | } else if(attempts < 1) { |
pkoirala3 | 6:6a43e2fdb8aa | 112 | attempts = attempts + 1; // First attempt |
pkoirala3 | 6:6a43e2fdb8aa | 113 | } else if (attempts == 1) { // Second attempt |
pkoirala3 | 6:6a43e2fdb8aa | 114 | attempts = 0; // Reset attempts |
pkoirala3 | 6:6a43e2fdb8aa | 115 | led1 = 1; |
pkoirala3 | 6:6a43e2fdb8aa | 116 | led2 = 1; |
pkoirala3 | 6:6a43e2fdb8aa | 117 | led3 = 1; |
pkoirala3 | 6:6a43e2fdb8aa | 118 | led4 = 1; |
pkoirala3 | 6:6a43e2fdb8aa | 119 | intrusion = true; |
pkoirala3 | 6:6a43e2fdb8aa | 120 | attempts = 0; |
pkoirala3 | 6:6a43e2fdb8aa | 121 | } |
pkoirala3 | 6:6a43e2fdb8aa | 122 | counter = 0; |
pkoirala3 | 6:6a43e2fdb8aa | 123 | } |
pkoirala3 | 6:6a43e2fdb8aa | 124 | |
pkoirala3 | 5:81a1920e5f3d | 125 | |
pkoirala3 | 3:415ccd1f7ae1 | 126 | void cameraImage() |
pkoirala3 | 3:415ccd1f7ae1 | 127 | { |
pkoirala3 | 6:6a43e2fdb8aa | 128 | if (camera.isReady()) { |
pkoirala3 | 6:6a43e2fdb8aa | 129 | char filename[32]; |
pkoirala3 | 6:6a43e2fdb8aa | 130 | sprintf(filename, "/local/pict%d.jpg",fileIndex); |
pkoirala3 | 6:6a43e2fdb8aa | 131 | fileIndex++; |
pkoirala3 | 6:6a43e2fdb8aa | 132 | printf("Picture: %s ", filename); |
pkoirala3 | 6:6a43e2fdb8aa | 133 | if (camera.takePicture(filename)) { |
pkoirala3 | 6:6a43e2fdb8aa | 134 | while (camera.isProcessing()) { |
pkoirala3 | 6:6a43e2fdb8aa | 135 | camera.processPicture(); |
pkoirala3 | 6:6a43e2fdb8aa | 136 | } |
pkoirala3 | 6:6a43e2fdb8aa | 137 | } |
pkoirala3 | 6:6a43e2fdb8aa | 138 | } |
pkoirala3 | 6:6a43e2fdb8aa | 139 | } |
pkoirala3 | 6:6a43e2fdb8aa | 140 | |
pkoirala3 | 6:6a43e2fdb8aa | 141 | |
pkoirala3 | 6:6a43e2fdb8aa | 142 | int main() |
pkoirala3 | 6:6a43e2fdb8aa | 143 | { |
pkoirala3 | 6:6a43e2fdb8aa | 144 | camera.setPictureSize(JPEGCamera::SIZE320x240); |
pkoirala3 | 6:6a43e2fdb8aa | 145 | light = 0; |
pkoirala3 | 6:6a43e2fdb8aa | 146 | rst1 = 0; |
pkoirala3 | 6:6a43e2fdb8aa | 147 | wait_ms(1); |
pkoirala3 | 6:6a43e2fdb8aa | 148 | rst1 = 1; |
pkoirala3 | 6:6a43e2fdb8aa | 149 | wait_ms(1); |
pkoirala3 | 6:6a43e2fdb8aa | 150 | t1.start(getcommand); |
pkoirala3 | 6:6a43e2fdb8aa | 151 | interrupt.fall(&fallInterrupt); |
pkoirala3 | 6:6a43e2fdb8aa | 152 | interrupt.mode(PullUp); |
pkoirala3 | 6:6a43e2fdb8aa | 153 | inBuffer = 's'; |
pkoirala3 | 3:415ccd1f7ae1 | 154 | while(1) { |
pkoirala3 | 6:6a43e2fdb8aa | 155 | photoval = 0.1/(0.1 + photocell); |
pkoirala3 | 6:6a43e2fdb8aa | 156 | float newlight = (lightOnOff == true) ? photoval : 0.0; |
pkoirala3 | 6:6a43e2fdb8aa | 157 | bool lighton = false; |
pkoirala3 | 6:6a43e2fdb8aa | 158 | if(newlight == 0.0) { |
pkoirala3 | 6:6a43e2fdb8aa | 159 | light = 0.0; |
pkoirala3 | 6:6a43e2fdb8aa | 160 | } else if(fabs(newlight - light) > 0.05) { |
pkoirala3 | 6:6a43e2fdb8aa | 161 | light = newlight; |
pkoirala3 | 6:6a43e2fdb8aa | 162 | lighton = true; |
pkoirala3 | 6:6a43e2fdb8aa | 163 | } |
pkoirala3 | 6:6a43e2fdb8aa | 164 | if(intrusion || requestIn || inBuffer != ' ' || lighton || unlockstatus) { // Check for input request msg |
pkoirala3 | 6:6a43e2fdb8aa | 165 | if(inBuffer == 's' || lighton) { // Send the status |
pkoirala3 | 6:6a43e2fdb8aa | 166 | statusUpdate(); |
pkoirala3 | 6:6a43e2fdb8aa | 167 | inBuffer = ' '; |
pkoirala3 | 6:6a43e2fdb8aa | 168 | } else if(unlockstatus) { |
pkoirala3 | 6:6a43e2fdb8aa | 169 | light = 0.1/(0.1 + photocell); |
pkoirala3 | 6:6a43e2fdb8aa | 170 | sendcommand("u,"); |
pkoirala3 | 6:6a43e2fdb8aa | 171 | unlockstatus = false; |
pkoirala3 | 6:6a43e2fdb8aa | 172 | lightOnOff = true; |
pkoirala3 | 6:6a43e2fdb8aa | 173 | } else if(inBuffer == 'l') { |
pkoirala3 | 6:6a43e2fdb8aa | 174 | lightOnOff = !lightOnOff; // Toggle light on/off |
pkoirala3 | 6:6a43e2fdb8aa | 175 | inBuffer = 's'; |
pkoirala3 | 6:6a43e2fdb8aa | 176 | } else if(intrusion || inBuffer == 'c' ) { |
pkoirala3 | 6:6a43e2fdb8aa | 177 | cameraImage(); // Capture pic & save locally |
pkoirala3 | 6:6a43e2fdb8aa | 178 | if(intrusion) { |
pkoirala3 | 6:6a43e2fdb8aa | 179 | sendcommand("i,"); |
pkoirala3 | 6:6a43e2fdb8aa | 180 | intrusion = false; |
pkoirala3 | 6:6a43e2fdb8aa | 181 | } else { |
pkoirala3 | 6:6a43e2fdb8aa | 182 | sendcommand("p,"); |
pkoirala3 | 6:6a43e2fdb8aa | 183 | inBuffer = ' '; |
pkoirala3 | 1:e9068d048f58 | 184 | } |
pkoirala3 | 1:e9068d048f58 | 185 | } |
pkoirala3 | 1:e9068d048f58 | 186 | } |
pkoirala3 | 6:6a43e2fdb8aa | 187 | Thread::wait(500); |
pkoirala3 | 1:e9068d048f58 | 188 | } |
pkoirala3 | 0:5b1386641010 | 189 | } |