kopia lustrzana https://github.com/pimoroni/pimoroni-pico
Add LTR559 driver
rodzic
2a7f8f4781
commit
7f49a52ccc
|
@ -1,2 +1,3 @@
|
|||
add_subdirectory(st7789)
|
||||
add_subdirectory(msa301)
|
||||
add_subdirectory(msa301)
|
||||
add_subdirectory(ltr559)
|
|
@ -0,0 +1 @@
|
|||
include(ltr559.cmake)
|
|
@ -0,0 +1,9 @@
|
|||
add_library(ltr559 INTERFACE)
|
||||
|
||||
target_sources(ltr559 INTERFACE
|
||||
${CMAKE_CURRENT_LIST_DIR}/ltr559.cpp)
|
||||
|
||||
target_include_directories(ltr559 INTERFACE ${CMAKE_CURRENT_LIST_DIR})
|
||||
|
||||
# Pull in pico libraries that we need
|
||||
target_link_libraries(ltr559 INTERFACE pico_stdlib hardware_i2c)
|
|
@ -0,0 +1,267 @@
|
|||
#include "ltr559.hpp"
|
||||
#include <algorithm>
|
||||
|
||||
namespace pimoroni {
|
||||
lookup::lookup(std::initializer_list<uint16_t> values) : lut(values) {
|
||||
}
|
||||
|
||||
uint8_t lookup::index(uint16_t value) {
|
||||
auto it = find(this->lut.begin(), this->lut.end(), value);
|
||||
|
||||
if(it == this->lut.end()) return 0;
|
||||
|
||||
return it - this->lut.begin();
|
||||
}
|
||||
|
||||
uint16_t lookup::value(uint8_t index) {
|
||||
return lut[index];
|
||||
}
|
||||
|
||||
pimoroni::lookup LTR559::lookup_led_current({5, 10, 20, 50, 100});
|
||||
pimoroni::lookup LTR559::lookup_led_duty_cycle({25, 50, 75, 100});
|
||||
pimoroni::lookup LTR559::lookup_led_pulse_freq({30, 40, 50, 60, 70, 80, 90, 100});
|
||||
pimoroni::lookup LTR559::lookup_proximity_meas_rate({10, 50, 70, 100, 200, 500, 1000, 2000});
|
||||
pimoroni::lookup LTR559::lookup_light_integration_time({100, 50, 200, 400, 150, 250, 300, 350});
|
||||
pimoroni::lookup LTR559::lookup_light_repeat_rate({50, 100, 200, 500, 1000, 2000});
|
||||
pimoroni::lookup LTR559::lookup_light_gain({1, 2, 4, 8, 0, 0, 48, 96});
|
||||
|
||||
int LTR559::init() {
|
||||
i2c_init(i2c, 400000);
|
||||
|
||||
gpio_set_function(sda, GPIO_FUNC_I2C); gpio_pull_up(sda);
|
||||
gpio_set_function(scl, GPIO_FUNC_I2C); gpio_pull_up(scl);
|
||||
|
||||
this->reset();
|
||||
this->interrupts(true, true);
|
||||
|
||||
// 50mA, 1.0 duty cycle, 30Hz, 1 pulse
|
||||
this->proximity_led(50, 1.0, 30, 1);
|
||||
|
||||
// enabled, gain 4x
|
||||
this->light_control(true, 4);
|
||||
|
||||
// enabled, saturation indicator enabled
|
||||
this->proximity_control(true, true);
|
||||
|
||||
// 100ms measurement rate
|
||||
this->proximity_measurement_rate(100);
|
||||
|
||||
// 50ms integration time and repeat rate
|
||||
this->light_measurement_rate(50, 50);
|
||||
|
||||
this->light_threshold(0xFFFF, 0x0000);
|
||||
this->proximity_threshold(0x7FFF, 0x7FFF);
|
||||
this->proximity_offset(0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t LTR559::part_id() {
|
||||
uint8_t part_id;
|
||||
this->read_bytes(LTR559_PART_ID, &part_id, 1);
|
||||
return (part_id >> LTR559_PART_ID_PART_NUMBER_SHIFT) & LTR559_PART_ID_PART_NUMBER_MASK;
|
||||
}
|
||||
|
||||
uint8_t LTR559::revision_id() {
|
||||
uint8_t revision_id;
|
||||
this->read_bytes(LTR559_PART_ID, &revision_id, 1);
|
||||
return revision_id & LTR559_PART_ID_REVISION_MASK;
|
||||
}
|
||||
|
||||
uint8_t LTR559::manufacturer_id() {
|
||||
uint8_t manufacturer;
|
||||
this->read_bytes(LTR559_MANUFACTURER_ID, &manufacturer, 1);
|
||||
return manufacturer;
|
||||
}
|
||||
|
||||
void LTR559::reset() {
|
||||
this->set_bits(LTR559_ALS_CONTROL, LTR559_ALS_CONTROL_SW_RESET_BIT);
|
||||
|
||||
while (this->get_bits(LTR559_ALS_CONTROL, LTR559_ALS_CONTROL_SW_RESET_BIT)) {
|
||||
sleep_ms(100);
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t LTR559::bit12_to_uint16(uint16_t value) {
|
||||
return ((value & 0xFF00) >> 8) | ((value & 0x000F) << 8);
|
||||
}
|
||||
|
||||
uint16_t LTR559::uint16_to_bit12(uint16_t value) {
|
||||
return ((value & 0xFF) << 8) | ((value & 0xF00) >> 8);
|
||||
}
|
||||
|
||||
bool LTR559::get_reading() {
|
||||
bool has_updated = false;
|
||||
uint8_t status;
|
||||
this->read_bytes(LTR559_ALS_PS_STATUS, &status, 1);
|
||||
bool als_int = (status >> LTR559_ALS_PS_STATUS_ALS_INTERRUPT_BIT) & 0b1;
|
||||
bool ps_int = (status >> LTR559_ALS_PS_STATUS_PS_INTERRUPT_BIT) & 0b1;
|
||||
bool als_data = (status >> LTR559_ALS_PS_STATUS_ALS_DATA_BIT) & 0b1;
|
||||
bool ps_data = (status >> LTR559_ALS_PS_STATUS_PS_DATA_BIT) & 0b1;
|
||||
|
||||
if (ps_int || ps_data) {
|
||||
has_updated = true;
|
||||
uint16_t ps0;
|
||||
this->read_bytes(LTR559_PS_DATA, (uint8_t *)&ps0, 2);
|
||||
ps0 &= LTR559_PS_DATA_MASK;
|
||||
|
||||
this->data.proximity = ps0;
|
||||
}
|
||||
|
||||
if (als_int || als_data) {
|
||||
has_updated = true;
|
||||
uint16_t als[2];
|
||||
this->read_bytes(LTR559_ALS_DATA_CH1, (uint8_t *)&als, 4);
|
||||
this->data.als0 = als[1];
|
||||
this->data.als1 = als[0];
|
||||
this->data.gain = this->lookup_light_gain.value((status >> LTR559_ALS_PS_STATUS_ALS_GAIN_SHIFT) & LTR559_ALS_PS_STATUS_ALS_GAIN_MASK);
|
||||
|
||||
this->data.ratio = 101.0f;
|
||||
|
||||
if ((uint32_t)this->data.als0 + this->data.als1 > 0) {
|
||||
this->data.ratio = (float)this->data.als1 * 100.0f / ((float)this->data.als1 + this->data.als0);
|
||||
}
|
||||
|
||||
uint8_t ch_idx = 3;
|
||||
if (this->data.ratio < 45) {
|
||||
ch_idx = 0;
|
||||
} else if (this->data.ratio < 64) {
|
||||
ch_idx = 1;
|
||||
} else if (this->data.ratio < 85) {
|
||||
ch_idx = 2;
|
||||
}
|
||||
|
||||
float lux = ((int32_t)this->data.als0 * this->ch0_c[ch_idx]) - ((int32_t)this->data.als1 * this->ch1_c[ch_idx]);
|
||||
lux /= (float)this->data.integration_time / 100.0f;
|
||||
lux /= (float)this->data.gain;
|
||||
this->data.lux = (uint16_t)(lux / 10000.0f);
|
||||
}
|
||||
|
||||
return has_updated;
|
||||
}
|
||||
|
||||
void LTR559::interrupts(bool light, bool proximity) {
|
||||
uint8_t buf = 0;
|
||||
buf |= 0b1 << LTR559_INTERRUPT_POLARITY_BIT;
|
||||
buf |= (uint8_t)light << LTR559_INTERRUPT_ALS_BIT;
|
||||
buf |= (uint8_t)proximity << LTR559_INTERRUPT_PS_BIT;
|
||||
this->write_bytes(LTR559_INTERRUPT, &buf, 1);
|
||||
}
|
||||
|
||||
void LTR559::proximity_led(uint8_t current, uint8_t duty_cycle, uint8_t pulse_freq, uint8_t num_pulses) {
|
||||
current = this->lookup_led_current.index(current);
|
||||
|
||||
duty_cycle = this->lookup_led_duty_cycle.index(duty_cycle);
|
||||
duty_cycle <<= LTR559_PS_LED_DUTY_CYCLE_SHIFT;
|
||||
|
||||
pulse_freq = this->lookup_led_pulse_freq.index(pulse_freq);
|
||||
pulse_freq <<= LTR559_PS_LED_PULSE_FREQ_SHIFT;
|
||||
|
||||
uint8_t buf = current | duty_cycle | pulse_freq;
|
||||
this->write_bytes(LTR559_PS_LED, &buf, 1);
|
||||
|
||||
buf = num_pulses & LTR559_PS_N_PULSES_MASK;
|
||||
this->write_bytes(LTR559_PS_N_PULSES, &buf, 1);
|
||||
}
|
||||
|
||||
void LTR559::light_control(bool active, uint8_t gain) {
|
||||
uint8_t buf = 0;
|
||||
gain = this->lookup_light_gain.index(gain);
|
||||
buf |= gain << LTR559_ALS_CONTROL_GAIN_SHIFT;
|
||||
|
||||
if(active) {
|
||||
buf |= (0b1 << LTR559_ALS_CONTROL_MODE_BIT);
|
||||
} else {
|
||||
buf &= ~(0b1 << LTR559_ALS_CONTROL_MODE_BIT);
|
||||
}
|
||||
|
||||
this->write_bytes(LTR559_ALS_CONTROL, &buf, 1);
|
||||
}
|
||||
|
||||
void LTR559::proximity_control(bool active, bool saturation_indicator) {
|
||||
uint8_t buf = 0;
|
||||
this->read_bytes(LTR559_PS_CONTROL, &buf, 1);
|
||||
if(active) {
|
||||
buf |= LTR559_PS_CONTROL_ACTIVE_MASK;
|
||||
} else {
|
||||
buf &= ~LTR559_PS_CONTROL_ACTIVE_MASK;
|
||||
}
|
||||
if(saturation_indicator) {
|
||||
buf |= 0b1 << LTR559_PS_CONTROL_SATURATION_INDICATOR_ENABLE_BIT;
|
||||
} else {
|
||||
buf &= ~(0b1 << LTR559_PS_CONTROL_SATURATION_INDICATOR_ENABLE_BIT);
|
||||
}
|
||||
this->write_bytes(LTR559_PS_CONTROL, &buf, 1);
|
||||
}
|
||||
|
||||
void LTR559::light_threshold(uint16_t lower, uint16_t upper) {
|
||||
lower = __builtin_bswap16(lower);
|
||||
upper = __builtin_bswap16(upper);
|
||||
this->write_bytes(LTR559_ALS_THRESHOLD_LOWER, (uint8_t *)&lower, 2);
|
||||
this->write_bytes(LTR559_ALS_THRESHOLD_UPPER, (uint8_t *)&upper, 2);
|
||||
}
|
||||
|
||||
void LTR559::proximity_threshold(uint16_t lower, uint16_t upper) {
|
||||
lower = this->uint16_to_bit12(lower);
|
||||
upper = this->uint16_to_bit12(upper);
|
||||
this->write_bytes(LTR559_PS_THRESHOLD_LOWER, (uint8_t *)&lower, 2);
|
||||
this->write_bytes(LTR559_PS_THRESHOLD_UPPER, (uint8_t *)&upper, 2);
|
||||
}
|
||||
|
||||
void LTR559::light_measurement_rate(uint16_t integration_time, uint16_t rate) {
|
||||
this->data.integration_time = integration_time;
|
||||
integration_time = this->lookup_light_integration_time.index(integration_time);
|
||||
rate = this->lookup_light_repeat_rate.index(rate);
|
||||
uint8_t buf = 0;
|
||||
buf |= rate;
|
||||
buf |= integration_time << LTR559_ALS_MEAS_RATE_INTEGRATION_TIME_SHIFT;
|
||||
this->write_bytes(LTR559_ALS_MEAS_RATE, &buf, 1);
|
||||
}
|
||||
|
||||
void LTR559::proximity_measurement_rate(uint16_t rate) {
|
||||
uint8_t buf = this->lookup_proximity_meas_rate.index(rate);
|
||||
this->write_bytes(LTR559_PS_MEAS_RATE, &buf, 1);
|
||||
}
|
||||
|
||||
void LTR559::proximity_offset(uint16_t offset) {
|
||||
offset &= LTR559_PS_OFFSET_MASK;
|
||||
this->write_bytes(LTR559_PS_OFFSET, (uint8_t *)&offset, 1);
|
||||
}
|
||||
|
||||
// i2c functions
|
||||
|
||||
int LTR559::write_bytes(uint8_t reg, uint8_t *buf, int len) {
|
||||
uint8_t buffer[len + 1];
|
||||
buffer[0] = reg;
|
||||
for(int x = 0; x < len; x++) {
|
||||
buffer[x + 1] = buf[x];
|
||||
}
|
||||
return i2c_write_blocking(this->i2c, this->address, buffer, len + 1, false);
|
||||
};
|
||||
|
||||
int LTR559::read_bytes(uint8_t reg, uint8_t *buf, int len) {
|
||||
i2c_write_blocking(this->i2c, this->address, ®, 1, true);
|
||||
i2c_read_blocking(this->i2c, this->address, buf, len, false);
|
||||
return len;
|
||||
};
|
||||
|
||||
uint8_t LTR559::get_bits(uint8_t reg, uint8_t shift, uint8_t mask) {
|
||||
uint8_t value;
|
||||
this->read_bytes(reg, &value, 1);
|
||||
return value & (mask << shift);
|
||||
}
|
||||
|
||||
void LTR559::set_bits(uint8_t reg, uint8_t shift, uint8_t mask) {
|
||||
uint8_t value;
|
||||
this->read_bytes(reg, &value, 1);
|
||||
value |= mask << shift;
|
||||
this->write_bytes(reg, &value, 1);
|
||||
}
|
||||
|
||||
void LTR559::clear_bits(uint8_t reg, uint8_t shift, uint8_t mask) {
|
||||
uint8_t value;
|
||||
this->read_bytes(reg, &value, 1);
|
||||
value &= ~(mask << shift);
|
||||
this->write_bytes(reg, &value, 1);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,165 @@
|
|||
#pragma once
|
||||
|
||||
#include "hardware/i2c.h"
|
||||
#include "hardware/gpio.h"
|
||||
#include <vector>
|
||||
#include <initializer_list>
|
||||
|
||||
#define LTR559_ALS_CONTROL 0x80
|
||||
#define LTR559_ALS_CONTROL_GAIN_MASK 0b111
|
||||
#define LTR559_ALS_CONTROL_GAIN_SHIFT 2
|
||||
#define LTR559_ALS_CONTROL_SW_RESET_BIT 1
|
||||
#define LTR559_ALS_CONTROL_MODE_BIT 0
|
||||
|
||||
#define LTR559_PS_CONTROL 0x81
|
||||
#define LTR559_PS_CONTROL_SATURATION_INDICATOR_ENABLE_BIT 5
|
||||
#define LTR559_PS_CONTROL_ACTIVE_MASK 0b11
|
||||
|
||||
#define LTR559_PS_LED 0x82
|
||||
#define LTR559_PS_LED_PULSE_FREQ_MASK 0b111
|
||||
#define LTR559_PS_LED_PULSE_FREQ_SHIFT 5
|
||||
#define LTR559_PS_LED_DUTY_CYCLE_MASK 0b11
|
||||
#define LTR559_PS_LED_DUTY_CYCLE_SHIFT 3
|
||||
#define LTR559_PS_LED_CURRENT_MASK 0b111
|
||||
|
||||
#define LTR559_PS_N_PULSES 0x83
|
||||
#define LTR559_PS_N_PULSES_MASK 0b1111
|
||||
|
||||
#define LTR559_PS_MEAS_RATE 0x84
|
||||
#define LTR559_PS_MEAS_RATE_RATE_MS_MASK 0b1111
|
||||
|
||||
#define LTR559_ALS_MEAS_RATE 0x85
|
||||
#define LTR559_ALS_MEAS_RATE_INTEGRATION_TIME_MASK 0b111
|
||||
#define LTR559_ALS_MEAS_RATE_INTEGRATION_TIME_SHIFT 3
|
||||
#define LTR559_ALS_MEAS_RATE_REPEAT_RATE_MASK 0b111
|
||||
|
||||
#define LTR559_PART_ID 0x86
|
||||
#define LTR559_PART_ID_PART_NUMBER_MASK 0b1111
|
||||
#define LTR559_PART_ID_PART_NUMBER_SHIFT 4
|
||||
#define LTR559_PART_ID_REVISION_MASK 0b1111
|
||||
|
||||
#define LTR559_MANUFACTURER_ID 0x87
|
||||
|
||||
#define LTR559_ALS_DATA 0x88
|
||||
#define LTR559_ALS_DATA_CH1 0x88
|
||||
#define LTR559_ALS_DATA_CH0 0x8a
|
||||
|
||||
#define LTR559_ALS_PS_STATUS 0x8c
|
||||
#define LTR559_ALS_PS_STATUS_INTERRUPT_MASK 0b00001010
|
||||
#define LTR559_ALS_PS_STATUS_ALS_DATA_VALID_BIT 7
|
||||
#define LTR559_ALS_PS_STATUS_ALS_GAIN_MASK 0b111
|
||||
#define LTR559_ALS_PS_STATUS_ALS_GAIN_SHIFT 4
|
||||
#define LTR559_ALS_PS_STATUS_ALS_INTERRUPT_BIT 3
|
||||
#define LTR559_ALS_PS_STATUS_ALS_DATA_BIT 2
|
||||
#define LTR559_ALS_PS_STATUS_PS_INTERRUPT_BIT 1
|
||||
#define LTR559_ALS_PS_STATUS_PS_DATA_BIT 0
|
||||
|
||||
#define LTR559_PS_DATA 0x8d
|
||||
#define LTR559_PS_DATA_MASK 0x07FF
|
||||
|
||||
#define LTR559_PS_DATA_SATURATION 0x8e
|
||||
#define LTR559_PS_DATA_SATURATION_SHIFT 4
|
||||
|
||||
#define LTR559_INTERRUPT 0x8f
|
||||
#define LTR559_INTERRUPT_POLARITY_BIT 2
|
||||
#define LTR559_INTERRUPT_ALS_PS_MASK 0b11
|
||||
#define LTR559_INTERRUPT_PS_BIT 0
|
||||
#define LTR559_INTERRUPT_ALS_BIT 1
|
||||
|
||||
#define LTR559_PS_THRESHOLD_UPPER 0x90
|
||||
#define LTR559_PS_THRESHOLD_LOWER 0x92
|
||||
|
||||
#define LTR559_PS_OFFSET 0x94
|
||||
#define LTR559_PS_OFFSET_MASK 0x03FF
|
||||
|
||||
#define LTR559_ALS_THRESHOLD_UPPER 0x97
|
||||
#define LTR559_ALS_THRESHOLD_LOWER 0x99
|
||||
|
||||
#define LTR559_INTERRUPT_PERSIST 0x9e
|
||||
#define LTR559_INTERRUPT_PERSIST_PS_MASK 0b1111
|
||||
#define LTR559_INTERRUPT_PERSIST_PS_SHIFT 4
|
||||
#define LTR559_INTERRUPT_PERSIST_ALS_MASK 0b1111
|
||||
|
||||
#define LTR559_I2C_ADDR 0x23
|
||||
#define LTR559_VALID_PART_ID 0x09
|
||||
#define LTR559_VALID_REVISION_ID 0x02
|
||||
|
||||
|
||||
namespace pimoroni {
|
||||
typedef struct {
|
||||
uint16_t proximity;
|
||||
uint16_t als0;
|
||||
uint16_t als1;
|
||||
uint16_t integration_time;
|
||||
uint16_t gain;
|
||||
float ratio;
|
||||
uint16_t lux;
|
||||
} ltr559_reading;
|
||||
|
||||
class lookup {
|
||||
private:
|
||||
std::vector<uint16_t> lut;
|
||||
public:
|
||||
lookup(std::initializer_list<uint16_t> values);
|
||||
uint8_t index(uint16_t value);
|
||||
uint16_t value(uint8_t index);
|
||||
};
|
||||
|
||||
class LTR559 {
|
||||
public:
|
||||
ltr559_reading data;
|
||||
|
||||
LTR559() {};
|
||||
|
||||
LTR559(uint8_t addr) : address(addr) {};
|
||||
|
||||
LTR559(i2c_inst_t *i2c, uint8_t addr, uint8_t sda, uint8_t scl, uint8_t interrupt) :
|
||||
i2c(i2c), address(addr), sda(sda), scl(scl), interrupt(interrupt) {};
|
||||
|
||||
int init();
|
||||
void reset();
|
||||
|
||||
uint8_t part_id();
|
||||
uint8_t revision_id();
|
||||
uint8_t manufacturer_id();
|
||||
void interrupts(bool light, bool proximity);
|
||||
void proximity_led(uint8_t current, uint8_t duty_cycle, uint8_t pulse_freq, uint8_t num_pulses);
|
||||
void light_control(bool active, uint8_t gain);
|
||||
void proximity_control(bool active, bool saturation_indicator);
|
||||
void light_threshold(uint16_t lower, uint16_t upper);
|
||||
void proximity_threshold(uint16_t lower, uint16_t upper);
|
||||
void light_measurement_rate(uint16_t integration_time, uint16_t rate);
|
||||
void proximity_measurement_rate(uint16_t rate);
|
||||
void proximity_offset(uint16_t offset);
|
||||
bool get_reading();
|
||||
|
||||
private:
|
||||
i2c_inst_t *i2c = i2c0;
|
||||
|
||||
// interface pins with our standard defaults where appropriate
|
||||
int8_t address = LTR559_I2C_ADDR;
|
||||
int8_t sda = 4;
|
||||
int8_t scl = 5;
|
||||
int8_t interrupt = 22;
|
||||
|
||||
uint16_t bit12_to_uint16(uint16_t value);
|
||||
uint16_t uint16_to_bit12(uint16_t value);
|
||||
const uint8_t lookup(uint16_t *lookup_table, uint16_t value, uint8_t length);
|
||||
const int ch0_c[4] = {17743, 42785, 5926, 0};
|
||||
const int ch1_c[4] = {-11059, 19548, -1185, 0};
|
||||
static pimoroni::lookup lookup_led_current;
|
||||
static pimoroni::lookup lookup_led_duty_cycle;
|
||||
static pimoroni::lookup lookup_led_pulse_freq;
|
||||
static pimoroni::lookup lookup_proximity_meas_rate;
|
||||
static pimoroni::lookup lookup_light_integration_time;
|
||||
static pimoroni::lookup lookup_light_repeat_rate;
|
||||
static pimoroni::lookup lookup_light_gain;
|
||||
|
||||
// From i2cdevice
|
||||
int write_bytes(uint8_t reg, uint8_t *buf, int len);
|
||||
int read_bytes(uint8_t reg, uint8_t *buf, int len);
|
||||
uint8_t get_bits(uint8_t reg, uint8_t shift, uint8_t mask=0b1);
|
||||
void set_bits(uint8_t reg, uint8_t shift, uint8_t mask=0b1);
|
||||
void clear_bits(uint8_t reg, uint8_t shift, uint8_t mask=0b1);
|
||||
};
|
||||
}
|
|
@ -3,4 +3,5 @@ add_subdirectory(pico_unicorn)
|
|||
add_subdirectory(pico_unicorn_plasma)
|
||||
add_subdirectory(pico_scroll)
|
||||
add_subdirectory(pico_explorer)
|
||||
add_subdirectory(pico_rgb_keypad)
|
||||
add_subdirectory(pico_rgb_keypad)
|
||||
add_subdirectory(breakout_ltr559)
|
|
@ -0,0 +1,10 @@
|
|||
add_executable(
|
||||
breakout_ltr559
|
||||
demo.cpp
|
||||
)
|
||||
|
||||
# Pull in pico libraries that we need
|
||||
target_link_libraries(breakout_ltr559 pico_stdlib hardware_spi ltr559)
|
||||
|
||||
# create map/bin/hex file etc.
|
||||
pico_add_extra_outputs(breakout_ltr559)
|
|
@ -0,0 +1,28 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "pico/stdlib.h"
|
||||
#include "ltr559.hpp"
|
||||
|
||||
using namespace pimoroni;
|
||||
|
||||
LTR559 ltr559;
|
||||
|
||||
int main() {
|
||||
setup_default_uart();
|
||||
|
||||
if (ltr559.init() == 1) {
|
||||
printf("Failed to set up LTR559\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
uint8_t part_id = ltr559.part_id();
|
||||
printf("Found LTR559. Part ID: 0x%02x\n", part_id);
|
||||
|
||||
while(true){
|
||||
bool new_data = ltr559.get_reading();
|
||||
if(new_data) {
|
||||
printf("Lux: %d Prox: %d\n", ltr559.data.lux, ltr559.data.proximity);
|
||||
}
|
||||
};
|
||||
return 0;
|
||||
}
|
Ładowanie…
Reference in New Issue