Marko Spremic 2020/0066 Test3
Dependencies: MarkoSpremic20200066 19E042PIM_MB_PINS
main.cpp@2:b01399394f5a, 2021-12-11 (annotated)
- 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?
User | Revision | Line number | New 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 | } |