Simple Mbed Cloud client application using features of K64F including Wi-Fi and SD Card

Fork of mbed-cloud-connect-example-ethernet by NXP

Configuration

  • Put ESP-WROOM-02 shield
  • Put Mbed Application Shield
  • Edit the text in the main.cpp

#define WIFI_SSID "SSID"
#define WIFI_PSWD "PASSWORD"
  • Download and replace your developer certificate from Mbed Cloud portal from the menu [Mbed Cloud] - [Certificate]
Revision:
19:999d13f83602
Parent:
18:139960a75894
--- a/main.cpp	Tue Jul 03 02:54:58 2018 +0000
+++ b/main.cpp	Tue Jul 03 04:32:09 2018 +0000
@@ -21,6 +21,8 @@
 #include "SDBlockDevice.h"
 #include "FATFileSystem.h"
 #include "ESP8266Interface.h"
+#include "MMA7660.h"
+#include "LM75B.h"
 
 #define WIFI_SSID "SSID"
 #define WIFI_PSWD "PASSWORD"
@@ -31,23 +33,31 @@
 Thread thread1;
 
 // Storage implementation definition, currently using SDBlockDevice (SPI flash, DataFlash, and internal flash are also available)
-/* K64 & K66 */ 
+/* K64 & K66 */
 InterruptIn sw2(SW2);
 DigitalOut led2(LED2);
-/* K64 & K66 */
+
 SDBlockDevice sd(PTE3, PTE1, PTE2, PTE4);
 FATFileSystem fs("sd", &sd);
 ESP8266Interface net(D1, D0);
+LM75B lm75b(I2C_SDA, I2C_SCL);     // temperature
+MMA7660 mma7660(I2C_SDA, I2C_SCL); // accel
 
+const int NUM_AXIS = 3;
 
 // Declaring pointers for access to Mbed Cloud Client resources outside of main()
 MbedCloudClientResource *button_res;
 MbedCloudClientResource *pattern_res;
+MbedCloudClientResource *temp_res;
+MbedCloudClientResource *temp_unit_res;    
+MbedCloudClientResource *accel_res[NUM_AXIS];
+MbedCloudClientResource *acc_unit_res;
 
 static bool button_pressed = false;
 static int button_count = 0;
