ECE 4180 Final Project

Dependencies:   4DGL-uLCD-SE mbed

Committer:
dbegasse
Date:
Tue Dec 08 15:44:18 2015 +0000
Revision:
2:4d9a4421fc08
Parent:
1:f7383e13e64f
ECE 4180 Final Project: XBee iMessage

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dbegasse 0:69cae396d104 1 //Daniel Begasse
dbegasse 2:4d9a4421fc08 2 //Keith Ng
dbegasse 2:4d9a4421fc08 3 //This is our ECE 4180 Final Project
dbegasse 2:4d9a4421fc08 4 //We use the uLCD, MPR121 Capacitive Touch Pad, XBee, and a pushbutton to send text messages between two identical breadboards
dbegasse 0:69cae396d104 5
dbegasse 0:69cae396d104 6 #include "mbed.h"
dbegasse 0:69cae396d104 7 #include "uLCD_4DGL.h"
dbegasse 0:69cae396d104 8 #include <stdio.h>
dbegasse 0:69cae396d104 9 #include <stdlib.h>
dbegasse 0:69cae396d104 10 #include <mpr121.h>
dbegasse 0:69cae396d104 11 #include <iostream>
dbegasse 0:69cae396d104 12 #include <string>
dbegasse 0:69cae396d104 13
dbegasse 0:69cae396d104 14 using namespace std;
dbegasse 0:69cae396d104 15
dbegasse 0:69cae396d104 16 //Set up the interrupt pin
dbegasse 0:69cae396d104 17 InterruptIn interrupt(p26);
dbegasse 0:69cae396d104 18
dbegasse 0:69cae396d104 19 // Setup the i2c bus on pins 9 and 10
dbegasse 0:69cae396d104 20 I2C i2c(p9, p10);
dbegasse 0:69cae396d104 21
dbegasse 0:69cae396d104 22 // constructor(i2c object, i2c address of the mpr121)
dbegasse 0:69cae396d104 23 Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);
dbegasse 0:69cae396d104 24
dbegasse 0:69cae396d104 25 //create a global lcd project
dbegasse 0:69cae396d104 26 uLCD_4DGL uLCD(p28, p27, p30);
dbegasse 0:69cae396d104 27
dbegasse 0:69cae396d104 28 // Setup the Serial to the PC for debugging
dbegasse 0:69cae396d104 29 Serial pc(USBTX, USBRX);
dbegasse 0:69cae396d104 30
dbegasse 1:f7383e13e64f 31 //Set up XBee
dbegasse 1:f7383e13e64f 32 Serial xbee(p13, p14);
dbegasse 1:f7383e13e64f 33 DigitalOut rst1(p11);
dbegasse 1:f7383e13e64f 34
dbegasse 1:f7383e13e64f 35 DigitalOut led1(LED1);
dbegasse 1:f7383e13e64f 36 DigitalOut led2(LED2);
dbegasse 1:f7383e13e64f 37 DigitalOut led3(LED3);
dbegasse 1:f7383e13e64f 38 DigitalOut led4(LED4);
dbegasse 1:f7383e13e64f 39 DigitalIn send(p21);
dbegasse 1:f7383e13e64f 40
dbegasse 0:69cae396d104 41 volatile bool tripped = false;
dbegasse 0:69cae396d104 42 volatile bool validkey;//This represents if the key pressed was a valid key
dbegasse 0:69cae396d104 43 volatile int oldpressed;//This is the previous key that was pressed
dbegasse 0:69cae396d104 44 volatile int value;//This is the value coming in from the register
dbegasse 0:69cae396d104 45 volatile int pressed;//This is the current key being pressed
dbegasse 0:69cae396d104 46 volatile int pressedcount = 0;//This is how many times the current key has been repeatedly pressed
dbegasse 2:4d9a4421fc08 47 int cursor_row = 13;
dbegasse 0:69cae396d104 48 int cursor_col = 0;
dbegasse 2:4d9a4421fc08 49 int read_row = 0;
dbegasse 2:4d9a4421fc08 50 int read_col = 0;
dbegasse 2:4d9a4421fc08 51 string message_send = "- ";
dbegasse 2:4d9a4421fc08 52 string message_receive = " ";
dbegasse 0:69cae396d104 53 int char_count = 0;//This is the number of times the space button has been pressed for the current message
dbegasse 2:4d9a4421fc08 54 unsigned size;
dbegasse 2:4d9a4421fc08 55 int received_count = 0;
dbegasse 0:69cae396d104 56
dbegasse 1:f7383e13e64f 57 bool sent = false;
dbegasse 1:f7383e13e64f 58
dbegasse 0:69cae396d104 59 char key_1[1] = {'1'};
dbegasse 0:69cae396d104 60 char key_2[4] = {'a','b','c','2'};
dbegasse 0:69cae396d104 61 char key_3[4] = {'d','e','f','3'};
dbegasse 0:69cae396d104 62 char key_4[4] = {'g','h','i','4'};
dbegasse 0:69cae396d104 63 char key_5[4] = {'j','k','l','5'};
dbegasse 0:69cae396d104 64 char key_6[4] = {'m','n','o','6'};
dbegasse 0:69cae396d104 65 char key_7[5] = {'p','q','r','s','7'};
dbegasse 0:69cae396d104 66 char key_8[4] = {'t','u','v','8'};
dbegasse 0:69cae396d104 67 char key_9[5] = {'w','x','y','z','9'};
dbegasse 0:69cae396d104 68 char key_10[1] = {' '};
dbegasse 0:69cae396d104 69
dbegasse 0:69cae396d104 70 void fallInterrupt() {
dbegasse 0:69cae396d104 71
dbegasse 0:69cae396d104 72 validkey = false;//Each key pressed is invalid until proven to be valid
dbegasse 0:69cae396d104 73 value = mpr121.read(0x00);
dbegasse 0:69cae396d104 74 value += mpr121.read(0x01)<<8;
dbegasse 0:69cae396d104 75
dbegasse 0:69cae396d104 76 //Take the value from the register and use it to assign a key #
dbegasse 0:69cae396d104 77 switch(value){
dbegasse 0:69cae396d104 78
dbegasse 0:69cae396d104 79 case (0x1):
dbegasse 0:69cae396d104 80 pressed = 10;
dbegasse 0:69cae396d104 81 validkey = true;
dbegasse 0:69cae396d104 82 break;
dbegasse 0:69cae396d104 83 case (0x10):
dbegasse 0:69cae396d104 84 pressed = 11;
dbegasse 0:69cae396d104 85 validkey = true;
dbegasse 0:69cae396d104 86 break;
dbegasse 0:69cae396d104 87 case (0x100):
dbegasse 0:69cae396d104 88 pressed = 12;
dbegasse 0:69cae396d104 89 validkey = true;
dbegasse 0:69cae396d104 90 break;
dbegasse 0:69cae396d104 91 case (0x2):
dbegasse 0:69cae396d104 92 pressed = 7;
dbegasse 0:69cae396d104 93 validkey = true;
dbegasse 0:69cae396d104 94 break;
dbegasse 0:69cae396d104 95 case (0x20):
dbegasse 0:69cae396d104 96 pressed = 8;
dbegasse 0:69cae396d104 97 validkey = true;
dbegasse 0:69cae396d104 98 break;
dbegasse 0:69cae396d104 99 case (0x200):
dbegasse 0:69cae396d104 100 pressed = 9;
dbegasse 0:69cae396d104 101 validkey = true;
dbegasse 0:69cae396d104 102 break;
dbegasse 0:69cae396d104 103 case (0x4):
dbegasse 0:69cae396d104 104 pressed = 4;
dbegasse 0:69cae396d104 105 validkey = true;
dbegasse 0:69cae396d104 106 break;
dbegasse 0:69cae396d104 107 case (0x40):
dbegasse 0:69cae396d104 108 pressed = 5;
dbegasse 0:69cae396d104 109 validkey = true;
dbegasse 0:69cae396d104 110 break;
dbegasse 0:69cae396d104 111 case (0x400):
dbegasse 0:69cae396d104 112 pressed = 6;
dbegasse 0:69cae396d104 113 validkey = true;
dbegasse 0:69cae396d104 114 break;
dbegasse 0:69cae396d104 115 case (0x8):
dbegasse 0:69cae396d104 116 pressed = 1;
dbegasse 0:69cae396d104 117 validkey = true;
dbegasse 0:69cae396d104 118 break;
dbegasse 0:69cae396d104 119 case (0x80):
dbegasse 0:69cae396d104 120 pressed = 2;
dbegasse 0:69cae396d104 121 validkey = true;
dbegasse 0:69cae396d104 122 break;
dbegasse 0:69cae396d104 123 case (0x800):
dbegasse 0:69cae396d104 124 pressed = 3;
dbegasse 0:69cae396d104 125 validkey = true;
dbegasse 0:69cae396d104 126 break;
dbegasse 0:69cae396d104 127 default:
dbegasse 0:69cae396d104 128 validkey = false;
dbegasse 0:69cae396d104 129 break;
dbegasse 0:69cae396d104 130 }
dbegasse 1:f7383e13e64f 131
dbegasse 0:69cae396d104 132 //If the two values are different, assign pressed to oldpressed
dbegasse 0:69cae396d104 133 if ((pressed != oldpressed) && (validkey == true) ){
dbegasse 0:69cae396d104 134
dbegasse 0:69cae396d104 135 oldpressed = pressed;
dbegasse 0:69cae396d104 136 pressedcount = 0;
dbegasse 0:69cae396d104 137 char_count++;//move the cursor over if there is a new key
dbegasse 0:69cae396d104 138 }
dbegasse 0:69cae396d104 139
dbegasse 0:69cae396d104 140 else if ((pressed == oldpressed) && (value != 0)) {
dbegasse 0:69cae396d104 141
dbegasse 1:f7383e13e64f 142 pressedcount++;
dbegasse 0:69cae396d104 143 }
dbegasse 0:69cae396d104 144 }
dbegasse 0:69cae396d104 145
dbegasse 0:69cae396d104 146 void checkCharacter(){
dbegasse 0:69cae396d104 147 if (pressed == 1){
dbegasse 0:69cae396d104 148 if (pressedcount > 0){
dbegasse 0:69cae396d104 149 pressedcount = 0;
dbegasse 0:69cae396d104 150 }
dbegasse 1:f7383e13e64f 151 message_send[char_count] = '1';
dbegasse 0:69cae396d104 152 }
dbegasse 0:69cae396d104 153
dbegasse 1:f7383e13e64f 154 if (pressed == 2){
dbegasse 0:69cae396d104 155 if (pressedcount > 3){
dbegasse 0:69cae396d104 156 pressedcount = 0;
dbegasse 0:69cae396d104 157 }
dbegasse 1:f7383e13e64f 158 message_send[char_count] = key_2[pressedcount];
dbegasse 0:69cae396d104 159 }
dbegasse 0:69cae396d104 160
dbegasse 0:69cae396d104 161 if (pressed == 3){
dbegasse 0:69cae396d104 162 if (pressedcount > 3){
dbegasse 0:69cae396d104 163 pressedcount = 0;
dbegasse 0:69cae396d104 164 }
dbegasse 2:4d9a4421fc08 165 message_send[char_count] = key_3[pressedcount];
dbegasse 0:69cae396d104 166 }
dbegasse 0:69cae396d104 167
dbegasse 0:69cae396d104 168 if (pressed == 4){
dbegasse 0:69cae396d104 169 if (pressedcount > 3){
dbegasse 0:69cae396d104 170 pressedcount = 0;
dbegasse 0:69cae396d104 171 }
dbegasse 2:4d9a4421fc08 172 message_send[char_count] = key_4[pressedcount];
dbegasse 0:69cae396d104 173 }
dbegasse 0:69cae396d104 174
dbegasse 0:69cae396d104 175 if (pressed == 5){
dbegasse 0:69cae396d104 176 if (pressedcount > 3){
dbegasse 0:69cae396d104 177 pressedcount = 0;
dbegasse 1:f7383e13e64f 178 }
dbegasse 2:4d9a4421fc08 179 message_send[char_count] = key_5[pressedcount];
dbegasse 0:69cae396d104 180 }
dbegasse 0:69cae396d104 181
dbegasse 0:69cae396d104 182 if (pressed == 6){
dbegasse 0:69cae396d104 183 if (pressedcount > 3){
dbegasse 0:69cae396d104 184 pressedcount = 0;
dbegasse 0:69cae396d104 185 }
dbegasse 2:4d9a4421fc08 186 message_send[char_count] = key_6[pressedcount];
dbegasse 0:69cae396d104 187 }
dbegasse 0:69cae396d104 188
dbegasse 0:69cae396d104 189 if (pressed == 7){
dbegasse 0:69cae396d104 190 if (pressedcount > 4){
dbegasse 0:69cae396d104 191 pressedcount = 0;
dbegasse 0:69cae396d104 192 }
dbegasse 2:4d9a4421fc08 193 message_send[char_count] = key_7[pressedcount];
dbegasse 0:69cae396d104 194 }
dbegasse 0:69cae396d104 195
dbegasse 0:69cae396d104 196 if (pressed == 8){
dbegasse 0:69cae396d104 197 if (pressedcount > 3){
dbegasse 0:69cae396d104 198 pressedcount = 0;
dbegasse 0:69cae396d104 199 }
dbegasse 2:4d9a4421fc08 200 message_send[char_count] = key_8[pressedcount];
dbegasse 0:69cae396d104 201 }
dbegasse 0:69cae396d104 202
dbegasse 0:69cae396d104 203 if (pressed == 9){
dbegasse 0:69cae396d104 204 if (pressedcount > 4){
dbegasse 0:69cae396d104 205 pressedcount = 0;
dbegasse 0:69cae396d104 206 }
dbegasse 2:4d9a4421fc08 207 message_send[char_count] = key_9[pressedcount];
dbegasse 0:69cae396d104 208 }
dbegasse 0:69cae396d104 209
dbegasse 1:f7383e13e64f 210 if (pressed == 10) {
dbegasse 2:4d9a4421fc08 211 message_send[char_count] = ' ';
dbegasse 2:4d9a4421fc08 212 }
dbegasse 2:4d9a4421fc08 213 if (pressed == 11) {
dbegasse 2:4d9a4421fc08 214 if (pressedcount > 0){
dbegasse 2:4d9a4421fc08 215 pressedcount = 0;
dbegasse 2:4d9a4421fc08 216 }
dbegasse 2:4d9a4421fc08 217 message_send[char_count] = '0';
dbegasse 1:f7383e13e64f 218 }
dbegasse 0:69cae396d104 219 }
dbegasse 0:69cae396d104 220
dbegasse 0:69cae396d104 221 void printMessage(){
dbegasse 0:69cae396d104 222
dbegasse 2:4d9a4421fc08 223 uLCD.locate(cursor_col, cursor_row);
dbegasse 0:69cae396d104 224
dbegasse 2:4d9a4421fc08 225 //This will print the current message being typed towards the bottom of the lcd screen
dbegasse 2:4d9a4421fc08 226 for ( unsigned i = 0; i <= char_count; i++ ){
dbegasse 0:69cae396d104 227
dbegasse 2:4d9a4421fc08 228 uLCD.printf("%c", message_send[i]);
dbegasse 2:4d9a4421fc08 229 }
dbegasse 0:69cae396d104 230
dbegasse 2:4d9a4421fc08 231 //If the message was just sent,
dbegasse 2:4d9a4421fc08 232 if ( sent == true ){
dbegasse 2:4d9a4421fc08 233
dbegasse 2:4d9a4421fc08 234 uLCD.locate(0, cursor_row);
dbegasse 2:4d9a4421fc08 235
dbegasse 2:4d9a4421fc08 236 for ( unsigned i = 1; i <= char_count+1; i++ ){
dbegasse 2:4d9a4421fc08 237
dbegasse 2:4d9a4421fc08 238 message_send[i] = ' ';//Overwrite all of the spots in the string with a space
dbegasse 2:4d9a4421fc08 239 uLCD.printf("%c", message_send[i]);
dbegasse 2:4d9a4421fc08 240 }
dbegasse 2:4d9a4421fc08 241 char_count = 0;
dbegasse 2:4d9a4421fc08 242 }
dbegasse 1:f7383e13e64f 243 }
dbegasse 1:f7383e13e64f 244
dbegasse 1:f7383e13e64f 245 void write(){
dbegasse 1:f7383e13e64f 246
dbegasse 1:f7383e13e64f 247 char chartosend;
dbegasse 2:4d9a4421fc08 248
dbegasse 1:f7383e13e64f 249 for ( unsigned i = 0; i <= char_count; i++ ){
dbegasse 1:f7383e13e64f 250
dbegasse 1:f7383e13e64f 251 //Go through each char of message and send the char's 1 by 1 through the xbee
dbegasse 2:4d9a4421fc08 252 chartosend = message_send[i];
dbegasse 1:f7383e13e64f 253 xbee.printf("%c", chartosend);
dbegasse 1:f7383e13e64f 254
dbegasse 1:f7383e13e64f 255 wait(0.01);
dbegasse 1:f7383e13e64f 256 led2 = 1;
dbegasse 1:f7383e13e64f 257 wait(0.01);
dbegasse 1:f7383e13e64f 258 led2 = 0;
dbegasse 1:f7383e13e64f 259 }
dbegasse 1:f7383e13e64f 260 }
dbegasse 1:f7383e13e64f 261
dbegasse 1:f7383e13e64f 262 void read(){
dbegasse 1:f7383e13e64f 263
dbegasse 1:f7383e13e64f 264 char fromXBee;
dbegasse 1:f7383e13e64f 265
dbegasse 2:4d9a4421fc08 266 //led3 = 1;
dbegasse 2:4d9a4421fc08 267 //wait(0.2);
dbegasse 2:4d9a4421fc08 268
dbegasse 1:f7383e13e64f 269
dbegasse 1:f7383e13e64f 270 if(xbee.readable()) {
dbegasse 1:f7383e13e64f 271
dbegasse 2:4d9a4421fc08 272 uLCD.locate(received_count, read_row);
dbegasse 2:4d9a4421fc08 273
dbegasse 1:f7383e13e64f 274 led4 = 1;
dbegasse 1:f7383e13e64f 275 wait(0.2);
dbegasse 1:f7383e13e64f 276
dbegasse 1:f7383e13e64f 277 fromXBee = xbee.getc(); //Get individual characters being sent by other xbee
dbegasse 2:4d9a4421fc08 278 message_receive[received_count] = fromXBee;
dbegasse 2:4d9a4421fc08 279 uLCD.printf("%c", message_receive[received_count]);
dbegasse 2:4d9a4421fc08 280
dbegasse 2:4d9a4421fc08 281 received_count++;
dbegasse 2:4d9a4421fc08 282
dbegasse 2:4d9a4421fc08 283 read();
dbegasse 1:f7383e13e64f 284
dbegasse 1:f7383e13e64f 285 led4 = 0;
dbegasse 2:4d9a4421fc08 286 //wait(0.2);
dbegasse 1:f7383e13e64f 287
dbegasse 1:f7383e13e64f 288 }
dbegasse 1:f7383e13e64f 289
dbegasse 2:4d9a4421fc08 290 //led3 = 0;
dbegasse 2:4d9a4421fc08 291 //wait(0.2);
dbegasse 0:69cae396d104 292
dbegasse 0:69cae396d104 293 }
dbegasse 0:69cae396d104 294
dbegasse 0:69cae396d104 295 int main(){
dbegasse 0:69cae396d104 296
dbegasse 1:f7383e13e64f 297 rst1 = 0;
dbegasse 1:f7383e13e64f 298 wait_ms(1);
dbegasse 1:f7383e13e64f 299 rst1 = 1;
dbegasse 1:f7383e13e64f 300 wait_ms(1);
dbegasse 1:f7383e13e64f 301
dbegasse 0:69cae396d104 302 pc.baud(9600);
dbegasse 0:69cae396d104 303
dbegasse 1:f7383e13e64f 304 send.mode(PullUp);
dbegasse 0:69cae396d104 305 interrupt.mode(PullUp);
dbegasse 0:69cae396d104 306 wait(.001);
dbegasse 0:69cae396d104 307 interrupt.fall(&fallInterrupt);
dbegasse 0:69cae396d104 308
dbegasse 0:69cae396d104 309 while(1){
dbegasse 0:69cae396d104 310
dbegasse 0:69cae396d104 311 checkCharacter();
dbegasse 0:69cae396d104 312 printMessage();
dbegasse 0:69cae396d104 313
dbegasse 2:4d9a4421fc08 314 sent = false;
dbegasse 1:f7383e13e64f 315
dbegasse 1:f7383e13e64f 316 if ( send == 0 ){
dbegasse 0:69cae396d104 317
dbegasse 1:f7383e13e64f 318 led2 = 1;
dbegasse 1:f7383e13e64f 319 write();
dbegasse 2:4d9a4421fc08 320 sent = true;
dbegasse 2:4d9a4421fc08 321 pressed = 0;
dbegasse 2:4d9a4421fc08 322 validkey = false;
dbegasse 0:69cae396d104 323 }
dbegasse 1:f7383e13e64f 324
dbegasse 1:f7383e13e64f 325 read();
dbegasse 2:4d9a4421fc08 326
dbegasse 2:4d9a4421fc08 327 if (sent == true){
dbegasse 2:4d9a4421fc08 328
dbegasse 2:4d9a4421fc08 329 read_row++;
dbegasse 2:4d9a4421fc08 330 received_count = 0;
dbegasse 2:4d9a4421fc08 331
dbegasse 2:4d9a4421fc08 332 }
dbegasse 1:f7383e13e64f 333
dbegasse 1:f7383e13e64f 334 }
dbegasse 1:f7383e13e64f 335 }