Andrija Mijailovic 2020/0388

Dependencies:   19E042PIM_MB_PINS

Committer:
ma200388
Date:
Sat Dec 11 16:22:16 2021 +0000
Revision:
4:3289b25dc1db
Parent:
3:bd632f30b46b
Andrija Mijailovic 2020/0388

Who changed what in which revision?

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