earthquake finder

Dependencies:   C12832 EthernetInterface MQTT mbed-rtos mbed picojson

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 /* Include mbed library */
00002 #include "mbed.h"
00003 
00004 /* Include LCD library */
00005 #include "C12832.h"
00006 
00007 /* include MQTT library */
00008 #include "MQTTEthernet.h"
00009 #include "MQTTClient.h"
00010 
00011 /* Include Json Library */
00012 #include "picojson.h"
00013 
00014 
00015 /* Communication with the host (serial over USB) */
00016 Serial host (USBTX, USBRX);   
00017 
00018 /* LED on main card */
00019 DigitalOut gpo(D0);
00020 DigitalOut ledR(LED_RED);
00021 DigitalOut ledG(LED_GREEN);
00022 
00023 
00024 /* LED on shield card */
00025 PwmOut red(D5);
00026 PwmOut green(D9);
00027 
00028 /* LCD on the shield (128x32) */
00029 C12832 shlcd (D11, D13, D12, D7, D10);
00030 
00031 /* Joystics */
00032 DigitalIn select(D4);
00033 
00034 /* Speaker */
00035 PwmOut speaker(D6);
00036 
00037 static volatile int Check = 0;
00038 static int err = 0;
00039 
00040 /* Put all led off */
00041 void ledOff()
00042 {
00043     ledR = 1;
00044     ledG = 1;  
00045     red.write(1.0f);
00046     green.write(1.0f);
00047 }
00048 
00049 /* Show hostname and port on lcd */
00050 void showHostPort(char *host, int port)
00051 {
00052     shlcd.cls();
00053     shlcd.locate(40,2);
00054     shlcd.printf("Welcome");
00055     shlcd.locate(5,10);
00056     shlcd.printf("Connecting to : ");
00057     shlcd.locate(5,18);
00058     shlcd.printf("%s:%d", host, port);
00059     wait(0.2f);
00060 }
00061 
00062 /* Show error msg on lcd */
00063 void showErrorMsg(int rc)
00064 {
00065     shlcd.cls();
00066     shlcd.locate(5,2);
00067     shlcd.printf("An error occured,");
00068     shlcd.locate(5,10);
00069     shlcd.printf("pls restart the application");
00070     shlcd.locate(5,18);
00071     if (rc == 1)
00072         shlcd.printf("Connection fail to the host");
00073     else if (rc == 2)
00074         shlcd.printf("Client: Invalid information");
00075     else
00076         shlcd.printf("Fail to subscribe");
00077     wait(4.0f);
00078 }
00079 
00080 /* Show subscribe msg on lcd */
00081 void showSubscribe(char *topic)
00082 {
00083     shlcd.cls();
00084     shlcd.locate(40,2);
00085     shlcd.printf("Welcome");
00086     shlcd.locate(5,10);
00087     shlcd.printf("Subscribe to : ");
00088     shlcd.locate(5,18);
00089     shlcd.printf("%s", topic);
00090     wait(1.0f);
00091 }
00092 
00093 /* Show wait for data on lcd */
00094 void showWaitData()
00095 {
00096     shlcd.cls();
00097     shlcd.locate(40,2);
00098     shlcd.printf("Welcome");
00099     shlcd.locate(15,10);
00100     shlcd.printf("Pls wait for data ...");
00101 }
00102 
00103 /* Put on/off the light and active the speaker. (Danger 1 = Higth danger, Danger 3 = Low danger) */
00104 void danger1()
00105 {
00106     for (float i=2000.0; i<(float)10000.0; i+=(float)50.0) {
00107         speaker.period((float)1.0/i);
00108         speaker = 0.06;
00109         ledR = ledR ? 0 : 1;
00110         if (red.read() == 0)
00111             red.write(1.0f);
00112         else
00113             red.write(0.0f);
00114         wait(0.03);
00115     }
00116     speaker=0.0;
00117     ledR = 0;
00118     red.write(0.0f);
00119 }
00120 
00121 /* Put on/off the light and active the speaker. (Danger 1 = Higth danger, Danger 3 = Low danger) */
00122 void danger2()
00123 {
00124     for (float i=2000.0; i<(float)10000.0; i+=(float)75.0) {
00125         speaker.period((float)1.0/i);
00126         speaker = 0.06;
00127         ledR = ledR ? 0 : 1;
00128         if (green.read() == 0)
00129             green.write(1.0f);
00130         else
00131             green.write(0.0f);
00132         if (red.read() == 0)
00133             red.write(1.0f);
00134         else
00135             red.write(0.0f);
00136         wait(0.03);
00137     }
00138     speaker=0.0;
00139     ledG = 0;
00140     ledR = 0;
00141     red.write(0.0f);
00142     green.write(0.0f);
00143 } 
00144 
00145 /* Put on/off the light and active the speaker. (Danger 1 = Higth danger, Danger 3 = Low danger) */
00146 void danger3()
00147 {
00148     for (float i=2000.0; i<(float)10000.0; i+=(float)100.0) {
00149         speaker.period((float)1.0/i);
00150         speaker = 0.06;
00151         ledG = ledG ? 0 : 1;
00152         if (green.read() == 0)
00153             green.write(1.0f);
00154         else
00155             green.write(0.0f);
00156         wait(0.03);
00157     }
00158     speaker=0.0;
00159     ledG = 0;
00160     green.write(0.0f);
00161 } 
00162 
00163 /* Get msg from mqtt server, parse the json, show data on lcd and call the function danger. */
00164 void messageArrived(MQTT::MessageData& md)
00165 {
00166     MQTT::Message &message = md.message;
00167     picojson::value res;
00168     string json((char*)message.payload);
00169     const char *value = json.c_str();
00170     
00171     picojson::parse(res, value, value + strlen(value));
00172     if (Check == (10 * (int)res.get("nb").get<double>())) {
00173         ledOff();
00174         return ;
00175     }
00176     shlcd.cls();
00177     shlcd.locate(-4,0);
00178     shlcd.printf("%s", res.get("l").get<string>().c_str());
00179     shlcd.locate(0,8);
00180     shlcd.printf("%s", res.get("t").get<string>().c_str());
00181     shlcd.locate(0,16);
00182     shlcd.printf("Distance: %s, M: %s", res.get("di").get<string>().c_str(), res.get("m").get<string>().c_str()); 
00183     ledOff();
00184     if ((int)res.get("da").get<double>() == 1)
00185         danger1();
00186     else if ((int)res.get("da").get<double>() == 2)
00187         danger2();
00188     else
00189         danger3();
00190     Check = 10 * (int)res.get("nb").get<double>();
00191 }
00192 
00193 
00194 int main()
00195 {
00196     char *topic = "ab981_a5_iot";
00197     char *hostname = "test.mosquitto.org";
00198     int port = 1883;
00199 
00200     host.baud (38400);                              /* set baud rate */
00201     ledOff();
00202     showHostPort(hostname, port);
00203     MQTTEthernet ipstack = MQTTEthernet();
00204     MQTT::Client<MQTTEthernet, Countdown> client = MQTT::Client<MQTTEthernet, Countdown>(ipstack);
00205     if (ipstack.connect(hostname, port) != 0)  /* Connecting to server */
00206         showErrorMsg(1);
00207     MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
00208     data.MQTTVersion = 3;
00209     data.clientID.cstring = "mbed-a5";
00210     data.keepAliveInterval = 20;
00211     data.cleansession = 1;     
00212     if (client.connect(data) != 0)     /* send data client */
00213         showErrorMsg(2);
00214     showSubscribe(topic);
00215     if (client.subscribe(topic, MQTT::QOS2, messageArrived) != 0)  /* subscribe to channel */
00216         showErrorMsg(3);
00217     showWaitData();
00218     while (!select || err != 1) {
00219         client.yield(100);
00220     }
00221     shlcd.cls();
00222     shlcd.locate(40,8);
00223     shlcd.printf("Goodbye");
00224     client.unsubscribe(topic);
00225     client.disconnect();
00226     ipstack.disconnect();
00227 }