![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Vote Controller IOT
Fork of PGO6_VoteController_template by
main.cpp
- Committer:
- kjellkleyn
- Date:
- 2017-11-06
- Revision:
- 3:b2c9de2f45c7
- Parent:
- 2:5b7d055dbc91
File content as of revision 3:b2c9de2f45c7:
#define APP_VERSION 0.6f #define MQTT_VERSION 3 #define BROKER_NAME "broker.hivemq.com" #define BROKER_PORT 1883 #include "debounce_button.h" #include "EthernetInterface.h" #include "MQTTNetwork.h" #include "MQTTmbed.h" #include "MQTTClient.h" using namespace MQTT; char* topic = "dansvloerVincent/votes"; char buf[100]; volatile bool button1_pressed; // Used in the main loop volatile bool button1_enabled = true; // Used for debouncing volatile int multiclick_state; // Counts how many clicks occured in the time slot, used in main loop volatile bool button1_busy; // Informs the mainloop that the user is clicking the button volatile bool countSecond = false; volatile bool readyClick = false; int arrivedcount = 0; /** TODO ---- - Check if the button has been pressed. If so, print the amount of clicks to a serial terminal. - Make an MQTT-service which: - starts up a network using EthernetInterface. Make sure the development board requests its address via DHCP. - makes a client and connects it to the broker using a client ID and credentials (username & password). - sends messages at the same topic as the smartphone app from PGO 2. Feel free to choose which Quality of Service you are going to use. Make a separate function which handles the sending procedure. Therefore, this function can be called each time we want to send a certain message. - When the button is pressed once, we send an upvote. When pressed twice, a downvote is sent. By pressing 4 times, the program disconnects from the broker and terminates. Extra ----- - Subscribe to the topic on which the song data is published. Display this received message on the serial terminal. - Test this controller in the complete system of PGO 2. Use these controllers instead of the smartphones. Tips & tricks ------------- - To generate an interrupt on the press of a button, use: InterruptIn button(USER_BUTTON); ... button.fall(callback(someFunction)); - Before implementing MQTT, test the multiclick feature first. - Have a look at the MQTT-library for Mbed and the HelloMQTT-example. - To have a uniform message sending procedure, use the following function usage: sendMessage(&client, topic, buf, qos, retained, duplicate) */ void messageArrived(MQTT::MessageData& md) { MQTT::Message &message = md.message; printf("Message arrived: qos %d, retained %d, dup %d, packetid %d\r\n", message.qos, message.retained, message.dup, message.id); printf("Payload %.*s\r\n", message.payloadlen, (char*)message.payload); ++arrivedcount; } int main(int argc, char* argv[]) { printf("Starting program \r\nConnecting...\r\n"); EthernetInterface eInterface; //eInterface.set_network("192.168.0.95","255.255.255.0","192.168.0.1"); eInterface.connect(); //const char *ip = eInterface.get_ip_address(); printf("IP address is: %s\r\n", eInterface.get_ip_address()); //________________________________________________________________ NetworkInterface *network = &eInterface; if (!network) { return -1; } MQTTNetwork mqttNetwork(network); MQTT::Client<MQTTNetwork, Countdown> client(mqttNetwork); const char* hostname = "143.129.39.151"; //const char* hostname = "broker.mqttdashboard.com"; int port = 1883; printf("Connecting to %s:%d\r\n", hostname, port); int rc = mqttNetwork.connect(hostname, port); if (rc != 0) printf("rc from TCP connect is %d\r\n", rc); MQTTPacket_connectData data = MQTTPacket_connectData_initializer; data.MQTTVersion = 3; data.clientID.cstring = "kjell"; data.username.cstring = "smartcity"; data.password.cstring = "smartcity"; if ((rc = client.connect(data)) != 0) printf("rc from MQTT connect is %d\r\n", rc); MQTT::Message message; message.qos = MQTT::QOS1; InterruptIn button(USER_BUTTON); button.fall(button1_onpressed_cb); while(multiclick_state < 4){ if(readyClick){ printf("TimesClicked %d \r\n" , multiclick_state); if(multiclick_state == 1){ sprintf(buf,"likeKjell\n"); }else if(multiclick_state == 2 || multiclick_state == 3){ sprintf(buf,"dislikeKjell\n"); } printf("buf : %s\r\n" ,buf); message.payload = (void*)buf; message.payloadlen = strlen(buf)+1; rc = client.publish(topic, message); readyClick = false; } } if ((rc = client.disconnect()) != 0) printf("rc from disconnect was %d\r\n", rc); mqttNetwork.disconnect(); printf("exiting program...\r\n"); return 0; }