Maksim Kostadinov / Mbed OS 19E042PIM_T3_2020_0358

Dependencies:   Adafruit_GFX 19E042PIM_MB_PINS

Committer:
maksimkostadinov
Date:
Sat Dec 11 16:25:50 2021 +0000
Revision:
1:b7b3a61ea5e9
Parent:
0:859a7d417620
Maksim Kostadinov 0358/2020

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maksimkostadinov 0:859a7d417620 1 /*
maksimkostadinov 0:859a7d417620 2 Maksim Kostadinov 0358/2020
maksimkostadinov 0:859a7d417620 3
maksimkostadinov 0:859a7d417620 4 Nazalost, iako uspevam da se povezem na mrezu, ne uspevam da osposobim kominikaciju :(
maksimkostadinov 0:859a7d417620 5 */
maksimkostadinov 0:859a7d417620 6
maksimkostadinov 0:859a7d417620 7 #include "mbed.h"
maksimkostadinov 0:859a7d417620 8 #include "mb_pins.h"
maksimkostadinov 0:859a7d417620 9 #include "platform/mbed_thread.h"
maksimkostadinov 0:859a7d417620 10 #include "MQTTClientMbedOs.h"
maksimkostadinov 0:859a7d417620 11
maksimkostadinov 0:859a7d417620 12
maksimkostadinov 0:859a7d417620 13 #include "Adafruit_GFX.h"
maksimkostadinov 0:859a7d417620 14 #include "Adafruit_GFX_Config.h"
maksimkostadinov 0:859a7d417620 15 #include "Adafruit_SSD1306.h"
maksimkostadinov 0:859a7d417620 16
maksimkostadinov 0:859a7d417620 17 #include "string"
maksimkostadinov 0:859a7d417620 18
maksimkostadinov 0:859a7d417620 19
maksimkostadinov 0:859a7d417620 20
maksimkostadinov 0:859a7d417620 21 #define SCL PB_13
maksimkostadinov 0:859a7d417620 22 #define SDA PB_14
maksimkostadinov 0:859a7d417620 23 #define DATA "15"
maksimkostadinov 0:859a7d417620 24 #define LENGTH 1
maksimkostadinov 0:859a7d417620 25 #define SMALL_DELAY_MS 10
maksimkostadinov 0:859a7d417620 26 #define I2C_ADD 0x3C
maksimkostadinov 0:859a7d417620 27 #define I2C_ADD_MBED I2C_ADD<<1
maksimkostadinov 0:859a7d417620 28 #define OLED_HEIGHT 64
maksimkostadinov 0:859a7d417620 29 #define OLED_WIDTH 128
maksimkostadinov 0:859a7d417620 30
maksimkostadinov 0:859a7d417620 31
maksimkostadinov 0:859a7d417620 32
maksimkostadinov 0:859a7d417620 33
maksimkostadinov 0:859a7d417620 34
maksimkostadinov 0:859a7d417620 35
maksimkostadinov 0:859a7d417620 36
maksimkostadinov 0:859a7d417620 37 // LED2 blinking rate:
maksimkostadinov 0:859a7d417620 38 #define BLINKING_RATE_MS 250
maksimkostadinov 0:859a7d417620 39 // Scaler to 3v3L
maksimkostadinov 0:859a7d417620 40 #define VOLTAGE_SCALER 3.3f
maksimkostadinov 0:859a7d417620 41 // Client yield timeout in miliseconds:
maksimkostadinov 0:859a7d417620 42 #define YIELD_TIMEOUT_MS 1000
maksimkostadinov 0:859a7d417620 43 // Maximum number of networks to scan for:
maksimkostadinov 0:859a7d417620 44 #define MAX_NETWORKS 15
maksimkostadinov 0:859a7d417620 45 // Small delay for network information printing:
maksimkostadinov 0:859a7d417620 46 #define PRINTF_DELAY_MS 10
maksimkostadinov 0:859a7d417620 47
maksimkostadinov 0:859a7d417620 48
maksimkostadinov 0:859a7d417620 49 // Left potentiometer:
maksimkostadinov 0:859a7d417620 50 AnalogIn pot1(MB_POT1);
maksimkostadinov 0:859a7d417620 51 // Right LED on the motherboard:
maksimkostadinov 0:859a7d417620 52 DigitalOut led2(MB_LED2);
maksimkostadinov 0:859a7d417620 53 // Left button on the motherboard:
maksimkostadinov 0:859a7d417620 54 InterruptIn sw1(MB_SW1);
maksimkostadinov 0:859a7d417620 55 // WiFi network handler:
maksimkostadinov 0:859a7d417620 56 WiFiInterface *wifi;
maksimkostadinov 0:859a7d417620 57 // Creating TCP socket:
maksimkostadinov 0:859a7d417620 58 TCPSocket socket;
maksimkostadinov 0:859a7d417620 59 // Creating MQTT client using the TCP socket;
maksimkostadinov 0:859a7d417620 60 MQTTClient client(&socket);
maksimkostadinov 0:859a7d417620 61 // Message handler:
maksimkostadinov 0:859a7d417620 62 MQTT::Message message;
maksimkostadinov 0:859a7d417620 63
maksimkostadinov 0:859a7d417620 64 char* topic = "pubpim33";
maksimkostadinov 0:859a7d417620 65 char* topic_sub = "subpim33";
maksimkostadinov 0:859a7d417620 66 // Counter of arrived messages:
maksimkostadinov 0:859a7d417620 67 int arrivedcount = 0;
maksimkostadinov 0:859a7d417620 68 // Flag indicating that button is not pressed:
maksimkostadinov 0:859a7d417620 69 int button_pressed=0;
maksimkostadinov 0:859a7d417620 70 // HiveMQ broker connectivity information:
maksimkostadinov 0:859a7d417620 71 const char* hostname = "broker.mqttdashboard.com";
maksimkostadinov 0:859a7d417620 72 int port = 8000;
maksimkostadinov 0:859a7d417620 73
maksimkostadinov 0:859a7d417620 74
maksimkostadinov 0:859a7d417620 75 // Returning a string for a provided network encryption:
maksimkostadinov 0:859a7d417620 76 const char *sec2str(nsapi_security_t sec)
maksimkostadinov 0:859a7d417620 77 {
maksimkostadinov 0:859a7d417620 78 switch (sec)
maksimkostadinov 0:859a7d417620 79 {
maksimkostadinov 0:859a7d417620 80 case NSAPI_SECURITY_NONE:
maksimkostadinov 0:859a7d417620 81 return "None";
maksimkostadinov 0:859a7d417620 82 case NSAPI_SECURITY_WEP:
maksimkostadinov 0:859a7d417620 83 return "WEP";
maksimkostadinov 0:859a7d417620 84 case NSAPI_SECURITY_WPA:
maksimkostadinov 0:859a7d417620 85 return "WPA";
maksimkostadinov 0:859a7d417620 86 case NSAPI_SECURITY_WPA2:
maksimkostadinov 0:859a7d417620 87 return "WPA2";
maksimkostadinov 0:859a7d417620 88 case NSAPI_SECURITY_WPA_WPA2:
maksimkostadinov 0:859a7d417620 89 return "WPA/WPA2";
maksimkostadinov 0:859a7d417620 90 case NSAPI_SECURITY_UNKNOWN:
maksimkostadinov 0:859a7d417620 91 default:
maksimkostadinov 0:859a7d417620 92 return "Unknown";
maksimkostadinov 0:859a7d417620 93 }
maksimkostadinov 0:859a7d417620 94 }
maksimkostadinov 0:859a7d417620 95
maksimkostadinov 0:859a7d417620 96 int scan_networks(WiFiInterface *wifi)
maksimkostadinov 0:859a7d417620 97 {
maksimkostadinov 0:859a7d417620 98 printf("Scan:\n");
maksimkostadinov 0:859a7d417620 99
maksimkostadinov 0:859a7d417620 100 // Scan only for the number of networks, first parameter is NULL:
maksimkostadinov 0:859a7d417620 101 int count = wifi->scan(NULL, 0);
maksimkostadinov 0:859a7d417620 102 // If there are no networks, count == 0, if there is an error, counter < 0:
maksimkostadinov 0:859a7d417620 103 if (count <= 0)
maksimkostadinov 0:859a7d417620 104 {
maksimkostadinov 0:859a7d417620 105 printf("scan() failed with return value: %d\n", count);
maksimkostadinov 0:859a7d417620 106 return 0;
maksimkostadinov 0:859a7d417620 107 }
maksimkostadinov 0:859a7d417620 108
maksimkostadinov 0:859a7d417620 109 // Limit number of network arbitrary to some reasonable number:
maksimkostadinov 0:859a7d417620 110 count = count < MAX_NETWORKS ? count : MAX_NETWORKS;
maksimkostadinov 0:859a7d417620 111
maksimkostadinov 0:859a7d417620 112 // Create a local pointer to an object, which is an array of WiFi APs:
maksimkostadinov 0:859a7d417620 113 WiFiAccessPoint *ap = new WiFiAccessPoint[count];
maksimkostadinov 0:859a7d417620 114 // Now scan again for 'count' networks and populate the array of APs:
maksimkostadinov 0:859a7d417620 115 count = wifi->scan(ap, count);
maksimkostadinov 0:859a7d417620 116
maksimkostadinov 0:859a7d417620 117 // This time, the number of entries to 'ap' is returned:
maksimkostadinov 0:859a7d417620 118 if (count <= 0)
maksimkostadinov 0:859a7d417620 119 {
maksimkostadinov 0:859a7d417620 120 printf("scan() failed with return value: %d\n", count);
maksimkostadinov 0:859a7d417620 121 return 0;
maksimkostadinov 0:859a7d417620 122 }
maksimkostadinov 0:859a7d417620 123
maksimkostadinov 0:859a7d417620 124 // Print out the parameters of each AP:
maksimkostadinov 0:859a7d417620 125 for (int i = 0; i < count; i++)
maksimkostadinov 0:859a7d417620 126 {
maksimkostadinov 0:859a7d417620 127 printf("Network: %s secured: %s BSSID: %hhX:%hhX:%hhX:%hhx:%hhx:%hhx RSSI: %hhd Ch: %hhd\n", ap[i].get_ssid(),
maksimkostadinov 0:859a7d417620 128 sec2str(ap[i].get_security()), ap[i].get_bssid()[0], ap[i].get_bssid()[1], ap[i].get_bssid()[2],
maksimkostadinov 0:859a7d417620 129 ap[i].get_bssid()[3], ap[i].get_bssid()[4], ap[i].get_bssid()[5], ap[i].get_rssi(), ap[i].get_channel());
maksimkostadinov 0:859a7d417620 130 thread_sleep_for(PRINTF_DELAY_MS);
maksimkostadinov 0:859a7d417620 131 }
maksimkostadinov 0:859a7d417620 132 printf("%d networks available.\n", count);
maksimkostadinov 0:859a7d417620 133
maksimkostadinov 0:859a7d417620 134 // Since 'ap' is dynamically allocated pointer to the array of objects, it
maksimkostadinov 0:859a7d417620 135 // needs to be deleted:
maksimkostadinov 0:859a7d417620 136 delete[] ap;
maksimkostadinov 0:859a7d417620 137 return count;
maksimkostadinov 0:859a7d417620 138 }
maksimkostadinov 0:859a7d417620 139
maksimkostadinov 0:859a7d417620 140 void messageArrived(MQTT::MessageData& md)
maksimkostadinov 0:859a7d417620 141 {
maksimkostadinov 0:859a7d417620 142 MQTT::Message &message = md.message;
maksimkostadinov 0:859a7d417620 143 //printf("Message arrived: qos %d, retained %d, dup %d, packetid %d\r\n", message.qos, message.retained, message.dup, message.id);
maksimkostadinov 0:859a7d417620 144 printf("Message from the browser: %.*s\r\n", message.payloadlen, (char*)message.payload);
maksimkostadinov 0:859a7d417620 145 ++arrivedcount;
maksimkostadinov 0:859a7d417620 146 }
maksimkostadinov 0:859a7d417620 147
maksimkostadinov 0:859a7d417620 148 void buttonFunction() {
maksimkostadinov 0:859a7d417620 149
maksimkostadinov 0:859a7d417620 150 button_pressed=1;
maksimkostadinov 0:859a7d417620 151
maksimkostadinov 0:859a7d417620 152 }
maksimkostadinov 0:859a7d417620 153
maksimkostadinov 0:859a7d417620 154
maksimkostadinov 0:859a7d417620 155 I2C i2c_obj(SDA,SCL);
maksimkostadinov 0:859a7d417620 156 Adafruit_SSD1306_I2c myOLED(i2c_obj,PA_5,I2C_ADD_MBED,OLED_HEIGHT,OLED_WIDTH );
maksimkostadinov 0:859a7d417620 157 int potValue=0.0;
maksimkostadinov 0:859a7d417620 158 void ISR_sw1(){
maksimkostadinov 0:859a7d417620 159 potValue=int(pot1.read()*100);
maksimkostadinov 0:859a7d417620 160
maksimkostadinov 0:859a7d417620 161 }
maksimkostadinov 0:859a7d417620 162
maksimkostadinov 0:859a7d417620 163 int main()
maksimkostadinov 0:859a7d417620 164
maksimkostadinov 0:859a7d417620 165
maksimkostadinov 0:859a7d417620 166 {
maksimkostadinov 0:859a7d417620 167
maksimkostadinov 0:859a7d417620 168 i2c_obj.frequency(400000);
maksimkostadinov 0:859a7d417620 169 myOLED.begin();
maksimkostadinov 0:859a7d417620 170
maksimkostadinov 0:859a7d417620 171 //myOLED.drawBitmap(0,0,myBitmap,OLED_WIDTH,OLED_HEIGHT,WHITE);
maksimkostadinov 0:859a7d417620 172 myOLED.display();
maksimkostadinov 0:859a7d417620 173 string mess="Voltage";
maksimkostadinov 0:859a7d417620 174
maksimkostadinov 0:859a7d417620 175 int r=0;
maksimkostadinov 0:859a7d417620 176
maksimkostadinov 0:859a7d417620 177
maksimkostadinov 0:859a7d417620 178 // Set the interrupt event:
maksimkostadinov 0:859a7d417620 179 sw1.fall(&buttonFunction);
maksimkostadinov 0:859a7d417620 180
maksimkostadinov 0:859a7d417620 181 // Create a default network interface:
maksimkostadinov 0:859a7d417620 182 wifi = WiFiInterface::get_default_instance();
maksimkostadinov 0:859a7d417620 183 if (!wifi) {
maksimkostadinov 0:859a7d417620 184 printf("ERROR: No WiFiInterface found.\n");
maksimkostadinov 0:859a7d417620 185 return -1;
maksimkostadinov 0:859a7d417620 186 }
maksimkostadinov 0:859a7d417620 187
maksimkostadinov 0:859a7d417620 188 // Scan for available networks and aquire information about Access Points:
maksimkostadinov 0:859a7d417620 189 int count = scan_networks(wifi);
maksimkostadinov 0:859a7d417620 190 if (count == 0) {
maksimkostadinov 0:859a7d417620 191 printf("No WIFI APs found - can't continue further.\n");
maksimkostadinov 0:859a7d417620 192 return -1;
maksimkostadinov 0:859a7d417620 193 }
maksimkostadinov 0:859a7d417620 194
maksimkostadinov 0:859a7d417620 195 // Connect to the network with the parameters specified in 'mbed_app.json':
maksimkostadinov 0:859a7d417620 196 printf("\nConnecting to %s...\n", MBED_CONF_APP_WIFI_SSID);
maksimkostadinov 0:859a7d417620 197 int ret = wifi->connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2);
maksimkostadinov 0:859a7d417620 198 if (ret != 0) {
maksimkostadinov 0:859a7d417620 199 printf("\nConnection error: %d\n", ret);
maksimkostadinov 0:859a7d417620 200 return -1;
maksimkostadinov 0:859a7d417620 201 }
maksimkostadinov 0:859a7d417620 202
maksimkostadinov 0:859a7d417620 203 // Print out the information aquired:
maksimkostadinov 0:859a7d417620 204 printf("Success\n\n");
maksimkostadinov 0:859a7d417620 205 printf("MAC: %s\n", wifi->get_mac_address());
maksimkostadinov 0:859a7d417620 206 printf("IP: %s\n", wifi->get_ip_address());
maksimkostadinov 0:859a7d417620 207 printf("Netmask: %s\n", wifi->get_netmask());
maksimkostadinov 0:859a7d417620 208 printf("Gateway: %s\n", wifi->get_gateway());
maksimkostadinov 0:859a7d417620 209 printf("RSSI: %d\n\n", wifi->get_rssi());
maksimkostadinov 0:859a7d417620 210
maksimkostadinov 0:859a7d417620 211 // Open TCP socket using WiFi network interface:
maksimkostadinov 0:859a7d417620 212 socket.open(wifi);
maksimkostadinov 0:859a7d417620 213 // Connect to the HiveMQ broker:
maksimkostadinov 0:859a7d417620 214 socket.connect(hostname, port);
maksimkostadinov 0:859a7d417620 215 // Fill connect data with default values:
maksimkostadinov 0:859a7d417620 216 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
maksimkostadinov 0:859a7d417620 217 // Change only ID and protocol version:
maksimkostadinov 0:859a7d417620 218 data.MQTTVersion = 3;
maksimkostadinov 0:859a7d417620 219 data.clientID.cstring = "NUCLEO-L476RG-60";
maksimkostadinov 0:859a7d417620 220
maksimkostadinov 0:859a7d417620 221 // Connect the
maksimkostadinov 0:859a7d417620 222 int rc = 0;
maksimkostadinov 0:859a7d417620 223 if ((rc = client.connect(data)) != 0)
maksimkostadinov 0:859a7d417620 224 printf("rc from MQTT connect is %d\r\n", rc);
maksimkostadinov 0:859a7d417620 225
maksimkostadinov 0:859a7d417620 226 if ((rc = client.subscribe(topic_sub, MQTT::QOS2, messageArrived)) != 0)
maksimkostadinov 0:859a7d417620 227 printf("rc from MQTT subscribe is %d\r\n", rc);
maksimkostadinov 0:859a7d417620 228
maksimkostadinov 0:859a7d417620 229 while (true) {
maksimkostadinov 0:859a7d417620 230 // Show that the loop is running by switching motherboard LED2:
maksimkostadinov 0:859a7d417620 231 led2 = !led2;
maksimkostadinov 0:859a7d417620 232 thread_sleep_for(BLINKING_RATE_MS);
maksimkostadinov 0:859a7d417620 233 if (button_pressed==1) {
maksimkostadinov 0:859a7d417620 234 button_pressed=0;
maksimkostadinov 0:859a7d417620 235 // QoS 0
maksimkostadinov 0:859a7d417620 236 char buf[100];
maksimkostadinov 0:859a7d417620 237 sprintf(buf, "V(POT1) = %1.2f\r\n", pot1*VOLTAGE_SCALER);
maksimkostadinov 0:859a7d417620 238 message.qos = MQTT::QOS0;
maksimkostadinov 0:859a7d417620 239 message.retained = false;
maksimkostadinov 0:859a7d417620 240 message.dup = false;
maksimkostadinov 0:859a7d417620 241 message.payload = (void*)buf;
maksimkostadinov 0:859a7d417620 242 message.payloadlen = strlen(buf)+1;
maksimkostadinov 0:859a7d417620 243 client.publish(topic, message);
maksimkostadinov 0:859a7d417620 244 }
maksimkostadinov 0:859a7d417620 245 // Need to call yield API to maintain connection:
maksimkostadinov 0:859a7d417620 246 client.yield(YIELD_TIMEOUT_MS);
maksimkostadinov 0:859a7d417620 247
maksimkostadinov 0:859a7d417620 248 for (r=0; r< mess.length();r++){
maksimkostadinov 0:859a7d417620 249 myOLED.drawChar(r*5,0,mess[r],WHITE,BLACK,1);
maksimkostadinov 0:859a7d417620 250 }
maksimkostadinov 0:859a7d417620 251 char decimal;
maksimkostadinov 0:859a7d417620 252
maksimkostadinov 0:859a7d417620 253 decimal='1';
maksimkostadinov 0:859a7d417620 254 myOLED.drawChar(0,12,decimal,WHITE,BLACK,2);
maksimkostadinov 0:859a7d417620 255
maksimkostadinov 0:859a7d417620 256
maksimkostadinov 0:859a7d417620 257 myOLED.display();
maksimkostadinov 0:859a7d417620 258 wait_ms(SMALL_DELAY_MS);
maksimkostadinov 0:859a7d417620 259 myOLED.display();
maksimkostadinov 0:859a7d417620 260 myOLED.fillScreen(BLACK);
maksimkostadinov 0:859a7d417620 261 }
maksimkostadinov 0:859a7d417620 262 }
maksimkostadinov 0:859a7d417620 263
maksimkostadinov 0:859a7d417620 264
maksimkostadinov 0:859a7d417620 265
maksimkostadinov 0:859a7d417620 266
maksimkostadinov 0:859a7d417620 267
maksimkostadinov 0:859a7d417620 268
maksimkostadinov 0:859a7d417620 269
maksimkostadinov 0:859a7d417620 270
maksimkostadinov 0:859a7d417620 271
maksimkostadinov 0:859a7d417620 272