esphome-docs/cookbook/stm32_port_extender.rst

184 lines
5.8 KiB
ReStructuredText

Stm32 Port Expander
=====================
.. seo::
:description: Instructions on using an STM32F103 board, like the BluePill for expanding ports of an ESPHome node
:image: stm32_logo.svg
:keywords: STM32 port expander extender ESPHome
With this sketch you can control pins of a remote STM32 board through ESPHome. The STM32 acts as a port
expander, allowing you to use more pins than a standard ESP8266/ESP32 has.
.. figure:: images/stm32f103.jpg
:align: center
:width: 75.0%
The STM32 is connected to the ESP via I²C.
Currently it is supported:
- reading digital inputs (0/1)
- reading analog inputs (0/255)
- writing digital outputs (0/1)
- writing analog outputs (0/255)
The STM32 project can be retrieved from `here <https://github.com/eugenscobich/stm32-port-expander>`__.
You will need STM32CubeIDE to change and build it.
The project if made to extand 10 ports for AC dimmable output, 15 digiat inputs, 2 analog outputs and one anolog input to configure temperature treshhold.
You need to download `stm32_port_expander.h <https://github.com/eugenscobich/stm32-port-expander/blob/main/esp_home/stm32_port_expander.h>`__
and include the stm32_port_expander.h in the ESPHome configuration.
Schematics and PCB can be found `here <https://oshwlab.com/eugenscobich/esphome-8-channel-dimmer>`__.
.. code-block:: yaml
esphome:
# ...
includes:
- stm32_port_expander.h
Setup your :ref:`I²C Bus <i2c>` and assign it an ``id``:
.. code-block:: yaml
i2c:
id: i2c_component
frequency: 400kHz
By default ESP8266 uses ``SDA`` pin ``GPIO4`` which you need to connect to STM32F103's ``PB7`` and the ``SCL``
is ``GPIO5`` which goes to Arduino's ``PB6``.
STM32F103 can operate at maximum 400kHz and the framework was optimized to work on this speed.
Then create a ``custom_component``, this will be the main component we will be referencing later when creating
individual IOs.
.. code-block:: yaml
custom_component:
- id: stm32_port_expander_1
lambda: |-
auto expander = new Stm32PortExpander(i2c_component, 0x08, 40);
return {expander};
By default the I²C address is ``0x08`` but you can change it on the STM32 Cube so you can have more devices
on the same bus.
Now it is time to add the ports.
Binary Sensor
-------------
This project is inspired by Arduino Port Expander and configuration are pretty much the same.
Pin numbers must be in sync between ESPHome config and STM32 frameware.
To setup binary sensors, create a custom platform as below, list in braces all the sensors you want,
in the example below two binary sensors are declared on pin 11 and 12, that correspond to PB15 and PA12 respectively.
Then declare the ESPHome reference of the binary sensor in the same order as declared in the lambda:
.. code-block:: yaml
- platform: custom
lambda: |-
return {stm32_port_expander_binary_sensor(stm32_port_expander_1, 11),
stm32_port_expander_binary_sensor(stm32_port_expander_1, 12)};
binary_sensors:
- id: binary_sensor_pin_11
name: Binary Sensor Pin 11
filters:
- invert:
- id: binary_sensor_pin_12
name: Binary Sensor Pin 12
filters:
- invert:
The listed ``binary_sensors`` supports all options from :ref:`Binary Sensor <config-binary_sensor>` like
automations and filters.
Sensor
------
Sensors allows for reading the analog value of an analog pin. In this example an internal temperauture sensor is used via DMA.
Then declare the ESPHome reference of the sensor in the same order as declared in the lambda:
.. code-block:: yaml
- platform: custom
lambda: |-
return {stm32_port_expander_analog_sensor(stm32_port_expander_1, 0)};
sensors:
- id: analog_sensor_pin_0
name: Dimmer module temperature
filters:
- throttle: 10s
unit_of_measurement: "°C"
device_class : temperature
state_class: measurement
The listed ``sensors`` supports all options from :ref:`Sensor <config-sensor>` like
automations and filters.
.. note::
Sensors are polled by default every loop cycle so it is recommended to use the ``throttle`` filter
to not flood the network.
Binary Output
-------------
To setup outputs, create a custom platform as below, list in braces all the outputs you want,
in the example below two outputs are declared on pin ``1`` and ``28``.
.. code-block:: yaml
- platform: custom
type: float
lambda: |-
return {stm32_port_expander_binary_output(stm32_port_expander_1, 29),
stm32_port_expander_binary_output(stm32_port_expander_1, 30)};
outputs:
- id: binary_output_pin_29
inverted: true
- id: binary_output_pin_30
Float Output
------------
To setup outputs, create a custom platform as below, list in braces all the outputs you want,
in the example below two outputs are declared on pin ``1`` and ``28``. ``28`` is not an real
output pin and it is used to set the temperature treshold when epander must go in error state and reset all outputs.
.. code-block:: yaml
- platform: custom
type: float
lambda: |-
return {stm32_port_expander_float_output(stm32_port_expander_1, 1),
stm32_port_expander_float_output(stm32_port_expander_1, 28)};
outputs:
- id: float_output_pin_1
- id: float_output_pin_28
min_power: 0.25
max_power: 0.60
light:
- id: dimmerized_light_1
platform: monochromatic
output: float_output_pin_1
name: Dimmerized Light Pin 1
gamma_correct: 0
- id: dimmerized_light_28
platform: monochromatic
output: float_output_pin_28
name: Dimmer module temperature limit
gamma_correct: 0
See Also
--------
- :doc:`/cookbook/arduino_port_extender`
- :ghedit:`Edit`