IoTKitV3 / Mbed OS MQTTPublish

Dependencies:   QEI MFRC522 HTS221 IoTKit BMP180 MQTT

Fork of MQTTPublish by smd.iotkit2.ch

Committer:
marcel1691
Date:
Mon Apr 15 11:54:53 2019 +0000
Revision:
28:aa3b3fa5b5a7
Parent:
27:43f3a9552db2
Child:
29:99e8c0ea9ac1
RFID integriert

Who changed what in which revision?

UserRevisionLine numberNew contents of line
stefan1691 18:53d83febbe0a 1 /** MQTT Publish von Sensordaten */
stefan1691 17:719bb7709c80 2 #include "mbed.h"
marcel1691 21:4693a8b2a665 3 #include "HTS221Sensor.h"
marcel1691 20:88b9edbdf125 4 #include "MQTTNetwork.h"
marcel1691 20:88b9edbdf125 5 #include "MQTTmbed.h"
icraggs 2:638c854c0695 6 #include "MQTTClient.h"
marcel1691 21:4693a8b2a665 7 #include "OLEDDisplay.h"
marcel1691 26:cf9cf40c63ea 8 #include "Motor.h"
marcel1691 28:aa3b3fa5b5a7 9 #include "QEI.h"
marcel1691 28:aa3b3fa5b5a7 10 #include "MFRC522.h"
marcel1691 28:aa3b3fa5b5a7 11
marcel1691 28:aa3b3fa5b5a7 12 // NFC/RFID Reader (SPI)
marcel1691 28:aa3b3fa5b5a7 13 MFRC522 rfidReader( PTA16, PTC7, PTC5, D10, D8 ); // PTD2 statt PTA16
icraggs 2:638c854c0695 14
marcel1691 27:43f3a9552db2 15 #include "ESP8266Interface.h"
marcel1691 28:aa3b3fa5b5a7 16 ESP8266Interface wifi(MBED_CONF_APP_WIFI_TX, MBED_CONF_APP_WIFI_RX);
marcel1691 27:43f3a9552db2 17
marcel1691 28:aa3b3fa5b5a7 18 // Sensoren wo Daten fuer Topics produzieren
marcel1691 21:4693a8b2a665 19 static DevI2C devI2c(PTE0,PTE1);
marcel1691 21:4693a8b2a665 20 static HTS221Sensor hum_temp(&devI2c);
marcel1691 21:4693a8b2a665 21 AnalogIn hallSensor( PTC0 );
marcel1691 28:aa3b3fa5b5a7 22 DigitalIn button( PTC13 );
marcel1691 28:aa3b3fa5b5a7 23 //Use X2 encoding by default.
marcel1691 28:aa3b3fa5b5a7 24 QEI wheel (PTC6, PTA4, NC, 624);
marcel1691 20:88b9edbdf125 25
stefan1691 18:53d83febbe0a 26 // Topic's
marcel1691 21:4693a8b2a665 27 char* topicTEMP = "iotkit/sensor";
marcel1691 21:4693a8b2a665 28 char* topicALERT = "iotkit/alert";
marcel1691 28:aa3b3fa5b5a7 29 char* topicBUTTON = "iotkit/button";
marcel1691 28:aa3b3fa5b5a7 30 char* topicENCODER = "iotkit/encoder";
marcel1691 28:aa3b3fa5b5a7 31 char* topicRFID = "iotkit/rfid";
stefan1691 17:719bb7709c80 32 // MQTT Brocker
marcel1691 28:aa3b3fa5b5a7 33 char* hostname = "broker.hivemq.com";
marcel1691 27:43f3a9552db2 34 int port = 1883;
stefan1691 17:719bb7709c80 35 // MQTT Message
stefan1691 17:719bb7709c80 36 MQTT::Message message;
stefan1691 17:719bb7709c80 37 // I/O Buffer
stefan1691 17:719bb7709c80 38 char buf[100];
marcel1691 24:d2f0599798a1 39
marcel1691 24:d2f0599798a1 40 // Klassifikation
marcel1691 24:d2f0599798a1 41 char cls[3][10] = { "low", "middle", "high" };
marcel1691 24:d2f0599798a1 42 int type = 0;
marcel1691 24:d2f0599798a1 43
stefan1691 17:719bb7709c80 44 // UI
marcel1691 21:4693a8b2a665 45 OLEDDisplay oled( PTE26, PTE0, PTE1);
marcel1691 20:88b9edbdf125 46 DigitalOut led1( D10 );
marcel1691 22:b671b01d00f9 47 DigitalOut alert( D13 );
icraggs 2:638c854c0695 48
marcel1691 26:cf9cf40c63ea 49 // Aktore(n)
marcel1691 26:cf9cf40c63ea 50 Motor m1(D3, D2, D4); // PWM, Vorwaerts, Rueckwarts
marcel1691 26:cf9cf40c63ea 51 PwmOut speaker( D12 );
marcel1691 26:cf9cf40c63ea 52
stefan1691 17:719bb7709c80 53 /** Hilfsfunktion zum Publizieren auf MQTT Broker */
marcel1691 21:4693a8b2a665 54 void publish( MQTTNetwork &mqttNetwork, MQTT::Client<MQTTNetwork, Countdown> &client, char* topic )
stefan1691 17:719bb7709c80 55 {
marcel1691 21:4693a8b2a665 56 led1 = 1;
marcel1691 21:4693a8b2a665 57 printf("Connecting to %s:%d\r\n", hostname, port);
marcel1691 21:4693a8b2a665 58
marcel1691 20:88b9edbdf125 59 int rc = mqttNetwork.connect(hostname, port);
marcel1691 20:88b9edbdf125 60 if (rc != 0)
marcel1691 21:4693a8b2a665 61 printf("rc from TCP connect is %d\r\n", rc);
stefan1691 17:719bb7709c80 62
stefan1691 17:719bb7709c80 63 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
icraggs 6:e4c690c45021 64 data.MQTTVersion = 3;
icraggs 8:a3e3113054a1 65 data.clientID.cstring = "mbed-sample";
icraggs 12:086a9314e8a5 66 data.username.cstring = "testuser";
icraggs 12:086a9314e8a5 67 data.password.cstring = "testpassword";
marcel1691 20:88b9edbdf125 68 if ((rc = client.connect(data)) != 0)
marcel1691 21:4693a8b2a665 69 printf("rc from MQTT connect is %d\r\n", rc);
icraggs 2:638c854c0695 70
marcel1691 20:88b9edbdf125 71 MQTT::Message message;
marcel1691 20:88b9edbdf125 72
marcel1691 21:4693a8b2a665 73 oled.cursor( 2, 0 );
marcel1691 21:4693a8b2a665 74 oled.printf( "Topi: %s\n", topic );
marcel1691 21:4693a8b2a665 75 oled.cursor( 3, 0 );
marcel1691 21:4693a8b2a665 76 oled.printf( "Push: %s\n", buf );
icraggs 2:638c854c0695 77 message.qos = MQTT::QOS0;
icraggs 2:638c854c0695 78 message.retained = false;
icraggs 2:638c854c0695 79 message.dup = false;
stefan1691 17:719bb7709c80 80 message.payload = (void*) buf;
icraggs 2:638c854c0695 81 message.payloadlen = strlen(buf)+1;
marcel1691 21:4693a8b2a665 82 client.publish( topic, message);
icraggs 2:638c854c0695 83
stefan1691 17:719bb7709c80 84 // Verbindung beenden, ansonsten ist nach 4x Schluss
marcel1691 20:88b9edbdf125 85 if ((rc = client.disconnect()) != 0)
marcel1691 21:4693a8b2a665 86 printf("rc from disconnect was %d\r\n", rc);
marcel1691 20:88b9edbdf125 87
marcel1691 20:88b9edbdf125 88 mqttNetwork.disconnect();
marcel1691 21:4693a8b2a665 89 led1 = 0;
icraggs 0:0cae29831d01 90 }
stefan1691 17:719bb7709c80 91
stefan1691 17:719bb7709c80 92 /** Hauptprogramm */
stefan1691 17:719bb7709c80 93 int main()
stefan1691 17:719bb7709c80 94 {
marcel1691 21:4693a8b2a665 95 uint8_t id;
marcel1691 21:4693a8b2a665 96 float temp, hum;
marcel1691 28:aa3b3fa5b5a7 97 int encoder;
marcel1691 22:b671b01d00f9 98 alert = 0;
marcel1691 21:4693a8b2a665 99
marcel1691 21:4693a8b2a665 100 oled.clear();
marcel1691 21:4693a8b2a665 101 oled.printf( "MQTTPublish\r\n" );
marcel1691 21:4693a8b2a665 102 oled.printf( "host: %s:%s\r\n", hostname, port );
marcel1691 20:88b9edbdf125 103
marcel1691 27:43f3a9552db2 104 printf("\nConnecting to %s...\n", MBED_CONF_APP_WIFI_SSID);
marcel1691 27:43f3a9552db2 105 oled.printf( "SSID: %s\r\n", MBED_CONF_APP_WIFI_SSID );
marcel1691 27:43f3a9552db2 106 int ret = wifi.connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2);
marcel1691 27:43f3a9552db2 107 if (ret != 0) {
marcel1691 27:43f3a9552db2 108 printf("\nConnection error: %d\n", ret);
marcel1691 20:88b9edbdf125 109 return -1;
marcel1691 27:43f3a9552db2 110 }
marcel1691 20:88b9edbdf125 111
marcel1691 20:88b9edbdf125 112 // TCP/IP und MQTT initialisieren (muss in main erfolgen)
marcel1691 27:43f3a9552db2 113 MQTTNetwork mqttNetwork( &wifi );
marcel1691 20:88b9edbdf125 114 MQTT::Client<MQTTNetwork, Countdown> client(mqttNetwork);
marcel1691 21:4693a8b2a665 115
marcel1691 21:4693a8b2a665 116 /* Init all sensors with default params */
marcel1691 21:4693a8b2a665 117 hum_temp.init(NULL);
marcel1691 21:4693a8b2a665 118 hum_temp.enable();
stefan1691 17:719bb7709c80 119
stefan1691 17:719bb7709c80 120 while ( 1 )
stefan1691 17:719bb7709c80 121 {
marcel1691 21:4693a8b2a665 122 // Temperator und Luftfeuchtigkeit
marcel1691 21:4693a8b2a665 123 hum_temp.read_id(&id);
marcel1691 21:4693a8b2a665 124 hum_temp.get_temperature(&temp);
marcel1691 21:4693a8b2a665 125 hum_temp.get_humidity(&hum);
marcel1691 24:d2f0599798a1 126 if ( type == 0 )
marcel1691 26:cf9cf40c63ea 127 {
marcel1691 24:d2f0599798a1 128 temp -= 5.0f;
marcel1691 26:cf9cf40c63ea 129 m1.speed( 0.0f );
marcel1691 26:cf9cf40c63ea 130 }
marcel1691 24:d2f0599798a1 131 else if ( type == 2 )
marcel1691 26:cf9cf40c63ea 132 {
marcel1691 24:d2f0599798a1 133 temp += 5.0f;
marcel1691 26:cf9cf40c63ea 134 m1.speed( 1.0f );
marcel1691 26:cf9cf40c63ea 135 }
marcel1691 26:cf9cf40c63ea 136 else
marcel1691 26:cf9cf40c63ea 137 {
marcel1691 26:cf9cf40c63ea 138 m1.speed( 0.75f );
marcel1691 26:cf9cf40c63ea 139 }
marcel1691 24:d2f0599798a1 140 sprintf( buf, "0x%X,%2.2f,%2.1f,%s", id, temp, hum, cls[type] );
marcel1691 24:d2f0599798a1 141 type++;
marcel1691 24:d2f0599798a1 142 if ( type > 2 )
marcel1691 24:d2f0599798a1 143 type = 0;
marcel1691 21:4693a8b2a665 144 publish( mqttNetwork, client, topicTEMP );
marcel1691 21:4693a8b2a665 145
marcel1691 21:4693a8b2a665 146 // alert Tuer offen
marcel1691 23:4d8f3061890e 147 printf( "Hall %4.4f, alert %d\n", hallSensor.read(), alert.read() );
marcel1691 21:4693a8b2a665 148 if ( hallSensor.read() > 0.6f )
marcel1691 21:4693a8b2a665 149 {
marcel1691 22:b671b01d00f9 150 // nur einmal Melden!, bis Reset
marcel1691 23:4d8f3061890e 151 if ( alert.read() == 0 )
marcel1691 22:b671b01d00f9 152 {
marcel1691 24:d2f0599798a1 153 sprintf( buf, "alert: hall" );
marcel1691 22:b671b01d00f9 154 message.payload = (void*) buf;
marcel1691 22:b671b01d00f9 155 message.payloadlen = strlen(buf)+1;
marcel1691 22:b671b01d00f9 156 publish( mqttNetwork, client, topicALERT );
marcel1691 22:b671b01d00f9 157 alert = 1;
marcel1691 22:b671b01d00f9 158 }
marcel1691 26:cf9cf40c63ea 159 speaker.period( 1.0 / 3969.0 ); // 3969 = Tonfrequenz in Hz
marcel1691 26:cf9cf40c63ea 160 speaker = 0.5f;
marcel1691 26:cf9cf40c63ea 161 wait( 0.5f );
marcel1691 26:cf9cf40c63ea 162 speaker.period( 1.0 / 2800.0 );
marcel1691 27:43f3a9552db2 163 wait( 0.5f );
marcel1691 21:4693a8b2a665 164 }
marcel1691 22:b671b01d00f9 165 else
marcel1691 26:cf9cf40c63ea 166 {
marcel1691 22:b671b01d00f9 167 alert = 0;
marcel1691 26:cf9cf40c63ea 168 speaker = 0.0f;
marcel1691 26:cf9cf40c63ea 169 }
marcel1691 28:aa3b3fa5b5a7 170
marcel1691 28:aa3b3fa5b5a7 171 // Button (nur wenn gedrueckt)
marcel1691 28:aa3b3fa5b5a7 172 if ( button == 0 )
marcel1691 28:aa3b3fa5b5a7 173 {
marcel1691 28:aa3b3fa5b5a7 174 sprintf( buf, "ON" );
marcel1691 28:aa3b3fa5b5a7 175 publish( mqttNetwork, client, topicBUTTON );
marcel1691 28:aa3b3fa5b5a7 176 }
marcel1691 28:aa3b3fa5b5a7 177
marcel1691 28:aa3b3fa5b5a7 178 // Encoder
marcel1691 28:aa3b3fa5b5a7 179 encoder = wheel.getPulses();
marcel1691 28:aa3b3fa5b5a7 180 sprintf( buf, "%d", encoder );
marcel1691 28:aa3b3fa5b5a7 181 publish( mqttNetwork, client, topicENCODER );
marcel1691 28:aa3b3fa5b5a7 182
marcel1691 28:aa3b3fa5b5a7 183 // RFID Reader
marcel1691 28:aa3b3fa5b5a7 184 if ( rfidReader.PICC_IsNewCardPresent())
marcel1691 28:aa3b3fa5b5a7 185 if ( rfidReader.PICC_ReadCardSerial())
marcel1691 28:aa3b3fa5b5a7 186 {
marcel1691 28:aa3b3fa5b5a7 187 // Print Card UID (2-stellig mit Vornullen, Hexadecimal)
marcel1691 28:aa3b3fa5b5a7 188 printf("Card UID: ");
marcel1691 28:aa3b3fa5b5a7 189 for ( int i = 0; i < rfidReader.uid.size; i++ )
marcel1691 28:aa3b3fa5b5a7 190 printf("%02X:", rfidReader.uid.uidByte[i]);
marcel1691 28:aa3b3fa5b5a7 191 printf("\n");
marcel1691 28:aa3b3fa5b5a7 192
marcel1691 28:aa3b3fa5b5a7 193 // Print Card type
marcel1691 28:aa3b3fa5b5a7 194 int piccType = rfidReader.PICC_GetType(rfidReader.uid.sak);
marcel1691 28:aa3b3fa5b5a7 195 printf("PICC Type: %s \n", rfidReader.PICC_GetTypeName(piccType) );
marcel1691 28:aa3b3fa5b5a7 196
marcel1691 28:aa3b3fa5b5a7 197 sprintf( buf, "%02X:%02X:%02X:%02X:", rfidReader.uid.uidByte[0], rfidReader.uid.uidByte[1], rfidReader.uid.uidByte[2], rfidReader.uid.uidByte[3] );
marcel1691 28:aa3b3fa5b5a7 198 publish( mqttNetwork, client, topicRFID );
marcel1691 28:aa3b3fa5b5a7 199
marcel1691 28:aa3b3fa5b5a7 200 }
marcel1691 28:aa3b3fa5b5a7 201
marcel1691 21:4693a8b2a665 202 wait ( 2.0f );
stefan1691 17:719bb7709c80 203 }
stefan1691 17:719bb7709c80 204 }