Export for Dan

Dependencies:   mbed MODSERIAL1

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?

UserRevisionLine numberNew 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 }