PMKIND

Dependencies:   rohm-rpr0521 rohm-sensor-hal Servo TextLCD

Committer:
pavledjo
Date:
Sun Jun 27 17:38:31 2021 +0000
Revision:
1:7b52bdcdac4e
Parent:
0:51001d8fdeff
PMK_m1;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emilija 0:51001d8fdeff 1 /* mbed Microcontroller Library
emilija 0:51001d8fdeff 2 * Copyright (c) 2019 ARM Limited
emilija 0:51001d8fdeff 3 * SPDX-License-Identifier: Apache-2.0
emilija 0:51001d8fdeff 4 */
emilija 0:51001d8fdeff 5
emilija 0:51001d8fdeff 6 #include "mbed.h"
emilija 0:51001d8fdeff 7 #include "platform/mbed_thread.h"
emilija 0:51001d8fdeff 8 #include <string>
emilija 0:51001d8fdeff 9 #include <MQTTClientMbedOs.h>
pavledjo 1:7b52bdcdac4e 10 #include "TextLCD.h"
pavledjo 1:7b52bdcdac4e 11 #include "rohm-sensor-hal/rohm-sensor-hal/rohm_hal.h" //mbed.h, types, DEBUG_print*
pavledjo 1:7b52bdcdac4e 12 #include "rohm-sensor-hal/rohm-sensor-hal/I2CCommon.h"
pavledjo 1:7b52bdcdac4e 13
pavledjo 1:7b52bdcdac4e 14 #include "rohm-rpr0521/rohm-rpr0521/rpr0521_driver.h"
pavledjo 1:7b52bdcdac4e 15 #include "rohm-rpr0521/rohm-rpr0521/rpr0521.h"
emilija 0:51001d8fdeff 16
emilija 0:51001d8fdeff 17 // Blinking rate in milliseconds
emilija 0:51001d8fdeff 18 #define BLINKING_RATE_MS 500
emilija 0:51001d8fdeff 19
pavledjo 1:7b52bdcdac4e 20 Serial pc(USBTX,USBRX);
emilija 0:51001d8fdeff 21 InterruptIn button(USER_BUTTON);
emilija 0:51001d8fdeff 22 int arrivedcount = 0;
emilija 0:51001d8fdeff 23 TCPSocket socket;
emilija 0:51001d8fdeff 24 MQTTClient client(&socket);
emilija 0:51001d8fdeff 25 MQTT::Message message;
emilija 0:51001d8fdeff 26 int button_pressed=0;
emilija 0:51001d8fdeff 27
pavledjo 1:7b52bdcdac4e 28 char* topic_sub = "PMK_industrija/micro1/#";
pavledjo 1:7b52bdcdac4e 29 char* topic_pub1 = "PMK_industrija/micro1/proxy1";
pavledjo 1:7b52bdcdac4e 30 char* topic_pub2 = "PMK_industrija/micro2/proxy1";
pavledjo 1:7b52bdcdac4e 31 char* topic_pub3 = "PMK_industrija/micro2/servo0";
emilija 0:51001d8fdeff 32 WiFiInterface *wifi;
pavledjo 1:7b52bdcdac4e 33
pavledjo 1:7b52bdcdac4e 34 TextLCD lcd(D2,D3,D4,D5,D6,D7);
pavledjo 1:7b52bdcdac4e 35 DigitalOut vdd(D8);
pavledjo 1:7b52bdcdac4e 36
emilija 0:51001d8fdeff 37 volatile int mems_event = 0;
emilija 0:51001d8fdeff 38 uint32_t previous_tick = 0;
emilija 0:51001d8fdeff 39 uint32_t current_tick = 0;
emilija 0:51001d8fdeff 40 uint8_t high = 0, low = 0;
emilija 0:51001d8fdeff 41 float temperature = 0.0f;
emilija 0:51001d8fdeff 42 char buffer[32];
pavledjo 1:7b52bdcdac4e 43 int plava = 0;
pavledjo 1:7b52bdcdac4e 44 int zuta = 0;
pavledjo 1:7b52bdcdac4e 45 int zelena = 0;
pavledjo 1:7b52bdcdac4e 46 int crvena = 0;
pavledjo 1:7b52bdcdac4e 47 int drugaBoja = 0;
emilija 0:51001d8fdeff 48 static char *print_double(char *str, double v, int decimalDigits = 2)
emilija 0:51001d8fdeff 49 {
emilija 0:51001d8fdeff 50 int i = 1;
emilija 0:51001d8fdeff 51 int intPart, fractPart;
emilija 0:51001d8fdeff 52 int len;
emilija 0:51001d8fdeff 53 char *ptr;
emilija 0:51001d8fdeff 54
emilija 0:51001d8fdeff 55 /* prepare decimal digits multiplicator */
emilija 0:51001d8fdeff 56 for (; decimalDigits != 0; i *= 10, decimalDigits--);
emilija 0:51001d8fdeff 57
emilija 0:51001d8fdeff 58 /* calculate integer & fractinal parts */
emilija 0:51001d8fdeff 59 intPart = (int)v;
emilija 0:51001d8fdeff 60 fractPart = (int)((v - (double)(int)v) * i);
emilija 0:51001d8fdeff 61
emilija 0:51001d8fdeff 62 /* fill in integer part */
emilija 0:51001d8fdeff 63 sprintf(str, "%i.", intPart);
emilija 0:51001d8fdeff 64
emilija 0:51001d8fdeff 65 /* prepare fill in of fractional part */
emilija 0:51001d8fdeff 66 len = strlen(str);
emilija 0:51001d8fdeff 67 ptr = &str[len];
emilija 0:51001d8fdeff 68
emilija 0:51001d8fdeff 69 /* fill in leading fractional zeros */
emilija 0:51001d8fdeff 70 for (i /= 10; i > 1; i /= 10, ptr++) {
emilija 0:51001d8fdeff 71 if (fractPart >= i) {
emilija 0:51001d8fdeff 72 break;
emilija 0:51001d8fdeff 73 }
emilija 0:51001d8fdeff 74 *ptr = '0';
emilija 0:51001d8fdeff 75 }
emilija 0:51001d8fdeff 76
emilija 0:51001d8fdeff 77 /* fill in (rest of) fractional part */
emilija 0:51001d8fdeff 78 sprintf(ptr, "%i", fractPart);
emilija 0:51001d8fdeff 79
emilija 0:51001d8fdeff 80 return str;
emilija 0:51001d8fdeff 81 }
emilija 0:51001d8fdeff 82
emilija 0:51001d8fdeff 83 const char *sec2str(nsapi_security_t sec)
emilija 0:51001d8fdeff 84 {
emilija 0:51001d8fdeff 85 switch (sec) {
emilija 0:51001d8fdeff 86 case NSAPI_SECURITY_NONE:
emilija 0:51001d8fdeff 87 return "None";
emilija 0:51001d8fdeff 88 case NSAPI_SECURITY_WEP:
emilija 0:51001d8fdeff 89 return "WEP";
emilija 0:51001d8fdeff 90 case NSAPI_SECURITY_WPA:
emilija 0:51001d8fdeff 91 return "WPA";
emilija 0:51001d8fdeff 92 case NSAPI_SECURITY_WPA2:
emilija 0:51001d8fdeff 93 return "WPA2";
emilija 0:51001d8fdeff 94 case NSAPI_SECURITY_WPA_WPA2:
emilija 0:51001d8fdeff 95 return "WPA/WPA2";
emilija 0:51001d8fdeff 96 case NSAPI_SECURITY_UNKNOWN:
emilija 0:51001d8fdeff 97 default:
emilija 0:51001d8fdeff 98 return "Unknown";
emilija 0:51001d8fdeff 99 }
emilija 0:51001d8fdeff 100 }
emilija 0:51001d8fdeff 101
emilija 0:51001d8fdeff 102 int scan_demo(WiFiInterface *wifi)
emilija 0:51001d8fdeff 103 {
emilija 0:51001d8fdeff 104 WiFiAccessPoint *ap;
emilija 0:51001d8fdeff 105 printf("Scan:\n");
emilija 0:51001d8fdeff 106 int count = wifi->scan(NULL,0);
emilija 0:51001d8fdeff 107 if (count <= 0) {
emilija 0:51001d8fdeff 108 printf("scan() failed with return value: %d\n", count);
emilija 0:51001d8fdeff 109 return 0;
emilija 0:51001d8fdeff 110 }
emilija 0:51001d8fdeff 111 /* Limit number of network arbitrary to 15 */
emilija 0:51001d8fdeff 112 count = count < 15 ? count : 15;
emilija 0:51001d8fdeff 113 ap = new WiFiAccessPoint[count];
emilija 0:51001d8fdeff 114 count = wifi->scan(ap, count);
emilija 0:51001d8fdeff 115 if (count <= 0) {
emilija 0:51001d8fdeff 116 printf("scan() failed with return value: %d\n", count);
emilija 0:51001d8fdeff 117 return 0;
emilija 0:51001d8fdeff 118 }
emilija 0:51001d8fdeff 119 for (int i = 0; i < count; i++) {
emilija 0:51001d8fdeff 120 printf("Network: %s secured: %s BSSID: %hhX:%hhX:%hhX:%hhx:%hhx:%hhx RSSI: %hhd Ch: %hhd\n", ap[i].get_ssid(),
emilija 0:51001d8fdeff 121 sec2str(ap[i].get_security()), ap[i].get_bssid()[0], ap[i].get_bssid()[1], ap[i].get_bssid()[2],
emilija 0:51001d8fdeff 122 ap[i].get_bssid()[3], ap[i].get_bssid()[4], ap[i].get_bssid()[5], ap[i].get_rssi(), ap[i].get_channel());
emilija 0:51001d8fdeff 123 }
emilija 0:51001d8fdeff 124 printf("%d networks available.\n", count);
emilija 0:51001d8fdeff 125 delete[] ap;
emilija 0:51001d8fdeff 126 return count;
emilija 0:51001d8fdeff 127 }
emilija 0:51001d8fdeff 128
emilija 0:51001d8fdeff 129 void messageArrived(MQTT::MessageData& md)
emilija 0:51001d8fdeff 130 {
emilija 0:51001d8fdeff 131 MQTTString &topic = md.topicName;
emilija 0:51001d8fdeff 132 string topic_name = topic.lenstring.data;
emilija 0:51001d8fdeff 133 printf("Topic name %d : %s\r\n",topic.lenstring.len,topic_name.c_str() );
emilija 0:51001d8fdeff 134 MQTT::Message &message = md.message;
emilija 0:51001d8fdeff 135 printf("Message arrived: qos %d, retained %d, dup %d, packetid %d\r\n", message.qos, message.retained, message.dup, message.id);
emilija 0:51001d8fdeff 136 printf("Payload %.*s\r\n", message.payloadlen, (char*)message.payload);
pavledjo 1:7b52bdcdac4e 137 string poruka = (char*)message.payload;
pavledjo 1:7b52bdcdac4e 138 if(topic_name.find("proxy1")!=std::string::npos) {
pavledjo 1:7b52bdcdac4e 139 printf("Ima cepa!!! \r\n");
pavledjo 1:7b52bdcdac4e 140
pavledjo 1:7b52bdcdac4e 141 char buf[100];
pavledjo 1:7b52bdcdac4e 142 sprintf(buf, "Daj mi boju tu je cep");
pavledjo 1:7b52bdcdac4e 143 message.qos = MQTT::QOS0;
pavledjo 1:7b52bdcdac4e 144 message.retained = false;
pavledjo 1:7b52bdcdac4e 145 message.dup = false;
pavledjo 1:7b52bdcdac4e 146 message.payload = (void*)buf;
pavledjo 1:7b52bdcdac4e 147 message.payloadlen = strlen(buf)+1;
pavledjo 1:7b52bdcdac4e 148 client.publish(topic_pub2, message);
pavledjo 1:7b52bdcdac4e 149
pavledjo 1:7b52bdcdac4e 150 }
pavledjo 1:7b52bdcdac4e 151 if(topic_name.find("color")!=std::string::npos) {
pavledjo 1:7b52bdcdac4e 152 printf("Vidi boje!!! \r\n");
pavledjo 1:7b52bdcdac4e 153 bool levo = false;
emilija 0:51001d8fdeff 154
pavledjo 1:7b52bdcdac4e 155 if (poruka.find("CRVENA") !=std::string::npos){
pavledjo 1:7b52bdcdac4e 156 levo = true;
pavledjo 1:7b52bdcdac4e 157 crvena++;
emilija 0:51001d8fdeff 158 }
pavledjo 1:7b52bdcdac4e 159 else if (poruka.find("ZELENA") !=std::string::npos){
pavledjo 1:7b52bdcdac4e 160 zelena++;
pavledjo 1:7b52bdcdac4e 161 }
pavledjo 1:7b52bdcdac4e 162 else if (poruka.find("PLAVA") !=std::string::npos){
pavledjo 1:7b52bdcdac4e 163 plava++;
emilija 0:51001d8fdeff 164 }
pavledjo 1:7b52bdcdac4e 165 else if (poruka.find("ZUTA") !=std::string::npos){
pavledjo 1:7b52bdcdac4e 166 zuta++;
pavledjo 1:7b52bdcdac4e 167 }else {
pavledjo 1:7b52bdcdac4e 168 drugaBoja++;
pavledjo 1:7b52bdcdac4e 169 }
pavledjo 1:7b52bdcdac4e 170 char buf[100];
pavledjo 1:7b52bdcdac4e 171
pavledjo 1:7b52bdcdac4e 172 sprintf(buf, "Otvaraj taj servo PS =%b",levo );
pavledjo 1:7b52bdcdac4e 173 message.qos = MQTT::QOS0;
pavledjo 1:7b52bdcdac4e 174 message.retained = false;
pavledjo 1:7b52bdcdac4e 175 message.dup = false;
pavledjo 1:7b52bdcdac4e 176 message.payload = (void*)buf;
pavledjo 1:7b52bdcdac4e 177 message.payloadlen = strlen(buf)+1;
pavledjo 1:7b52bdcdac4e 178 client.publish(topic_pub3, message);
pavledjo 1:7b52bdcdac4e 179 lcd.cls();
pavledjo 1:7b52bdcdac4e 180 lcd.printf("c:%d p:%d z:%d\ny:%d dr:%d",crvena,plava,zelena,zuta,drugaBoja);
emilija 0:51001d8fdeff 181 }
emilija 0:51001d8fdeff 182 ++arrivedcount;
emilija 0:51001d8fdeff 183 }
emilija 0:51001d8fdeff 184
emilija 0:51001d8fdeff 185
emilija 0:51001d8fdeff 186 void buttonFunction() {
emilija 0:51001d8fdeff 187 button_pressed=1;
emilija 0:51001d8fdeff 188 }
emilija 0:51001d8fdeff 189
pavledjo 1:7b52bdcdac4e 190 void rpr0521_print_one_value(){
pavledjo 1:7b52bdcdac4e 191 bool error;
pavledjo 1:7b52bdcdac4e 192 uint16_t data[3];
pavledjo 1:7b52bdcdac4e 193
pavledjo 1:7b52bdcdac4e 194 error = rpr0521_read_data(&data[0]);
pavledjo 1:7b52bdcdac4e 195 if (!error) {
pavledjo 1:7b52bdcdac4e 196 printf("PS[%4u], Als0[%4u], Als1[%4u]\n\r", data[0], data[1], data[2]);
pavledjo 1:7b52bdcdac4e 197 }
pavledjo 1:7b52bdcdac4e 198 else {
pavledjo 1:7b52bdcdac4e 199 printf("\n\r");
pavledjo 1:7b52bdcdac4e 200 }
pavledjo 1:7b52bdcdac4e 201 }
emilija 0:51001d8fdeff 202 int main()
emilija 0:51001d8fdeff 203 {
emilija 0:51001d8fdeff 204 // Initialise the digital pin LED1 as an output
pavledjo 1:7b52bdcdac4e 205 bool error;
pavledjo 1:7b52bdcdac4e 206 uint16_t dataProx[3];
pavledjo 1:7b52bdcdac4e 207 DigitalOut led(LED1);
emilija 0:51001d8fdeff 208 button.rise(&buttonFunction);
emilija 0:51001d8fdeff 209 const char* hostname = "broker.mqttdashboard.com";
emilija 0:51001d8fdeff 210 int port = 1883;
pavledjo 1:7b52bdcdac4e 211 DigitalOut d8(D8);
pavledjo 1:7b52bdcdac4e 212 d8 = 1;
pavledjo 1:7b52bdcdac4e 213 DigitalOut d12(D12);
pavledjo 1:7b52bdcdac4e 214 d12 = 0;
pavledjo 1:7b52bdcdac4e 215 DigitalOut d13(D13);
pavledjo 1:7b52bdcdac4e 216 d13 = 1;
pavledjo 1:7b52bdcdac4e 217
pavledjo 1:7b52bdcdac4e 218 I2CCommonBegin();
pavledjo 1:7b52bdcdac4e 219 rpr0521_wait_until_found();
pavledjo 1:7b52bdcdac4e 220 pc.printf("\nSensor found.\n\r");
pavledjo 1:7b52bdcdac4e 221 rpr0521_initial_setup();
emilija 0:51001d8fdeff 222
emilija 0:51001d8fdeff 223 wifi = WiFiInterface::get_default_instance();
emilija 0:51001d8fdeff 224 if (!wifi) {
emilija 0:51001d8fdeff 225 printf("ERROR: No WiFiInterface found.\n");
emilija 0:51001d8fdeff 226 return -1;
emilija 0:51001d8fdeff 227 }
emilija 0:51001d8fdeff 228
emilija 0:51001d8fdeff 229 int count = scan_demo(wifi);
emilija 0:51001d8fdeff 230 if (count == 0) {
emilija 0:51001d8fdeff 231 printf("No WIFI APs found - can't continue further.\n");
emilija 0:51001d8fdeff 232 return -1;
emilija 0:51001d8fdeff 233 }
emilija 0:51001d8fdeff 234
emilija 0:51001d8fdeff 235 printf("\nConnecting to %s...\n", MBED_CONF_APP_WIFI_SSID);
emilija 0:51001d8fdeff 236 int ret = wifi->connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, NSAPI_SECURITY_WPA_WPA2);
emilija 0:51001d8fdeff 237 if (ret != 0) {
emilija 0:51001d8fdeff 238 printf("\nConnection error: %d\n", ret);
emilija 0:51001d8fdeff 239 return -1;
emilija 0:51001d8fdeff 240 }
emilija 0:51001d8fdeff 241
emilija 0:51001d8fdeff 242 printf("Success\n\n");
emilija 0:51001d8fdeff 243 printf("MAC: %s\n", wifi->get_mac_address());
emilija 0:51001d8fdeff 244 printf("IP: %s\n", wifi->get_ip_address());
emilija 0:51001d8fdeff 245 printf("Netmask: %s\n", wifi->get_netmask());
emilija 0:51001d8fdeff 246 printf("Gateway: %s\n", wifi->get_gateway());
emilija 0:51001d8fdeff 247 printf("RSSI: %d\n\n", wifi->get_rssi());
emilija 0:51001d8fdeff 248
emilija 0:51001d8fdeff 249 socket.open(wifi);
emilija 0:51001d8fdeff 250 socket.connect(hostname, port);
emilija 0:51001d8fdeff 251
emilija 0:51001d8fdeff 252 int rc=0;
emilija 0:51001d8fdeff 253
emilija 0:51001d8fdeff 254 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
emilija 0:51001d8fdeff 255 data.MQTTVersion = 3;
emilija 0:51001d8fdeff 256 data.clientID.cstring = "PMK-client2";
emilija 0:51001d8fdeff 257 //data.username.cstring = "testuser";
emilija 0:51001d8fdeff 258 //data.password.cstring = "testpassword";
emilija 0:51001d8fdeff 259
emilija 0:51001d8fdeff 260 if ((rc = client.connect(data)) != 0)
emilija 0:51001d8fdeff 261 printf("rc from MQTT connect is %d\r\n", rc);
emilija 0:51001d8fdeff 262
emilija 0:51001d8fdeff 263
emilija 0:51001d8fdeff 264 if ((rc = client.subscribe(topic_sub, MQTT::QOS2, messageArrived)) != 0)
emilija 0:51001d8fdeff 265 printf("rc from MQTT subscribe is %d\r\n", rc);
emilija 0:51001d8fdeff 266
emilija 0:51001d8fdeff 267
emilija 0:51001d8fdeff 268
emilija 0:51001d8fdeff 269 while (true) {
emilija 0:51001d8fdeff 270 led = !led;
emilija 0:51001d8fdeff 271 thread_sleep_for(BLINKING_RATE_MS);
pavledjo 1:7b52bdcdac4e 272
pavledjo 1:7b52bdcdac4e 273
pavledjo 1:7b52bdcdac4e 274 error = rpr0521_read_data(&dataProx[0]);
pavledjo 1:7b52bdcdac4e 275 if (!error){
pavledjo 1:7b52bdcdac4e 276 if(dataProx[0] > 50) {
pavledjo 1:7b52bdcdac4e 277 printf("Pristigao je cep na lokaciju O.O O:'( \r\n ");
pavledjo 1:7b52bdcdac4e 278 char buf[100];
pavledjo 1:7b52bdcdac4e 279 sprintf(buf, "Cep je pristigao na proxy1 PS = %d",dataProx[0]);
pavledjo 1:7b52bdcdac4e 280 message.qos = MQTT::QOS0;
pavledjo 1:7b52bdcdac4e 281 message.retained = false;
pavledjo 1:7b52bdcdac4e 282 message.dup = false;
pavledjo 1:7b52bdcdac4e 283 message.payload = (void*)buf;
pavledjo 1:7b52bdcdac4e 284 message.payloadlen = strlen(buf)+1;
pavledjo 1:7b52bdcdac4e 285 client.publish(topic_pub1, message);
pavledjo 1:7b52bdcdac4e 286
pavledjo 1:7b52bdcdac4e 287 }
pavledjo 1:7b52bdcdac4e 288
pavledjo 1:7b52bdcdac4e 289 }
emilija 0:51001d8fdeff 290 if (button_pressed==1) {
emilija 0:51001d8fdeff 291 button_pressed=0;
emilija 0:51001d8fdeff 292 printf("Publishing data\r\n");
emilija 0:51001d8fdeff 293 // QoS 0
emilija 0:51001d8fdeff 294 char buf[100];
pavledjo 1:7b52bdcdac4e 295
emilija 0:51001d8fdeff 296 //sprintf(buf, "RGB: %7s C\r\n", print_double(buffer, cs.getRed()*100000000+cs.getGreen()*10000+cs.getBlue()));
emilija 0:51001d8fdeff 297
pavledjo 1:7b52bdcdac4e 298 //message.qos = MQTT::QOS0;
emilija 0:51001d8fdeff 299 //message.retained = false;
emilija 0:51001d8fdeff 300 //message.dup = false;
emilija 0:51001d8fdeff 301 //message.payload = (void*)buf;
emilija 0:51001d8fdeff 302 //message.payloadlen = strlen(buf)+1;
emilija 0:51001d8fdeff 303 //client.publish(topic_pub, message);
emilija 0:51001d8fdeff 304
emilija 0:51001d8fdeff 305 }
pavledjo 1:7b52bdcdac4e 306 // printf("Yielding");
emilija 0:51001d8fdeff 307 client.yield(1000);
pavledjo 1:7b52bdcdac4e 308 //printf(" -> Yielded\r\n");
emilija 0:51001d8fdeff 309 }
emilija 0:51001d8fdeff 310 }