Ontzettend handig dot-matrix display gekoppeld met wifi en het internet

Het is niet overdreven om te stellen dat je in 2022 prima elektronische prototypes van fancy gadgets in een paar uur kunt realiseren en zo is ook dit leuke apparaatje ontstaan. Uitgerust met vier 8×8 led matrix modules die in serie verbonden zijn met een Wemos D1mini, een leuke 3D geprinte behuizing en wat handige ESPhome-gebaseerde software is dit 32×8 led matrix display een toonbeeld van neo-traditionele functionaliteit.

Het is geen geheim dat ik sinds het uitkomen van de eerste rode 5mm led in 1975 gefascineerd ben door de vele toepassingsmogelijkheden ervan. Rode dot-matrix displays zijn daarom al tientallen jaren geen nieuws meer voor me, maar daar zelf even iets mee knutselen heeft nog nooit iets aan aantrekkingskracht ingeboet. Ik heb een speciale projectdoos met allerlei in de loop der jaren verzamelde leds, led displays en op leds gebaseerde halfproducten, waaronder een voorraadje MAX7219 8*8 Dot Matrix LED Display Modules. Dit zijn kleine (3,2 x 3,2cm) modules met 8×8 leds, die worden aangestuurd door een speciaal IC genaamd MAX7219. Dit IC wordt zelf weer aangestuurd door een microprocessor of microcontroller.

8×8 led matrix module met MAX7219 driver IC; de modules kunnen onderling worden verbonden

Het project bestaat uit de volgende onderdelen:

  • Vier 8×8 led matrix modules met MAX7219 driver
  • Een Wemos D1mini met ESP32 microcontroller
  • Een 3D geprinte behuizing
  • Een USB chassisdeel voor de stroomverzorging van D1mini en led displays
  • Software in ESPhome

De software is als volgt geworden:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# MAX7219 matrix clock 4 x 64 pixels
# ORANJE / GRIJS
 
esphome:
  name: esphome-web-180e68
 
esp8266:
  board: d1_mini
  restore_from_flash: true
 
# Enable logging
logger:
  level: debug
 
# Enable Home Assistant API
api:
 
ota:
 
 
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
 
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esphome-Web-180E68"
    password: !secret wifi_ap_password
 
captive_portal:
 
globals:
  - id: shpm_internal
    type: float
    restore_value: yes
    initial_value: "0.0000"
 
sensor:
  - platform: homeassistant
    name: "Passanten"
    id: passanten
    entity_id: counter.passanten_voorzijde
    accuracy_decimals: 0
    internal: true
  - platform: homeassistant
    name: "Gas verbruikt totaal"
    id: gas_totaal
    entity_id: sensor.totaal_gasconsumptie
    internal: true
    accuracy_decimals: 3
    unit_of_measurement: "m³"
  - platform: homeassistant
    name: "Gas verbruikt vandaag"
    id: gas_vandaag
    entity_id: sensor.daily_gas_usage
    internal: true
    accuracy_decimals: 3
    unit_of_measurement: "m³"
  - platform: homeassistant
    name: "Zonnecellen energieproductie"
    id: zonnecellen_productie
    entity_id: sensor.huidige_elektriciteitsproductie
    internal: true
    accuracy_decimals: 3
  - platform: homeassistant
    name: "Net energieconsumptie"
    id: afname_energienet
    entity_id: sensor.huidige_elektriciteitsconsumptie
    internal: true
    accuracy_decimals: 3
  - platform: template
    name: "Netto productie"
    id: netto_productie
    internal: true
    accuracy_decimals: 3
    lambda: |-
      if (id(zonnecellen_productie).state > 0) {
        return id(zonnecellen_productie).state;
      } else {
        return 0 - id(afname_energienet).state;
      }
  - platform: homeassistant
    name: "SolarEdge productie"
    id: solaredge_productie
    entity_id: sensor.solaredge_current_power
    internal: true
    accuracy_decimals: 4
  - platform: homeassistant
    name: "SolarEdge productie vandaag"
    id: solaredge_productie_vandaag
    entity_id: sensor.solaredge_energy_today
    internal: true
    accuracy_decimals: 2
  - platform: homeassistant
    name: "Dremel 3D45 Print Voortgang"
    id: dremel_3d45_progress
    entity_id: sensor.dremel_3d45_progress
    internal: true
    accuracy_decimals: 1
    unit_of_measurement: "%"
  - platform: template
    name: "SolarEdge Historical Maximum Power Output"
    id: solaredge_historical_power_max
    unit_of_measurement: "W"
    accuracy_decimals: 4
    lambda: |-
      if (id(solaredge_productie).state > id(shpm_internal)) {
        id(shpm_internal) = id(solaredge_productie).state;
      }
      return id(shpm_internal);
  - platform: homeassistant
    name: "Gaskosten vandaag"
    id: kosten_gas_vandaag
    entity_id: sensor.gasverbruikskosten_vandaag
    unit_of_measurement: "€"
    accuracy_decimals: 2
    internal: true
  - platform: homeassistant
    name: "Dremel 3D45 Resterend"
    id: dremel_3d45_resterend
    entity_id: sensor.dremel_3d45_remaining_print_time_human_readable
    internal: true
 
# https://www.energievergelijk.nl/energieprijzen
 
spi:
  clk_pin: D0
  mosi_pin: D1
 
# pixelmix.ttf toont prima in 6 punten, maar enkele cijfers vertonen 'gaten', 8 punten is 'native'
# monobit.ttf werkt niet bij 6 punten
# slkscr.ttf toont okee bij 8 punten maar heeft een rare horizontale spatiëring
 
font:
    # Mooie volle letters voor klokweergave
  - file: "fonts/eight-bit-dragon.ttf"
    id: dragon_font
    size: 8
    glyphs: '.,:0123456789abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    # Nette 3x6 font voor kleine teksten en getallen
  - file: "fonts/uncle_lee3x6.ttf"
    id: uncle_lee_font
    size: 11
    glyphs: '€-.,:%0123456789abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    # Nette 3x6 font voor kleine teksten en getallen
  - file: "fonts/Toy.ttf"
    id: toy_font
    size: 16
    glyphs: '€-.,:0123456789abcdefghijklmnopqrstuvwxyz'
 
time:
  - platform: sntp
    id: ntptime
 
display:
  - platform: max7219digit
    id: multidisplay
    cs_pin: D2
    num_chips: 4
    intensity: 5
    update_interval: 500ms
    lambda: |-
      //it.strftime(16, 4, id(dragon_font), TextAlign::CENTER, "%H:%M", id(ntptime).now());
      //it.printf(33, 4, id(uncle_lee_font), TextAlign::CENTER_RIGHT, "%.1f W", id(solaredge_productie).state);
      it.printf(33, 4, id(uncle_lee_font), TextAlign::CENTER_RIGHT, "%.1f kWh", id(solaredge_productie_vandaag).state);
      // it.printf(33, 2, id(toy_font), TextAlign::CENTER_RIGHT, "€%.2f", id(kosten_gas_vandaag).state);
      //it.printf(33, 4, id(uncle_lee_font), TextAlign::CENTER_RIGHT, "3D %.1f%%",  id(dremel_3d45_progress).state);
      //it.printf(it.get_width(), 4, id(uncle_lee_font), TextAlign::CENTER_RIGHT, "%s", id(dremel_3d45_resterend).state);

Plaats een reactie