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 mbed-cloud-workshop-connect-HTS221 by
Revision 4:e518dde96e59, committed 2018-10-25
- Comitter:
- JimCarver
- Date:
- Thu Oct 25 14:00:12 2018 +0000
- Parent:
- 3:0d3492ebb1a5
- Commit message:
- Simulated dispenser
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Mon Oct 22 23:01:04 2018 +0000 +++ b/main.cpp Thu Oct 25 14:00:12 2018 +0000 @@ -39,7 +39,8 @@ #include "HTS221/HTS221Sensor.h" - +float rtime = 5.0; + // An event queue is a very useful structure to debounce information between contexts (e.g. ISR and normal threads) // This is great because things such as network operations are illegal in ISR, so updating a resource in a button's fall() function is not allowed EventQueue eventQueue; @@ -60,16 +61,40 @@ MbedCloudClientResource *pattern_res; MbedCloudClientResource *temperature_res; MbedCloudClientResource *humidity_res; -static int v = 0; + -// This function gets triggered by the timer. It's easy to replace it by an InterruptIn and fall() mode on a real button -void fake_button_press() { +int SwipeCount = 0; +InterruptIn PIR(D5); +DigitalOut motorOnLed(LED4); +DigitalOut PIRtrigger(LED2); +DigitalOut connectLED(LED1); + +Thread motorThread; +Semaphore motorHold; - button_res->set_value(v++); - if(v > 1000) v = 0; - //printf("Simulated button clicked %d times\n", v); +void motorAction(void) +{ +while(1) { + motorHold.wait(); + SwipeCount++; + motorOnLed = 0; + PIRtrigger = 1; + button_res->set_value(SwipeCount); + wait(rtime); + motorOnLed = 1; + } +} + +void PIRhandler(void) +{ + motorHold.release(); +} + +void PIRreset(void) +{ + PIRtrigger = 0; +} -} // Manage the HST221 in an independent thread Thread HTS221Thread; @@ -80,11 +105,13 @@ float value1, value2; static DevI2C devI2c(PB_11,PB_10); // This defines the processor port pins attached to the I2C bus static HTS221Sensor hum_temp(&devI2c); + hum_temp.init(NULL); hum_temp.read_id(&id); // Read the device ID - printf("\r\n\n\nHTS221 humidity & temperature = 0x%X\r\n", id); + //printf("\r\n\n\nHTS221 humidity & temperature = 0x%X\r\n", id); hum_temp.enable(); - while(1) { + while(5) { + //printf("PIR=%x\r\n", PIR.read()); wait(5); // Update every 5 seconds // Update temperature and humidity resources hum_temp.get_temperature(&value1); @@ -94,13 +121,24 @@ } } + +// This function gets triggered by the timer. It's easy to replace it by an InterruptIn and fall() mode on a real button +void fake_button_press() { + // int v = button_res->get_value_int() + 1; + + + printf("Dispenser Swiped %d times\n", SwipeCount); +} + /** * PUT handler * @param resource The resource that triggered the callback * @param newValue Updated value for the resource */ void pattern_updated(MbedCloudClientResource *resource, m2m::String newValue) { - printf("PUT received, new value: %s\n", newValue.c_str()); + //printf("PUT received, new value: %s\n", newValue.c_str()); + rtime = atof(newValue.c_str()); + printf("New Rtime= %f\r\n", rtime); } /** @@ -110,16 +148,14 @@ * Note that the buffer is deallocated after leaving this function, so copy it if you need it longer. * @param size Size of the body */ - - - -void blink_callback(MbedCloudClientResource *resource, const uint8_t *buffer, uint16_t size) { +/*void blink_callback(MbedCloudClientResource *resource, const uint8_t *buffer, uint16_t size) { printf("POST received. Going to blink LED pattern: %s\n", pattern_res->get_value().c_str()); - static DigitalOut augmentedLed(LED1); // LED that is used for blinking the pattern + static DigitalOut augmentedLed(LED2); // LED that is used for blinking the pattern // Parse the pattern string, and toggle the LED in that pattern string s = std::string(pattern_res->get_value().c_str()); + //printf("Pattern = %s\r\n", s); size_t i = 0; size_t pos = s.find(':'); while (pos != string::npos) { @@ -135,16 +171,16 @@ } } } - +*/ /** * Notification callback handler * @param resource The resource that triggered the callback * @param status The delivery status of the notification */ void button_callback(MbedCloudClientResource *resource, const NoticationDeliveryStatus status) { - printf("Button %s (%d)\n", MbedCloudClientResource::delivery_status_to_string(status), status); + printf("callback %s (%d)\n", MbedCloudClientResource::delivery_status_to_string(status), status); } - +/* void temperature_callback(MbedCloudClientResource *resource, const NoticationDeliveryStatus status) { printf("Temperature %s (%d)\n", MbedCloudClientResource::delivery_status_to_string(status), status); } @@ -152,6 +188,16 @@ void humidity_callback(MbedCloudClientResource *resource, const NoticationDeliveryStatus status) { printf("Humidity %s (%d)\n", MbedCloudClientResource::delivery_status_to_string(status), status); } +*/ + +void startData(void) +{ + connectLED = 1; + PIR.rise(PIRhandler); + PIR.fall(PIRreset); + motorThread.start(motorAction); + HTS221Thread.start(HTS221Handler); +} /** * Registration callback handler @@ -159,14 +205,12 @@ */ void registered(const ConnectorClientEndpointInfo *endpoint) { printf("Connected to Mbed Cloud. Endpoint Name: %s\n", endpoint->internal_endpoint_name.c_str()); - Ticker timer; - timer.attach(eventQueue.event(&fake_button_press), 5.0); - HTS221Thread.start(HTS221Handler); + startData(); } - int main(void) { - + connectLED = 0; + motorOnLed = 1; printf("Starting Simple Mbed Cloud Client example\n"); printf("Checking SDCard is Formatted\r\n"); @@ -188,12 +232,7 @@ // if (err < 0) { // error("error: %s (%d)\n", strerror(-err), err); // } - - // - // Initalize temperature and humidity sensor - // - printf("Connecting to the network using Wifi...\n"); // Connect to the internet (DHCP is expected to be on) @@ -222,25 +261,26 @@ button_res->attach_notification_callback(button_callback); pattern_res = client.create_resource("3201/0/5853", "blink_pattern"); - pattern_res->set_value("500:500:500:500:500:500:500:500"); + pattern_res->set_value("5.0"); pattern_res->methods(M2MMethod::GET | M2MMethod::PUT); pattern_res->attach_put_callback(pattern_updated); +/* MbedCloudClientResource *blink_res = client.create_resource("3201/0/5850", "blink_action"); blink_res->methods(M2MMethod::POST); blink_res->attach_post_callback(blink_callback); - +*/ temperature_res = client.create_resource("3303/0/5700", "temperature"); temperature_res->set_value(0); temperature_res->methods(M2MMethod::GET); temperature_res->observable(true); - temperature_res->attach_notification_callback(temperature_callback); + temperature_res->attach_notification_callback(button_callback); humidity_res = client.create_resource("3304/0/5700", "humidity"); humidity_res->set_value(0); humidity_res->methods(M2MMethod::GET); humidity_res->observable(true); - humidity_res->attach_notification_callback(humidity_callback); + humidity_res->attach_notification_callback(button_callback); printf("Initialized Mbed Cloud Client. Registering...\n"); @@ -250,10 +290,6 @@ // Register with Mbed Cloud client.register_and_connect(); - // Placeholder for callback to update local resource when GET comes. - // The timer fires on an interrupt context, but debounces it to the eventqueue, so it's safe to do network operations - - // You can easily run the eventQueue in a separate thread if required eventQueue.dispatch_forever(); -} +} \ No newline at end of file