Marko Spremic 2020/0066 Test3

Dependencies:   MarkoSpremic20200066 19E042PIM_MB_PINS

Committer:
markospremic
Date:
Sat Dec 11 16:24:28 2021 +0000
Revision:
2:b01399394f5a
Parent:
1:9f39e9bda966
promenio pubpim, subpim

Who changed what in which revision?

UserRevisionLine numberNew contents of line
markospremic 0:84ea13a92da9 1 /*
markospremic 0:84ea13a92da9 2 *Marko Spremic
markospremic 0:84ea13a92da9 3 *Indeks: 2020/0066
markospremic 0:84ea13a92da9 4 */
markospremic 0:84ea13a92da9 5
markospremic 0:84ea13a92da9 6 //ukljucivanje biblioteka
markospremic 0:84ea13a92da9 7 #include "mbed.h"
markospremic 0:84ea13a92da9 8 #include "mb_pins.h"
markospremic 0:84ea13a92da9 9 #include "platform/mbed_thread.h"
markospremic 0:84ea13a92da9 10 #include "MQTTClientMbedOs.h"
markospremic 0:84ea13a92da9 11 #include "Adafruit_GFX.h"
markospremic 0:84ea13a92da9 12 #include "Adafruit_GFX_Config.h"
markospremic 0:84ea13a92da9 13 #include "Adafruit_SSD1306.h"
markospremic 0:84ea13a92da9 14
markospremic 0:84ea13a92da9 15
markospremic 0:84ea13a92da9 16 // LED2 blinking rate:
markospremic 0:84ea13a92da9 17 #define BLINKING_RATE_MS 250
markospremic 0:84ea13a92da9 18 // Scaler to 3v3L
markospremic 0:84ea13a92da9 19 #define VOLTAGE_SCALER 3.3f
markospremic 0:84ea13a92da9 20 // Client yield timeout in miliseconds:
markospremic 0:84ea13a92da9 21 #define YIELD_TIMEOUT_MS 1000
markospremic 0:84ea13a92da9 22 // Maximum number of networks to scan for:
markospremic 0:84ea13a92da9 23 #define MAX_NETWORKS 15
markospremic 0:84ea13a92da9 24 // Small delay for network information printing:
markospremic 0:84ea13a92da9 25 #define PRINTF_DELAY_MS 10
markospremic 0:84ea13a92da9 26
markospremic 0:84ea13a92da9 27 //I2C bus:
markospremic 0:84ea13a92da9 28 #define SCL PB_13
markospremic 0:84ea13a92da9 29 #define SDA PB_14
markospremic 0:84ea13a92da9 30
markospremic 0:84ea13a92da9 31 //I2C address:
markospremic 0:84ea13a92da9 32 #define I2C_ADDRESS 0x3c
markospremic 0:84ea13a92da9 33 #define I2C_ADD_MBED I2C_ADDRESS<<1
markospremic 0:84ea13a92da9 34 #define I2C_freq 400000
markospremic 0:84ea13a92da9 35
markospremic 0:84ea13a92da9 36 //oled dimensions:
markospremic 0:84ea13a92da9 37 #define OLED_HEIGHT_PX 64
markospremic 0:84ea13a92da9 38 #define OLED_WIDTH_PX 128
markospremic 0:84ea13a92da9 39
markospremic 0:84ea13a92da9 40
markospremic 0:84ea13a92da9 41
markospremic 0:84ea13a92da9 42 // Left potentiometer:
markospremic 0:84ea13a92da9 43 AnalogIn pot1(MB_POT1);
markospremic 0:84ea13a92da9 44 // Left button on the motherboard:
markospremic 0:84ea13a92da9 45 InterruptIn sw1(MB_SW1);
markospremic 0:84ea13a92da9 46 // Right LED on the motherboard:
markospremic 0:84ea13a92da9 47 DigitalOut led2(MB_LED2);
markospremic 0:84ea13a92da9 48 // Pointer to a WiFi network object:
markospremic 0:84ea13a92da9 49 WiFiInterface *wifi;
markospremic 0:84ea13a92da9 50 // Creating TCP socket:
markospremic 0:84ea13a92da9 51 TCPSocket socket;
markospremic 0:84ea13a92da9 52 // Creating MQTT client using the TCP socket;
markospremic 0:84ea13a92da9 53 MQTTClient client(&socket);
markospremic 0:84ea13a92da9 54 // Message handler:
markospremic 0:84ea13a92da9 55 MQTT::Message message;
markospremic 0:84ea13a92da9 56 I2C i2c_obj(SDA, SCL);
markospremic 0:84ea13a92da9 57 Adafruit_SSD1306_I2c myOLED(i2c_obj, PB_5, I2C_ADD_MBED, OLED_HEIGHT_PX, OLED_WIDTH_PX);
markospremic 0:84ea13a92da9 58
markospremic 0:84ea13a92da9 59
markospremic 0:84ea13a92da9 60
markospremic 2:b01399394f5a 61 char* topic = "pubpim";
markospremic 2:b01399394f5a 62 char* topic_sub = "subpim";
markospremic 0:84ea13a92da9 63 // Counter of arrived messages:
markospremic 0:84ea13a92da9 64 int arrivedcount = 0;
markospremic 0:84ea13a92da9 65 // Flag indicating that button is not pressed:
markospremic 0:84ea13a92da9 66 int button_pressed=0;
markospremic 0:84ea13a92da9 67 // HiveMQ broker connectivity information:
markospremic 0:84ea13a92da9 68 const char* hostname = "broker.hivemq.com";
markospremic 0:84ea13a92da9 69 int port = 1883;
markospremic 0:84ea13a92da9 70 char ms_show[100] = "";
markospremic 0:84ea13a92da9 71 // Returning a string for a provided network encryption:
markospremic 0:84ea13a92da9 72
markospremic 0:84ea13a92da9 73
markospremic 0:84ea13a92da9 74 int scan_networks(WiFiInterface *wifi)
markospremic 0:84ea13a92da9 75 {
markospremic 0:84ea13a92da9 76 printf("Scan\n");
markospremic 0:84ea13a92da9 77
markospremic 0:84ea13a92da9 78 // Scan only for the number of networks, first parameter is NULL:
markospremic 0:84ea13a92da9 79 int count = wifi->scan(NULL, 0);
markospremic 0:84ea13a92da9 80 // If there are no networks, count == 0, if there is an error, counter < 0:
markospremic 0:84ea13a92da9 81 if (count <= 0)
markospremic 0:84ea13a92da9 82 {
markospremic 0:84ea13a92da9 83 printf("scan() failed with return value: %d\n", count);
markospremic 0:84ea13a92da9 84 return 0;
markospremic 0:84ea13a92da9 85 }
markospremic 0:84ea13a92da9 86
markospremic 0:84ea13a92da9 87 // Limit number of network arbitrary to some reasonable number:
markospremic 0:84ea13a92da9 88 count = count < MAX_NETWORKS ? count : MAX_NETWORKS;
markospremic 0:84ea13a92da9 89
markospremic 0:84ea13a92da9 90 // Create a local pointer to an object, which is an array of WiFi APs:
markospremic 0:84ea13a92da9 91 WiFiAccessPoint *ap = new WiFiAccessPoint[count];
markospremic 0:84ea13a92da9 92 // Now scan again for 'count' networks and populate the array of APs:
markospremic 0:84ea13a92da9 93 count = wifi->scan(ap, count);
markospremic 0:84ea13a92da9 94
markospremic 0:84ea13a92da9 95 // This time, the number of entries to 'ap' is returned:
markospremic 0:84ea13a92da9 96 if (count <= 0)
markospremic 0:84ea13a92da9 97 {
markospremic 0:84ea13a92da9 98 printf("scan() failed with return value: %d\n", count);
markospremic 0:84ea13a92da9 99 return 0;
markospremic 0:84ea13a92da9 100 }
markospremic 0:84ea13a92da9 101
markospremic 0:84ea13a92da9 102
markospremic 0:84ea13a92da9 103 delete[] ap;
markospremic 0:84ea13a92da9 104 return count;
markospremic 0:84ea13a92da9 105 }
markospremic 0:84ea13a92da9 106 //proverava tekst koji je primio
markospremic 0:84ea13a92da9 107 char text_check ( char* text1, char* text2)
markospremic 0:84ea13a92da9 108 {
markospremic 0:84ea13a92da9 109 int i;
markospremic 0:84ea13a92da9 110 for(i= 0; 1;i++)
markospremic 0:84ea13a92da9 111 {
markospremic 0:84ea13a92da9 112 if(text1[i] != text2[i])
markospremic 0:84ea13a92da9 113 return 0;
markospremic 0:84ea13a92da9 114 if(text1[i] == '\0')
markospremic 0:84ea13a92da9 115 break;
markospremic 0:84ea13a92da9 116 }
markospremic 0:84ea13a92da9 117 return 1;
markospremic 0:84ea13a92da9 118 }
markospremic 0:84ea13a92da9 119
markospremic 0:84ea13a92da9 120
markospremic 0:84ea13a92da9 121 char send_voltage = 0, oled = 0;
markospremic 0:84ea13a92da9 122 //kada stigne poruka
markospremic 0:84ea13a92da9 123 void messageArrived(MQTT::MessageData& md)
markospremic 0:84ea13a92da9 124 {
markospremic 0:84ea13a92da9 125 MQTT::Message &message = md.message;
markospremic 0:84ea13a92da9 126
markospremic 0:84ea13a92da9 127 char ms[100]; sprintf(ms, "%.*s",message.payloadlen, (char*)message.payload);
markospremic 0:84ea13a92da9 128 sprintf(ms_show, "%s", ms);
markospremic 0:84ea13a92da9 129 send_voltage = text_check(ms, "start")||send_voltage;//ukoliko je poruka start ili je pre toga start bio na 1
markospremic 0:84ea13a92da9 130 if(text_check(ms, "stop")) send_voltage = 0;//ako je poruka stop start ide na 0
markospremic 0:84ea13a92da9 131 oled = text_check(ms, "oled")||oled;//ako je poruka oled oled ide na 1 ili ako je oled vec na kecu
markospremic 0:84ea13a92da9 132 ++arrivedcount;
markospremic 0:84ea13a92da9 133 }
markospremic 0:84ea13a92da9 134 //pritiskom na dugme prstaje prikaz na oledu
markospremic 0:84ea13a92da9 135 void buttonFunction() {
markospremic 0:84ea13a92da9 136
markospremic 0:84ea13a92da9 137 oled = 0;
markospremic 0:84ea13a92da9 138
markospremic 0:84ea13a92da9 139 }
markospremic 0:84ea13a92da9 140
markospremic 0:84ea13a92da9 141
markospremic 0:84ea13a92da9 142
markospremic 0:84ea13a92da9 143 int main()
markospremic 0:84ea13a92da9 144 {
markospremic 0:84ea13a92da9 145 // Set the interrupt event:
markospremic 0:84ea13a92da9 146 sw1.fall(&buttonFunction);
markospremic 0:84ea13a92da9 147
markospremic 0:84ea13a92da9 148 // Create a default network interface:
markospremic 0:84ea13a92da9 149 wifi = WiFiInterface::get_default_instance();
markospremic 0:84ea13a92da9 150 if (!wifi) {
markospremic 0:84ea13a92da9 151 printf("ERROR: No WiFiInterface found.\n");
markospremic 0:84ea13a92da9 152 return -1;
markospremic 0:84ea13a92da9 153 }
markospremic 0:84ea13a92da9 154
markospremic 0:84ea13a92da9 155 // Scan for available networks and aquire information about Access Points:
markospremic 0:84ea13a92da9 156 int count = scan_networks(wifi);
markospremic 0:84ea13a92da9 157 if (count == 0) {
markospremic 0:84ea13a92da9 158 printf("No WIFI APs found - can't continue further.\n");
markospremic 0:84ea13a92da9 159 return -1;
markospremic 0:84ea13a92da9 160 }
markospremic 0:84ea13a92da9 161 char send_ms[100] = "";
markospremic 0:84ea13a92da9 162
markospremic 0:84ea13a92da9 163 // Connect to the network with the parameters specified in 'mbed_app.json':
markospremic 0:84ea13a92da9 164 printf("\nConnecting to %s...\n", MBED_CONF_APP_WIFI_SSID);
markospremic 0:84ea13a92da9 165 int ret = wifi->connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2);
markospremic 0:84ea13a92da9 166 if (ret != 0) {
markospremic 0:84ea13a92da9 167 printf("\nConnection error: %d\n", ret);
markospremic 0:84ea13a92da9 168 return -1;
markospremic 0:84ea13a92da9 169 }
markospremic 0:84ea13a92da9 170
markospremic 0:84ea13a92da9 171 // Print out the information aquired:
markospremic 0:84ea13a92da9 172 printf("Success\n\n");
markospremic 0:84ea13a92da9 173
markospremic 0:84ea13a92da9 174 // Open TCP socket using WiFi network interface:
markospremic 0:84ea13a92da9 175 socket.open(wifi);
markospremic 0:84ea13a92da9 176 // Connect to the HiveMQ broker:
markospremic 0:84ea13a92da9 177 socket.connect(hostname, port);
markospremic 0:84ea13a92da9 178 // Fill connect data with default values:
markospremic 0:84ea13a92da9 179 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
markospremic 0:84ea13a92da9 180 // Change only ID and protocol version:
markospremic 0:84ea13a92da9 181 data.MQTTVersion = 3;
markospremic 0:84ea13a92da9 182 data.clientID.cstring = "pim-21";
markospremic 0:84ea13a92da9 183
markospremic 0:84ea13a92da9 184 // Connect the
markospremic 0:84ea13a92da9 185 int rc = 0;
markospremic 0:84ea13a92da9 186 if ((rc = client.connect(data)) != 0)
markospremic 0:84ea13a92da9 187 printf("rc from MQTT connect is %d\r\n", rc);
markospremic 0:84ea13a92da9 188
markospremic 0:84ea13a92da9 189 if ((rc = client.subscribe(topic_sub, MQTT::QOS2, messageArrived)) != 0)
markospremic 0:84ea13a92da9 190 printf("rc from MQTT subscribe is %d\r\n", rc);
markospremic 0:84ea13a92da9 191
markospremic 0:84ea13a92da9 192 myOLED.begin();
markospremic 0:84ea13a92da9 193 i2c_obj.frequency(I2C_freq);
markospremic 0:84ea13a92da9 194 myOLED.clearDisplay();
markospremic 0:84ea13a92da9 195 myOLED.display();
markospremic 0:84ea13a92da9 196 while (true) {
markospremic 0:84ea13a92da9 197
markospremic 0:84ea13a92da9 198 led2 = !led2;
markospremic 0:84ea13a92da9 199 thread_sleep_for(BLINKING_RATE_MS);
markospremic 0:84ea13a92da9 200 //ukoliko je primio start
markospremic 0:84ea13a92da9 201 if (send_voltage) {
markospremic 0:84ea13a92da9 202 // QoS 0
markospremic 0:84ea13a92da9 203 char buf[100];
markospremic 0:84ea13a92da9 204
markospremic 0:84ea13a92da9 205 sprintf(buf, "V(POT1) = %1.2f\r\n", pot1*VOLTAGE_SCALER);
markospremic 0:84ea13a92da9 206 sprintf(send_ms, "%s", buf);
markospremic 0:84ea13a92da9 207 message.qos = MQTT::QOS0;
markospremic 0:84ea13a92da9 208 message.retained = false;
markospremic 0:84ea13a92da9 209 message.dup = false;
markospremic 0:84ea13a92da9 210 message.payload = (void*)buf;
markospremic 0:84ea13a92da9 211 message.payloadlen = strlen(buf)+1;
markospremic 0:84ea13a92da9 212 client.publish(topic, message);
markospremic 0:84ea13a92da9 213 wait(10);
markospremic 0:84ea13a92da9 214 }
markospremic 0:84ea13a92da9 215 //ako je primio oled
markospremic 0:84ea13a92da9 216 if(oled)
markospremic 0:84ea13a92da9 217 {
markospremic 0:84ea13a92da9 218 myOLED.clearDisplay();
markospremic 0:84ea13a92da9 219 myOLED.resetCoordinate();
markospremic 0:84ea13a92da9 220 myOLED.printf("poslata poruka:\n%s", send_ms);//prikazivanje poslednje poslate poruke
markospremic 0:84ea13a92da9 221 myOLED.printf("Primljena poruka:\n%s", ms_show);//prikazivanje poslednje primljene poruke
markospremic 0:84ea13a92da9 222 myOLED.display();
markospremic 0:84ea13a92da9 223 }
markospremic 0:84ea13a92da9 224 //ako je stisnuto dugme
markospremic 0:84ea13a92da9 225 else
markospremic 0:84ea13a92da9 226 {
markospremic 0:84ea13a92da9 227 myOLED.clearDisplay();
markospremic 0:84ea13a92da9 228 myOLED.display();
markospremic 0:84ea13a92da9 229 }
markospremic 0:84ea13a92da9 230
markospremic 0:84ea13a92da9 231
markospremic 0:84ea13a92da9 232 client.yield(YIELD_TIMEOUT_MS);
markospremic 0:84ea13a92da9 233 }
markospremic 0:84ea13a92da9 234 }