The IR Puck can mimic arbitrary infrared remote controls. Built on the Puck IOT platform.

Dependencies:   Puck IRSender mbed

The IR Puck is a puck that can mimic arbitrary infrared remote controls. This is useful for controlling things like TVs, radios, airconditioners, window blinds, and just about anything and everything that can be otherwise be controlled by a regular remote control.

A tutorial for the IR Puck is available on GitHub.

Tutorials and in-depth documentation for the Puck platform is available at the project's GitHub page

Committer:
aleksanb
Date:
Wed Jul 09 14:47:41 2014 +0000
Revision:
1:e92c3b50191d
Parent:
0:c94311378ec1
Child:
4:24d9873936e6
Resolve timing issues with IR printing when receiving data over BLE.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sigveseb 0:c94311378ec1 1 #include "mbed.h"
sigveseb 0:c94311378ec1 2 #include "BLEDevice.h"
sigveseb 0:c94311378ec1 3 #include "IR.h"
sigveseb 0:c94311378ec1 4 #include "nRF51822n.h"
sigveseb 0:c94311378ec1 5
sigveseb 0:c94311378ec1 6 BLEDevice ble;
sigveseb 0:c94311378ec1 7
sigveseb 0:c94311378ec1 8 DigitalOut myled(LED1);
sigveseb 0:c94311378ec1 9 DigitalOut yourled(LED2);
sigveseb 0:c94311378ec1 10 nRF51822n nrf;
sigveseb 0:c94311378ec1 11
sigveseb 0:c94311378ec1 12 Serial py(USBTX, USBRX);
sigveseb 0:c94311378ec1 13
sigveseb 0:c94311378ec1 14 const static uint8_t beaconPayload[] = {
sigveseb 0:c94311378ec1 15 0x00, 0x4C, // Company identifier code (0x004C == Apple)
sigveseb 0:c94311378ec1 16 0x02, // ID
sigveseb 0:c94311378ec1 17 0x15, // length of the remaining payload
sigveseb 0:c94311378ec1 18 0xE2, 0x0A, 0x39, 0xF4, 0x73, 0xF5, 0x4B, 0xC4, // UUID
sigveseb 0:c94311378ec1 19 0xA1, 0x2F, 0x17, 0xD1, 0xAD, 0x07, 0xA9, 0x61,
sigveseb 0:c94311378ec1 20 0x13, 0x37, // the major value to differenciate a location
sigveseb 0:c94311378ec1 21 0xFA, 0xCE, // the minor value to differenciate a location
sigveseb 0:c94311378ec1 22 0xC8 // 2's complement of the Tx power (-56dB)
sigveseb 0:c94311378ec1 23 };
sigveseb 0:c94311378ec1 24
sigveseb 0:c94311378ec1 25 extern GattService ir_service;
sigveseb 0:c94311378ec1 26 extern GattCharacteristic header, one, zero, ptrail, predata, code;
sigveseb 0:c94311378ec1 27
aleksanb 1:e92c3b50191d 28 int received_ir_transmission = 0;
sigveseb 0:c94311378ec1 29 void onDataWritten(uint16_t handle)
sigveseb 0:c94311378ec1 30 {
sigveseb 0:c94311378ec1 31 py.printf("Data written! %i\n", handle);
sigveseb 0:c94311378ec1 32 for (int i = 0; i < ir_service.getCharacteristicCount(); i++) {
sigveseb 0:c94311378ec1 33 GattCharacteristic* characteristic = ir_service.getCharacteristic(i);
sigveseb 0:c94311378ec1 34 characteristic->getMaxLength();
sigveseb 0:c94311378ec1 35 if (characteristic->getHandle() == handle) {
sigveseb 0:c94311378ec1 36 uint16_t max_length = characteristic->getMaxLength();
sigveseb 0:c94311378ec1 37 ble.readCharacteristicValue(handle, characteristic->getValuePtr(), &max_length);
aleksanb 1:e92c3b50191d 38 for (int i=0; i<max_length; i++) {
aleksanb 1:e92c3b50191d 39 py.printf("Got value: %d\n", characteristic->getValuePtr()[i]);
aleksanb 1:e92c3b50191d 40 }
sigveseb 0:c94311378ec1 41 break;
sigveseb 0:c94311378ec1 42 }
sigveseb 0:c94311378ec1 43 }
aleksanb 1:e92c3b50191d 44
sigveseb 0:c94311378ec1 45 if (code.getHandle() == handle) {
aleksanb 1:e92c3b50191d 46 received_ir_transmission = 1;
sigveseb 0:c94311378ec1 47 }
sigveseb 0:c94311378ec1 48 }
sigveseb 0:c94311378ec1 49
sigveseb 0:c94311378ec1 50 void disconnectionCallback(void)
sigveseb 0:c94311378ec1 51 {
sigveseb 0:c94311378ec1 52 py.printf("Disconnected!\n");
sigveseb 0:c94311378ec1 53 py.printf("Restarting the advertising process\n");
sigveseb 0:c94311378ec1 54 ble.startAdvertising();
sigveseb 0:c94311378ec1 55 }
sigveseb 0:c94311378ec1 56
sigveseb 0:c94311378ec1 57 void connectionCallback(void)
sigveseb 0:c94311378ec1 58 {
aleksanb 1:e92c3b50191d 59 py.printf("Connected!\n");
sigveseb 0:c94311378ec1 60 }
sigveseb 0:c94311378ec1 61
sigveseb 0:c94311378ec1 62 void onDataSent(uint16_t data)
sigveseb 0:c94311378ec1 63 {
sigveseb 0:c94311378ec1 64 py.printf("onDataSent!\n");
sigveseb 0:c94311378ec1 65 }
sigveseb 0:c94311378ec1 66
aleksanb 1:e92c3b50191d 67 int main()
aleksanb 1:e92c3b50191d 68 {
aleksanb 1:e92c3b50191d 69 py.printf("Start of main\n");
aleksanb 1:e92c3b50191d 70
sigveseb 0:c94311378ec1 71 ble.init();
sigveseb 0:c94311378ec1 72 ble.onConnection(connectionCallback);
sigveseb 0:c94311378ec1 73 ble.onDisconnection(disconnectionCallback);
sigveseb 0:c94311378ec1 74 ble.onDataWritten(onDataWritten);
sigveseb 0:c94311378ec1 75 ble.onDataSent(onDataSent);
sigveseb 0:c94311378ec1 76 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
sigveseb 0:c94311378ec1 77 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
sigveseb 0:c94311378ec1 78 ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
aleksanb 1:e92c3b50191d 79
sigveseb 0:c94311378ec1 80 ble.accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA,
aleksanb 1:e92c3b50191d 81 beaconPayload, sizeof(beaconPayload));
aleksanb 1:e92c3b50191d 82
sigveseb 0:c94311378ec1 83 ble.startAdvertising();
sigveseb 0:c94311378ec1 84
sigveseb 0:c94311378ec1 85 ble.addService(ir_service);
aleksanb 1:e92c3b50191d 86
sigveseb 0:c94311378ec1 87 myled = 1;
aleksanb 1:e92c3b50191d 88
aleksanb 1:e92c3b50191d 89 py.printf("Listening..\n");
sigveseb 0:c94311378ec1 90
sigveseb 0:c94311378ec1 91 while (true) {
sigveseb 0:c94311378ec1 92 ble.waitForEvent();
aleksanb 1:e92c3b50191d 93 if (received_ir_transmission == 1) {
aleksanb 1:e92c3b50191d 94 fireIRCode(header.getValuePtr(), one.getValuePtr(), zero.getValuePtr(), ptrail.getValuePtr(), predata.getValuePtr(), code.getValuePtr());
aleksanb 1:e92c3b50191d 95 received_ir_transmission = 0;
aleksanb 1:e92c3b50191d 96 }
sigveseb 0:c94311378ec1 97 myled = !myled;
sigveseb 0:c94311378ec1 98 }
sigveseb 0:c94311378ec1 99 }