I recently bought a Vevor 100" electric projection screen for €160 after our old manual screen broke down. With the new(ish) radio frequency integration I thought this would be a nice project to automate. Bought a CC1101 module, connected it to a ESP32-C3 SuperMini and used this ESPHome config to log the codes of the remote. Had to fiddle around a bit, I was expecting the remote to be 433Mhz but it was 315Mhz. Anyways, here's the ESPHome config I'm using now to control the screen, might help someone else!
esphome:
name: projector-screen
friendly_name: Projector Screen
on_boot:
priority: -100
then:
- cc1101.begin_rx: cc1101_module
esp32:
board: esp32-c3-devkitm-1
framework:
type: arduino
logger:
level: INFO
api:
ota:
- platform: esphome
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# ESP32-C3 SuperMini <-> CC1101
#
# CC1101 3.3V -> ESP32-C3 3V3
# CC1101 GND -> ESP32-C3 GND
# CC1101 SCK -> ESP32-C3 GPIO4
# CC1101 MOSI -> ESP32-C3 GPIO6
# CC1101 GCD1 -> ESP32-C3 GPIO5 # MISO / GDO1 / SO
# CC1101 CSN -> ESP32-C3 GPIO7
# CC1101 GDO2 -> ESP32-C3 GPIO3 # RX
# CC1101 GDO0 -> ESP32-C3 GPIO10 # TX
spi:
clk_pin: GPIO4
mosi_pin: GPIO6
miso_pin: GPIO5
cc1101:
id: cc1101_module
cs_pin: GPIO7
frequency: 315MHz
output_power: 10
modulation_type: ASK/OOK
symbol_rate: 2000
filter_bandwidth: 200kHz
remote_receiver:
id: rf_receiver
pin:
number: GPIO3
mode:
input: true
pullup: false
pulldown: false
tolerance: 60%
filter: 50us
idle: 30ms
remote_transmitter:
id: rf_transmitter
pin: GPIO10
carrier_duty_percent: 100%
non_blocking: true
on_transmit:
then:
- cc1101.begin_tx: cc1101_module
on_complete:
then:
- cc1101.begin_rx: cc1101_module
script:
# Screen UP / retract
- id: screen_up
mode: restart
then:
- remote_transmitter.transmit_raw:
transmitter_id: rf_transmitter
code:
[
215,
-5909,
213,
-545,
592,
-173,
602,
-172,
601,
-173,
601,
-173,
601,
-195,
186,
-579,
196,
-578,
195,
-576,
195,
-550,
196,
-573,
586,
-208,
193,
-557,
607,
-191,
571,
-177,
204,
-574,
591,
-172,
208,
-576,
196,
-578,
588,
-182,
193,
-582,
187,
-579,
582,
-189,
193,
-578,
]
repeat:
times: 10
wait_time: 0ms
# Screen STOP
- id: screen_stop
mode: restart
then:
- remote_transmitter.transmit_raw:
transmitter_id: rf_transmitter
code:
[
171,
-5939,
189,
-577,
554,
-197,
585,
-196,
583,
-196,
580,
-196,
580,
-197,
187,
-579,
196,
-581,
172,
-602,
181,
-577,
192,
-577,
584,
-184,
193,
-578,
584,
-197,
564,
-196,
189,
-582,
590,
-194,
186,
-578,
196,
-579,
564,
-207,
576,
-210,
193,
-553,
208,
-559,
197,
-582,
]
repeat:
times: 10
wait_time: 0ms
# Screen DOWN / deploy
- id: screen_down
mode: restart
then:
- remote_transmitter.transmit_raw:
transmitter_id: rf_transmitter
code:
[
188,
-5918,
201,
-571,
590,
-196,
580,
-172,
601,
-196,
579,
-196,
579,
-196,
185,
-578,
197,
-580,
181,
-578,
181,
-583,
213,
-569,
570,
-196,
186,
-580,
591,
-181,
577,
-210,
193,
-578,
565,
-198,
195,
-565,
196,
-583,
564,
-207,
192,
-583,
583,
-188,
192,
-567,
197,
-582,
]
repeat:
times: 10
wait_time: 0ms
button:
- platform: template
name: "Projector Screen Up"
icon: mdi:arrow-up-bold
on_press:
- script.execute: screen_up
- platform: template
name: "Projector Screen Stop"
icon: mdi:stop
on_press:
- script.execute: screen_stop
- platform: template
name: "Projector Screen Down"
icon: mdi:arrow-down-bold
on_press:
- script.execute: screen_down
cover:
- platform: template
name: "Projector Screen"
id: projector_screen
device_class: blind
optimistic: true
assumed_state: true
# Home Assistant "open" = screen retracts upward/out of the way.
open_action:
- script.execute: screen_up
# Home Assistant "close" = screen comes down/deploys.
close_action:
- script.execute: screen_down
stop_action:
- script.execute: screen_stop