asdasd

Dependencies:   Cayenne-MQTT-mbed mbed X_NUCLEO_IKS01A2 X_NUCLEO_IDW01M1v2 NetworkSocketAPI TMP36

Committer:
percu
Date:
Wed Dec 23 23:39:17 2020 +0000
Revision:
7:4265a0d54e46
Parent:
6:8aa852ca98d8
twoj;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jburhenn 0:4d7a64104b46 1 /**
jburhenn 0:4d7a64104b46 2 * Example app for using the Cayenne MQTT mbed library to send data from a TMP36 sensor. This example uses
jburhenn 0:4d7a64104b46 3 * the X-NUCLEO-IDW01M1 WiFi expansion board via the X_NUCLEO_IDW01M1v2 library.
jburhenn 0:4d7a64104b46 4 */
jburhenn 0:4d7a64104b46 5
jburhenn 0:4d7a64104b46 6 #include "MQTTTimer.h"
jburhenn 0:4d7a64104b46 7 #include "CayenneMQTTClient.h"
jburhenn 0:4d7a64104b46 8 #include "MQTTNetworkIDW01M1.h"
jburhenn 0:4d7a64104b46 9 #include "SpwfInterface.h"
jburhenn 0:4d7a64104b46 10 #include "TMP36.h"
percu 6:8aa852ca98d8 11 #include "mbed.h"
percu 6:8aa852ca98d8 12 #include "XNucleoIKS01A2.h"
jburhenn 0:4d7a64104b46 13
jburhenn 0:4d7a64104b46 14 // WiFi network info.
jburhenn 0:4d7a64104b46 15 char* ssid = "ssid";
jburhenn 0:4d7a64104b46 16 char* wifiPassword = "wifiPassword";
jburhenn 0:4d7a64104b46 17
jburhenn 0:4d7a64104b46 18 // Cayenne authentication info. This should be obtained from the Cayenne Dashboard.
jburhenn 0:4d7a64104b46 19 char* username = "MQTT_USERNAME";
jburhenn 0:4d7a64104b46 20 char* password = "MQTT_PASSWORD";
jburhenn 0:4d7a64104b46 21 char* clientID = "CLIENT_ID";
jburhenn 0:4d7a64104b46 22
jburhenn 0:4d7a64104b46 23 SpwfSAInterface interface(D8, D2); // TX, RX
jburhenn 0:4d7a64104b46 24 MQTTNetwork<SpwfSAInterface> network(interface);
jburhenn 0:4d7a64104b46 25 CayenneMQTT::MQTTClient<MQTTNetwork<SpwfSAInterface>, MQTTTimer> mqttClient(network, username, password, clientID);
percu 6:8aa852ca98d8 26 // płytka dodatkowa
percu 6:8aa852ca98d8 27 static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance(D14, D15, D4, D5);
percu 6:8aa852ca98d8 28 //czujniki
percu 6:8aa852ca98d8 29 static HTS221Sensor *hum_temp = mems_expansion_board->ht_sensor;
percu 6:8aa852ca98d8 30 static LPS22HBSensor *press_temp = mems_expansion_board->pt_sensor;
jburhenn 0:4d7a64104b46 31
jburhenn 0:4d7a64104b46 32 DigitalOut led1(LED1);
jburhenn 0:4d7a64104b46 33
jburhenn 0:4d7a64104b46 34 /**
jburhenn 0:4d7a64104b46 35 * Print the message info.
jburhenn 0:4d7a64104b46 36 * @param[in] message The message received from the Cayenne server.
jburhenn 0:4d7a64104b46 37 */
jburhenn 0:4d7a64104b46 38 void outputMessage(CayenneMQTT::MessageData& message)
jburhenn 0:4d7a64104b46 39 {
jburhenn 0:4d7a64104b46 40 switch (message.topic) {
jburhenn 0:4d7a64104b46 41 case COMMAND_TOPIC:
jburhenn 0:4d7a64104b46 42 printf("topic=Command");
jburhenn 0:4d7a64104b46 43 break;
jburhenn 0:4d7a64104b46 44 case CONFIG_TOPIC:
jburhenn 0:4d7a64104b46 45 printf("topic=Config");
jburhenn 0:4d7a64104b46 46 break;
jburhenn 0:4d7a64104b46 47 default:
jburhenn 0:4d7a64104b46 48 printf("topic=%d", message.topic);
jburhenn 0:4d7a64104b46 49 break;
jburhenn 0:4d7a64104b46 50 }
jburhenn 0:4d7a64104b46 51 printf(" channel=%d", message.channel);
jburhenn 0:4d7a64104b46 52 if (message.clientID) {
jburhenn 0:4d7a64104b46 53 printf(" clientID=%s", message.clientID);
jburhenn 0:4d7a64104b46 54 }
jburhenn 0:4d7a64104b46 55 if (message.type) {
jburhenn 0:4d7a64104b46 56 printf(" type=%s", message.type);
jburhenn 0:4d7a64104b46 57 }
jburhenn 0:4d7a64104b46 58 for (size_t i = 0; i < message.valueCount; ++i) {
jburhenn 0:4d7a64104b46 59 if (message.getValue(i)) {
jburhenn 0:4d7a64104b46 60 printf(" value=%s", message.getValue(i));
jburhenn 0:4d7a64104b46 61 }
jburhenn 0:4d7a64104b46 62 if (message.getUnit(i)) {
jburhenn 0:4d7a64104b46 63 printf(" unit=%s", message.getUnit(i));
jburhenn 0:4d7a64104b46 64 }
jburhenn 0:4d7a64104b46 65 }
jburhenn 0:4d7a64104b46 66 if (message.id) {
jburhenn 0:4d7a64104b46 67 printf(" id=%s", message.id);
jburhenn 0:4d7a64104b46 68 }
jburhenn 0:4d7a64104b46 69 printf("\n");
jburhenn 0:4d7a64104b46 70 }
jburhenn 0:4d7a64104b46 71
jburhenn 0:4d7a64104b46 72 /**
jburhenn 0:4d7a64104b46 73 * Handle messages received from the Cayenne server.
jburhenn 0:4d7a64104b46 74 * @param[in] message The message received from the Cayenne server.
jburhenn 0:4d7a64104b46 75 */
jburhenn 0:4d7a64104b46 76 void messageArrived(CayenneMQTT::MessageData& message)
jburhenn 0:4d7a64104b46 77 {
jburhenn 0:4d7a64104b46 78 int error = 0;
jburhenn 0:4d7a64104b46 79 // Add code to process the message. Here we just ouput the message data.
jburhenn 0:4d7a64104b46 80 outputMessage(message);
jburhenn 0:4d7a64104b46 81
jburhenn 0:4d7a64104b46 82 if (message.topic == COMMAND_TOPIC) {
jburhenn 0:4d7a64104b46 83 switch(message.channel) {
jburhenn 0:4d7a64104b46 84 case 0:
jburhenn 0:4d7a64104b46 85 // Set the onboard LED state
jburhenn 0:4d7a64104b46 86 led1 = atoi(message.getValue());
jburhenn 0:4d7a64104b46 87 // Publish the updated LED state
jburhenn 0:4d7a64104b46 88 if ((error = mqttClient.publishData(DATA_TOPIC, message.channel, NULL, NULL, message.getValue())) != CAYENNE_SUCCESS) {
jburhenn 0:4d7a64104b46 89 printf("Publish LED state failure, error: %d\n", error);
jburhenn 0:4d7a64104b46 90 }
jburhenn 0:4d7a64104b46 91 break;
jburhenn 0:4d7a64104b46 92 }
jburhenn 0:4d7a64104b46 93
jburhenn 0:4d7a64104b46 94 // If this is a command message we publish a response. Here we are just sending a default 'OK' response.
jburhenn 0:4d7a64104b46 95 // An error response should be sent if there are issues processing the message.
jburhenn 2:d7c27e622707 96 if ((error = mqttClient.publishResponse(message.id, NULL, message.clientID)) != CAYENNE_SUCCESS) {
jburhenn 0:4d7a64104b46 97 printf("Response failure, error: %d\n", error);
jburhenn 0:4d7a64104b46 98 }
jburhenn 0:4d7a64104b46 99 }
jburhenn 0:4d7a64104b46 100 }
jburhenn 0:4d7a64104b46 101
jburhenn 0:4d7a64104b46 102 /**
jburhenn 0:4d7a64104b46 103 * Connect to the Cayenne server.
jburhenn 0:4d7a64104b46 104 * @return Returns CAYENNE_SUCCESS if the connection succeeds, or an error code otherwise.
jburhenn 0:4d7a64104b46 105 */
jburhenn 0:4d7a64104b46 106 int connectClient(void)
jburhenn 0:4d7a64104b46 107 {
jburhenn 0:4d7a64104b46 108 int error = 0;
jburhenn 0:4d7a64104b46 109 // Connect to the server.
jburhenn 0:4d7a64104b46 110 printf("Connecting to %s:%d\n", CAYENNE_DOMAIN, CAYENNE_PORT);
jburhenn 0:4d7a64104b46 111 while ((error = network.connect(CAYENNE_DOMAIN, CAYENNE_PORT)) != 0) {
jburhenn 0:4d7a64104b46 112 printf("TCP connect failed, error: %d\n", error);
jburhenn 0:4d7a64104b46 113 wait(2);
jburhenn 0:4d7a64104b46 114 }
jburhenn 0:4d7a64104b46 115
jburhenn 0:4d7a64104b46 116 if ((error = mqttClient.connect()) != MQTT::SUCCESS) {
jburhenn 0:4d7a64104b46 117 printf("MQTT connect failed, error: %d\n", error);
jburhenn 0:4d7a64104b46 118 return error;
jburhenn 0:4d7a64104b46 119 }
jburhenn 0:4d7a64104b46 120 printf("Connected\n");
jburhenn 0:4d7a64104b46 121
jburhenn 0:4d7a64104b46 122 // Subscribe to required topics.
jburhenn 0:4d7a64104b46 123 if ((error = mqttClient.subscribe(COMMAND_TOPIC, CAYENNE_ALL_CHANNELS)) != CAYENNE_SUCCESS) {
jburhenn 0:4d7a64104b46 124 printf("Subscription to Command topic failed, error: %d\n", error);
jburhenn 0:4d7a64104b46 125 }
jburhenn 0:4d7a64104b46 126 if ((error = mqttClient.subscribe(CONFIG_TOPIC, CAYENNE_ALL_CHANNELS)) != CAYENNE_SUCCESS) {
jburhenn 0:4d7a64104b46 127 printf("Subscription to Config topic failed, error:%d\n", error);
jburhenn 0:4d7a64104b46 128 }
jburhenn 0:4d7a64104b46 129
jburhenn 0:4d7a64104b46 130 // Send device info. Here we just send some example values for the system info. These should be changed to use actual system data, or removed if not needed.
jburhenn 0:4d7a64104b46 131 mqttClient.publishData(SYS_VERSION_TOPIC, CAYENNE_NO_CHANNEL, NULL, NULL, CAYENNE_VERSION);
jburhenn 0:4d7a64104b46 132 mqttClient.publishData(SYS_MODEL_TOPIC, CAYENNE_NO_CHANNEL, NULL, NULL, "mbedDevice");
jburhenn 0:4d7a64104b46 133 //mqttClient.publishData(SYS_CPU_MODEL_TOPIC, CAYENNE_NO_CHANNEL, NULL, NULL, "CPU Model");
jburhenn 0:4d7a64104b46 134 //mqttClient.publishData(SYS_CPU_SPEED_TOPIC, CAYENNE_NO_CHANNEL, NULL, NULL, "1000000000");
jburhenn 0:4d7a64104b46 135
jburhenn 0:4d7a64104b46 136 return CAYENNE_SUCCESS;
jburhenn 0:4d7a64104b46 137 }
jburhenn 0:4d7a64104b46 138
jburhenn 0:4d7a64104b46 139 /**
jburhenn 0:4d7a64104b46 140 * Main loop where MQTT code is run.
jburhenn 0:4d7a64104b46 141 */
jburhenn 0:4d7a64104b46 142 void loop(void)
jburhenn 0:4d7a64104b46 143 {
jburhenn 5:294a8b1bca28 144 // Start the countdown timer for publishing data every 5 seconds. Change the timeout parameter to publish at a different interval.
jburhenn 0:4d7a64104b46 145 MQTTTimer timer(5000);
jburhenn 0:4d7a64104b46 146 TMP36 tmpSensor(A5);
percu 6:8aa852ca98d8 147 float stopnie,paskal;
percu 6:8aa852ca98d8 148 char buffer6[32],buffer7[32];
percu 6:8aa852ca98d8 149 press_temp->enable();
percu 6:8aa852ca98d8 150 press_temp->get_pressure(&stopnie);
jburhenn 0:4d7a64104b46 151 while (true) {
jburhenn 0:4d7a64104b46 152 // Yield to allow MQTT message processing.
jburhenn 0:4d7a64104b46 153 mqttClient.yield(1000);
jburhenn 0:4d7a64104b46 154
jburhenn 0:4d7a64104b46 155 // Check that we are still connected, if not, reconnect.
jburhenn 0:4d7a64104b46 156 if (!network.connected() || !mqttClient.connected()) {
jburhenn 0:4d7a64104b46 157 network.disconnect();
jburhenn 0:4d7a64104b46 158 mqttClient.disconnect();
jburhenn 0:4d7a64104b46 159 printf("Reconnecting\n");
jburhenn 0:4d7a64104b46 160 while (connectClient() != CAYENNE_SUCCESS) {
jburhenn 0:4d7a64104b46 161 wait(2);
jburhenn 0:4d7a64104b46 162 printf("Reconnect failed, retrying\n");
jburhenn 0:4d7a64104b46 163 }
jburhenn 0:4d7a64104b46 164 }
jburhenn 0:4d7a64104b46 165
jburhenn 0:4d7a64104b46 166 // Publish some example data every few seconds. This should be changed to send your actual data to Cayenne.
jburhenn 0:4d7a64104b46 167 if (timer.expired()) {
jburhenn 0:4d7a64104b46 168 int error = 0;
percu 7:4265a0d54e46 169 if ((error = mqttClient.publishData(stopnie)) != CAYENNE_SUCCESS) {
jburhenn 0:4d7a64104b46 170 printf("Publish temperature failed, error: %d\n", error);
jburhenn 0:4d7a64104b46 171 }
jburhenn 5:294a8b1bca28 172 // Restart the countdown timer for publishing data every 5 seconds. Change the timeout parameter to publish at a different interval.
jburhenn 0:4d7a64104b46 173 timer.countdown_ms(5000);
jburhenn 0:4d7a64104b46 174 }
jburhenn 0:4d7a64104b46 175 }
jburhenn 0:4d7a64104b46 176 }
jburhenn 0:4d7a64104b46 177
percu 6:8aa852ca98d8 178
percu 6:8aa852ca98d8 179
percu 6:8aa852ca98d8 180
percu 6:8aa852ca98d8 181
percu 6:8aa852ca98d8 182
percu 6:8aa852ca98d8 183 //coś do dziesiątek
percu 6:8aa852ca98d8 184
percu 6:8aa852ca98d8 185
percu 6:8aa852ca98d8 186
percu 6:8aa852ca98d8 187
percu 6:8aa852ca98d8 188
percu 6:8aa852ca98d8 189 static char *print_double(char* str, double v, int decimalDigits=2)
percu 6:8aa852ca98d8 190 {
percu 6:8aa852ca98d8 191 int i = 1;
percu 6:8aa852ca98d8 192 int intPart, fractPart
percu 6:8aa852ca98d8 193 ;int len;
percu 6:8aa852ca98d8 194 char *ptr;/* prepare decimal digits multiplicator */
percu 6:8aa852ca98d8 195 for (;decimalDigits!=0; i*=10, decimalDigits--);
percu 6:8aa852ca98d8 196 /* calculate integer & fractinal parts */
percu 6:8aa852ca98d8 197 intPart = (int)v;
percu 6:8aa852ca98d8 198 fractPart= (int)((v-(double)(int)v)*i);/* fill in integer part */
percu 6:8aa852ca98d8 199 sprintf(str, "%i.", intPart);/* prepare fill in of fractional part */
percu 6:8aa852ca98d8 200 len = strlen(str);
percu 6:8aa852ca98d8 201 ptr = &str[len];/* fill in leading fractional zeros */
percu 6:8aa852ca98d8 202 for (i/=10;i>1; i/=10, ptr++)
percu 6:8aa852ca98d8 203 {
percu 6:8aa852ca98d8 204 if (fractPart >= i)
percu 6:8aa852ca98d8 205 {
percu 6:8aa852ca98d8 206 break;
percu 6:8aa852ca98d8 207 }
percu 6:8aa852ca98d8 208 *ptr = '0';
percu 6:8aa852ca98d8 209 }/* fill in (rest of) fractional part */
percu 6:8aa852ca98d8 210 sprintf(ptr, "%i", fractPart);
percu 6:8aa852ca98d8 211 return str;
percu 6:8aa852ca98d8 212 }
percu 6:8aa852ca98d8 213 int main ()
percu 6:8aa852ca98d8 214 {
percu 6:8aa852ca98d8 215 uint8_t id;
percu 6:8aa852ca98d8 216 float value1, value2; // Deklaracja
percu 6:8aa852ca98d8 217 char buffer1[32], buffer2[32],buffer3[32],buffer4[32],buffer5[32];
percu 6:8aa852ca98d8 218 hum_temp->enable();
percu 6:8aa852ca98d8 219 press_temp->enable();
percu 6:8aa852ca98d8 220 // hum_temp->get_temperature(&value1); hum_temp->get_humidity(&value3); press_temp->get_pressure(&value2);
percu 6:8aa852ca98d8 221 printf("Start Programu");
percu 6:8aa852ca98d8 222 hum_temp->read_id(&id);
percu 6:8aa852ca98d8 223 printf("HTS221 temeperatura=0x%X\r\n",id);
percu 6:8aa852ca98d8 224 press_temp->read_id(&id);
percu 6:8aa852ca98d8 225 printf("LPS22HB temeperatura=0x%X\r\n",id);
percu 6:8aa852ca98d8 226 // z czujników i wyświetlanie/
percu 6:8aa852ca98d8 227 press_temp->get_pressure(&value1);
percu 6:8aa852ca98d8 228 printf("Cisnie: %7s hPa\r\n ", print_double(buffer1, value1));
percu 6:8aa852ca98d8 229 press_temp->get_temperature(&value2);
percu 6:8aa852ca98d8 230 printf("Temp: %7s C\r\n ", print_double(buffer2, value2));
percu 6:8aa852ca98d8 231 double x,bary,ile;// Cisnie w kole zadane
percu 6:8aa852ca98d8 232 int wzorzecP,wzorzecT;
percu 6:8aa852ca98d8 233 wzorzecP=230000;
percu 6:8aa852ca98d8 234 wzorzecT=293;
percu 6:8aa852ca98d8 235 x=(((wzorzecP)*(value2+ 273))/(wzorzecT));
percu 6:8aa852ca98d8 236 bary=x/100000;
percu 6:8aa852ca98d8 237 ile=(bary-(value1/1000));
percu 6:8aa852ca98d8 238 printf("Ile ma byc w kole? %7s B\r\n ", print_double(buffer3,bary));
percu 6:8aa852ca98d8 239 printf("Ilejest w kole? %7s B\r\n ", print_double(buffer1,value1/1000));
percu 6:8aa852ca98d8 240 if ((value1/1000)>bary)
percu 6:8aa852ca98d8 241 {
percu 6:8aa852ca98d8 242 printf("Upusc %7s B\r\n ", print_double(buffer5,ile ));
percu 6:8aa852ca98d8 243 }
percu 6:8aa852ca98d8 244 else if ((value1/1000)<bary)
percu 6:8aa852ca98d8 245 {
percu 6:8aa852ca98d8 246 printf("dobij %7s B\r\n ", print_double(buffer5,ile ));
percu 6:8aa852ca98d8 247 }
percu 6:8aa852ca98d8 248 printf("Initializing interface\n");
jburhenn 0:4d7a64104b46 249 interface.connect(ssid, wifiPassword, NSAPI_SECURITY_WPA2);
jburhenn 0:4d7a64104b46 250
jburhenn 0:4d7a64104b46 251 // Set the default function that receives Cayenne messages.
jburhenn 0:4d7a64104b46 252 mqttClient.setDefaultMessageHandler(messageArrived);
jburhenn 0:4d7a64104b46 253
jburhenn 0:4d7a64104b46 254 // Connect to Cayenne.
jburhenn 0:4d7a64104b46 255 if (connectClient() == CAYENNE_SUCCESS) {
jburhenn 0:4d7a64104b46 256 // Run main loop.
jburhenn 0:4d7a64104b46 257 loop();
jburhenn 0:4d7a64104b46 258 }
jburhenn 0:4d7a64104b46 259 else {
jburhenn 0:4d7a64104b46 260 printf("Connection failed, exiting\n");
jburhenn 0:4d7a64104b46 261 }
jburhenn 0:4d7a64104b46 262
jburhenn 0:4d7a64104b46 263 if (mqttClient.connected())
jburhenn 0:4d7a64104b46 264 mqttClient.disconnect();
jburhenn 0:4d7a64104b46 265 if (network.connected())
jburhenn 0:4d7a64104b46 266 network.disconnect();
jburhenn 0:4d7a64104b46 267
jburhenn 0:4d7a64104b46 268 return 0;
jburhenn 0:4d7a64104b46 269 }
jburhenn 0:4d7a64104b46 270
percu 6:8aa852ca98d8 271