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:
sigveseb
Date:
Wed Jul 02 10:48:58 2014 +0000
Revision:
0:c94311378ec1
Child:
1:e92c3b50191d
.

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
sigveseb 0:c94311378ec1 28 void onDataWritten(uint16_t handle)
sigveseb 0:c94311378ec1 29 {
sigveseb 0:c94311378ec1 30 py.printf("Data written! %i\n", handle);
sigveseb 0:c94311378ec1 31 for (int i = 0; i < ir_service.getCharacteristicCount(); i++) {
sigveseb 0:c94311378ec1 32 GattCharacteristic* characteristic = ir_service.getCharacteristic(i);
sigveseb 0:c94311378ec1 33 characteristic->getMaxLength();
sigveseb 0:c94311378ec1 34 if (characteristic->getHandle() == handle) {
sigveseb 0:c94311378ec1 35 uint16_t max_length = characteristic->getMaxLength();
sigveseb 0:c94311378ec1 36 ble.readCharacteristicValue(handle, characteristic->getValuePtr(), &max_length);
sigveseb 0:c94311378ec1 37 break;
sigveseb 0:c94311378ec1 38 }
sigveseb 0:c94311378ec1 39 }
sigveseb 0:c94311378ec1 40
sigveseb 0:c94311378ec1 41 if (code.getHandle() == handle) {
sigveseb 0:c94311378ec1 42 fireIRCode(header.getValuePtr(), one.getValuePtr(), zero.getValuePtr(), ptrail.getValuePtr(), predata.getValuePtr(), code.getValuePtr());
sigveseb 0:c94311378ec1 43 }
sigveseb 0:c94311378ec1 44 }
sigveseb 0:c94311378ec1 45
sigveseb 0:c94311378ec1 46 void disconnectionCallback(void)
sigveseb 0:c94311378ec1 47 {
sigveseb 0:c94311378ec1 48 py.printf("Disconnected!\n");
sigveseb 0:c94311378ec1 49 py.printf("Restarting the advertising process\n");
sigveseb 0:c94311378ec1 50 ble.startAdvertising();
sigveseb 0:c94311378ec1 51 }
sigveseb 0:c94311378ec1 52
sigveseb 0:c94311378ec1 53 void connectionCallback(void)
sigveseb 0:c94311378ec1 54 {
sigveseb 0:c94311378ec1 55 py.printf("Connected!\n");
sigveseb 0:c94311378ec1 56 }
sigveseb 0:c94311378ec1 57
sigveseb 0:c94311378ec1 58 void onDataSent(uint16_t data)
sigveseb 0:c94311378ec1 59 {
sigveseb 0:c94311378ec1 60 py.printf("onDataSent!\n");
sigveseb 0:c94311378ec1 61 }
sigveseb 0:c94311378ec1 62
sigveseb 0:c94311378ec1 63 int main() {
sigveseb 0:c94311378ec1 64 ble.init();
sigveseb 0:c94311378ec1 65 ble.onConnection(connectionCallback);
sigveseb 0:c94311378ec1 66 ble.onDisconnection(disconnectionCallback);
sigveseb 0:c94311378ec1 67 ble.onDataWritten(onDataWritten);
sigveseb 0:c94311378ec1 68 ble.onDataSent(onDataSent);
sigveseb 0:c94311378ec1 69 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
sigveseb 0:c94311378ec1 70 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
sigveseb 0:c94311378ec1 71 ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
sigveseb 0:c94311378ec1 72
sigveseb 0:c94311378ec1 73
sigveseb 0:c94311378ec1 74 ble.accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA,
sigveseb 0:c94311378ec1 75 beaconPayload, sizeof(beaconPayload));
sigveseb 0:c94311378ec1 76
sigveseb 0:c94311378ec1 77 ble.startAdvertising();
sigveseb 0:c94311378ec1 78
sigveseb 0:c94311378ec1 79 ble.addService(ir_service);
sigveseb 0:c94311378ec1 80
sigveseb 0:c94311378ec1 81 myled = 1;
sigveseb 0:c94311378ec1 82
sigveseb 0:c94311378ec1 83 py.printf("Starting up.\n");
sigveseb 0:c94311378ec1 84
sigveseb 0:c94311378ec1 85
sigveseb 0:c94311378ec1 86
sigveseb 0:c94311378ec1 87 while (true) {
sigveseb 0:c94311378ec1 88 ble.waitForEvent();
sigveseb 0:c94311378ec1 89 myled = !myled;
sigveseb 0:c94311378ec1 90 }
sigveseb 0:c94311378ec1 91
sigveseb 0:c94311378ec1 92 }