Skip to content

Instantly share code, notes, and snippets.

@Nizzle
Last active October 11, 2025 16:54
Show Gist options
  • Select an option

  • Save Nizzle/6971c2cc066e6412740487bcc3b2c62a to your computer and use it in GitHub Desktop.

Select an option

Save Nizzle/6971c2cc066e6412740487bcc3b2c62a to your computer and use it in GitHub Desktop.
ESPhome config for SHA2017 badge (https://wiki.sha2017.org/w/Projects:Badge)
esphome:
name: shabadge
esp32:
board: esp32-pro
logger:
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_pass
ota:
password: !secret ota_pass
api:
id: hassapi
password: !secret api_pass
i2c:
sda: 26
scl: 27
scan: True
mpr121:
id: mpr121_component
address: 0x5A
touch_debounce: 1
release_debounce: 1
touch_threshold: 12
release_threshold: 6
binary_sensor:
- platform: mpr121
id: touch_buttonA
channel: 0
name: "Touch Button A"
- platform: mpr121
id: touch_buttonB
channel: 1
name: "Touch Button B"
- platform: mpr121
id: touch_buttonStart
channel: 2
name: "Touch Button Start"
- platform: mpr121
id: touch_buttonSelect
channel: 3
name: "Touch Button Select"
- platform: mpr121
id: touch_buttonDown
channel: 4
name: "Touch Button Down"
- platform: mpr121
id: touch_buttonRight
channel: 5
name: "Touch Button Right"
- platform: mpr121
id: touch_buttonUp
channel: 6
name: "Touch Button Up"
- platform: mpr121
id: touch_buttonLeft
channel: 7
name: "Touch Button Left"
- platform: mpr121
id: charging_status
channel: 9
name: "Charging Status"
- platform: gpio
name: "Flash Button"
pin: 0
filters:
- invert:
sensor:
- platform: adc
pin: 34
attenuation: 6db
filters:
- multiply: 2.91
name: "USB Voltage"
update_interval: 20s
accuracy_decimals: 1
- platform: adc
pin: 35
attenuation: 6db
#attenuation: 2.5db
filters:
- multiply: 2.91
#- multiply: 1.95
name: "Battery Voltage"
update_interval: 20s
accuracy_decimals: 1
- platform: uptime
name: Uptime Sensor
id: uptime_sensor
update_interval: 1s
on_raw_value:
then:
- text_sensor.template.publish:
id: uptime_human
state: !lambda |-
int seconds = round(id(uptime_sensor).raw_state);
int days = seconds / (24 * 3600);
seconds = seconds % (24 * 3600);
int hours = seconds / 3600;
seconds = seconds % 3600;
int minutes = seconds / 60;
seconds = seconds % 60;
return (
(days ? to_string(days) + "d " : "") +
(hours ? to_string(hours) + "h " : "") +
(minutes ? to_string(minutes) + "m " : "") +
(to_string(seconds) + "s")
).c_str();
spi:
clk_pin: 18
mosi_pin: 5
text_sensor:
- platform: version
id: ver
hide_timestamp: true
- platform: template
name: Uptime Human Readable
id: uptime_human
icon: mdi:clock-start
display:
- platform: waveshare_epaper
cs_pin: 19
dc_pin: 21
busy_pin: 22
reset_pin: 23
model: 2.90in-dke
#Partial not working yet so full only
full_update_every: 1
update_interval: 5s
lambda: |-
it.printf(0, 0, id(font40), "%s", id(ver).state.c_str());
it.printf(0, 40, id(font40), "%s", id(uptime_human).state.c_str());
rotation: 270
external_components:
- source:
type: git
url: https://github.com/Nizzle/esphome
ref: dke2.9-epaper
components: [ waveshare_epaper ]
font:
- file: "Fonts/Comfortaa-Regular.ttf"
id: font40
size: 40
@morris2009
Copy link

morris2009 commented Oct 14, 2024

@polyfloyd
** Edit: have no been able to get the LED's working (config below)

Haven't been able to get the LEDs working yet, unfortunately.

But for reference to add to @Nizzle his git repository, you can use the buzzer if you ever need to. You'd have to give up the is_charging sensor though (channel 9 on the mpr121), because in esphome the mpr121 touch sensors can only be enabled as a range. And the power to the buzzer is channel 8 which i used as GPIO output, similar as channel 10 (apparantly for enabling the power to the LEDstrip).
You might be able to directly access the GPIO in a switch section, or a button section, but I am not that good in writing yaml. In this way you can use automations in home assistant to trigger the buzzer, or even to trigger it when a sensor is too high, via lambda's independent of home assistant.

the following is the code i used for the buzzer

output:
  - id: buzzer_power
    platform: gpio
    pin:
      mpr121: mpr121_component
      number: 8
      mode: OUTPUT

button:
  - platform: output
    name: buzzer
    output: buzzer_power
    duration: 4000ms
    icon: mdi:vibrate

And this is the correct config for the 6 LED's. i guess there is still something to gain by setting up each led as a separate partition to gain full advantage.

  - platform: neopixelbus
    type: GRBW
    variant: sk6812
    pin: 32
    num_leds: 6
    name: badge_leds

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment