Luka Ristic 2020/0331

Dependencies:   Adafruit_GFX 19E042PIM_MB_PINS

Committer:
lukan
Date:
Mon Dec 13 14:14:22 2021 +0000
Revision:
6:b361643727ea
Parent:
5:b4c6bef81c0b
Luka Ristic 2020/0331

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lukan 6:b361643727ea 1 /*
lukan 6:b361643727ea 2 * Program implements MQTT client on a NUCLEO-L476RG board
lukan 6:b361643727ea 3 * using arm mbed-mqtt library and ESP-WROOM-02 WiFi modem.
lukan 6:b361643727ea 4 *
lukan 6:b361643727ea 5 * University of Belgrade - School of Electrical Engineering
lukan 6:b361643727ea 6 * Department of Electronics
lukan 6:b361643727ea 7 * Bulevar Kralja Aleksandra 73, 11120 Belgrade, Serbia
lukan 6:b361643727ea 8 *
lukan 6:b361643727ea 9 * November 2021.
lukan 6:b361643727ea 10 *
lukan 6:b361643727ea 11 */
lukan 6:b361643727ea 12
lukan 6:b361643727ea 13 #include "mbed.h"
filip_ste 0:82908a60b720 14 #include "mb_pins.h"
filip_ste 0:82908a60b720 15 #include "platform/mbed_thread.h"
filip_ste 0:82908a60b720 16 #include "MQTTClientMbedOs.h"
filip_ste 0:82908a60b720 17
filip_ste 0:82908a60b720 18 #include "Adafruit_GFX.h"
filip_ste 0:82908a60b720 19 #include "Adafruit_GFX_Config.h"
filip_ste 0:82908a60b720 20 #include "Adafruit_SSD1306.h"
filip_ste 0:82908a60b720 21
filip_ste 2:8dacbf975c41 22
filip_ste 0:82908a60b720 23
filip_ste 0:82908a60b720 24 #define SMALL_WAIT_MS 10
filip_ste 2:8dacbf975c41 25 #define VOLTAGE_SCALER 3.3f
filip_ste 0:82908a60b720 26
filip_ste 0:82908a60b720 27 //I2C adress
filip_ste 0:82908a60b720 28 #define I2C_ADDRESS 0x3c
filip_ste 0:82908a60b720 29 #define I2C_ADD_MBED I2C_ADDRESS << 1
filip_ste 0:82908a60b720 30
filip_ste 0:82908a60b720 31 //OLED DIMENSIONS
filip_ste 0:82908a60b720 32 #define OLED_HEIGHT_PX 64
filip_ste 0:82908a60b720 33 #define OLED_WIDTH_PX 128
filip_ste 0:82908a60b720 34
lukan 6:b361643727ea 35 // Pointer to a WiFi network object:
lukan 6:b361643727ea 36 WiFiInterface *wifi;
lukan 6:b361643727ea 37 // Creating TCP socket:
filip_ste 0:82908a60b720 38 TCPSocket socket;
lukan 6:b361643727ea 39 // Creating MQTT client using the TCP socket;
filip_ste 0:82908a60b720 40 MQTTClient client(&socket);
lukan 6:b361643727ea 41 // Message handler:
filip_ste 0:82908a60b720 42 MQTT::Message message;
filip_ste 0:82908a60b720 43
filip_ste 0:82908a60b720 44 I2C i2c_obj(MB_OLED_SDA, MB_OLED_SCL);
filip_ste 0:82908a60b720 45 Adafruit_SSD1306_I2c myOLED(i2c_obj, PB_5, I2C_ADD_MBED, OLED_HEIGHT_PX, OLED_WIDTH_PX);
filip_ste 0:82908a60b720 46
filip_ste 2:8dacbf975c41 47 const char* topic_sub = "subpim";
filip_ste 2:8dacbf975c41 48 const char* topic_pub = "pubpim";
lukan 6:b361643727ea 49 // HiveMQ broker connectivity information:
filip_ste 0:82908a60b720 50 const char* hostname = "broker.hivemq.com";
filip_ste 5:b4c6bef81c0b 51 const int port = 1883;
filip_ste 0:82908a60b720 52
filip_ste 0:82908a60b720 53
filip_ste 0:82908a60b720 54 void messageArrived(MQTT::MessageData& md)
filip_ste 0:82908a60b720 55 {
lukan 6:b361643727ea 56 MQTT::Message &msg = md.message;
lukan 6:b361643727ea 57 printf("Browser message: %.*s \n", msg.payloadlen, (char*)msg.payload);
lukan 6:b361643727ea 58 message.qos = MQTT::QOS0;
lukan 6:b361643727ea 59 message.retained = false;
lukan 6:b361643727ea 60 message.dup = false;
lukan 6:b361643727ea 61 message.payload = (void*)msg.payload;
lukan 6:b361643727ea 62 message.payloadlen = msg.payloadlen + 1;
lukan 6:b361643727ea 63 client.publish(topic_pub, message);
lukan 6:b361643727ea 64 myOLED.clearDisplay();
lukan 6:b361643727ea 65 myOLED.setTextCursor(0, 0);
lukan 6:b361643727ea 66 myOLED.printf("%.*s \n", msg.payloadlen, (char*)msg.payload);
lukan 6:b361643727ea 67 myOLED.display();
filip_ste 2:8dacbf975c41 68
filip_ste 0:82908a60b720 69 }
filip_ste 0:82908a60b720 70
filip_ste 0:82908a60b720 71 int main()
filip_ste 0:82908a60b720 72 {
lukan 6:b361643727ea 73 // Create a default network interface:
filip_ste 0:82908a60b720 74 wifi = WiFiInterface::get_default_instance();
lukan 6:b361643727ea 75 if (!wifi) {
lukan 6:b361643727ea 76 printf("ERROR: No WiFiInterface found.\n");
lukan 6:b361643727ea 77 return -1;
lukan 6:b361643727ea 78 }
filip_ste 0:82908a60b720 79
lukan 6:b361643727ea 80 // Connect to the network with the parameters specified in 'mbed_app.json':
lukan 6:b361643727ea 81 printf("Connecting to %s... \n",MBED_CONF_APP_WIFI_SSID);
filip_ste 0:82908a60b720 82 int ret = wifi->connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2);
lukan 6:b361643727ea 83 if(ret != 0){
lukan 6:b361643727ea 84 printf("\nConnection error: %d\n", ret);
lukan 6:b361643727ea 85 return -1;
lukan 6:b361643727ea 86 }
lukan 6:b361643727ea 87 // Print out the information aquired:
lukan 6:b361643727ea 88 printf("Connected to %s\n", MBED_CONF_APP_WIFI_SSID);
filip_ste 0:82908a60b720 89
lukan 6:b361643727ea 90 // Open TCP socket using WiFi network interface:
filip_ste 0:82908a60b720 91 socket.open(wifi);
lukan 6:b361643727ea 92
lukan 6:b361643727ea 93 // Connect to the HiveMQ broker:
filip_ste 0:82908a60b720 94 socket.connect(hostname,port);
filip_ste 0:82908a60b720 95
lukan 6:b361643727ea 96 // Fill connect data with default values:
filip_ste 0:82908a60b720 97 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
lukan 6:b361643727ea 98 // Change only ID and protocol version:
filip_ste 0:82908a60b720 99 data.MQTTVersion = 3;
lukan 6:b361643727ea 100 data.clientID.cstring = "pim-09";
filip_ste 0:82908a60b720 101
filip_ste 0:82908a60b720 102 client.connect(data);
filip_ste 0:82908a60b720 103 client.subscribe(topic_sub, MQTT::QOS0, messageArrived);
filip_ste 0:82908a60b720 104
filip_ste 2:8dacbf975c41 105 i2c_obj.frequency(400000);
filip_ste 0:82908a60b720 106
lukan 6:b361643727ea 107 myOLED.begin();
lukan 6:b361643727ea 108 myOLED.clearDisplay();
lukan 6:b361643727ea 109 myOLED.display();
filip_ste 0:82908a60b720 110 while(1) {
filip_ste 0:82908a60b720 111 thread_sleep_for(SMALL_WAIT_MS);
filip_ste 0:82908a60b720 112 client.yield(1000);
filip_ste 0:82908a60b720 113 }
filip_ste 0:82908a60b720 114 }