TEMT6000
========

.. seo::
    :description: Instructions for setting up TEMT6000 ambient light sensors in ESPHome using the ADC sensor component.
    :image: temt6000.jpg
    :keywords: TEMT6000

The TEMT6000 is a simple and cheap ambient light sensor. The sensor itself
changes its resistance based on how much light hits the sensor. In order
for us to read this resistance the breakout boards you can buy these chips on
often have a small constant value resistor and three pins: ``GND``, ``VCC`` and
``SIG``. Connect ``VCC`` to ``3.3V``, ``GND`` to ``GND`` and ``SIG`` to any
available :doc:`analog pin </components/sensor/adc>`.

.. figure:: images/temt6000-header.jpg
    :align: center
    :width: 75.0%

To get the brightness the sensor measures, we then simply have to measure the voltage
on the ``SIG`` (also called ``OUT``) pin using the :doc:`/components/sensor/adc`
and convert those voltage measurements to illuminance values in lux using a formula:

.. code-block:: yaml

    sensor:
      - platform: adc
        pin: A0
        name: "TEMT6000 Illuminance"
        unit_of_measurement: lx
        filters:
          - lambda: |-
              return (x / 10000.0) * 2000000.0;

.. figure:: images/temt6000-pins.jpg
    :align: center
    :width: 75.0%

    Pins on the TEMT6000. Connect ``OUT`` to an ADC pin, ``GND`` to ``GND``, and ``VCC``
    to ``3.3V``

Formula Explanation:
--------------------

To get the illuminance in lux, we first need to convert the measured voltage to the
current flowing across the TEMT6000 sensor. This current is also equal to the current
flowing across the 10kΩ resistor in the voltage divider circuit, which is
``I = adc_value/10000kΩ``.

The `datasheet for the TEMT6000 <https://www.sparkfun.com/datasheets/Sensors/Imaging/TEMT6000.pdf>`__
specifies a proportional correlation between current and illuminance: Every 2 µA of current
correlates to 1 lx in the illuminance.

.. note::

    The default voltage range of the ADC for the ESP8266 and ESP32 are from 0 to 1.0V.
    So you won't be able to measure any value above 200 lx using the default setup.

    For the ESP32, you have the option of setting a :ref:`Voltage Attenuation <adc-esp32_attenuation>`
    (note that the formula doesn't need to be adjusted if you set an attenuation, as the value ``x``
    is automatically converted to volts).

    For the ESP8266, you unfortunately need to tinker with the hardware a bit to decrease
    the voltage a bit. So one option would be to create another voltage divider on the ``SIG`` pin
    to divide the analog voltage by a constant value.

See Also
--------

- :doc:`/components/sensor/adc`
- `TEMT6000 datasheet <https://www.sparkfun.com/datasheets/Sensors/Imaging/TEMT6000.pdf>`__
- :doc:`bruh`
- :ghedit:`Edit`
