A program for IoT demonstration with mbed, EnOcean and MQTT.

Dependencies:   IBMIoTClientEthernetExample C12832 EthernetInterface MQTT USB400Serial USBHost mbed

Fork of IBMIoTClientEthernetExample by IBM Watson IoT

Files at this revision

API Documentation at this revision

Comitter:
ytsuboi
Date:
Sat Aug 08 04:23:12 2015 +0000
Parent:
11:7a6df9a2dcdc
Commit message:
Initial version for demonstration at Maker Faire Tokyo 2015

Changed in this revision

0_IBMIoTClientEthernetExample.lib Show annotated file Show diff for this revision Revisions of this file
LM75B.lib Show diff for this revision Revisions of this file
LPC1768.h Show annotated file Show diff for this revision Revisions of this file
MMA7660.lib Show diff for this revision Revisions of this file
USB400Serial.lib Show annotated file Show diff for this revision Revisions of this file
USBHost.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show diff for this revision Revisions of this file
diff -r 7a6df9a2dcdc -r 354dbc33ecc0 0_IBMIoTClientEthernetExample.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/0_IBMIoTClientEthernetExample.lib	Sat Aug 08 04:23:12 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/teams/IBM_IoT/code/IBMIoTClientEthernetExample/#7a6df9a2dcdc
diff -r 7a6df9a2dcdc -r 354dbc33ecc0 LM75B.lib
--- a/LM75B.lib	Tue Mar 10 08:24:52 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/neilt6/code/LM75B/#7ac462ba84ac
diff -r 7a6df9a2dcdc -r 354dbc33ecc0 LPC1768.h
--- a/LPC1768.h	Tue Mar 10 08:24:52 2015 +0000
+++ b/LPC1768.h	Sat Aug 08 04:23:12 2015 +0000
@@ -19,12 +19,15 @@
 #define LPC1768_H
 
 C12832 lcd(p5, p7, p6, p8, p11);
+DigitalOut led1(LED1);
 DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
 PwmOut r(p23);
 PwmOut g(p24);
 PwmOut b(p25);
-MMA7660 MMA(p28, p27);
-LM75B sensor(p28, p27);
+//MMA7660 MMA(p28, p27);
+//LM75B sensor(p28, p27);
 DigitalIn Down(p12);
 DigitalIn Left(p13);
 DigitalIn Click(p14);
diff -r 7a6df9a2dcdc -r 354dbc33ecc0 MMA7660.lib
--- a/MMA7660.lib	Tue Mar 10 08:24:52 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/Sissors/code/MMA7660/#36a163511e34
diff -r 7a6df9a2dcdc -r 354dbc33ecc0 USB400Serial.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USB400Serial.lib	Sat Aug 08 04:23:12 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/nanashino/code/USB400Serial/#0dd5d1e4cf71
diff -r 7a6df9a2dcdc -r 354dbc33ecc0 USBHost.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/USBHost.lib	Sat Aug 08 04:23:12 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/USBHost/#220cd93c9a5f
diff -r 7a6df9a2dcdc -r 354dbc33ecc0 main.cpp
--- a/main.cpp	Tue Mar 10 08:24:52 2015 +0000
+++ b/main.cpp	Sat Aug 08 04:23:12 2015 +0000
@@ -21,10 +21,9 @@
  *
  *******************************************************************************/
 
-#include "LM75B.h"
-#include "MMA7660.h"
 #include "MQTTClient.h"
 #include "MQTTEthernet.h"
+#include "USB400Serial.h"
 #include "C12832.h"
 #include "Arial12x12.h"
 #include "rtos.h"
@@ -33,10 +32,10 @@
 #define __APP_SW_REVISION__ "10"
 
 // Configuration values needed to connect to IBM IoT Cloud
-#define ORG "quickstart"             // For a registered connection, replace with your org
-#define ID ""                        // For a registered connection, replace with your id
-#define AUTH_TOKEN ""                // For a registered connection, replace with your auth-token
-#define TYPE DEFAULT_TYPE_NAME       // For a registered connection, replace with your type
+#define ORG "CHANGE_THIS"               // For a registered connection, replace with your org
+#define ID "CHANGE_THIS"                // For a registered connection, replace with your id
+#define AUTH_TOKEN "CHANGE_THIS"        // For a registered connection, replace with your auth-token
+#define TYPE "CHANGE_THIS"              // For a registered connection, replace with your type
 
 #define MQTT_PORT 1883
 #define MQTT_TLS_PORT 8883
@@ -55,7 +54,7 @@
 #include "K64F.h"
 #endif
 
-bool quickstartMode = true;
+bool quickstartMode = false;
 char org[11] = ORG;  
 char type[30] = TYPE;
 char id[30] = ID;                 // mac without colons
