0

Dependencies:   Cayenne-MQTT-mbed Servo nfc X_NUCLEO_IDW01M1v2 NetworkSocketAPI 13

Committer:
kapitaninternet
Date:
Wed Sep 18 15:00:53 2019 +0000
Revision:
14:c5aab7546de9
Parent:
13:7b3b429e9731
KPG

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jburhenn 0:d20655cd1f3c 1 #include "MQTTTimer.h"
jburhenn 0:d20655cd1f3c 2 #include "CayenneMQTTClient.h"
jburhenn 0:d20655cd1f3c 3 #include "MQTTNetworkIDW01M1.h"
jburhenn 0:d20655cd1f3c 4 #include "SpwfInterface.h"
kapitaninternet 10:8892a1436342 5 #include "mbed.h"
kapitaninternet 11:60c50eae8b81 6 #include "XNucleoIKS01A2.h" // czujniki ruchu i otoczenia
kapitaninternet 11:60c50eae8b81 7 #include "XNucleoNFC01A1.h" // modul nfc
kapitaninternet 10:8892a1436342 8 #include "NDefLib/NDefNfcTag.h"
kapitaninternet 10:8892a1436342 9 #include "NDefLib/RecordType/RecordURI.h"
kapitaninternet 14:c5aab7546de9 10 #include "Servo.h" //biblioteka z funkcjami mbed
kapitaninternet 14:c5aab7546de9 11 #include "XNucleoIKS01A2.h" //biblioteka ze sterownikiem plytki wykonującej pomiary (IKS)
kapitaninternet 14:c5aab7546de9 12 #include "XNucleoNFC01A1.h" //biblioteka ze sterownikiem plytki NFC
kapitaninternet 14:c5aab7546de9 13 #include "NDefLib/NDefNfcTag.h" //biblioteka z funkcjami plytki NFC - nadawanie tagu NFC
kapitaninternet 14:c5aab7546de9 14 #include "NDefLib/RecordType/RecordText.h"
kapitaninternet 9:c206c33736fe 15
kapitaninternet 9:c206c33736fe 16 /* Instantiate the expansion board */
kapitaninternet 9:c206c33736fe 17 static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance(D14, D15, D4, D5);
kapitaninternet 14:c5aab7546de9 18 //instance the board with the default paramiters
kapitaninternet 14:c5aab7546de9 19 I2C i2cChannel(XNucleoNFC01A1::DEFAULT_SDA_PIN,XNucleoNFC01A1::DEFAULT_SDL_PIN);
kapitaninternet 14:c5aab7546de9 20 XNucleoNFC01A1 *nfcNucleo = XNucleoNFC01A1::instance(i2cChannel);
kapitaninternet 9:c206c33736fe 21
kapitaninternet 9:c206c33736fe 22 /* Retrieve the composing elements of the expansion board */
kapitaninternet 9:c206c33736fe 23 static HTS221Sensor *hum_temp = mems_expansion_board->ht_sensor;
kapitaninternet 9:c206c33736fe 24 static LPS22HBSensor *press_temp = mems_expansion_board->pt_sensor;
kapitaninternet 9:c206c33736fe 25
kapitaninternet 14:c5aab7546de9 26 NDefLib::Message msg;
kapitaninternet 14:c5aab7546de9 27
kapitaninternet 10:8892a1436342 28 // Cayenne authentication info. This should be obtained from the Cayenne Dashboard.
kapitaninternet 10:8892a1436342 29 char* username = "68880f30-7425-11e9-beb3-736c9e4bf7d0";
kapitaninternet 10:8892a1436342 30 char* password = "19f07b4d8806fe42bdda724980634f39d8e639ba";
kapitaninternet 10:8892a1436342 31 char* clientID = "bb8e7cc0-74b9-11e9-94e9-493d67fd755e";
kapitaninternet 10:8892a1436342 32
kapitaninternet 14:c5aab7546de9 33 AnalogIn ain(A0); //pin do pomiaru napiecia
kapitaninternet 12:32dbf8ff8d80 34 DigitalOut myLed(LED2);
kapitaninternet 14:c5aab7546de9 35 Servo myservo(PA_6); // pin do sterowania serwo
kapitaninternet 14:c5aab7546de9 36 bool manualControl = false; // reczne sterowanie
kapitaninternet 14:c5aab7546de9 37 // DigitalOut actuatorPin2(PA_7);
kapitaninternet 14:c5aab7546de9 38 float voltageMultiplier = 1.0; // mnoznik do wyskalowania odczytu napiecia z pinu A0
kapitaninternet 14:c5aab7546de9 39 int publishInterval = 1000; // co ile publikowac dane na cayenne
kapitaninternet 14:c5aab7546de9 40 float voltageChangeLevel = 1.5; // napiecie powyzej ktorego ma poruszyc serwo
kapitaninternet 12:32dbf8ff8d80 41
kapitaninternet 14:c5aab7546de9 42 // dane do WiFi.
kapitaninternet 10:8892a1436342 43 char* ssid = "Interneto";
kapitaninternet 10:8892a1436342 44 char* wifiPassword = "matu1234";
kapitaninternet 10:8892a1436342 45
jburhenn 0:d20655cd1f3c 46 SpwfSAInterface interface(D8, D2); // TX, RX
jburhenn 0:d20655cd1f3c 47 MQTTNetwork<SpwfSAInterface> network(interface);
jburhenn 2:445f09de09bd 48 CayenneMQTT::MQTTClient<MQTTNetwork<SpwfSAInterface>, MQTTTimer> mqttClient(network, username, password, clientID);
jburhenn 0:d20655cd1f3c 49
jburhenn 2:445f09de09bd 50 void messageArrived(CayenneMQTT::MessageData& message)
jburhenn 0:d20655cd1f3c 51 {
jburhenn 0:d20655cd1f3c 52 int error = 0;
jburhenn 1:a2d8aec2bb92 53 if (message.topic == COMMAND_TOPIC) {
jburhenn 1:a2d8aec2bb92 54 switch(message.channel) {
kapitaninternet 12:32dbf8ff8d80 55 case 4:
kapitaninternet 12:32dbf8ff8d80 56 // Set the onboard LED state & actuator PIN
kapitaninternet 12:32dbf8ff8d80 57 myLed = atoi(message.getValue());
kapitaninternet 13:7b3b429e9731 58 wait(0.1);
kapitaninternet 14:c5aab7546de9 59 myservo = myservo <= 0 ? 0.5 : -0.1;
kapitaninternet 14:c5aab7546de9 60 // actuatorPin2 = atoi(message.getValue());
jburhenn 1:a2d8aec2bb92 61 // Publish the updated LED state
jburhenn 2:445f09de09bd 62 if ((error = mqttClient.publishData(DATA_TOPIC, message.channel, NULL, NULL, message.getValue())) != CAYENNE_SUCCESS) {
jburhenn 1:a2d8aec2bb92 63 printf("Publish LED state failure, error: %d\n", error);
jburhenn 1:a2d8aec2bb92 64 }
jburhenn 1:a2d8aec2bb92 65 break;
kapitaninternet 14:c5aab7546de9 66 case 6:
kapitaninternet 14:c5aab7546de9 67 // ustaw prog napiecia do wywolaniaobrotu serwa
kapitaninternet 14:c5aab7546de9 68 voltageChangeLevel = atof(message.getValue());
kapitaninternet 14:c5aab7546de9 69
kapitaninternet 14:c5aab7546de9 70 // Publish the updated LED state
kapitaninternet 14:c5aab7546de9 71 if ((error = mqttClient.publishData(DATA_TOPIC, message.channel, NULL, NULL, message.getValue())) != CAYENNE_SUCCESS) {
kapitaninternet 14:c5aab7546de9 72 printf("Publish LED state failure, error: %d\n", error);
kapitaninternet 14:c5aab7546de9 73 }
kapitaninternet 14:c5aab7546de9 74 break;
kapitaninternet 14:c5aab7546de9 75 case 7:
kapitaninternet 14:c5aab7546de9 76 // przelacz manualne sterowanie
kapitaninternet 14:c5aab7546de9 77 manualControl = manualControl ? false : true;
kapitaninternet 14:c5aab7546de9 78
kapitaninternet 14:c5aab7546de9 79 // Publish the updated LED state
kapitaninternet 14:c5aab7546de9 80 if ((error = mqttClient.publishData(DATA_TOPIC, message.channel, NULL, NULL, manualControl ? 1 : 0)) != CAYENNE_SUCCESS) {
kapitaninternet 14:c5aab7546de9 81 printf("Take manual control: %d\n", error);
kapitaninternet 14:c5aab7546de9 82 }
kapitaninternet 14:c5aab7546de9 83 break;
kapitaninternet 14:c5aab7546de9 84 }
jburhenn 1:a2d8aec2bb92 85 }
jburhenn 1:a2d8aec2bb92 86
jburhenn 1:a2d8aec2bb92 87 // If this is a command message we publish a response. Here we are just sending a default 'OK' response.
jburhenn 1:a2d8aec2bb92 88 // An error response should be sent if there are issues processing the message.
jburhenn 4:939f308d004a 89 if ((error = mqttClient.publishResponse(message.id, NULL, message.clientID)) != CAYENNE_SUCCESS) {
jburhenn 1:a2d8aec2bb92 90 printf("Response failure, error: %d\n", error);
jburhenn 1:a2d8aec2bb92 91 }
jburhenn 0:d20655cd1f3c 92 }
jburhenn 0:d20655cd1f3c 93
kapitaninternet 14:c5aab7546de9 94
jburhenn 0:d20655cd1f3c 95 /**
jburhenn 0:d20655cd1f3c 96 * Connect to the Cayenne server.
jburhenn 0:d20655cd1f3c 97 * @return Returns CAYENNE_SUCCESS if the connection succeeds, or an error code otherwise.
jburhenn 0:d20655cd1f3c 98 */
jburhenn 0:d20655cd1f3c 99 int connectClient(void)
jburhenn 0:d20655cd1f3c 100 {
jburhenn 0:d20655cd1f3c 101 int error = 0;
jburhenn 0:d20655cd1f3c 102 // Connect to the server.
jburhenn 0:d20655cd1f3c 103 printf("Connecting to %s:%d\n", CAYENNE_DOMAIN, CAYENNE_PORT);
jburhenn 0:d20655cd1f3c 104 while ((error = network.connect(CAYENNE_DOMAIN, CAYENNE_PORT)) != 0) {
jburhenn 0:d20655cd1f3c 105 printf("TCP connect failed, error: %d\n", error);
jburhenn 0:d20655cd1f3c 106 wait(2);
jburhenn 0:d20655cd1f3c 107 }
jburhenn 0:d20655cd1f3c 108
jburhenn 2:445f09de09bd 109 if ((error = mqttClient.connect()) != MQTT::SUCCESS) {
jburhenn 0:d20655cd1f3c 110 printf("MQTT connect failed, error: %d\n", error);
jburhenn 0:d20655cd1f3c 111 return error;
jburhenn 0:d20655cd1f3c 112 }
jburhenn 0:d20655cd1f3c 113 printf("Connected\n");
jburhenn 0:d20655cd1f3c 114
jburhenn 0:d20655cd1f3c 115 // Subscribe to required topics.
jburhenn 0:d20655cd1f3c 116 if ((error = mqttClient.subscribe(COMMAND_TOPIC, CAYENNE_ALL_CHANNELS)) != CAYENNE_SUCCESS) {
jburhenn 0:d20655cd1f3c 117 printf("Subscription to Command topic failed, error: %d\n", error);
jburhenn 0:d20655cd1f3c 118 }
jburhenn 0:d20655cd1f3c 119 if ((error = mqttClient.subscribe(CONFIG_TOPIC, CAYENNE_ALL_CHANNELS)) != CAYENNE_SUCCESS) {
jburhenn 0:d20655cd1f3c 120 printf("Subscription to Config topic failed, error:%d\n", error);
jburhenn 0:d20655cd1f3c 121 }
jburhenn 0:d20655cd1f3c 122
jburhenn 0:d20655cd1f3c 123 // 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:d20655cd1f3c 124 mqttClient.publishData(SYS_VERSION_TOPIC, CAYENNE_NO_CHANNEL, NULL, NULL, CAYENNE_VERSION);
jburhenn 0:d20655cd1f3c 125 mqttClient.publishData(SYS_MODEL_TOPIC, CAYENNE_NO_CHANNEL, NULL, NULL, "mbedDevice");
jburhenn 0:d20655cd1f3c 126
jburhenn 0:d20655cd1f3c 127 return CAYENNE_SUCCESS;
jburhenn 0:d20655cd1f3c 128 }
jburhenn 0:d20655cd1f3c 129
kapitaninternet 14:c5aab7546de9 130 static void write_message(XNucleoNFC01A1 *nfcNucleo,NDefLib::Message &msg){ //funkcja uruchamiajaca proces tworzenia tagu NFC
kapitaninternet 14:c5aab7546de9 131 NDefLib::NDefNfcTag& tag = nfcNucleo->get_M24SR().get_NDef_tag();
kapitaninternet 14:c5aab7546de9 132 //open the i2c session with the nfc chip
kapitaninternet 14:c5aab7546de9 133 if(tag.open_session()){
kapitaninternet 14:c5aab7546de9 134 printf("Session opened\r\n");
kapitaninternet 14:c5aab7546de9 135
kapitaninternet 14:c5aab7546de9 136 nfcNucleo->get_led1()=! nfcNucleo->get_led1(); //zapala led1 przy przesylaniu danych przez I2C
kapitaninternet 14:c5aab7546de9 137
kapitaninternet 14:c5aab7546de9 138 //write the tag
kapitaninternet 14:c5aab7546de9 139 if(tag.write(msg)){
kapitaninternet 14:c5aab7546de9 140 printf("message wrote\r\n");
kapitaninternet 14:c5aab7546de9 141 nfcNucleo->get_led2()=!nfcNucleo->get_led2(); //zapala led2 przy tworzeniu tagu NFC
kapitaninternet 14:c5aab7546de9 142 }//if
kapitaninternet 14:c5aab7546de9 143
kapitaninternet 14:c5aab7546de9 144 //close the i2c session
kapitaninternet 14:c5aab7546de9 145 if(tag.close_session()){
kapitaninternet 14:c5aab7546de9 146 printf("Session closed\r\n");
kapitaninternet 14:c5aab7546de9 147 nfcNucleo->get_led3()=!nfcNucleo->get_led3(); //zapala led2 przy zakonczeniu przesylu danych przez I2C
kapitaninternet 14:c5aab7546de9 148 }
kapitaninternet 14:c5aab7546de9 149 }//if open session
kapitaninternet 14:c5aab7546de9 150 }
kapitaninternet 14:c5aab7546de9 151
jburhenn 0:d20655cd1f3c 152 void loop(void)
jburhenn 0:d20655cd1f3c 153 {
kapitaninternet 14:c5aab7546de9 154 float voltage_read = 0;
kapitaninternet 14:c5aab7546de9 155 NDefLib::RecordURI rUri(NDefLib::RecordURI::HTTPS,"cayenne.mydevices.com/shared/5d7376a3a4b14e4ee5849b49");
kapitaninternet 14:c5aab7546de9 156 msg.add_record(&rUri);
kapitaninternet 14:c5aab7546de9 157
kapitaninternet 14:c5aab7546de9 158
kapitaninternet 14:c5aab7546de9 159 // timer do publikacji wiadomosci mqtt
kapitaninternet 12:32dbf8ff8d80 160 MQTTTimer timer(publishInterval);
jburhenn 0:d20655cd1f3c 161
jburhenn 0:d20655cd1f3c 162 while (true) {
kapitaninternet 14:c5aab7546de9 163 // wyslij wiadomosc z adresem panelu sterowania przez NFC
kapitaninternet 14:c5aab7546de9 164 write_message(nfcNucleo,msg);
jburhenn 0:d20655cd1f3c 165 mqttClient.yield(1000);
jburhenn 0:d20655cd1f3c 166
kapitaninternet 14:c5aab7546de9 167 // sprawdz polaczenie z siecia i klientem mqtt, jesli brak sprobuj polaczyc ponownie
jburhenn 0:d20655cd1f3c 168 if (!network.connected() || !mqttClient.connected()) {
kapitaninternet 14:c5aab7546de9 169 //network.disconnect();
jburhenn 0:d20655cd1f3c 170 mqttClient.disconnect();
jburhenn 0:d20655cd1f3c 171 while (connectClient() != CAYENNE_SUCCESS) {
kapitaninternet 14:c5aab7546de9 172 wait(2);
jburhenn 0:d20655cd1f3c 173 }
jburhenn 0:d20655cd1f3c 174 }
jburhenn 0:d20655cd1f3c 175
kapitaninternet 12:32dbf8ff8d80 176 // Publish data every few seconds. This should be changed to send your actual data to Cayenne.
jburhenn 0:d20655cd1f3c 177 if (timer.expired()) {
jburhenn 0:d20655cd1f3c 178 int error = 0;
kapitaninternet 9:c206c33736fe 179
kapitaninternet 10:8892a1436342 180 uint8_t id;
kapitaninternet 13:7b3b429e9731 181 float value1, value2, value3;
kapitaninternet 12:32dbf8ff8d80 182 // char buffer1[32], buffer2[32];
kapitaninternet 9:c206c33736fe 183
kapitaninternet 10:8892a1436342 184 /* Enable all sensors */
kapitaninternet 10:8892a1436342 185 hum_temp->enable();
kapitaninternet 10:8892a1436342 186 press_temp->enable();
kapitaninternet 12:32dbf8ff8d80 187 hum_temp->read_id(&id);
kapitaninternet 12:32dbf8ff8d80 188 press_temp->read_id(&id);
kapitaninternet 10:8892a1436342 189 hum_temp->get_temperature(&value1);
kapitaninternet 13:7b3b429e9731 190 hum_temp->get_humidity(&value3);
kapitaninternet 12:32dbf8ff8d80 191 // press_temp->get_temperature(&value1);
kapitaninternet 10:8892a1436342 192 press_temp->get_pressure(&value2);
kapitaninternet 12:32dbf8ff8d80 193 // printf("LPS22HB: [temp] %7s C, [press] %s mbar\r\n", print_double(buffer1, value1), print_double(buffer2, value2));
kapitaninternet 9:c206c33736fe 194
kapitaninternet 14:c5aab7546de9 195 voltage_read = ain.read() * voltageMultiplier;
kapitaninternet 14:c5aab7546de9 196
kapitaninternet 14:c5aab7546de9 197 if ((error = mqttClient.publishData(DATA_TOPIC, 1, TYPE_TEMPERATURE, UNIT_CELSIUS, value1 - 3)) != CAYENNE_SUCCESS) {
jburhenn 0:d20655cd1f3c 198 printf("Publish temperature failed, error: %d\n", error);
jburhenn 0:d20655cd1f3c 199 }
kapitaninternet 13:7b3b429e9731 200
kapitaninternet 13:7b3b429e9731 201 if ((error = mqttClient.publishData(DATA_TOPIC, 5, TYPE_RELATIVE_HUMIDITY, UNIT_PERCENT, value3)) != CAYENNE_SUCCESS) {
kapitaninternet 13:7b3b429e9731 202 printf("Publish humidity failed, error: %d\n", error);
kapitaninternet 13:7b3b429e9731 203 }
kapitaninternet 10:8892a1436342 204
kapitaninternet 10:8892a1436342 205 if ((error = mqttClient.publishData(DATA_TOPIC, 3, TYPE_VOLTAGE, UNIT_VOLTS, voltage_read)) != CAYENNE_SUCCESS) {
kapitaninternet 10:8892a1436342 206 printf("Publish voltage failed, error: %d\n", error);
kapitaninternet 10:8892a1436342 207 }
kapitaninternet 14:c5aab7546de9 208
kapitaninternet 14:c5aab7546de9 209 if ((error = mqttClient.publishData(DATA_TOPIC, 6, TYPE_VOLTAGE, UNIT_VOLTS, voltageChangeLevel)) != CAYENNE_SUCCESS) {
kapitaninternet 14:c5aab7546de9 210 printf("Publish voltage change level failed, error: %d\n", error);
kapitaninternet 14:c5aab7546de9 211 }
kapitaninternet 9:c206c33736fe 212
kapitaninternet 9:c206c33736fe 213 if ((error = mqttClient.publishData(DATA_TOPIC, 2, TYPE_BAROMETRIC_PRESSURE, UNIT_HECTOPASCAL, value2)) != CAYENNE_SUCCESS) {
jburhenn 0:d20655cd1f3c 214 printf("Publish barometric pressure failed, error: %d\n", error);
jburhenn 0:d20655cd1f3c 215 }
kapitaninternet 9:c206c33736fe 216 // Restart the countdown timer for publishing data every 2 seconds. Change the timeout parameter to publish at a different interval.
kapitaninternet 12:32dbf8ff8d80 217 timer.countdown_ms(publishInterval);
jburhenn 0:d20655cd1f3c 218 }
kapitaninternet 14:c5aab7546de9 219
kapitaninternet 14:c5aab7546de9 220 // jesli przekroczono ustawione napiecie o 5%, to zmien stan serwa
kapitaninternet 14:c5aab7546de9 221 if(!manualControl & voltage_read > voltageChangeLevel*1.05f)
kapitaninternet 14:c5aab7546de9 222 {
kapitaninternet 14:c5aab7546de9 223 // zmien pozycję serwa na pozycje otwartą
kapitaninternet 14:c5aab7546de9 224 myservo = 0.5;
kapitaninternet 14:c5aab7546de9 225 } else if(!manualControl & voltage_read < voltageChangeLevel*0.95f) // jesli napiecie spadlo ponizej 95% ustalonego napiecia, zmien stan serwa
kapitaninternet 14:c5aab7546de9 226 {
kapitaninternet 14:c5aab7546de9 227 myservo = -0.1;
kapitaninternet 14:c5aab7546de9 228 }
jburhenn 0:d20655cd1f3c 229 }
jburhenn 0:d20655cd1f3c 230 }
jburhenn 0:d20655cd1f3c 231
jburhenn 0:d20655cd1f3c 232 int main()
jburhenn 0:d20655cd1f3c 233 {
kapitaninternet 12:32dbf8ff8d80 234 myLed = 0;
kapitaninternet 14:c5aab7546de9 235 myservo = -0.1;
kapitaninternet 12:32dbf8ff8d80 236
jburhenn 0:d20655cd1f3c 237 interface.connect(ssid, wifiPassword, NSAPI_SECURITY_WPA2);
jburhenn 0:d20655cd1f3c 238 mqttClient.setDefaultMessageHandler(messageArrived);
jburhenn 0:d20655cd1f3c 239
jburhenn 0:d20655cd1f3c 240 // Connect to Cayenne.
jburhenn 0:d20655cd1f3c 241 if (connectClient() == CAYENNE_SUCCESS) {
jburhenn 0:d20655cd1f3c 242 // Run main loop.
jburhenn 0:d20655cd1f3c 243 loop();
jburhenn 0:d20655cd1f3c 244 }
kapitaninternet 12:32dbf8ff8d80 245
jburhenn 0:d20655cd1f3c 246 if (mqttClient.connected())
jburhenn 0:d20655cd1f3c 247 mqttClient.disconnect();
jburhenn 0:d20655cd1f3c 248 if (network.connected())
jburhenn 0:d20655cd1f3c 249 network.disconnect();
kapitaninternet 12:32dbf8ff8d80 250 return 0;
kapitaninternet 10:8892a1436342 251 }