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]

Files at this revision

API Documentation at this revision

Comitter:
MACRUM
Date:
Tue Jul 03 04:32:09 2018 +0000
Parent:
18:139960a75894
Commit message:
Add sensor access code

Changed in this revision

LM75B.lib Show annotated file Show diff for this revision Revisions of this file
MMA7660.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_cloud_dev_credentials.c Show annotated file Show diff for this revision Revisions of this file
diff -r 139960a75894 -r 999d13f83602 LM75B.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LM75B.lib	Tue Jul 03 04:32:09 2018 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/chris/code/LM75B/#6a70c9303bbe
diff -r 139960a75894 -r 999d13f83602 MMA7660.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MMA7660.lib	Tue Jul 03 04:32:09 2018 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/Sissors/code/MMA7660/#36a163511e34
diff -r 139960a75894 -r 999d13f83602 main.cpp
--- 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);
         }
-        
+
     }
 }
diff -r 139960a75894 -r 999d13f83602 mbed_cloud_dev_credentials.c
--- a/mbed_cloud_dev_credentials.c	Tue Jul 03 02:54:58 2018 +0000
+++ b/mbed_cloud_dev_credentials.c	Tue Jul 03 04:32:09 2018 +0000
@@ -15,39 +15,39 @@
  */
 #ifndef __MBED_CLOUD_DEV_CREDENTIALS_H__
 #define __MBED_CLOUD_DEV_CREDENTIALS_H__
- 
+
 #if MBED_CONF_APP_DEVELOPER_MODE == 1
 #error "Replace mbed_cloud_dev_credentials.c with your own developer cert."
 #endif
- 
+
 #include <inttypes.h>
- 
+
 const char MBED_CLOUD_DEV_BOOTSTRAP_ENDPOINT_NAME[] = "";
 const char MBED_CLOUD_DEV_ACCOUNT_ID[] = "";
 const char MBED_CLOUD_DEV_BOOTSTRAP_SERVER_URI[] = "";
- 
+
 const uint8_t MBED_CLOUD_DEV_BOOTSTRAP_DEVICE_CERTIFICATE[] =
 { 0x0 };
- 
+
 const uint8_t MBED_CLOUD_DEV_BOOTSTRAP_SERVER_ROOT_CA_CERTIFICATE[] =
 { 0x0 };
- 
+
 const uint8_t MBED_CLOUD_DEV_BOOTSTRAP_DEVICE_PRIVATE_KEY[] =
 { 0x0 };
- 
+
 const char MBED_CLOUD_DEV_MANUFACTURER[] = "dev_manufacturer";
- 
+
 const char MBED_CLOUD_DEV_MODEL_NUMBER[] = "dev_model_num";
- 
+
 const char MBED_CLOUD_DEV_SERIAL_NUMBER[] = "0";
- 
+
 const char MBED_CLOUD_DEV_DEVICE_TYPE[] = "dev_device_type";
- 
+
 const char MBED_CLOUD_DEV_HARDWARE_VERSION[] = "dev_hardware_version";
- 
+
 const uint32_t MBED_CLOUD_DEV_MEMORY_TOTAL_KB = 0;
 const uint32_t MBED_CLOUD_DEV_BOOTSTRAP_DEVICE_CERTIFICATE_SIZE = sizeof(MBED_CLOUD_DEV_BOOTSTRAP_DEVICE_CERTIFICATE);
 const uint32_t MBED_CLOUD_DEV_BOOTSTRAP_SERVER_ROOT_CA_CERTIFICATE_SIZE = sizeof(MBED_CLOUD_DEV_BOOTSTRAP_SERVER_ROOT_CA_CERTIFICATE);
 const uint32_t MBED_CLOUD_DEV_BOOTSTRAP_DEVICE_PRIVATE_KEY_SIZE = sizeof(MBED_CLOUD_DEV_BOOTSTRAP_DEVICE_PRIVATE_KEY);
- 
+
 #endif //__MBED_CLOUD_DEV_CREDENTIALS_H__