@@ -65,6 +64,46 @@
 char* joystickPos = "CENTRE";
 int blink_interval = 0;
 
+int sensor = 0;
+int humidity = 0;
+int temperature = 0;
+
+uint8_t u8CRC8Table[256] = {
+    0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15,
+    0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d,
+    0x70, 0x77, 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65,
+    0x48, 0x4f, 0x46, 0x41, 0x54, 0x53, 0x5a, 0x5d,
+    0xe0, 0xe7, 0xee, 0xe9, 0xfc, 0xfb, 0xf2, 0xf5,
+    0xd8, 0xdf, 0xd6, 0xd1, 0xc4, 0xc3, 0xca, 0xcd,
+    0x90, 0x97, 0x9e, 0x99, 0x8c, 0x8b, 0x82, 0x85,
+    0xa8, 0xaf, 0xa6, 0xa1, 0xb4, 0xb3, 0xba, 0xbd,
+    0xc7, 0xc0, 0xc9, 0xce, 0xdb, 0xdc, 0xd5, 0xd2,
+    0xff, 0xf8, 0xf1, 0xf6, 0xe3, 0xe4, 0xed, 0xea,
+    0xb7, 0xb0, 0xb9, 0xbe, 0xab, 0xac, 0xa5, 0xa2,
+    0x8f, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9d, 0x9a,
+    0x27, 0x20, 0x29, 0x2e, 0x3b, 0x3c, 0x35, 0x32,
+    0x1f, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0d, 0x0a,
+    0x57, 0x50, 0x59, 0x5e, 0x4b, 0x4c, 0x45, 0x42,
+    0x6f, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7d, 0x7a,
+    0x89, 0x8e, 0x87, 0x80, 0x95, 0x92, 0x9b, 0x9c,
+    0xb1, 0xb6, 0xbf, 0xb8, 0xad, 0xaa, 0xa3, 0xa4,
+    0xf9, 0xfe, 0xf7, 0xf0, 0xe5, 0xe2, 0xeb, 0xec,
+    0xc1, 0xc6, 0xcf, 0xc8, 0xdd, 0xda, 0xd3, 0xd4,
+    0x69, 0x6e, 0x67, 0x60, 0x75, 0x72, 0x7b, 0x7c,
+    0x51, 0x56, 0x5f, 0x58, 0x4d, 0x4a, 0x43, 0x44,
+    0x19, 0x1e, 0x17, 0x10, 0x05, 0x02, 0x0b, 0x0c,
+    0x21, 0x26, 0x2f, 0x28, 0x3d, 0x3a, 0x33, 0x34,
+    0x4e, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5c, 0x5b,
+    0x76, 0x71, 0x78, 0x7f, 0x6A, 0x6d, 0x64, 0x63,
+    0x3e, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2c, 0x2b,
+    0x06, 0x01, 0x08, 0x0f, 0x1a, 0x1d, 0x14, 0x13,
+    0xae, 0xa9, 0xa0, 0xa7, 0xb2, 0xb5, 0xbc, 0xbb,
+    0x96, 0x91, 0x98, 0x9f, 0x8a, 0x8D, 0x84, 0x83,
+    0xde, 0xd9, 0xd0, 0xd7, 0xc2, 0xc5, 0xcc, 0xcb,
+    0xe6, 0xe1, 0xe8, 0xef, 0xfa, 0xfd, 0xf4, 0xf3
+};
+
+#define proccrc8(u8CRC, u8Data) (u8CRC8Table[u8CRC ^ u8Data])
 
 void off()
 {
@@ -116,68 +155,6 @@
     }
 }
 
-
-void printMenu(int menuItem) 
-{
-    lcd.cls();
-    lcd.locate(0,0);
-    switch (menuItem)
-    {
-        case 0:
-            lcd.printf("IBM IoT Cloud");
-            lcd.locate(0,16);
-            lcd.printf("Scroll with joystick");
-            break;
-        case 1:
-            lcd.printf("Go to:");
-            lcd.locate(0,16);
-            lcd.printf("http://ibm.biz/iotqstart");
-            break;
-        case 2:
-            lcd.printf("Device Identity:");
-            lcd.locate(0,16);
-            lcd.printf("%s", id);
-            break;
-        case 3:
-            lcd.printf("Status:");
-            lcd.locate(0,16);
-            lcd.printf(connected ? "Connected" : "Disconnected");
-            break;
-        case 4:
-            lcd.printf("App version:");
-            lcd.locate(0,16);
-            lcd.printf("%s",__APP_SW_REVISION__);
-            break;
-    }
-}
-
-
-void setMenu()
-{
-    static int menuItem = 0;
-    if (Down)
-    {
-        joystickPos = "DOWN";
-        if (menuItem >= 0 && menuItem < 4)
-            printMenu(++menuItem);
-    } 
-    else if (Left)
-        joystickPos = "LEFT";
-    else if (Click)
-        joystickPos = "CLICK";
-    else if (Up)
-    {
-        joystickPos = "UP";
-        if (menuItem <= 4 && menuItem > 0)
-            printMenu(--menuItem);
-    }
-    else if (Right)
-        joystickPos = "RIGHT";
-    else
-        joystickPos = "CENTRE";
-}
-
-
 /**
  * Display a message on the LCD screen prefixed with IBM IoT Cloud
  */
