Amanda Travieso
/
SerialComms
Export for Dan
main.cpp@5:14a21c3812ed, 2015-10-29 (annotated)
- Committer:
- atravieso
- Date:
- Thu Oct 29 23:04:14 2015 +0000
- Revision:
- 5:14a21c3812ed
- Parent:
- 4:810c3971bb3e
- Child:
- 6:aa3219001d18
Sends and receives commands on the comm port via an RS232 level shifter. Outputs humidity information in ASCII.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
atravieso | 0:4b4c18724370 | 1 | |
atravieso | 0:4b4c18724370 | 2 | |
atravieso | 0:4b4c18724370 | 3 | #include "mbed.h" |
atravieso | 0:4b4c18724370 | 4 | #include "MODSERIAL.h" |
atravieso | 5:14a21c3812ed | 5 | #include "HIH_5030.h" |
atravieso | 0:4b4c18724370 | 6 | |
atravieso | 1:66e3217ec4ec | 7 | #define MESSAGE_BUFFER_SIZE 100 |
atravieso | 0:4b4c18724370 | 8 | |
atravieso | 0:4b4c18724370 | 9 | DigitalOut led1(LED1); |
atravieso | 0:4b4c18724370 | 10 | DigitalOut led2(LED2); |
atravieso | 0:4b4c18724370 | 11 | DigitalOut led3(LED3); |
atravieso | 0:4b4c18724370 | 12 | DigitalOut led4(LED4); |
atravieso | 5:14a21c3812ed | 13 | AnalogIn ain_UseA(p15); |
atravieso | 5:14a21c3812ed | 14 | //AnalogIn ain_UseB(p16); //pins 16-19 are tied to ground to reduce noise |
atravieso | 5:14a21c3812ed | 15 | //AnalogIn ain_UseC(p17); |
atravieso | 5:14a21c3812ed | 16 | //AnalogIn ain_UseD(p18); |
atravieso | 5:14a21c3812ed | 17 | //AnalogIn ain_UseE(p19); |
atravieso | 0:4b4c18724370 | 18 | |
atravieso | 4:810c3971bb3e | 19 | MODSERIAL messageSystem(p13, p14); |
atravieso | 0:4b4c18724370 | 20 | |
atravieso | 5:14a21c3812ed | 21 | unsigned char messageBufferIncoming[MESSAGE_BUFFER_SIZE]; |
atravieso | 5:14a21c3812ed | 22 | unsigned int hexBufferIncoming[MESSAGE_BUFFER_SIZE]; |
atravieso | 4:810c3971bb3e | 23 | unsigned char messageBufferOutgoing[MESSAGE_BUFFER_SIZE]; |
atravieso | 1:66e3217ec4ec | 24 | int count = 0; |
atravieso | 1:66e3217ec4ec | 25 | int i = 0; |
atravieso | 0:4b4c18724370 | 26 | bool messageReceived; |
atravieso | 0:4b4c18724370 | 27 | |
atravieso | 1:66e3217ec4ec | 28 | |
atravieso | 0:4b4c18724370 | 29 | void messageReceive(MODSERIAL_IRQ_INFO *q) { |
atravieso | 1:66e3217ec4ec | 30 | // Get the pointer to MODSERIAL object that invoked this callback. |
atravieso | 0:4b4c18724370 | 31 | MODSERIAL *sys = q->serial; |
atravieso | 3:4039b6c8da2e | 32 | |
atravieso | 3:4039b6c8da2e | 33 | //dereference rxGetLasChar() of sys object |
atravieso | 4:810c3971bb3e | 34 | unsigned int c = sys->rxGetLastChar(); // Returns the last byte to pass through the RX interrupt handler. |
atravieso | 3:4039b6c8da2e | 35 | |
atravieso | 5:14a21c3812ed | 36 | //add the character that triggered the interrupt to the incoming buffers |
atravieso | 5:14a21c3812ed | 37 | //I'm adding to an in buffer and a char buffer, but using the int buffer to determine which message it is |
atravieso | 5:14a21c3812ed | 38 | //if I want to use the char buffer to determine, then I need to use strcmp instead of = |
atravieso | 1:66e3217ec4ec | 39 | if(i <=MESSAGE_BUFFER_SIZE){ |
atravieso | 5:14a21c3812ed | 40 | messageBufferIncoming[i] = c; |
atravieso | 3:4039b6c8da2e | 41 | hexBufferIncoming[i] = c; |
atravieso | 1:66e3217ec4ec | 42 | i++; |
atravieso | 5:14a21c3812ed | 43 | } |
atravieso | 1:66e3217ec4ec | 44 | count++; |
atravieso | 5:14a21c3812ed | 45 | if (count == 4){ //TODO: Determine if I need to be able to find a message anywhere within a bigger buffer |
atravieso | 4:810c3971bb3e | 46 | //led4 = !led4; |
atravieso | 4:810c3971bb3e | 47 | if (hexBufferIncoming[0] == 0xAA){ //Start Calibration |
atravieso | 3:4039b6c8da2e | 48 | if (hexBufferIncoming[1] == 0x55){ |
atravieso | 3:4039b6c8da2e | 49 | if (hexBufferIncoming[2] == 0xFF){ |
atravieso | 3:4039b6c8da2e | 50 | if (hexBufferIncoming[3] == 0x00){ |
atravieso | 3:4039b6c8da2e | 51 | led1 = !led1; |
atravieso | 5:14a21c3812ed | 52 | //TODO: Determine if I need to add disable interrupt. What happens if I receive while transmitting??? |
atravieso | 4:810c3971bb3e | 53 | messageSystem.printf("%c", messageBufferOutgoing[0]= 0xAB); |
atravieso | 4:810c3971bb3e | 54 | messageSystem.printf("%c", messageBufferOutgoing[1] = 0x54); |
atravieso | 4:810c3971bb3e | 55 | messageSystem.printf("%c", messageBufferOutgoing[2] = 0xFF); |
atravieso | 4:810c3971bb3e | 56 | messageSystem.printf("%c", messageBufferOutgoing[3] = 0x00); |
atravieso | 4:810c3971bb3e | 57 | |
atravieso | 3:4039b6c8da2e | 58 | } |
atravieso | 3:4039b6c8da2e | 59 | } |
atravieso | 3:4039b6c8da2e | 60 | } |
atravieso | 3:4039b6c8da2e | 61 | } |
atravieso | 3:4039b6c8da2e | 62 | |
atravieso | 4:810c3971bb3e | 63 | else if (hexBufferIncoming[0] == 0xBB){ //Stop Calibration |
atravieso | 3:4039b6c8da2e | 64 | if (hexBufferIncoming[1] == 0x44){ |
atravieso | 3:4039b6c8da2e | 65 | if (hexBufferIncoming[2] == 0xFF){ |
atravieso | 3:4039b6c8da2e | 66 | if (hexBufferIncoming[3] == 0x00){ |
atravieso | 3:4039b6c8da2e | 67 | led2 = !led2; |
atravieso | 4:810c3971bb3e | 68 | messageSystem.printf("%c", messageBufferOutgoing[0]= 0xBC); |
atravieso | 4:810c3971bb3e | 69 | messageSystem.printf("%c", messageBufferOutgoing[1]= 0x43); |
atravieso | 4:810c3971bb3e | 70 | messageSystem.printf("%c", messageBufferOutgoing[2]= 0xFF); |
atravieso | 4:810c3971bb3e | 71 | messageSystem.printf("%c", messageBufferOutgoing[3]= 0x00); |
atravieso | 3:4039b6c8da2e | 72 | } |
atravieso | 3:4039b6c8da2e | 73 | } |
atravieso | 3:4039b6c8da2e | 74 | } |
atravieso | 3:4039b6c8da2e | 75 | } |
atravieso | 3:4039b6c8da2e | 76 | |
atravieso | 4:810c3971bb3e | 77 | else if (hexBufferIncoming[0] == 0xCC){ //Get Calibration Value Leave room for data bits |
atravieso | 3:4039b6c8da2e | 78 | if (hexBufferIncoming[1] == 0x33){ |
atravieso | 3:4039b6c8da2e | 79 | if (hexBufferIncoming[2] == 0xFF){ |
atravieso | 3:4039b6c8da2e | 80 | if (hexBufferIncoming[3] == 0x00){ |
atravieso | 3:4039b6c8da2e | 81 | led3 = !led3; |
atravieso | 4:810c3971bb3e | 82 | messageSystem.printf("%c", messageBufferOutgoing[0]= 0xCD); |
atravieso | 4:810c3971bb3e | 83 | messageSystem.printf("%c", messageBufferOutgoing[1]= 0x32); |
atravieso | 4:810c3971bb3e | 84 | messageSystem.printf("%c", messageBufferOutgoing[2]= 0xFF); |
atravieso | 4:810c3971bb3e | 85 | messageSystem.printf("%c", messageBufferOutgoing[3]= 0x00); |
atravieso | 3:4039b6c8da2e | 86 | } |
atravieso | 3:4039b6c8da2e | 87 | } |
atravieso | 3:4039b6c8da2e | 88 | } |
atravieso | 3:4039b6c8da2e | 89 | } |
atravieso | 4:810c3971bb3e | 90 | else if (hexBufferIncoming[0] == 0xDD){ //Get Dynamic Data Leave room for data bits |
atravieso | 3:4039b6c8da2e | 91 | if (hexBufferIncoming[1] == 0x22){ |
atravieso | 3:4039b6c8da2e | 92 | if (hexBufferIncoming[2] == 0xFF){ |
atravieso | 3:4039b6c8da2e | 93 | if (hexBufferIncoming[3] == 0x00){ |
atravieso | 3:4039b6c8da2e | 94 | led4 = !led4; |
atravieso | 4:810c3971bb3e | 95 | messageSystem.printf("%c", messageBufferOutgoing[0]= 0xDE); |
atravieso | 4:810c3971bb3e | 96 | messageSystem.printf("%c", messageBufferOutgoing[1]= 0x21); |
atravieso | 4:810c3971bb3e | 97 | messageSystem.printf("%c", messageBufferOutgoing[2]= 0xFF); |
atravieso | 4:810c3971bb3e | 98 | messageSystem.printf("%c", messageBufferOutgoing[3]= 0x00); |
atravieso | 3:4039b6c8da2e | 99 | } |
atravieso | 3:4039b6c8da2e | 100 | } |
atravieso | 3:4039b6c8da2e | 101 | } |
atravieso | 3:4039b6c8da2e | 102 | } |
atravieso | 4:810c3971bb3e | 103 | else if (hexBufferIncoming[0] == 0xDB){ //Get Heading //Add space for responses |
atravieso | 3:4039b6c8da2e | 104 | if (hexBufferIncoming[1] == 0x24){ |
atravieso | 3:4039b6c8da2e | 105 | if (hexBufferIncoming[2] == 0xFF){ |
atravieso | 3:4039b6c8da2e | 106 | if (hexBufferIncoming[3] == 0x00){ |
atravieso | 3:4039b6c8da2e | 107 | led1 = !led1; |
atravieso | 4:810c3971bb3e | 108 | messageSystem.printf("%c", messageBufferOutgoing[0]= 0xDC); |
atravieso | 4:810c3971bb3e | 109 | messageSystem.printf("%c", messageBufferOutgoing[1]= 0x23); |
atravieso | 4:810c3971bb3e | 110 | messageSystem.printf("%c", messageBufferOutgoing[2]= 0x00); |
atravieso | 4:810c3971bb3e | 111 | messageSystem.printf("%c", messageBufferOutgoing[3]= 0x00); |
atravieso | 3:4039b6c8da2e | 112 | } |
atravieso | 3:4039b6c8da2e | 113 | } |
atravieso | 3:4039b6c8da2e | 114 | } |
atravieso | 3:4039b6c8da2e | 115 | } |
atravieso | 4:810c3971bb3e | 116 | else if (hexBufferIncoming[0] == 0xD9){ //Get Temperature //Add space for response |
atravieso | 3:4039b6c8da2e | 117 | if (hexBufferIncoming[1] == 0x26){ |
atravieso | 3:4039b6c8da2e | 118 | if (hexBufferIncoming[2] == 0xFF){ |
atravieso | 3:4039b6c8da2e | 119 | if (hexBufferIncoming[3] == 0x00){ |
atravieso | 3:4039b6c8da2e | 120 | led2 = !led2; |
atravieso | 4:810c3971bb3e | 121 | messageSystem.printf("%c", messageBufferOutgoing[0]= 0xDA); |
atravieso | 4:810c3971bb3e | 122 | messageSystem.printf("%c", messageBufferOutgoing[1]= 0x25); |
atravieso | 4:810c3971bb3e | 123 | messageSystem.printf("%c", messageBufferOutgoing[2]= 0x00); |
atravieso | 4:810c3971bb3e | 124 | messageSystem.printf("%c", messageBufferOutgoing[3]= 0x00); |
atravieso | 3:4039b6c8da2e | 125 | } |
atravieso | 3:4039b6c8da2e | 126 | } |
atravieso | 3:4039b6c8da2e | 127 | } |
atravieso | 3:4039b6c8da2e | 128 | } |
atravieso | 4:810c3971bb3e | 129 | else if (hexBufferIncoming[0] == 0xEE){ //Get Elapsed Time On //Add space for response |
atravieso | 3:4039b6c8da2e | 130 | if (hexBufferIncoming[1] == 0x11){ |
atravieso | 3:4039b6c8da2e | 131 | if (hexBufferIncoming[2] == 0x00){ |
atravieso | 3:4039b6c8da2e | 132 | if (hexBufferIncoming[3] == 0x01){ |
atravieso | 3:4039b6c8da2e | 133 | led3 = !led3; |
atravieso | 4:810c3971bb3e | 134 | messageSystem.printf("%c", messageBufferOutgoing[0]= 0xEF); |
atravieso | 4:810c3971bb3e | 135 | messageSystem.printf("%c", messageBufferOutgoing[1]= 0x10); |
atravieso | 4:810c3971bb3e | 136 | messageSystem.printf("%c", messageBufferOutgoing[2]= 0x00); |
atravieso | 4:810c3971bb3e | 137 | messageSystem.printf("%c", messageBufferOutgoing[3]= 0x00); |
atravieso | 3:4039b6c8da2e | 138 | } |
atravieso | 3:4039b6c8da2e | 139 | } |
atravieso | 3:4039b6c8da2e | 140 | } |
atravieso | 3:4039b6c8da2e | 141 | } |
atravieso | 5:14a21c3812ed | 142 | memset(messageBufferIncoming, '\0', sizeof(messageBufferIncoming)); |
atravieso | 4:810c3971bb3e | 143 | memset(hexBufferIncoming, '\0', sizeof(hexBufferIncoming)); |
atravieso | 4:810c3971bb3e | 144 | memset(messageBufferOutgoing, '\0', sizeof(messageBufferOutgoing)); |
atravieso | 1:66e3217ec4ec | 145 | i = 0; |
atravieso | 1:66e3217ec4ec | 146 | messageReceived = true; |
atravieso | 1:66e3217ec4ec | 147 | count = 0; |
atravieso | 1:66e3217ec4ec | 148 | } |
atravieso | 0:4b4c18724370 | 149 | return; |
atravieso | 0:4b4c18724370 | 150 | } |
atravieso | 0:4b4c18724370 | 151 | |
atravieso | 1:66e3217ec4ec | 152 | void messageProcess(void) { |
atravieso | 3:4039b6c8da2e | 153 | // led1 = !led1; |
atravieso | 0:4b4c18724370 | 154 | messageReceived = false; |
atravieso | 0:4b4c18724370 | 155 | } |
atravieso | 5:14a21c3812ed | 156 | /* |
atravieso | 5:14a21c3812ed | 157 | Constructor |
atravieso | 5:14a21c3812ed | 158 | dataPin: the IO pin connected to the sensor's data pin (pin 15) |
atravieso | 5:14a21c3812ed | 159 | supplyVoltage: the voltage supplying the humidity sensor (pins 1,3 - for the HIH5030 3.3 V typical) |
atravieso | 5:14a21c3812ed | 160 | referenceVoltage: motor controller's reference voltage (3.3V for the LPC1768) |
atravieso | 5:14a21c3812ed | 161 | */ |
atravieso | 0:4b4c18724370 | 162 | |
atravieso | 5:14a21c3812ed | 163 | HIH5030::HIH5030(float dataPin, float supplyVoltage, float referenceVoltage){ |
atravieso | 5:14a21c3812ed | 164 | |
atravieso | 5:14a21c3812ed | 165 | pin = dataPin; |
atravieso | 5:14a21c3812ed | 166 | vSupply = supplyVoltage; |
atravieso | 5:14a21c3812ed | 167 | vRef = referenceVoltage; |
atravieso | 5:14a21c3812ed | 168 | |
atravieso | 5:14a21c3812ed | 169 | /* |
atravieso | 5:14a21c3812ed | 170 | Relative Humidity is calculated using the following equations taken from the datasheet: |
atravieso | 5:14a21c3812ed | 171 | (1) Vout = (VSupply)(0.00636(sensorRH) + 0.1515) |
atravieso | 5:14a21c3812ed | 172 | (2) sensorRH = (Vout - zeroOffset) / slope |
atravieso | 5:14a21c3812ed | 173 | |
atravieso | 5:14a21c3812ed | 174 | Solving (1) for sensorRH: |
atravieso | 5:14a21c3812ed | 175 | sensorRH = (Vout - (0.1515)VSupply) / (0.00636)VSupply |
atravieso | 5:14a21c3812ed | 176 | |
atravieso | 5:14a21c3812ed | 177 | Equate result with (2): |
atravieso | 5:14a21c3812ed | 178 | zeroOffset = (0.1515)VSupply |
atravieso | 5:14a21c3812ed | 179 | slope = (0.00636)VSupply |
atravieso | 5:14a21c3812ed | 180 | */ |
atravieso | 5:14a21c3812ed | 181 | |
atravieso | 5:14a21c3812ed | 182 | slope = 0.00636 * vSupply; |
atravieso | 5:14a21c3812ed | 183 | zeroOffset = 0.1515 * vSupply; |
atravieso | 5:14a21c3812ed | 184 | |
atravieso | 5:14a21c3812ed | 185 | } |
atravieso | 5:14a21c3812ed | 186 | |
atravieso | 5:14a21c3812ed | 187 | |
atravieso | 5:14a21c3812ed | 188 | /* |
atravieso | 5:14a21c3812ed | 189 | Convert sensor reading into relative humidity using equation (2) |
atravieso | 5:14a21c3812ed | 190 | */ |
atravieso | 5:14a21c3812ed | 191 | |
atravieso | 5:14a21c3812ed | 192 | float HIH5030::getSensorRH() { |
atravieso | 5:14a21c3812ed | 193 | return ((vout() - zeroOffset) / slope); |
atravieso | 5:14a21c3812ed | 194 | |
atravieso | 5:14a21c3812ed | 195 | } |
atravieso | 5:14a21c3812ed | 196 | |
atravieso | 5:14a21c3812ed | 197 | /* |
atravieso | 5:14a21c3812ed | 198 | Get temperature-compensated relative humity. From data sheet: |
atravieso | 5:14a21c3812ed | 199 | trueRH = sensorRH / (1.0546 - 0.00216T) |
atravieso | 5:14a21c3812ed | 200 | */ |
atravieso | 5:14a21c3812ed | 201 | |
atravieso | 5:14a21c3812ed | 202 | float HIH5030::getTrueRH(float temperature) { |
atravieso | 5:14a21c3812ed | 203 | return getSensorRH() / (1.0546 - (0.00216 * temperature)); |
atravieso | 5:14a21c3812ed | 204 | |
atravieso | 5:14a21c3812ed | 205 | } |
atravieso | 5:14a21c3812ed | 206 | |
atravieso | 5:14a21c3812ed | 207 | /* |
atravieso | 5:14a21c3812ed | 208 | Get sensor output voltage. |
atravieso | 5:14a21c3812ed | 209 | Assumes 12-bit (2^16 = 4096) A/D resolution. |
atravieso | 5:14a21c3812ed | 210 | */ |
atravieso | 5:14a21c3812ed | 211 | |
atravieso | 5:14a21c3812ed | 212 | float HIH5030::vout() { |
atravieso | 5:14a21c3812ed | 213 | return (float)(ain_UseA.read_u16()) * 3.3 / 65536; |
atravieso | 5:14a21c3812ed | 214 | |
atravieso | 5:14a21c3812ed | 215 | } |
atravieso | 0:4b4c18724370 | 216 | |
atravieso | 0:4b4c18724370 | 217 | int main() { |
atravieso | 0:4b4c18724370 | 218 | |
atravieso | 0:4b4c18724370 | 219 | messageReceived = false; |
atravieso | 5:14a21c3812ed | 220 | memset(messageBufferIncoming, '\0', sizeof(messageBufferIncoming)); |
atravieso | 4:810c3971bb3e | 221 | memset(hexBufferIncoming, '\0', sizeof(hexBufferIncoming)); |
atravieso | 4:810c3971bb3e | 222 | memset(messageBufferOutgoing, '\0', sizeof(messageBufferOutgoing)); |
atravieso | 0:4b4c18724370 | 223 | messageSystem.baud(9600); |
atravieso | 3:4039b6c8da2e | 224 | messageSystem.attach(&messageReceive, MODSERIAL::RxIrq); //Attach a C++ type object/method pointer as the callback. |
atravieso | 1:66e3217ec4ec | 225 | |
atravieso | 0:4b4c18724370 | 226 | // Fix Mbed library bug, see http://mbed.org/forum/bugs-suggestions/topic/1498 |
atravieso | 0:4b4c18724370 | 227 | LPC_GPIOINT->IO2IntClr = (1UL << 5) | (1UL << 4) | (1UL << 3) | (1UL << 2); |
atravieso | 0:4b4c18724370 | 228 | \ |
atravieso | 0:4b4c18724370 | 229 | while(1) { |
atravieso | 4:810c3971bb3e | 230 | //led1 = !led1; |
atravieso | 4:810c3971bb3e | 231 | wait(.05); |
atravieso | 5:14a21c3812ed | 232 | float ad[5]; |
atravieso | 5:14a21c3812ed | 233 | float supplyvoltage = 3.3; |
atravieso | 5:14a21c3812ed | 234 | float referencevoltage = 3.3; |
atravieso | 5:14a21c3812ed | 235 | float vdiv = (3.3 / 65536); //3.3 is the reference voltage (AnalogIn measures from 0V to 3.3V) and 65536 is the highest number that can be represented by a 16 bit unsigned |
atravieso | 5:14a21c3812ed | 236 | while( 1 ){ |
atravieso | 5:14a21c3812ed | 237 | ad[0] = (float)ain_UseA.read_u16() * vdiv; //16-bit unsigned short representing the current input voltage, normalised to a 16-bit value |
atravieso | 5:14a21c3812ed | 238 | // ad[1] = (float)ain_UseB.read_u16() * vdiv; |
atravieso | 5:14a21c3812ed | 239 | // ad[2] = (float)ain_UseC.read_u16() * vdiv; |
atravieso | 5:14a21c3812ed | 240 | // ad[3] = (float)ain_UseD.read_u16() * vdiv; |
atravieso | 5:14a21c3812ed | 241 | // ad[4] = (float)ain_UseE.read_u16() * vdiv; |
atravieso | 5:14a21c3812ed | 242 | //pc.printf("%5.3f,%5.3f,%5.3f,%5.3f,%5.3f\r\n ", ad[0],ad[1],ad[2],ad[3],ad[4]); |
atravieso | 5:14a21c3812ed | 243 | HIH5030 humidity(ad[0], supplyvoltage, referencevoltage); |
atravieso | 5:14a21c3812ed | 244 | messageSystem.printf("%5.3f\r\nHumidity: ", humidity.getSensorRH()); |
atravieso | 5:14a21c3812ed | 245 | led3 = 1; |
atravieso | 5:14a21c3812ed | 246 | wait(2.0); |
atravieso | 5:14a21c3812ed | 247 | led3 = 0; |
atravieso | 5:14a21c3812ed | 248 | wait(2.0); |
atravieso | 5:14a21c3812ed | 249 | } |
atravieso | 0:4b4c18724370 | 250 | if (messageReceived) |
atravieso | 0:4b4c18724370 | 251 | { |
atravieso | 4:810c3971bb3e | 252 | //led2 = !led2; |
atravieso | 0:4b4c18724370 | 253 | messageProcess(); |
atravieso | 0:4b4c18724370 | 254 | } |
atravieso | 0:4b4c18724370 | 255 | } |
atravieso | 0:4b4c18724370 | 256 | } |