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

Committer:
SteakNinja
Date:
2018-11-28
Revision:
0:720912d4ddcb

File content as of revision 0:720912d4ddcb:

#include "mbed.h"
#include "LM75B.h"
#include "MMA7660.h"
#include "C12832.h"

DigitalOut myled(LED1);
AnalogIn pot1(p19);
AnalogIn pot2(p20);
InterruptIn JoyDown(p12);
LM75B temp(p28, p27);
MMA7660 MMA(p28,p27);
C12832 lcd(p5,p7,p6,p8,p11);
Serial xbee(p9,p10);
Serial pc(USBTX, USBRX);
char Buffer[70];
bool isSplitMode = false;
char allDelimiters[] = "{}\":,";
char* strArray[100];

//Split string using preset characters
void delimitJson()
{
    char* pch = strtok(Buffer, allDelimiters);
    int i = 0;
    while (pch != NULL) {
        strArray[i] = pch;
        pch = strtok (NULL, allDelimiters);
        i++;
    }
    pch = NULL;
}

void switchMode()
{
    //Switch between split display and JSON display mode
    isSplitMode = !isSplitMode;
}

void RxData()
{
    //Check if data is received
    if (xbee.readable()) {
        //Put new serial data into Buffer until a '\n' (New Line) character is detected
        xbee.scanf("%67s",Buffer);
    }
    if (isSplitMode)
    {
        //Split the string into a Char Array called strArray
        delimitJson();
        //Draw first two entries in the array (Temp: value)
        lcd.cls();
        lcd.locate(0,0);
        lcd.printf("%s:",strArray[0]);
        lcd.locate(25,0);
        lcd.printf(strArray[1]);
        //Draw next two entries in the array (X: value)
        lcd.locate(0,10);
        lcd.printf("%s:",strArray[2]);
        lcd.locate(25,10);
        lcd.printf(strArray[3]);
        //Draw next two entries in the array (Y: value)
        lcd.locate(0,20);
        lcd.printf("%s:",strArray[4]);
        lcd.locate(25,20);
        lcd.printf(strArray[5]);
        //Draw next two entries in the array (Z: value)
        lcd.locate(60,0);
        lcd.printf("%s:",strArray[6]);
        lcd.locate(85,0);
        lcd.printf(strArray[7]);
        //Draw next two entries in the array (Pot1: value)
        lcd.locate(60,10);
        lcd.printf("%s:",strArray[8]);
        lcd.locate(85,10);
        lcd.printf(strArray[9]);
        //Draw last two entries in the array (Pot2: value)
        lcd.locate(60,20);
        lcd.printf("%s:",strArray[10]);
        lcd.locate(85,20);
        lcd.printf(strArray[11]);
    } else {
        lcd.cls();
        lcd.locate(0,0);
        lcd.printf(Buffer);
    }
}

int main()
{
    //Attach receive interrupt to xbee serial pins
    xbee.attach(&RxData, Serial::RxIrq);
    //Attach button interrupt to the switchMode method
    JoyDown.rise(&switchMode);
    //Initialise LM75B temperature sensor
    if (temp.open()) {
        pc.printf("\r\nLM75B Operational\r\n");
    }

    while(1) {
        //Flash LED so we know program is running
        myled = 1;
        wait(0.2);
        myled = 0;
        wait(0.2);
        //Send current data from sensors to Xbee
        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());
    }
}