989

Dependencies:   mbed Servo X_NUCLEO_IKS01A2 X_NUCLEO_IDW01M1v2 NetworkSocketAPI NDefLib MQTT

Revision:
25:d7f1e43736cf
Parent:
24:a59eb8bdc431
--- a/main.cpp	Thu Nov 24 13:22:03 2016 +0000
+++ b/main.cpp	Wed Nov 04 02:51:05 2020 +0000
@@ -1,68 +1,64 @@
-/* SpwfInterface NetworkSocketAPI Example Program
- * Copyright (c) 2015 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
 #include "mbed.h"
 #include "SpwfInterface.h"
 #include "TCPSocket.h"
 #include "MQTTClient.h"
 #include "MQTTWiFi.h"
 #include <ctype.h>
-#include "x_nucleo_iks01a1.h"
-#include "X_NUCLEO_NFC01A1.h"
 #include "NDefLib/NDefNfcTag.h"
 #include "NDefLib/RecordType/RecordURI.h"
+#include "Servo.h"
+#include"XNucleoIKS01A2.h"
+#include "stm32f4xx_hal.h"
+Servo servo(D10);
 
-//------------------------------------
-// Hyperterminal configuration
-// 9600 bauds, 8-bit data, no parity
-//------------------------------------
+float range = 0.005;
+float position = 0.5;
+
 Serial pc(SERIAL_TX, SERIAL_RX); 
-DigitalOut myled(LED1);
 bool quickstartMode = true;    
 
-#define ORG_QUICKSTART           // comment to connect to play.internetofthings.ibmcloud.com
+#define ORG_QUICKSTART   101.132.47.170        // comment to connect to play.internetofthings.ibmcloud.com
 //#define SUBSCRIBE              // uncomment to subscribe to broker msgs (not to be used with IBM broker) 
-#define X_NUCLEO_NFC01A1_PRESENT // uncomment to add NFC support
     
 #define MQTT_MAX_PACKET_SIZE 250   
 #define MQTT_MAX_PAYLOAD_SIZE 300 
 
  // Configuration values needed to connect to IBM IoT Cloud
-#define BROKER_URL ".messaging.internetofthings.ibmcloud.com";     
+#define BROKER_URL ".132.47.170";     
 #ifdef ORG_QUICKSTART
-#define ORG "quickstart"     // connect to quickstart.internetofthings.ibmcloud.com/ For a registered connection, replace with your org 
-#define ID ""
-#define AUTH_TOKEN ""
-#define DEFAULT_TYPE_NAME "iotsample-mbed-Nucleo"
+#define ORG "101"     // connect to quickstart.internetofthings.ibmcloud.com/ For a registered connection, replace with your org 
+#define ID "168"
+#define AUTH_TOKEN "10"
+#define DEFAULT_TYPE_NAME "145"
 #else   // not def ORG_QUICKSTART
-#define ORG "play"             // connect to play.internetofthings.ibmcloud.com/ 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 DEFAULT_TYPE_NAME "sensor"
+#define ORG "192"             // connect to play.internetofthings.ibmcloud.com/ For a registered connection, replace with your org
+#define ID "168"       // For a registered connection, replace with your id
+#define AUTH_TOKEN "10"// For a registered connection, replace with your auth-token
+#define DEFAULT_TYPE_NAME "145"
 #endif
-#define TOPIC  "iot-2/evt/status/fmt/json" 
+#define TOPIC  "TempA" 
+#define TOPIC2  "commond" 
+#define  TOPICT_hum  "hum" 
+#define TOPICT_x "x"
+#define TOPICT_y "y"
+#define TOPICT_z "z"
+#define  TOPICT_ax  "a_x" 
+#define  TOPICT_ay  "a_y" 
+#define  TOPICT_az  "a_z" 
+#define  TOPICT_bx  "b_x" 
+#define  TOPICT_by  "b_y" 
+#define  TOPICT_bz  "b_z" 
+
 
 #define TYPE DEFAULT_TYPE_NAME       // For a registered connection, replace with your type
 #define MQTT_PORT 1883
 #define MQTT_TLS_PORT 8883
 #define IBM_IOT_PORT MQTT_PORT
 // WiFi network credential
-#define SSID   ""  // Network must be visible otherwise it can't connect
-#define PASSW  ""
+#define SSID   "LongFreeMoble"  // Network must be visible otherwise it can't connect
+#define PASSW  "iots8230"
 #warning "Wifi SSID & password empty"
+char* topic = "TempA";
     
 char id[30] = ID;                 // mac without colons  
 char org[12] = ORG;        
@@ -78,10 +74,50 @@
 bool connected = false;
 int retryAttempt = 0;
 char subscription_url[MQTT_MAX_PAYLOAD_SIZE];
+     
+     
+     static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance(D14, D15, D4, D5);
 
-PressureSensor *pressure_sensor;
-HumiditySensor *humidity_sensor;
-TempSensor *temp_sensor1;
+    /* Retrieve the composing elements of the expansion board */
+    static LSM303AGRMagSensor *magnetometer = mems_expansion_board->magnetometer;
+    static HTS221Sensor *hum_temp = mems_expansion_board->ht_sensor;
+    static LPS22HBSensor *press_temp = mems_expansion_board->pt_sensor;
+    static LSM6DSLSensor *acc_gyro = mems_expansion_board->acc_gyro;
+    static LSM303AGRAccSensor *accelerometer = mems_expansion_board->accelerometer;
+
+class WatchDog {
+ 
+private:
+ 
+    IWDG_HandleTypeDef hiwdg;
+ 
+public:
+ 
+    WatchDog(uint32_t prescaler = IWDG_PRESCALER_256, uint32_t reload = 0xfff) {
+ 
+        hiwdg.Instance = IWDG;
+ 
+        hiwdg.Init.Prescaler = prescaler;
+ 
+        hiwdg.Init.Reload = reload;
+ 
+        HAL_IWDG_Init(&hiwdg);
+ 
+    }
+ 
+    void feed() {
+ 
+        HAL_IWDG_Refresh(&hiwdg);
+ 
+    }
+ 
+};
+
+
+/* Retrieve the composing elements of the expansion board */
+//PressureSensor *pressure_sensor;
+//HumiditySensor *humidity_sensor;
+//TempSensor *temp_sensor1;
 
 MQTT::Message message;
 MQTTString TopicName={TOPIC};
