I have a light-to-digital sensor (TCS34001) that measures intensity in four different bands (R, G, B, IR) and a red LED (ASMT-MR00-AHJ00) that I want to detect. Their spectra look like this: Response curves for the 4 channels of TCS34001

LED emission curve (ignore the amber peak, I have the red variant)

As you might notice the detection wavelengths of the R, G, and B channels slightly overlap such that when I shine the LED onto the sensor the red value peaks but the values for G and B rise as well, so my measurement channels are not completely orthogonal.

For my application I want to detect whether the LED shines onto the sensor or not, this works well in a relatively dark room with no other light sources, but I want this to work under worse conditions (background light, dimmer LED, outside on a sunny day). My first approach to raise SNR was to look at the relation of the red channel to the IR channel and detect if this ratio is changing. $$x_{detect}=R/IR$$

But by doing this I'm throwing away the information of the green and blue channel, even if they are not perfect. I could also look at the ratio between the red channel and the sum of all other channels: $$ x_{detect} = R / (G + B + IR)$$

But this feels wrong again, because the IR signal is more important than green and blue and it feels like I'm supposed to weigh all three channels depending on their orthogonality. Is there some smart approach to go about this? I can control the LED and switch it off regularly to take baseline readings.

I have four sensors hooked up right now and did a quick test with the LED on and off:

Read all light-to-digital sensors (LED on)
D (67222) TCS3400: Sensor LEFT          R: 1197 G: 133  B: 172  IR: 66
D (67222) TCS3400: Sensor RIGHT         R: 928  G: 117  B: 173  IR: 56
D (67222) TCS3400: Sensor TOP           R: 1204 G: 150  B: 187  IR: 77
D (67232) TCS3400: Sensor BOTTOM        R: 1174 G: 130  B: 149  IR: 69

Read all light-to-digital sensors (LED off)
D (68232) TCS3400: Sensor LEFT          R: 45   G: 40   B: 41   IR: 38
D (68232) TCS3400: Sensor RIGHT         R: 42   G: 48   B: 70   IR: 39
D (68232) TCS3400: Sensor TOP           R: 48   G: 41   B: 40   IR: 47
D (68242) TCS3400: Sensor BOTTOM        R: 43   G: 39   B: 39   IR: 42
  • $\begingroup$ Specific led encoding is usually done through frequency encoded pulses. It involves blinking a light to a certain pattern and designing the other end to look for that pattern. The pattern can be adjusted to minimize false detects in the intended environment. Your choice of sensor may or may not be good for this depending on sample rate and how quickly you need a response. $\endgroup$
    – Abel
    Dec 2, 2023 at 20:35
  • $\begingroup$ @Abel I currently use a sample rate of 200Hz. Later on I want to test different modulation schemes (OOK, PPM etc) for transmitting data via the LED, that's why I want to maximize SNR of the measured light amplitude. It's not about recognizing specific LEDs $\endgroup$
    – gnarflord
    Dec 2, 2023 at 21:58
  • $\begingroup$ If it is for data transmission, a sync, minimum packer length and an integrity check (checksum or similar) can serve the same purpose. 200 bits per sec is pretty low, but usable over time... $\endgroup$
    – Abel
    Dec 3, 2023 at 16:19


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.