989
Dependencies: mbed Servo X_NUCLEO_IKS01A2 X_NUCLEO_IDW01M1v2 NetworkSocketAPI NDefLib MQTT
Diff: main.cpp
- 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); + } }