Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of PGO6_VoteController_template by
Revision 2:5f2104244c27, committed 2017-10-30
- Comitter:
- jonasdr
- Date:
- Mon Oct 30 16:43:58 2017 +0000
- Parent:
- 1:34e76c0cbe5a
- Commit message:
- Jonas De Rynck - embedded vote controller
Changed in this revision
--- a/debounce_button.cpp Sun Oct 29 23:01:06 2017 +0000 +++ b/debounce_button.cpp Mon Oct 30 16:43:58 2017 +0000 @@ -34,8 +34,56 @@ /** This function is called when the button has been pressed by the user. */ +Timeout timeout; +Timeout timeout2; +DigitalOut busy_led(LED2); +DigitalOut testled(LED1); +volatile bool button1_enabled = true; +volatile int multiclick_state = 0; +volatile bool button1_busy = false; // Informs the mainloop that the user is clicking the button +volatile int multiclick_state_mem = 0; +volatile bool isready = false; void button1_onpressed_cb(void) { + if (button1_enabled) + { + if(multiclick_state == 0) //eerste druk binnen een seconde + { + button1_busy = true; //knop is busy voor 1 sec + busy_led = 1; + timeout2.attach(callback(button1_multiclick_reset_cb), 1.0); + } + multiclick_state += 1; + button1_enabled = false; + timeout.attach(callback(&button1_enabled_cb), 0.075); + } +} + +void button1_multiclick_reset_cb(void) +{ + isready = true; + multiclick_state_mem = multiclick_state; // aantal kliks onthouden + multiclick_state = 0; + button1_busy = false; //button niet meer busy + busy_led = 0; + for(int i = 0; i<multiclick_state_mem; i++) + { + testing(); + } +} + + +void button1_enabled_cb(void) +{ + button1_enabled = true; +} + +void testing(void) +{ + testled = 1; + wait(0.2); + testled = 0; + wait(0.2); } \ No newline at end of file
--- a/debounce_button.h Sun Oct 29 23:01:06 2017 +0000 +++ b/debounce_button.h Mon Oct 30 16:43:58 2017 +0000 @@ -9,11 +9,14 @@ */ -extern volatile bool button1_pressed; // Used in the main loop +//extern volatile bool button1_pressed = false; // Used in the main loop extern volatile bool button1_enabled; // Used for debouncing extern volatile int multiclick_state; // Counts how many clicks occured in the time slot, used in main loop -extern volatile bool button1_busy; // Informs the mainloop that the user is clicking the button +extern volatile bool button1_busy ; // Informs the mainloop that the user is clicking the button +extern volatile int multiclick_state_mem; // remembers how many times the button was pressed after the state reset to 0. +extern volatile bool isready; void button1_multiclick_reset_cb(void); // Resets the amount of clicks, but stores this value for the usage in the main loop void button1_enabled_cb(void); // Enables the button again after a timeout, used for debouncing the button -void button1_onpressed_cb(void); // Callback which is called when the user presses the button \ No newline at end of file +void button1_onpressed_cb(void); // Callback which is called when the user presses the button +void testing(void); //function that uses LEDS for testing (couldn't use printf's because my computer couldn't find the right COM port). \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/easy-connect.h Mon Oct 30 16:43:58 2017 +0000 @@ -0,0 +1,102 @@ +#ifndef __MAGIC_CONNECT_H__ +#define __MAGIC_CONNECT_H__ + +#include "mbed.h" + +Serial output(USBTX, USBRX); + +#define ETHERNET 1 +#define WIFI_ESP8266 2 +#define MESH_LOWPAN_ND 3 +#define MESH_THREAD 4 + +#if MBED_CONF_APP_NETWORK_INTERFACE == WIFI_ESP8266 +#include "ESP8266Interface.h" + +#ifdef MBED_CONF_APP_ESP8266_DEBUG +ESP8266Interface esp(MBED_CONF_APP_ESP8266_TX, MBED_CONF_APP_ESP8266_RX, MBED_CONF_APP_ESP8266_DEBUG); +#else +ESP8266Interface esp(MBED_CONF_APP_ESP8266_TX, MBED_CONF_APP_ESP8266_RX); +#endif + +#elif MBED_CONF_APP_NETWORK_INTERFACE == ETHERNET +#include "EthernetInterface.h" +EthernetInterface eth; +#elif MBED_CONF_APP_NETWORK_INTERFACE == MESH_LOWPAN_ND +#define MESH +#include "NanostackInterface.h" +LoWPANNDInterface mesh; +#elif MBED_CONF_APP_NETWORK_INTERFACE == MESH_THREAD +#define MESH +#include "NanostackInterface.h" +ThreadInterface mesh; +#else +#error "No connectivity method chosen. Please add 'config.network-interfaces.value' to your mbed_app.json (see README.md for more information)." +#endif + +#if defined(MESH) +#if MBED_CONF_APP_MESH_RADIO_TYPE == ATMEL +#include "NanostackRfPhyAtmel.h" +NanostackRfPhyAtmel rf_phy(ATMEL_SPI_MOSI, ATMEL_SPI_MISO, ATMEL_SPI_SCLK, ATMEL_SPI_CS, + ATMEL_SPI_RST, ATMEL_SPI_SLP, ATMEL_SPI_IRQ, ATMEL_I2C_SDA, ATMEL_I2C_SCL); +#elif MBED_CONF_APP_MESH_RADIO_TYPE == MCR20 +#include "NanostackRfPhyMcr20a.h" +NanostackRfPhyMcr20a rf_phy(MCR20A_SPI_MOSI, MCR20A_SPI_MISO, MCR20A_SPI_SCLK, MCR20A_SPI_CS, MCR20A_SPI_RST, MCR20A_SPI_IRQ); +#endif //MBED_CONF_APP_RADIO_TYPE +#endif //MESH + +#ifndef MESH +// This is address to mbed Device Connector +#define MBED_SERVER_ADDRESS "coap://api.connector.mbed.com:5684" +#else +// This is address to mbed Device Connector +#define MBED_SERVER_ADDRESS "coaps://[2607:f0d0:2601:52::20]:5684" +#endif + +NetworkInterface* easy_connect(bool log_messages = false) { + NetworkInterface* network_interface = 0; + int connect_success = -1; +#if MBED_CONF_APP_NETWORK_INTERFACE == WIFI_ESP8266 + if (log_messages) { + output.printf("[EasyConnect] Using WiFi (ESP8266) \r\n"); + output.printf("[EasyConnect] Connecting to WiFi..\r\n"); + } + connect_success = esp.connect(MBED_CONF_APP_ESP8266_SSID, MBED_CONF_APP_ESP8266_PASSWORD); + network_interface = &esp; +#elif MBED_CONF_APP_NETWORK_INTERFACE == ETHERNET + if (log_messages) { + output.printf("[EasyConnect] Using Ethernet\r\n"); + } + connect_success = eth.connect(); + network_interface = ð +#endif +#ifdef MESH + if (log_messages) { + output.printf("[EasyConnect] Using Mesh\r\n"); + output.printf("[EasyConnect] Connecting to Mesh..\r\n"); + } + connect_success = mesh.connect(); + network_interface = &mesh; +#endif + if(connect_success == 0) { + if (log_messages) { + output.printf("[EasyConnect] Connected to Network successfully\r\n"); + } + } else { + if (log_messages) { + output.printf("[EasyConnect] Connection to Network Failed %d!\r\n", connect_success); + } + return NULL; + } + if (log_messages) { + const char *ip_addr = network_interface->get_ip_address(); + if (ip_addr) { + output.printf("[EasyConnect] IP address %s\r\n", ip_addr); + } else { + output.printf("[EasyConnect] No IP address\r\n"); + } + } + return network_interface; +} + +#endif // __MAGIC_CONNECT_H__
--- a/main.cpp Sun Oct 29 23:01:06 2017 +0000 +++ b/main.cpp Mon Oct 30 16:43:58 2017 +0000 @@ -1,6 +1,6 @@ #define APP_VERSION 0.6f #define MQTT_VERSION 3 -#define BROKER_NAME "broker.hivemq.com" +#define BROKER_NAME "143.129.39.151" #define BROKER_PORT 1883 #include "debounce_button.h" @@ -9,8 +9,6 @@ #include "MQTTmbed.h" #include "MQTTClient.h" -char* topic; - /** TODO ---- @@ -34,7 +32,7 @@ - To generate an interrupt on the press of a button, use: InterruptIn button(USER_BUTTON); ... - button.fall(callback(someFunction)); + button.fall(callback(&someFunction)); The function someFunction(void) is called when this interrupt occurs. - Before implementing MQTT, test the multiclick feature first. You can simply use 'printf()' to print to a serial terminal. The baud rate is 9600. @@ -43,8 +41,93 @@ sendMessage(&client, topic, buf, qos, retained, duplicate) */ +InterruptIn button(USER_BUTTON); +bool flag = false; //set on interrupt +DigitalOut connected_led(LED3); +char* topic = "clubIOT/feedback"; //publish topic +char* songTopic="clubIOT/songmeta"; //subscribe topic + + +void buttonpress() +{ + flag = true; +} + +void sendMessage(MQTT::Client<MQTTNetwork, Countdown> *client, int qos, char* mqtt_message) +{ + MQTT::Message message; + char buf[100]; + sprintf(buf, mqtt_message); + if(qos==0) + message.qos = MQTT::QOS0; + else if(qos==1) + message.qos = MQTT::QOS1; + else + message.qos = MQTT::QOS2; + message.retained = false; + message.dup = false; + message.payload = (void*)buf; + message.payloadlen = strlen(buf)+1; + client->publish(topic, message); +} + +void newSong(MQTT::MessageData &data) +{ + MQTT::Message &message = data.message; + printf("new song: %s \n", (char*)message.payload); +} + + int main(int argc, char* argv[]) { - + EthernetInterface eth_interface; //maak ethernet interface + MQTTNetwork mqttNetwork(ð_interface); //maak mqtt network + MQTT::Client<MQTTNetwork, Countdown> client(mqttNetwork); //maak een client + eth_interface.connect(); // connect de ethernet interface + int rc = mqttNetwork.connect(BROKER_NAME, BROKER_PORT); // connect to the MQTTbroker + if(rc!=0) + printf("'tis kapot %d \n", rc); + client.subscribe(songTopic, MQTT::QOS1, newSong); //subscribe op de songmeta + + MQTTPacket_connectData data = MQTTPacket_connectData_initializer; + data.MQTTVersion = 3; + data.clientID.cstring = "jonas"; + data.username.cstring = "smartcity"; + data.password.cstring = "smartcity"; + client.connect(data); + + char* mqtt_message = ""; + + button.fall(callback(&buttonpress )); + while(1) + { + if(flag) + { + button1_onpressed_cb(); //roep debouncer op + flag = false; //reset interrupt flag + } + + if(!button1_busy && isready) + { + if (multiclick_state_mem == 1) + { + mqtt_message = "like"; + sendMessage(&client, 0, mqtt_message); + } + else if(multiclick_state_mem == 2) + { + mqtt_message = "dislike"; + sendMessage(&client, 0, mqtt_message); + } + else if(multiclick_state_mem == 4) + { + client.unsubscribe(topic); + client.disconnect(); + eth_interface.disconnect(); + } + isready = false; + } + } return 0; } +