@@ -197,7 +174,7 @@
     
     char hostname[strlen(org) + strlen(iot_ibm) + 1];
     sprintf(hostname, "%s%s", org, iot_ibm);
-    DEBUG("hostname is %s\n", hostname);
+//    DEBUG("hostname is %s\n", hostname);
     int rc = ipstack->connect(hostname, IBM_IOT_PORT);
     if (rc != 0)
         return rc;
@@ -205,7 +182,7 @@
     // Construct clientId - d:org:type:id
     char clientId[strlen(org) + strlen(type) + strlen(id) + 5];
     sprintf(clientId, "d:%s:%s:%s", org, type, id);
-    DEBUG("clientid is %s\n", clientId);
+//    DEBUG("clientid is %s\n", clientId);
     
     // MQTT Connect
     MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
@@ -223,9 +200,7 @@
         connected = true;
         green();    
         displayMessage("Connected");
-        wait(2);
-        displayMessage("Scroll with joystick");
-    }
+  }
     return rc;
 }
 
@@ -247,7 +222,7 @@
         wait(1.0f);
         WARN("Ethernet link not present. Check cable connection\n");
     }
-        
+    
     while (connect(client, ipstack) != 0) 
     {    
 #if defined(TARGET_K64F)
@@ -276,9 +251,12 @@
     char* pubTopic = "iot-2/evt/status/fmt/json";
             
     char buf[250];
+//    sprintf(buf,
+//     "{\"d\":{\"myName\":\"IoT mbed\",\"accelX\":%0.4f,\"accelY\":%0.4f,\"accelZ\":%0.4f,\"temp\":%0.4f,\"joystick\":\"%s\",\"potentiometer1\":%0.4f,\"potentiometer2\":%0.4f}}",
+//            MMA.x(), MMA.y(), MMA.z(), sensor.temp(), joystickPos, ain1.read(), ain2.read());
     sprintf(buf,
-     "{\"d\":{\"myName\":\"IoT mbed\",\"accelX\":%0.4f,\"accelY\":%0.4f,\"accelZ\":%0.4f,\"temp\":%0.4f,\"joystick\":\"%s\",\"potentiometer1\":%0.4f,\"potentiometer2\":%0.4f}}",
-            MMA.x(), MMA.y(), MMA.z(), sensor.temp(), joystickPos, ain1.read(), ain2.read());
+     "{\"d\":{\"sensor\":\"%02X\",\"hum\":%3.1f,\"temp\":%2.2f}}",
+            sensor, humidity*0.4, temperature*0.16);
     message.qos = MQTT::QOS0;
     message.retained = false;
     message.dup = false;
@@ -289,42 +267,6 @@
     return client->publish(pubTopic, message);
 }
 
-
-#if defined(TARGET_K64F)
-int getUUID48(char* buf, int buflen) 
-{
-    unsigned int UUID_LOC_WORD0 = 0x40048060;
-    unsigned int UUID_LOC_WORD1 = 0x4004805C;
- 
-    // Fetch word 0
-    uint32_t word0 = *(uint32_t *)UUID_LOC_WORD0;
- 
-    // Fetch word 1
-    // we only want bottom 16 bits of word1 (MAC bits 32-47)
-    // and bit 9 forced to 1, bit 8 forced to 0
-    // Locally administered MAC, reduced conflicts
-    // http://en.wikipedia.org/wiki/MAC_address
-    uint32_t word1 = *(uint32_t *)UUID_LOC_WORD1;
-    word1 |= 0x00000200;
-    word1 &= 0x0000FEFF;
- 
-    int rc = snprintf(buf, buflen, "%4x%08x", word1, word0);   // Device id must be in lower case
-    
-    return rc;
-}
-#else
-char* getMac(EthernetInterface& eth, char* buf, int buflen)    // Obtain MAC address
-{   
-    strncpy(buf, eth.getMACAddress(), buflen);
-
-    char* pos;                                                 // Remove colons from mac address
-    while ((pos = strchr(buf, ':')) != NULL)
-        memmove(pos, pos + 1, strlen(pos) + 1);
-    return buf;
-}
-#endif
-
-
 void messageArrived(MQTT::MessageData& md)
 {
     MQTT::Message &message = md.message;
@@ -358,16 +300,13 @@
         WARN("Unsupported command: %.*s\n", len, start);
 }
 
