Simple example program - Read sensors from Mbed Application Board, build JSON style string from data, Send data via pre-configured Xbee, Receive data from duplicate program on another device, Display data received on LCD, Switch display mode from full string to split string using Joystick Down button.
Dependencies: mbed C12832 LM75B MMA7660
main.cpp@0:720912d4ddcb, 2018-11-28 (annotated)
- Committer:
- SteakNinja
- Date:
- Wed Nov 28 16:41:20 2018 +0000
- Revision:
- 0:720912d4ddcb
A simple example program showing how to get data from sensors (Mbed Application Board), send/receive the data via pre-configured Xbee (Serial on Xbee footprint) using a JSON style message structure and switch mode of LCD display with Joystick Down.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
SteakNinja | 0:720912d4ddcb | 1 | #include "mbed.h" |
SteakNinja | 0:720912d4ddcb | 2 | #include "LM75B.h" |
SteakNinja | 0:720912d4ddcb | 3 | #include "MMA7660.h" |
SteakNinja | 0:720912d4ddcb | 4 | #include "C12832.h" |
SteakNinja | 0:720912d4ddcb | 5 | |
SteakNinja | 0:720912d4ddcb | 6 | DigitalOut myled(LED1); |
SteakNinja | 0:720912d4ddcb | 7 | AnalogIn pot1(p19); |
SteakNinja | 0:720912d4ddcb | 8 | AnalogIn pot2(p20); |
SteakNinja | 0:720912d4ddcb | 9 | InterruptIn JoyDown(p12); |
SteakNinja | 0:720912d4ddcb | 10 | LM75B temp(p28, p27); |
SteakNinja | 0:720912d4ddcb | 11 | MMA7660 MMA(p28,p27); |
SteakNinja | 0:720912d4ddcb | 12 | C12832 lcd(p5,p7,p6,p8,p11); |
SteakNinja | 0:720912d4ddcb | 13 | Serial xbee(p9,p10); |
SteakNinja | 0:720912d4ddcb | 14 | Serial pc(USBTX, USBRX); |
SteakNinja | 0:720912d4ddcb | 15 | char Buffer[70]; |
SteakNinja | 0:720912d4ddcb | 16 | bool isSplitMode = false; |
SteakNinja | 0:720912d4ddcb | 17 | char allDelimiters[] = "{}\":,"; |
SteakNinja | 0:720912d4ddcb | 18 | char* strArray[100]; |
SteakNinja | 0:720912d4ddcb | 19 | |
SteakNinja | 0:720912d4ddcb | 20 | //Split string using preset characters |
SteakNinja | 0:720912d4ddcb | 21 | void delimitJson() |
SteakNinja | 0:720912d4ddcb | 22 | { |
SteakNinja | 0:720912d4ddcb | 23 | char* pch = strtok(Buffer, allDelimiters); |
SteakNinja | 0:720912d4ddcb | 24 | int i = 0; |
SteakNinja | 0:720912d4ddcb | 25 | while (pch != NULL) { |
SteakNinja | 0:720912d4ddcb | 26 | strArray[i] = pch; |
SteakNinja | 0:720912d4ddcb | 27 | pch = strtok (NULL, allDelimiters); |
SteakNinja | 0:720912d4ddcb | 28 | i++; |
SteakNinja | 0:720912d4ddcb | 29 | } |
SteakNinja | 0:720912d4ddcb | 30 | pch = NULL; |
SteakNinja | 0:720912d4ddcb | 31 | } |
SteakNinja | 0:720912d4ddcb | 32 | |
SteakNinja | 0:720912d4ddcb | 33 | void switchMode() |
SteakNinja | 0:720912d4ddcb | 34 | { |
SteakNinja | 0:720912d4ddcb | 35 | //Switch between split display and JSON display mode |
SteakNinja | 0:720912d4ddcb | 36 | isSplitMode = !isSplitMode; |
SteakNinja | 0:720912d4ddcb | 37 | } |
SteakNinja | 0:720912d4ddcb | 38 | |
SteakNinja | 0:720912d4ddcb | 39 | void RxData() |
SteakNinja | 0:720912d4ddcb | 40 | { |
SteakNinja | 0:720912d4ddcb | 41 | //Check if data is received |
SteakNinja | 0:720912d4ddcb | 42 | if (xbee.readable()) { |
SteakNinja | 0:720912d4ddcb | 43 | //Put new serial data into Buffer until a '\n' (New Line) character is detected |
SteakNinja | 0:720912d4ddcb | 44 | xbee.scanf("%67s",Buffer); |
SteakNinja | 0:720912d4ddcb | 45 | } |
SteakNinja | 0:720912d4ddcb | 46 | if (isSplitMode) |
SteakNinja | 0:720912d4ddcb | 47 | { |
SteakNinja | 0:720912d4ddcb | 48 | //Split the string into a Char Array called strArray |
SteakNinja | 0:720912d4ddcb | 49 | delimitJson(); |
SteakNinja | 0:720912d4ddcb | 50 | //Draw first two entries in the array (Temp: value) |
SteakNinja | 0:720912d4ddcb | 51 | lcd.cls(); |
SteakNinja | 0:720912d4ddcb | 52 | lcd.locate(0,0); |
SteakNinja | 0:720912d4ddcb | 53 | lcd.printf("%s:",strArray[0]); |
SteakNinja | 0:720912d4ddcb | 54 | lcd.locate(25,0); |
SteakNinja | 0:720912d4ddcb | 55 | lcd.printf(strArray[1]); |
SteakNinja | 0:720912d4ddcb | 56 | //Draw next two entries in the array (X: value) |
SteakNinja | 0:720912d4ddcb | 57 | lcd.locate(0,10); |
SteakNinja | 0:720912d4ddcb | 58 | lcd.printf("%s:",strArray[2]); |
SteakNinja | 0:720912d4ddcb | 59 | lcd.locate(25,10); |
SteakNinja | 0:720912d4ddcb | 60 | lcd.printf(strArray[3]); |
SteakNinja | 0:720912d4ddcb | 61 | //Draw next two entries in the array (Y: value) |
SteakNinja | 0:720912d4ddcb | 62 | lcd.locate(0,20); |
SteakNinja | 0:720912d4ddcb | 63 | lcd.printf("%s:",strArray[4]); |
SteakNinja | 0:720912d4ddcb | 64 | lcd.locate(25,20); |
SteakNinja | 0:720912d4ddcb | 65 | lcd.printf(strArray[5]); |
SteakNinja | 0:720912d4ddcb | 66 | //Draw next two entries in the array (Z: value) |
SteakNinja | 0:720912d4ddcb | 67 | lcd.locate(60,0); |
SteakNinja | 0:720912d4ddcb | 68 | lcd.printf("%s:",strArray[6]); |
SteakNinja | 0:720912d4ddcb | 69 | lcd.locate(85,0); |
SteakNinja | 0:720912d4ddcb | 70 | lcd.printf(strArray[7]); |
SteakNinja | 0:720912d4ddcb | 71 | //Draw next two entries in the array (Pot1: value) |
SteakNinja | 0:720912d4ddcb | 72 | lcd.locate(60,10); |
SteakNinja | 0:720912d4ddcb | 73 | lcd.printf("%s:",strArray[8]); |
SteakNinja | 0:720912d4ddcb | 74 | lcd.locate(85,10); |
SteakNinja | 0:720912d4ddcb | 75 | lcd.printf(strArray[9]); |
SteakNinja | 0:720912d4ddcb | 76 | //Draw last two entries in the array (Pot2: value) |
SteakNinja | 0:720912d4ddcb | 77 | lcd.locate(60,20); |
SteakNinja | 0:720912d4ddcb | 78 | lcd.printf("%s:",strArray[10]); |
SteakNinja | 0:720912d4ddcb | 79 | lcd.locate(85,20); |
SteakNinja | 0:720912d4ddcb | 80 | lcd.printf(strArray[11]); |
SteakNinja | 0:720912d4ddcb | 81 | } else { |
SteakNinja | 0:720912d4ddcb | 82 | lcd.cls(); |
SteakNinja | 0:720912d4ddcb | 83 | lcd.locate(0,0); |
SteakNinja | 0:720912d4ddcb | 84 | lcd.printf(Buffer); |
SteakNinja | 0:720912d4ddcb | 85 | } |
SteakNinja | 0:720912d4ddcb | 86 | } |
SteakNinja | 0:720912d4ddcb | 87 | |
SteakNinja | 0:720912d4ddcb | 88 | int main() |
SteakNinja | 0:720912d4ddcb | 89 | { |
SteakNinja | 0:720912d4ddcb | 90 | //Attach receive interrupt to xbee serial pins |
SteakNinja | 0:720912d4ddcb | 91 | xbee.attach(&RxData, Serial::RxIrq); |
SteakNinja | 0:720912d4ddcb | 92 | //Attach button interrupt to the switchMode method |
SteakNinja | 0:720912d4ddcb | 93 | JoyDown.rise(&switchMode); |
SteakNinja | 0:720912d4ddcb | 94 | //Initialise LM75B temperature sensor |
SteakNinja | 0:720912d4ddcb | 95 | if (temp.open()) { |
SteakNinja | 0:720912d4ddcb | 96 | pc.printf("\r\nLM75B Operational\r\n"); |
SteakNinja | 0:720912d4ddcb | 97 | } |
SteakNinja | 0:720912d4ddcb | 98 | |
SteakNinja | 0:720912d4ddcb | 99 | while(1) { |
SteakNinja | 0:720912d4ddcb | 100 | //Flash LED so we know program is running |
SteakNinja | 0:720912d4ddcb | 101 | myled = 1; |
SteakNinja | 0:720912d4ddcb | 102 | wait(0.2); |
SteakNinja | 0:720912d4ddcb | 103 | myled = 0; |
SteakNinja | 0:720912d4ddcb | 104 | wait(0.2); |
SteakNinja | 0:720912d4ddcb | 105 | //Send current data from sensors to Xbee |
SteakNinja | 0:720912d4ddcb | 106 | xbee.printf("{Temp:%.3f,X:%.4f,Y:%.4f,Z:%.4f,Pot1:%.3f,Pot2:%.3f}\n", temp.temp(), MMA.x(), MMA.y(), MMA.z(), pot1.read(), pot2.read()); |
SteakNinja | 0:720912d4ddcb | 107 | } |
SteakNinja | 0:720912d4ddcb | 108 | } |