@@ -92,11 +128,28 @@
     msg[0]='\0';
     strncat (msg, (char*)msgMQTT.message.payload, msgMQTT.message.payloadlen);
     printf ("--->>> subscribe_cb msg: %s\n\r", msg);
+    printf("%d\r\n",strlen(msg));
+    if(strlen(msg)==2) 
+    {
+        printf ("I AM WORKING\n\r");
+        int i=0;
+        while(i<500) {
+            i++;
+            servo = position;
+            position += range;
+            if(position >= 1) {
+                position = 0;
+                wait(0.5);
+            }
+            wait(0.002);
+        }
+    }
 }
 
 int subscribe(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
 {
-    char* pubTopic = TOPIC;    
+    char* pubTopic = TOPIC2;    
+    printf("subscribe int finished\r\n");
     return client->subscribe(pubTopic, MQTT::QOS1, subscribe_cb);
 }
 
@@ -108,21 +161,16 @@
     char hostname[strlen(org) + strlen(iot_ibm) + 1];
     sprintf(hostname, "%s%s", org, iot_ibm);
     SpwfSAInterface& WiFi = ipstack->getWiFi();
-//    ip_addr = WiFi.get_ip_address();
-    // Construct clientId - d:org:type:id
     char clientId[strlen(org) + strlen(type) + strlen(id) + 5];  
     sprintf(clientId, "d:%s:%s:%s", org, type, id);  
-    sprintf(subscription_url, "%s.%s/#/device/%s/sensor/", org, "internetofthings.ibmcloud.com",id);
+    sprintf(subscription_url, "%s.%s/#/device/%s/sensor/", org, "iots",id);
 
     // Network debug statements 
-    LOG("=====================================\n\r");
+    LOG("\n\r=====================================\n\r");
     LOG("Connecting WiFi.\n\r");
     LOG("Nucleo IP ADDRESS: %s\n\r", WiFi.get_ip_address());
     LOG("Nucleo MAC ADDRESS: %s\n\r", WiFi.get_mac_address());
     LOG("Server Hostname: %s port: %d\n\r", hostname, IBM_IOT_PORT);
-//    for(int i = 0; clientId[i]; i++){  // set lowercase mac
-//       clientId[i] = tolower(clientId[i]); 
-//    }    
     LOG("Client ID: %s\n\r", clientId);
     LOG("Topic: %s\n\r",TOPIC);
     LOG("Subscription URL: %s\n\r", subscription_url);
@@ -202,44 +250,254 @@
 {
     MQTT::Message message;
     char* pubTopic = TOPIC;
+    char buf[MQTT_MAX_PAYLOAD_SIZE];
+    float temp, press, hum;
+    printf("%f\r\n",press);
+ hum_temp->get_temperature(&temp);
+    hum_temp->get_humidity(&hum);
+ //   temp_sensor1->GetTemperature(&temp);
+ //   humidity_sensor->GetHumidity(&hum);
+ //   pressure_sensor->GetPressure(&press);
+  
+  
+    sprintf(buf,"%0.4f",temp);
+    message.qos = MQTT::QOS1;
+    message.retained = false;
+    message.dup = false;
+    message.payload = (void*)buf;
+    message.payloadlen = strlen(buf);
+    //message.payloadlen = sizeof(temp);
+    
+//    LOG("Publishing %s\n\r", buf);
+    printf("Publishing hum %s\n\r", buf);
+    return client->publish(pubTopic, message);
+} 
+int publish2(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
+{
+    MQTT::Message message;
+    char* pubTopic = TOPICT_hum;
+    uint8_t id;
+            
+    char buf[MQTT_MAX_PAYLOAD_SIZE];
+    float temp, press, hum;
+    printf("%f\r\n",press);
+     hum_temp->get_temperature(&temp);
+    hum_temp->get_humidity(&hum);
+   // temp_sensor1->GetTemperature(&temp);
+  //  humidity_sensor->GetHumidity(&hum);
+ //   pressure_sensor->GetPressure(&press);
+  
+  
+    sprintf(buf,"%0.4f",hum);
+    message.qos = MQTT::QOS1;
+    message.retained = false;
+    message.dup = false;
+    message.payload = (void*)buf;
+    message.payloadlen = strlen(buf);
+    //message.payloadlen = sizeof(temp);
+    
+//    LOG("Publishing %s\n\r", buf);
+    printf("Publishing temp %s\n\r", buf);
+    return client->publish(pubTopic, message);
+} 
+int publish3(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
+{
+     int32_t axes[3];
+    MQTT::Message message;
+    char* pubTopic = TOPICT_x;
+    uint8_t id;
             
     char buf[MQTT_MAX_PAYLOAD_SIZE];
     float temp, press, hum;
-    temp_sensor1->GetTemperature(&temp);
-    pressure_sensor->GetPressure(&press);
-    humidity_sensor->GetHumidity(&hum);
-    sprintf(buf,
-     "{\"d\":{\"ST\":\"Nucleo-IoT-mbed\",\"Temp\":%0.4f,\"Pressure\":%0.4f,\"Humidity\":%0.4f}}",
-              temp, press, hum);
+    printf("%f\r\n",press);
+     hum_temp->get_temperature(&temp);
+    hum_temp->get_humidity(&hum);
+    magnetometer->get_m_axes(axes);
+  
+  
+    sprintf(buf,"%0.4d",axes[0]);
+    message.qos = MQTT::QOS1;
+    message.retained = false;
+    message.dup = false;
+    message.payload = (void*)buf;
+    message.payloadlen = strlen(buf);
+    printf("Publishing x %s\n\r", buf);
+    return client->publish(pubTopic, message);
+} 
+int publish4(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
+{
+     int32_t axes[3];
+    MQTT::Message message;
+    char* pubTopic = TOPICT_y;
+    uint8_t id;
+            
+    char buf[MQTT_MAX_PAYLOAD_SIZE];
+    magnetometer->get_m_axes(axes);
+    
+    printf("axes's number%d\r\n",axes[1]);
+    sprintf(buf,"%0.4d",axes[1]);
+    message.qos = MQTT::QOS1;
+    message.retained = false;
+    message.dup = false;
+    message.payload = (void*)buf;
+    message.payloadlen = strlen(buf);
+    printf("Publishing y %s\n\r", buf);
+    return client->publish(pubTopic, message);
+} 
+int publish5(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
+{
+     int32_t axes[3];
+    MQTT::Message message;
+    char* pubTopic = TOPICT_z;
+    uint8_t id;
+            
+    char buf[MQTT_MAX_PAYLOAD_SIZE];
+    float temp, press, hum;
+     hum_temp->get_temperature(&temp);
+    hum_temp->get_humidity(&hum);
+    magnetometer->get_m_axes(axes);
+  
+  
+    sprintf(buf,"%0.4d",axes[2]);
+    message.qos = MQTT::QOS1;
+    message.retained = false;
+    message.dup = false;
+    message.payload = (void*)buf;
+    message.payloadlen = strlen(buf);
+    //message.payloadlen = sizeof(temp);
+    
+//    LOG("Publishing %s\n\r", buf);
+    printf("Publishing z %s\n\r", buf);
+    return client->publish(pubTopic, message);
+} 
+int publish7(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
+{
+    int32_t axes[3];
+    MQTT::Message message;
+    char* pubTopic = TOPICT_ax;
+            
+    char buf[MQTT_MAX_PAYLOAD_SIZE];
+    accelerometer->get_x_axes(axes);
+     sprintf(buf,"%0.4d",axes[0]);
     message.qos = MQTT::QOS0;
     message.retained = false;
     message.dup = false;
     message.payload = (void*)buf;
     message.payloadlen = strlen(buf);
+    printf("Publishing %s\n\r", buf);
+    return client->publish(pubTopic, message);
+} 
+int publish8(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
+{
+    int32_t axes[3];
+    MQTT::Message message;
+    char* pubTopic = TOPICT_ay;
+            
+    char buf[MQTT_MAX_PAYLOAD_SIZE];
+    accelerometer->get_x_axes(axes);
+     sprintf(buf,"%0.4d",axes[1]);
+    message.qos = MQTT::QOS0;
+    message.retained = false;
+    message.dup = false;
+    message.payload = (void*)buf;
+    message.payloadlen = strlen(buf);
+    printf("Publishing %s\n\r", buf);
+    return client->publish(pubTopic, message);
+} 
+int publish9(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
+{
+    int32_t axes[3];
+    MQTT::Message message;
+    char* pubTopic = TOPICT_az;
+            
+    char buf[MQTT_MAX_PAYLOAD_SIZE];
+    accelerometer->get_x_axes(axes);
+     sprintf(buf,"%0.4d",axes[2]);
+    message.qos = MQTT::QOS0;
+    message.retained = false;
+    message.dup = false;
+    message.payload = (void*)buf;
+    message.payloadlen = strlen(buf);
+    printf("Publishing %s\n\r", buf);
+    return client->publish(pubTopic, message);
+} 
+int publish10(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
+{
+    int32_t axes[3];
+    MQTT::Message message;
+    char* pubTopic = TOPICT_bx;
+            
+    char buf[MQTT_MAX_PAYLOAD_SIZE];
     
-//    LOG("Publishing %s\n\r", buf);
+    acc_gyro->get_x_axes(axes);
+     sprintf(buf,"%0.4d",axes[0]);
+    message.qos = MQTT::QOS0;
+    message.retained = false;
+    message.dup = false;
+    message.payload = (void*)buf;
+    message.payloadlen = strlen(buf);
+    printf("Publishing %s\n\r", buf);
+    return client->publish(pubTopic, message);
+} 
+int publish11(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
+{
+    int32_t axes[3];
+    MQTT::Message message;
+    char* pubTopic = TOPICT_by;
+            
+    char buf[MQTT_MAX_PAYLOAD_SIZE];
+    
+    acc_gyro->get_x_axes(axes);
+     sprintf(buf,"%0.4d",axes[1]);
+    message.qos = MQTT::QOS0;
+    message.retained = false;
+    message.dup = false;
+    message.payload = (void*)buf;
+    message.payloadlen = strlen(buf);
+    printf("Publishing %s\n\r", buf);
+    return client->publish(pubTopic, message);
+} 
+int publish12(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
+{
+    int32_t axes[3];
+    MQTT::Message message;
+    char* pubTopic = TOPICT_bz;
+            
+    char buf[MQTT_MAX_PAYLOAD_SIZE];
+    
+    acc_gyro->get_x_axes(axes);
+     sprintf(buf,"%0.4d",axes[2]);
+    message.qos = MQTT::QOS0;
+    message.retained = false;
+    message.dup = false;
+    message.payload = (void*)buf;
+    message.payloadlen = strlen(buf);
     printf("Publishing %s\n\r", buf);
     return client->publish(pubTopic, message);
 } 
     
+    
 int main()
 {
+  
     const char * ssid = SSID; // Network must be visible otherwise it can't connect
     const char * seckey = PASSW;
     SpwfSAInterface spwf(D8, D2, false);
-    
-//    Timer tyeld;
-    myled=0;
     DevI2C *i2c = new DevI2C(I2C_SDA, I2C_SCL);
     i2c->frequency(400000);    
     
-    X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(i2c);   
-    pressure_sensor = mems_expansion_board->pt_sensor;
-    temp_sensor1 = mems_expansion_board->ht_sensor;  
-    humidity_sensor = mems_expansion_board->ht_sensor;  
+    
+ 
     
     pc.printf("\r\nX-NUCLEO-IDW01M1 mbed Application\r\n");     
     pc.printf("\r\nconnecting to AP\r\n");            
+        
+  hum_temp->enable();
+  press_temp->enable();
+  magnetometer->enable();
+  accelerometer->enable();
+  acc_gyro->enable_x();
+  acc_gyro->enable_g();
 
    quickstartMode=false;
    if (strcmp(org, "quickstart") == 0){quickstartMode = true;}
@@ -262,43 +520,34 @@
    {
       while (true)
       wait(1.0); // Permanent failures - don't retry
-   }
-#ifdef X_NUCLEO_NFC01A1_PRESENT      
-   // program NFC with broker URL        
-   X_NUCLEO_NFC01A1 *nfcNucleo = X_NUCLEO_NFC01A1::Instance(*i2c, NULL, X_NUCLEO_NFC01A1::DEFAULT_GPO_PIN, X_NUCLEO_NFC01A1::DEFAULT_RF_DISABLE_PIN, NC,NC,NC);  
-   NDefLib::NDefNfcTag& tag = nfcNucleo->getM24SR().getNDefTag();
-   printf("NFC Init done: !\r\n");
-   //open the i2c session with the nfc chip
-   if(tag.openSession()){
-       //create the NDef message and record
-       NDefLib::Message msg;
-       NDefLib::RecordURI rUri(NDefLib::RecordURI::HTTPS, subscription_url);
-       msg.addRecord(&rUri);
-        //write the tag
-        if(tag.write(msg)){
-            printf("Tag writed \r\n");
-        }
-        //close the i2c session
-        if(!tag.closeSession()){
-            printf("Error Closing the session\r\n");
-        }
-    }else printf("Error open Session\r\n");             
-#endif    
-   myled=1;         
+   }    
+    WatchDog wdg(IWDG_PRESCALER_64, 62500);  
    int count = 0;    
 //    tyeld.start();    
     while (true)
-    {
-        if (++count == 100)
-        {               // Publish a message every second
-            if (publish(&client, &ipstack) != 0) { 
-                myled=0;
-                attemptConnect(&client, &ipstack);   // if we have lost the connection                
-            } else myled=1;
-            count = 0;
+    {   
+     wdg.feed();   
+    if (++count == 100)
+        {  
+        if(subscribe(&client, &ipstack)>30){
+            printf("ok \n\r");
+            }         
+    publish2(&client, &ipstack);
+    publish3(&client, &ipstack);
+    publish4(&client, &ipstack);
+    publish5(&client, &ipstack);
+    publish5(&client, &ipstack);
+    publish7(&client, &ipstack);
+      publish8(&client, &ipstack);
+        publish9(&client, &ipstack);
+        publish10(&client, &ipstack);
+        publish11(&client, &ipstack);
+        publish12(&client, &ipstack);
+          if (publish(&client, &ipstack) != 0) { 
+         attemptConnect(&client, &ipstack);   // if we have lost the connection                
+           }
+          count = 0;
         }        
-//        int start = tyeld.read_ms();
-        client.yield(10);  // allow the MQTT client to receive messages
-//        printf ("tyeld: %d\n\r",tyeld.read_ms()-start);
-    }
+        client.yield(10);
+     }
 }