-
 int main()
-{    
-    quickstartMode = (strcmp(org, "quickstart") == 0);
+{
+//    quickstartMode = (strcmp(org, "quickstart") == 0);
+    lcd.set_font((unsigned char*) Arial12x12);  // Set a nice font for the LCD screen
+    led2 = LED2_OFF; // K64F: turn off the main board LED 
+    displayMessage("Connecting");
 
-    lcd.set_font((unsigned char*) Arial12x12);  // Set a nice font for the LCD screen
-    
-    led2 = LED2_OFF; // K64F: turn off the main board LED 
-    
-    displayMessage("Connecting");
 #if defined(TARGET_K64F)
     yellow();  // Don't flash on the K64F, because starting a thread causes the EthernetInterface init call to hang
 #else
@@ -376,7 +315,7 @@
     
     MQTTEthernet ipstack;
     MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
-    
+/*
     if (quickstartMode)
     {
 #if defined(TARGET_K64F)
@@ -385,33 +324,91 @@
         getMac(ipstack.getEth(), id, sizeof(id));
 #endif
     }
-    
+*/    
     attemptConnect(&client, &ipstack);
-    
-    if (!quickstartMode) 
-    {
+
+//    if (!quickstartMode) 
+//    {
         int rc = 0;
         if ((rc = client.subscribe("iot-2/cmd/+/fmt/json", MQTT::QOS1, messageArrived)) != 0)
             WARN("rc from MQTT subscribe is %d\n", rc); 
-    }
+//    }
+
+    USB400Serial usb400;
+    int i;
+    int dataLength;
+    int optionalLength;
+    uint8_t c;
+    uint8_t crc;
     
-    blink_interval = 0;
-    int count = 0;
-    while (true)
-    {
-        if (++count == 100)
-        {               // Publish a message every second
-            if (publish(&client, &ipstack) != 0) 
-                attemptConnect(&client, &ipstack);   // if we have lost the connection
-            count = 0;
+    while(1) {
+
+        while(!usb400.connect())
+            wait(0.5);
+
+        while (1) {
+            if (!usb400.connected())
+                break;
+
+            if (usb400.available()) {
+                c = usb400.getc();
+
+                if (c == 0x55) {
+                    crc = 0;
+
+                    c = usb400.getc();
+                    crc = proccrc8(crc, c);
+                    dataLength = c;
+
+                    c = usb400.getc();
+                    crc = proccrc8(crc, c);
+                    dataLength = (dataLength << 8) | c;
+
+                    c = usb400.getc();
+                    crc = proccrc8(crc, c);
+                    optionalLength = c;
+
+                    c = usb400.getc();
+                    crc = proccrc8(crc, c); // packet type
+
+                    c = usb400.getc();
+                    crc = proccrc8(crc, c); // CRC
+
+                    if (crc == 0) {
+                        crc = 0;
+
+                        for (i = 0; i < dataLength; i++) {
+                            c = usb400.getc();
+                            crc = proccrc8(crc, c);
+
+                            if (i == 4) {
+//                                printf("Sensor: %02X ", c);
+                                sensor = c;
+                            }
+                            //A5-04-01
+                            if (i == 6) {
+                                humidity = c;
+                            }
+                            if (i == 7) {
+                                temperature = c;
+                            }
+                        }
+//                        printf("hum:%3.1f%% temp:%2.2fC\r\n", humidity*0.4, temperature*0.16);
+                        
+                        if (publish(&client, &ipstack) != 0) 
+                        attemptConnect(&client, &ipstack);   // if we have lost the connection
+
+                        for (i = 0; i < optionalLength; i++) {
+                            c = usb400.getc();
+                            crc = proccrc8(crc, c);
+                        }
+
+                        c = usb400.getc();
+                        crc = proccrc8(crc, c);
+
+                    }
+                }
+            }
         }
-        
-        if (blink_interval == 0)
-            led2 = LED2_OFF;
-        else if (count % blink_interval == 0)
-            led2 = !led2;
-        if (count % 20 == 0)
-            setMenu();
-        client.yield(10);  // allow the MQTT client to receive messages
-    }
+    }    
 }
diff -r 7a6df9a2dcdc -r 354dbc33ecc0 mbed-rtos.lib
--- a/mbed-rtos.lib	Tue Mar 10 08:24:52 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/mbed_official/code/mbed-rtos/#aaa1b2c7c64c