DALI-based Driver for Mbed OS
A driver for DALI lights that adhere to iec62386-102. THe driver also supports DALI sensor instances part of iec62386-103, like presence and motion sensors.
Example Usage - Lights only configuration
#include "mbed.h"
#include "DALIDriver.h"
int main() {
DALIDriver dali(D0, D2);
dali.init();
int num_devices = dali.get_num_lights();
printf("Devices on bus: %d\r\n", num_devices);
// Devices will be addressed [0, num_devices-1]
// Add all devices to group 1
for(int i = 0; i < num_devices; i++) {
dali.add_to_group(i, 1);
}
// Get the group address of group 1
uint8_t group_addr = dali.get_group_addr(1);
dali.turn_off(group_addr); // turn entire group off
dali.set_fade_time(group_addr, 12); // 28 seconds
dali.set_fade_rate(group_addr, 5); // 80 steps/second
// Set the scene 2 for the group to be at level 254
dali.set_scene(group_addr, 2, 254);
// Group go to scene 2
dali.go_to_scene(group_addr, 2);
// wait for 5 seconds
wait(5);
// Turn off all lights using the broadcast address
dali.turn_off(DALIDriver::broadcast_addr);
}
Example Usage - Colored lights
#include "mbed.h"
#include "DALIDriver.h"
int main() {
DALIDriver dali(D0, D2);
dali.init();
int num_devices = dali.get_num_lights();
printf("Devices on bus: %d\r\n", num_devices);
// Devices will be addressed [0, num_devices-1]
for(int i = 0; i < num_devices; i++) {
dali.turn_on(i);
uint8_t channels = dali.query_rgbwaf_channels(i);
printf("Channels for device %i: 0x%X\r\n", i, channels);
if (channels == 4) {
printf("RGBD light\r\n");
// Set red light
dali.set_color(i, 255, 0, 0);
wait(3);
// Set green light
dali.set_color(i, 0, 255, 0);
}
else if (dali.query_temperature_capable(i)) {
printf("Temperature light\r\n");
// Set very warm color
dali.set_color(i, 2500);
wait(3);
// Set very cold color
dali.set_color(i, 7042);
}
}
Example usage - Lights and sensors
#include "mbed.h"
#include "DALIDriver.h"
EventQueue eventQueue;
void handle_sensor(uint32_t data)
{
printf("Sensor event message: %lu\r\n", data);
event_msg m = controller.parse_event(data);
if (m.inst_type == OCCUPANCY) {
// a 1 in the LSb means motion detected
int motion = (m.info & 1) ? 1 : 0;
printf("Motion captured, occupancy status: %d\r\n", motion);
}
}
int main() {
DALIDriver dali(D0, D2);
// Assign addresses to devices on the bus
// Lights will be addressed [0, num_lights-1]
// Instances will be addressed [num_lights, num_lights + num_inputs - 1]
dali.init();
// number of lights
int num_lights = dali.get_num_lights();
// number of input instances
int num_inputs = dali.get_num_inputs();
printf("Devices on bus: %d\r\n", num_lights + num_inputs);
// Handle motion events
dali.attach(eventQueue.event(handle_sensor));
// Add all devices to group 1
for(int i = 0; i < num_lights; i++) {
dali.add_to_group(i, 1);
}
// Get the group address of group 1
uint8_t group_addr = dali.get_group_addr(1);
dali.turn_off(group_addr); // turn entire group off
dali.set_fade_time(group_addr, 12); // 28 seconds
dali.set_fade_rate(group_addr, 5); // 80 steps/second
// Set the scene 2 for the group to be at level 254
dali.set_scene(group_addr, 2, 254);
// Group go to scene 2
dali.go_to_scene(group_addr, 2);
}