-      
-void button_press() {
+
+void button_press()
+{
     button_pressed = true;
     ++button_count;
     button_res->set_value(button_count);
@@ -58,7 +68,8 @@
  * @param resource The resource that triggered the callback
  * @param newValue Updated value for the resource
  */
-void pattern_updated(MbedCloudClientResource *resource, m2m::String newValue) {
+void pattern_updated(MbedCloudClientResource *resource, m2m::String newValue)
+{
     printf("PUT received, new value: %s\n", newValue.c_str());
 }
 
@@ -69,7 +80,8 @@
  *               Note that the buffer is deallocated after leaving this function, so copy it if you need it longer.
  * @param size Size of the body
  */
-void blink_callback(MbedCloudClientResource *resource, const uint8_t *buffer, uint16_t size) {
+void blink_callback(MbedCloudClientResource *resource, const uint8_t *buffer, uint16_t size)
+{
     printf("POST received. Going to blink LED pattern: %s\n", pattern_res->get_value().c_str());
 
     static DigitalOut augmentedLed(LED1); // LED that is used for blinking the pattern
@@ -97,19 +109,51 @@
  * @param resource The resource that triggered the callback
  * @param status The delivery status of the notification
  */
-void button_callback(MbedCloudClientResource *resource, const NoticationDeliveryStatus status) {
+void button_callback(MbedCloudClientResource *resource, const NoticationDeliveryStatus status)
+{
     printf("Button notification, status %s (%d)\n", MbedCloudClientResource::delivery_status_to_string(status), status);
 }
 
+void temp_callback(MbedCloudClientResource *resource, const NoticationDeliveryStatus status)
+{
+    printf("Temperature notification, status %s (%d)\n", MbedCloudClientResource::delivery_status_to_string(status), status);
+}
+
+void accel_callback(MbedCloudClientResource *resource, const NoticationDeliveryStatus status)
+{
+    printf("Accelerometer notification, status %s (%d)\n", MbedCloudClientResource::delivery_status_to_string(status), status);
+}
+
+void measure_sensors()
+{
+    float temperature, acc[3];
+    const unsigned int buf_size = 20;
+    char buf[buf_size];
+
+    mma7660.readData(acc);
+    for(int i=0; i < NUM_AXIS; i++) {
+        snprintf(buf, buf_size, "%f", acc[i]);
+        accel_res[i]->set_value(buf);
+    }
+    printf("acc: %f,%f,%f\n", acc[0], acc[1], acc[2]);
+
+    temperature = lm75b.read();
+    snprintf(buf, buf_size, "%f", temperature);
+    temp_res->set_value(buf);
+    printf("temp: %s\n", buf);
+}
+
 /**
  * Registration callback handler
  * @param endpoint Information about the registered endpoint such as the name (so you can find it back in portal)
  */
-void registered(const ConnectorClientEndpointInfo *endpoint) {
+void registered(const ConnectorClientEndpointInfo *endpoint)
+{
     printf("Connected to Mbed Cloud. Endpoint Name: %s\n", endpoint->internal_endpoint_name.c_str());
 }
 
-int main(void) {
+int main(void)
+{
     printf("Starting Simple Mbed Cloud Client example\n");
     printf("Connecting to the network using Wi-Fi...\n");
 
@@ -146,7 +190,30 @@
     MbedCloudClientResource *blink_res = client.create_resource("3201/0/5850", "blink_action");
     blink_res->methods(M2MMethod::POST);
     blink_res->attach_post_callback(blink_callback);
+    
+    temp_res = client.create_resource("3303/0/5700", "temperature");
+    temp_res->set_value("0");
+    temp_res->methods(M2MMethod::GET);
+    temp_res->attach_notification_callback(temp_callback);
+    temp_res->observable(true);
 
+    temp_unit_res = client.create_resource("3303/0/5701", "unit");
+    temp_unit_res->set_value("Cel");
+    
+    accel_res[0] = client.create_resource("3313/0/5702", "accel_x");
+    accel_res[1] = client.create_resource("3313/0/5703", "accel_y");
+    accel_res[2] = client.create_resource("3313/0/5704", "accel_z");
+
+    for (int i=0; i < NUM_AXIS; i++) {
+        accel_res[i]->set_value(0);
+        accel_res[i]->methods(M2MMethod::GET);
+        accel_res[i]->attach_notification_callback(accel_callback);
+        accel_res[i]->observable(true);
+    }
+
+    acc_unit_res = client.create_resource("3313/0/5701", "unit");
+    acc_unit_res->set_value("G");
+    
     printf("Initialized Mbed Cloud Client. Registering...\n");
 
     // Callback that fires when registering is complete
@@ -155,25 +222,29 @@
     // Register with Mbed Cloud
     client.register_and_connect();
 
-    // Setup the button 
-      sw2.mode(PullUp);
-    
+    // Setup the button
+    sw2.mode(PullUp);
+
     // The button fall handler is placed in the event queue so it will run in
-    // thread context instead of ISR context, which allows safely updating the cloud resource         
-      sw2.fall(eventQueue.event(&button_press));
-      button_count = 0;
+    // thread context instead of ISR context, which allows safely updating the cloud resource
+    sw2.fall(eventQueue.event(&button_press));
+    button_count = 0;
+
+    // Placeholder for callback to update local resource when GET comes.
+    // The timer fires on an interrupt context, but debounces it to the eventqueue, so it's safe to do network operations
+    Ticker timer;
+    timer.attach(eventQueue.event(&measure_sensors), 5.0);
 
     // Start the event queue in a separate thread so the main thread continues
     thread1.start(callback(&eventQueue, &EventQueue::dispatch_forever));
 
-    while(1)
-    {
+    while(1) {
         wait_ms(100);
 
         if (button_pressed) {
             button_pressed = false;
-            printf("button clicked %d times\r\n", button_count);            
+            printf("button clicked %d times\r\n", button_count);
         }
-        
+
     }
 }