
De LD2410C is een mmWave-aanwezigheids-/bewegingssensor die erg goedkoop en breed verkrijgbaar is. Met een beetje hulp en begrip is het een GEWELDIG alternatief voor infrarood- en ultrasone detectoren. Voor die prijs is hij geschikt voor alles, van het detecteren van menselijke aanwezigheid/beweging in vrij grote ruimtes tot het regelen van de verlichting in opslagruimtes en kasten.
Ik heb EINDELOOS veel tijd besteed aan het leren gebruiken van dit apparaat, mede door projecten die niet werkten, andere projecten met code achter een betaalmuur en meer.
Commerciële kant-en-klare units
Dus, ik begon mijn zoektocht met apparaten van Apollo Automation, zoals de Apollo Pro-1 mm Sensor en andere producten van hetzelfde bedrijf. Ze zijn GEWELDIG, maar niet goedkoop. Afhankelijk van waar je woont en je budget, kunnen ze uiteindelijk gewoon te duur zijn voor algemeen gebruik in huis.
Daarna ben ik de LD2450 gaan bekijken en uiteindelijk besloot ik de LD2410C uit te proberen na het zien van verschillende YouTube-video’s over dit onderwerp… maar ik liep steeds tegen doodlopende wegen aan – tot nu toe.
En hier zijn we dan… Ik heb een paar LD2410C-modules van AliExpress… simpel gezegd, ze hebben over het algemeen een 5-pins connector met aarde, seriële RX, seriële TX, een uitgang voor een LED en VCC. Voorlopig kunnen we de uitgang negeren en ons concentreren op de 4 pinnen – aarde (GND) is duidelijk, VCC naar 5V, RX en TX.
Standalone gebruik van de LD2410C – zonder ESP
Vervolgens heb ik een FTDI uit de voorraad gehaald (Koop deze hier en steun dit kanaal) – een klein printplaatje dat je in de seriële poort van je computer (of een hub) steekt en dat je 3V3V seriële RX- en TX-signalen geeft, evenals 3V3V- en 5V-uitgangen – ook deze is voor een prikkie verkrijgbaar bij AliExpress. Bij hun CHOICE-items zou je een paar LD2410C’s en een FTDI voor ongeveer 10 euro inclusief verzendkosten moeten kunnen krijgen. Tegenwoordig kies ik meestal voor seriële apparaten zoals FTDI’s met USB-C, omdat ik probeer te standaardiseren op USB-C, maar ik heb wel een paar USB-A naar C-adapters bij de hand, omdat niet al mijn USB-hubs een USB-C-aansluiting hebben.
Hier is in ieder geval een oudere USB-A FTDI aangesloten op een LD2410C-sensor… de FTDI levert de 5V-voeding (ongeveer 79 mA nodig) en ook de seriële RX- en TX-signalen (aangesloten op de LD2410c in omgekeerde volgorde – d.w.z. RX op TX, TX op RX).


Enkele details… als je naar de LD2410C kijkt, zie je rechts het apparaat – de sensorzijde is zichtbaar. Mijn exemplaar is ongeveer 20 mm bij 15 mm. Zoals je ziet heb ik TX, TX, aarde en VCC aangesloten. Dat is alles – voor slechts een paar euro kan dit apparaat, dat bijvoorbeeld met een app of pc communiceert, betrouwbaar de aanwezigheid en beweging van mensen detecteren. Om er iets nuttigs mee te doen, is iets meer werk nodig, maar laten we dat stap voor stap aanpakken.
Aan de rechterkant detecteert het apparaat objecten recht vooruit tot een hoek van ongeveer 60 graden en werkt het op een afstand van enkele centimeters tot enkele meters – hoewel mijn ervaring tot nu toe suggereert dat 20 cm naar buiten het beste werkt. Oh ja, de LD2410C wordt warm tijdens gebruik. Hieronder zie je een beter beeld van mijn FTDI en de aansluitingen.

Hopelijk maken de bovenstaande afbeeldingen de verbanden duidelijk. Ik heb een video (hieronder – ingesloten) gemaakt die bij dit artikel hoort en hopelijk helpen die twee je op weg om deze apparaten te gebruiken. Terzijde, de LD2410C heeft een lichtsensor. Die kan handig zijn als aanwezigheidssensor in een ruimte voor lichtregeling, om te voorkomen dat de lichten aangaan als het buiten al licht is. Daar ga ik hier niet verder op in.
Wees niet zuinig – een ESP32 S3 Mini kost slechts 3 euro (of het equivalent daarvan) in China.
Een video van Dronebot Workshop heeft me uiteindelijk op weg geholpen – dank aan de eigenaar daarvoor – hier is zijn video ter referentie. Er zijn twee manieren om met de LD2410C te communiceren: via Bluetooth of via de seriële pinnen. Ik begin met de laatste. In een blogpost bij de bovenstaande video noemt de schrijver een gratis EXE-tool van de fabrikant van de LD2410C die Bluetooth gebruikt. Hieronder de 3 jaar oude versie van die tool:
HLK-LD-KIT-V2.0.rar
HLK-LD2410 user manual V1.02
HLK-LD2410 Serial Communication Protocol V1.02
LD2410_Tool_EN_(english-version).zip
En de link op de Google Drive. Zie het laatste item in de bovenstaande link.

Op mijn pc heb ik deze tool geprobeerd en hij werkt – zie bovenstaande afbeelding.
Maar dat gaat ervan uit dat je een pc gebruikt… en het is maar ZO nuttig – dus ik geef de voorkeur aan de webgebaseerde online tool die ook in de video wordt beschreven. Maar eerst – zowel de tool rechts als de webtool moeten met je FTDI communiceren via de seriële poort die wordt aangemaakt wanneer deze is aangesloten op je pc of wat dan ook. Het werkend krijgen van FTDI’s valt buiten het bestek van dit artikel – bij mij lijken ze altijd direct te werken.
Ik sluit ze gewoon aan op een USB-hub die is verbonden met mijn pc en er verschijnt als bij toverslag een nieuwe seriële poort. Dat is de poort waarop je verbinding maakt met het enkele .EXE-programma dat hierboven rechts wordt getoond – en met de bedrading die ik hierboven heb laten zien, zou je, na het klikken op CONNECT met de standaard baudrate van 25600, direct iets moeten zien gebeuren.
Ik ga echter direct naar de webtool, omdat ik de bovenstaande uitleg niet zo intuïtief vond. De webtool moet namelijk ook verbinding maken met de seriële poort die door de FTDI is aangemaakt. Hier is de link, dit keer niet voor een download, maar direct naar de webgebaseerde LD2410 Configurator. En hier zie je het in actie – mijn video laat dit allemaal grafisch zien en hopelijk zie je aan de hand van de video hoe makkelijk het is om met de LD2410C aan de slag te gaan.

Na het laden van de pagina – en met uw FTDI aangesloten op uw computer en op de LD2450C – zou u dit moeten zien.
Ik heb het vakje “Geavanceerde verbindingsopties weergeven” niet aangevinkt, ik heb gewoon een poort gekozen zoals hierboven weergegeven – en verbinding gemaakt.
Op dit punt was alles operationeel. Nu zien we de volledige hoofdpagina van de LD2410 Configurator – met live aanwezigheidsdetectie in het blauwe vak linksboven en beweging in het rode vak ernaast – zoals hieronder weergegeven. Ik ga hier in de video dieper op in.
Door simpelweg naar het onderstaande paneel te kijken en misschien wat met de bedieningselementen rechtsboven te spelen, krijg je hopelijk een idee van wat de LD2410C kan (en wat de beperkingen ervan zijn – de waarden hebben de neiging om wat te fluctueren, dus in de praktijk is een beetje filteren handig).

De volgende stap, waar ik later op terugkom (aangezien niet iedereen ESPHOME en Home Assistant gebruikt), is om die gegevens in een bruikbare vorm te krijgen. In het artikel van DronebotWorkshop wordt uitgelegd hoe je Arduino met de LD2410C kunt gebruiken en wordt ook de HLKRadarTool-app voor Android genoemd. Als je naar het bovenstaande bedieningsscherm kijkt, zie je dat je Bluetooth op het apparaat via die webpagina kunt in- en uitschakelen. Toen ik het inschakelde, verscheen de LD2410C in de app die ik uit de Android Play Store had gedownload, maar persoonlijk besloot ik om bij de bovenstaande webpagina te blijven en de officiële ESPHOME-website te raadplegen, waar ze de code voor de LD2410C uitleggen.
De basis is achter de rug – nu komt het echte werk!
NU, als je dat allemaal hebt doorstaan!!!! GEFELICITEERD!!!! Je hebt de juiste keuze gemaakt, want na meer dan een dag te hebben verspild aan een ESP32-C3-bord dat werkte met licht aangepaste standaard ESP-HOME LD2410-code – op zich al spannend – probeerde ik vandaag een ESP32-S3. Nadat ik erachter kwam dat ik willekeurig pinnen GPIO9 en 10 had gekozen voor RX en TX, en ze niet alleen verkeerd om had aangesloten, maar ook fysiek pinnen 8 en 9 had verbonden, kreeg ik de code eindelijk niet alleen werkend in ESP-HOME, maar verscheen deze OOK op magische wijze in Home Assistant. En daar begint de ECHTE magie…
Keuze van ESP, mogelijkheden en beperkingen
Een paar dingen om te beginnen: ik weet zeker dat er een reden is waarom de C3 zich zo lastig gedraagt, daar kom ik nog een keer op terug. Ten tweede is het belangrijk om te weten dat je op de ESP32-borden de standaard UART1 niet kunt gebruiken. Uiteindelijk heb ik gewoon GPIO9 en GPIO10 gekozen, omdat die pinnen in een lijst staan die als UART’s gebruikt kunnen worden. Ik heb NIETS meer gedaan dan GPIO9 en GPIO10 specificeren en jawel, een ESP32-S3 mini communiceerde met de LD2410C. En toevallig heeft de S3 Mini een WS2812B LED op pin 48. Dat is mijn volgende project… visuele afstandsindicatie, zoals ik die gebruik op mijn Apollo-units.
In mijn geval had ik ook problemen (en dat had ik al heel lang) met het maken van projecten op mijn hoofd-pc terwijl Home Assistant en dus ESP-HOME op een andere machine draaiden… al die problemen verdwenen toen ik verder ging zoals voorheen, maar voor de eerste flash de controls liet compileren op de machine waarop ESP-HOME draait – en het board op diezelfde machine aansloot – voilà. Oh, en het toewijzen van een vast IP-adres (een willekeurig vrij adres) aan de chip garandeert een betere flash-ervaring.
Ik zet alle code hier online, geen betaalmuren, geen ontbrekende onderdelen…
En als voorproefje: de code…
De code als voorbeeld
(Deze is zonder de WS2812B LED code)
|
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 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 |
esphome: name: s3-radar friendly_name: LD2410_radar_ESP32-C3-Mini esp32: board: esp32c3 framework: type: arduino # Enable logging logger: # Enable Home Assistant API api: encryption: key: !secret api_encryption_key ota: - platform: esphome password: !secret ota_password wifi: ssid: !secret wifi_ssid password: !secret wifi_password manual_ip: # Static IP settings static_ip: 10.0.0.222 # Your desired static IP address gateway: 10.0.0.138 # Your router's IP address subnet: 255.255.255.0 # Your network's subnet mask # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: LD2410C-ESP32-Mini password: !secret ap_password captive_portal: web_server: port: 80 auth: username: !secret web_server_username password: !secret web_server_password mqtt: broker: !secret mqtt_broker username: !secret mqtt_username password: !secret mqtt_password # --------------------------------------------------------------------------------- light: - platform: binary name: "Blue Status Light" output: light_output id: led_light restore_mode: ALWAYS_OFF output: - platform: gpio pin: GPIO2 id: light_output uart: id: ld2410_uart tx_pin: GPIO10 # TX rx_pin: GPIO9 # RX baud_rate: 256000 parity: NONE stop_bits: 1 ld2410: uart_id: ld2410_uart id: ld2410_comp select: - platform: ld2410 distance_resolution: name: distance resolution baud_rate: name: baud rate light_function: name: light function out_pin_level: name: out pin level button: - platform: ld2410 factory_reset: name: "factory reset" restart: name: "restart" query_params: name: query params number: - platform: ld2410 timeout: name: timeout max_move_distance_gate: name: max move distance gate max_still_distance_gate: name: max still distance gate g0: move_threshold: name: g0 move threshold still_threshold: name: g0 still threshold g1: move_threshold: name: g1 move threshold still_threshold: name: g1 still threshold g2: move_threshold: name: g2 move threshold still_threshold: name: g2 still threshold g3: move_threshold: name: g3 move threshold still_threshold: name: g3 still threshold g4: move_threshold: name: g4 move threshold still_threshold: name: g4 still threshold g5: move_threshold: name: g5 move threshold still_threshold: name: g5 still threshold g6: move_threshold: name: g6 move threshold still_threshold: name: g6 still threshold g7: move_threshold: name: g7 move threshold still_threshold: name: g7 still threshold g8: move_threshold: name: g8 move threshold still_threshold: name: g8 still threshold light_threshold: name: light threshold text_sensor: - platform: ld2410 version: name: "presence sensor version" mac_address: name: "presence sensor mac address" switch: - platform: ld2410 engineering_mode: name: "engineering mode" bluetooth: name: control Bluetooth sensor: - platform: internal_temperature name: "Internal Temperature" - platform: ld2410 moving_distance: name: "Moving distance (cm)" still_distance: name: "Still Distance (cm)" moving_energy: name: "Move Energy (%)" still_energy: name: "Still Energy (%)" detection_distance: name: "Distance Detection (cm)" g0: move_energy: name: g0 move energy still_energy: name: g0 still energy g1: move_energy: name: g1 move energy still_energy: name: g1 still energy g2: move_energy: name: g2 move energy still_energy: name: g2 still energy g3: move_energy: name: g3 move energy still_energy: name: g3 still energy g4: move_energy: name: g4 move energy still_energy: name: g4 still energy g5: move_energy: name: g5 move energy still_energy: name: g5 still energy g6: move_energy: name: g6 move energy still_energy: name: g6 still energy g7: move_energy: name: g7 move energy still_energy: name: g7 still energy g8: move_energy: name: g8 move energy still_energy: name: g8 still energy light: name: light binary_sensor: - platform: ld2410 has_target: name: Presence has_moving_target: name: Moving Target has_still_target: name: Still Target |
De bovenstaande code was mijn eerste poging en bevatte geen WS2812B-code – alleen de LD2450C.
En nu, met behulp van ChatGPT, heb ik mijn eerdere pogingen – de onderstaande code – voor de ESP32-S3 met RGB-led op GPIO48 en de LD2410C overtroffen… nu verandert de ingebouwde RGB-led van kleur afhankelijk van de afstand… ALLEMAAL BINNEN het ESP32-S3-bord met ESP-HOME – helemaal zonder Home Assistant. MAGIE. Hier is het… Ik heb de blauwe led losgekoppeld, ik kan dat eerste led-platform net zo goed uiteindelijk weggooien…
platform: binary
name: “Blue Status Light”
output: light_output
id: led_light
restore_mode: ALWAYS_OFF
De code met de WS2812B LED als voorbeeld
|
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 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 |
esphome: name: s3-radar friendly_name: LD2410_radar_ESP32-C3-Mini esp32: board: esp32c3 framework: type: arduino # Enable logging logger: # Enable Home Assistant API api: encryption: key: !secret api_encryption_key ota: - platform: esphome password: !secret ota_password wifi: ssid: !secret wifi_ssid password: !secret wifi_password manual_ip: # Static IP settings static_ip: 10.0.0.222 # Your desired static IP address gateway: 10.0.0.138 # Your router's IP address subnet: 255.255.255.0 # Your network's subnet mask # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: LD2410C-ESP32-Mini password: !secret ap_password captive_portal: web_server: port: 80 auth: username: !secret web_server_username password: !secret web_server_password mqtt: broker: !secret mqtt_broker username: !secret mqtt_username password: !secret mqtt_password # ---------------------------------------------------------------------------------light: - platform: binary name: "Blue Status Light" output: light_output id: led_light restore_mode: ALWAYS_OFF - platform: neopixelbus type: GRB variant: WS2812 pin: GPIO48 num_leds: 1 name: "NeoPixel Light" id: neo_pixel_light output: - platform: gpio pin: GPIO2 id: light_output uart: id: ld2410_uart tx_pin: GPIO10 rx_pin: GPIO9 baud_rate: 256000 parity: NONE stop_bits: 1 ld2410: uart_id: ld2410_uart id: ld2410_comp select: - platform: ld2410 distance_resolution: name: distance resolution baud_rate: name: baud rate light_function: name: light function out_pin_level: name: out pin level button: - platform: ld2410 factory_reset: name: "factory reset" restart: name: "restart" query_params: name: query params number: - platform: ld2410 timeout: name: timeout max_move_distance_gate: name: max move distance gate max_still_distance_gate: name: max still distance gate g0: move_threshold: name: g0 move threshold still_threshold: name: g0 still threshold g1: move_threshold: name: g1 move threshold still_threshold: name: g1 still threshold g2: move_threshold: name: g2 move threshold still_threshold: name: g2 still threshold g3: move_threshold: name: g3 move threshold still_threshold: name: g3 still threshold g4: move_threshold: name: g4 move threshold still_threshold: name: g4 still threshold g5: move_threshold: name: g5 move threshold still_threshold: name: g5 still threshold g6: move_threshold: name: g6 move threshold still_threshold: name: g6 still threshold g7: move_threshold: name: g7 move threshold still_threshold: name: g7 still threshold g8: move_threshold: name: g8 move threshold still_threshold: name: g8 still threshold light_threshold: name: light threshold text_sensor: - platform: ld2410 version: name: "presence sensor version" mac_address: name: "presence sensor mac address" switch: - platform: ld2410 engineering_mode: name: "engineering mode" bluetooth: name: control Bluetooth sensor: - platform: internal_temperature name: "Internal Temperature" - platform: ld2410 moving_distance: name: "Moving distance (cm)" still_distance: name: "Still Distance (cm)" id: still_distance_sensor moving_energy: name: "Move Energy (%)" still_energy: name: "Still Energy (%)" detection_distance: name: "Distance Detection (cm)" g0: move_energy: name: g0 move energy still_energy: name: g0 still energy g1: move_energy: name: g1 move energy still_energy: name: g1 still energy g2: move_energy: name: g2 move energy still_energy: name: g2 still energy g3: move_energy: name: g3 move energy still_energy: name: g3 still energy g4: move_energy: name: g4 move energy still_energy: name: g4 still energy g5: move_energy: name: g5 move energy still_energy: name: g5 still energy g6: move_energy: name: g6 move energy still_energy: name: g6 still energy g7: move_energy: name: g7 move energy still_energy: name: g7 still energy g8: move_energy: name: g8 move energy still_energy: name: g8 still energy light: name: light binary_sensor: - platform: ld2410 has_target: name: Presence has_moving_target: name: Moving Target has_still_target: name: Still Target # ------------------------------------------------------------------------------- # Local LED colour control based on still distance interval: - interval: 2s then: - lambda: |- float dist = id(still_distance_sensor).state; ESP_LOGD("neo", "Still distance = %.1f cm", dist); if (dist <= 0) { // Turn off via ESPHome action auto call = id(neo_pixel_light).make_call(); call.set_state(false); call.perform(); return; } // Decide colour float r = 0.0, g = 0.0, b = 0.0; if (dist < 100) { r = 0.0; g = 1.0; b = 0.0; } // Green else if (dist < 200) { r = 1.0; g = 1.0; b = 0.0; } // Yellow else if (dist < 300) { r = 1.0; g = 0.5; b = 0.0; } // Orange else if (dist < 400) { r = 1.0; g = 0.0; b = 0.0; } // Red else { r = 0.0; g = 0.0; b = 1.0; } // Blue // Turn on NeoPixel via ESPHome light action auto call = id(neo_pixel_light).make_call(); call.set_state(true); call.set_rgb(r,g,b); call.set_brightness(1.0); call.perform(); |
Heb je gezien dat ik in de bovenstaande code (bijna aan het begin) ben overgeschakeld naar het Arduino-framework?
Dat bleek een probleem te zijn met mijn ESP-HOME-installatie, die nog wat verouderde code bevatte. Ik stuitte op hetzelfde probleem met de ESP-C6 (ook een fijn board met een RGB-led, maar deze keer op GPIO8). Uiteindelijk vonden we een oplossing: de ESP-HOME-add-in verwijderen en opnieuw installeren (simpelweg), hoewel ik uiteindelijk toch bij het Arduino-framework ben gebleven, zonder specifieke reden. Het simpelweg verwijderen en opnieuw installeren wist de cache en is onschadelijk (je verliest je eerdere werk niet), waarna het ESP-IDF-framework weer werkt. Ik ontdekte dit toen ik de C6 probeerde en te horen kreeg dat het Arduino-framework de C6 niet ondersteunt. Dus ik heb de sprong gewaagd – en na het opnieuw toevoegen van ESP-HOME kon ik de C6 met esp-idf gebruiken, waarbij ik de LED naar GPIO8 verplaatste – maar toen werkte de originele Neopixel-bus niet meer met de C6, dus heb ik de WS2812-instellingen aangepast om het esp32_rmt_led_strip-platform te gebruiken met iets andere parameters – ik vermoed dat dat wel werkt met de oudere boards.
Hier is de code voor de ESP32-C6… met een paar aanpassingen aan de afstanden en dat rare blauwe lampje uitgeschakeld…
|
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 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 |
esphome: name: s3-radar friendly_name: LD2410_radar_ESP32-C3-Mini esp32: board: esp32c3 framework: type: arduino # Enable logging logger: # Enable Home Assistant API api: encryption: key: !secret api_encryption_key ota: - platform: esphome password: !secret ota_password wifi: ssid: !secret wifi_ssid password: !secret wifi_password manual_ip: # Static IP settings static_ip: 10.0.0.222 # Your desired static IP address gateway: 10.0.0.138 # Your router's IP address subnet: 255.255.255.0 # Your network's subnet mask # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: LD2410C-ESP32-Mini password: !secret ap_password captive_portal: web_server: port: 80 auth: username: !secret web_server_username password: !secret web_server_password mqtt: broker: !secret mqtt_broker username: !secret mqtt_username password: !secret mqtt_password # --------------------------------------------------------------------------------- light: # - platform: binary # name: "Blue Status Light" # output: light_output # id: led_light # restore_mode: ALWAYS_OFF - platform: esp32_rmt_led_strip rgb_order: GRB pin: GPIO8 num_leds: 1 chipset: WS2812 name: "NeoPixel Light" id: neo_pixel_light #output: # - platform: gpio # pin: GPIO2 # id: light_output uart: id: ld2410_uart tx_pin: GPIO6 rx_pin: GPIO7 baud_rate: 256000 parity: NONE stop_bits: 1 ld2410: uart_id: ld2410_uart id: ld2410_comp select: - platform: ld2410 distance_resolution: name: distance resolution baud_rate: name: baud rate light_function: name: light function out_pin_level: name: out pin level button: - platform: ld2410 factory_reset: name: "factory reset" restart: name: "restart" query_params: name: query params number: - platform: ld2410 timeout: name: timeout max_move_distance_gate: name: max move distance gate max_still_distance_gate: name: max still distance gate g0: move_threshold: name: g0 move threshold still_threshold: name: g0 still threshold g1: move_threshold: name: g1 move threshold still_threshold: name: g1 still threshold g2: move_threshold: name: g2 move threshold still_threshold: name: g2 still threshold g3: move_threshold: name: g3 move threshold still_threshold: name: g3 still threshold g4: move_threshold: name: g4 move threshold still_threshold: name: g4 still threshold g5: move_threshold: name: g5 move threshold still_threshold: name: g5 still threshold g6: move_threshold: name: g6 move threshold still_threshold: name: g6 still threshold g7: move_threshold: name: g7 move threshold still_threshold: name: g7 still threshold g8: move_threshold: name: g8 move threshold still_threshold: name: g8 still threshold light_threshold: name: light threshold text_sensor: - platform: ld2410 version: name: "presence sensor version" mac_address: name: "presence sensor mac address" switch: - platform: ld2410 engineering_mode: name: "engineering mode" bluetooth: name: control Bluetooth sensor: - platform: internal_temperature name: "Internal Temperature" - platform: ld2410 moving_distance: name: "Moving distance (cm)" still_distance: name: "Still Distance (cm)" id: still_distance_sensor moving_energy: name: "Move Energy (%)" still_energy: name: "Still Energy (%)" detection_distance: name: "Distance Detection (cm)" g0: move_energy: name: g0 move energy still_energy: name: g0 still energy g1: move_energy: name: g1 move energy still_energy: name: g1 still energy g2: move_energy: name: g2 move energy still_energy: name: g2 still energy g3: move_energy: name: g3 move energy still_energy: name: g3 still energy g4: move_energy: name: g4 move energy still_energy: name: g4 still energy g5: move_energy: name: g5 move energy still_energy: name: g5 still energy g6: move_energy: name: g6 move energy still_energy: name: g6 still energy g7: move_energy: name: g7 move energy still_energy: name: g7 still energy g8: move_energy: name: g8 move energy still_energy: name: g8 still energy light: name: light binary_sensor: - platform: ld2410 has_target: name: Presence has_moving_target: name: Moving Target has_still_target: name: Still Target # ------------------------------------------------------------------------------- # Local LED colour control based on still distance interval: - interval: 2s then: - lambda: |- float dist = id(still_distance_sensor).state; ESP_LOGD("neo", "Still distance = %.1f cm", dist); if (dist <= 0) { // Turn off via ESPHome action auto call = id(neo_pixel_light).make_call(); call.set_state(false); call.perform(); return; } // Decide colour float r = 0.0, g = 0.0, b = 0.0; if (dist < 80) { r = 0.0; g = 1.0; b = 0.0; } // Green else if (dist < 160) { r = 1.0; g = 1.0; b = 0.0; } // Yellow else if (dist < 240) { r = 1.0; g = 0.5; b = 0.0; } // Orange else if (dist < 320) { r = 1.0; g = 0.0; b = 0.0; } // Red else if (dist < 400) { r = 1.0; g = 0.0; b = 1.0; } // purple else if (dist < 480) { r = 0.0; g = 0.0; b = 1.0; } // blue else { r = 0.0; g = 0.0; b = 0.0; } // black // Turn on NeoPixel via ESPHome light action auto call = id(neo_pixel_light).make_call(); call.set_state(true); call.set_rgb(r,g,b); call.set_brightness(1.0); call.perform(); |
De ultieme oplossing en enkele beperkingen
Na wat meer onderzoek bleek dat de ESP32-S3 van deze kleine boards iets meer geheugen heeft. Dus ik koos daarvoor en, gewapend met succes, werd ik ambitieus. Ik dacht dat het leuk zou zijn om een BME280 temperatuur-/druk-/vochtigheidssensor op hetzelfde board te hebben – GEWELDIG idee – twee gadgets in één… maar er was één probleem: de sensor gebruikt een I2C-bibliotheek en haalt ook code op voor (in dit geval niet gebruikte) SPI.
Toen ik mijn nieuwste wonder wilde compileren, weigerde de ESP-HOME-linker. Ik dacht dat de gecombineerde code van de LD2410C en de BME280 misschien te veel was – en ik had gelijk. Ik had echter (zoals gebruikelijk) een basiswebserver in de ESP-HOME-code opgenomen, zodat ik de resultaten in een browser kon bekijken voordat ik controleerde of het apparaat aan Home Assistant was toegevoegd. Door de webserver uit te commentariëren werkte alles weer – ChatGPT zegt dat het tot 300 KB alleen al voor de webserver gebruikt en dat geloof ik wel.
Hier is de code zoals die er nu uitziet, de webserver is uitgeschakeld, maar de rest werkt perfect. Na wat onderzoek lijkt het erop dat er manieren zijn om het codegebruik te minimaliseren, zodat ik mijn webserver weer kan gebruiken – bijvoorbeeld door geen API-versleuteling te gebruiken als alles op een vertrouwd intern netwerk draait. De webserver heeft de grootste impact, gevolgd door het uitschakelen of minimaliseren van logging, het uitschakelen van OTA (eh, nee dank je), de API-encryptie en andere optimalisaties – niets van dat alles hieronder – gewoon geen webserver, dus geen preview op een webpagina… pas het IP-adres aan en gebruik niet alleen DHCP (dynamische adressering)…
Oh, hieronder heb ik de seriële pinnen van de LD2410 aangepast aan de standaard I2C-pinnen van de BME280…
HAH – lastminute wijziging – in plaats van de webserver uit te schakelen, heb ik logging uitgeschakeld door de baudrate van logging op 0 te zetten. Ik kon de webserver daarna weer inschakelen. De beste keuze.
|
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 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 |
esphome: name: s3-radar friendly_name: LD2410_radar_ESP32-C3-Mini esp32: board: esp32c3 framework: type: arduino # Enable logging logger: # Enable Home Assistant API api: encryption: key: !secret api_encryption_key ota: - platform: esphome password: !secret ota_password wifi: ssid: !secret wifi_ssid password: !secret wifi_password manual_ip: # Static IP settings static_ip: 10.0.0.222 # Your desired static IP address gateway: 10.0.0.138 # Your router's IP address subnet: 255.255.255.0 # Your network's subnet mask # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: LD2410C-ESP32-Mini password: !secret ap_password captive_portal: web_server: port: 80 auth: username: !secret web_server_username password: !secret web_server_password mqtt: broker: !secret mqtt_broker username: !secret mqtt_username password: !secret mqtt_password # --------------------------------------------------------------------------------- i2c: sda: GPIO8 scl: GPIO9 scan: true id: bus_a light: - platform: neopixelbus type: GRB variant: WS2812 pin: GPIO48 num_leds: 1 name: "NeoPixel Light" id: neo_pixel_light output: - platform: gpio pin: GPIO2 id: light_output sensor: - platform: bme280_i2c temperature: name: "BME280 Temperature" accuracy_decimals: 0 pressure: name: "BME280 Pressure" accuracy_decimals: 0 humidity: name: "BME280 Humidity" accuracy_decimals: 0 - platform: internal_temperature name: "Internal Temperature" - platform: ld2410 moving_distance: name: "Moving distance (cm)" id: moving_distance_sensor still_distance: name: "Still Distance (cm)" id: still_distance_sensor moving_energy: name: "Move Energy (%)" still_energy: name: "Still Energy (%)" detection_distance: name: "Distance Detection (cm)" g0: move_energy: name: g0 move energy still_energy: name: g0 still energy g1: move_energy: name: g1 move energy still_energy: name: g1 still energy g2: move_energy: name: g2 move energy still_energy: name: g2 still energy g3: move_energy: name: g3 move energy still_energy: name: g3 still energy g4: move_energy: name: g4 move energy still_energy: name: g4 still energy g5: move_energy: name: g5 move energy still_energy: name: g5 still energy g6: move_energy: name: g6 move energy still_energy: name: g6 still energy g7: move_energy: name: g7 move energy still_energy: name: g7 still energy g8: move_energy: name: g8 move energy still_energy: name: g8 still energy light: name: light uart: id: ld2410_uart tx_pin: GPIO11 rx_pin: GPIO10 baud_rate: 256000 parity: NONE stop_bits: 1 ld2410: uart_id: ld2410_uart id: ld2410_comp select: - platform: ld2410 distance_resolution: name: distance resolution baud_rate: name: baud rate light_function: name: light function out_pin_level: name: out pin level button: - platform: ld2410 factory_reset: name: "factory reset" restart: name: "restart" query_params: name: query params number: - platform: ld2410 timeout: name: timeout max_move_distance_gate: name: max move distance gate max_still_distance_gate: name: max still distance gate g0: move_threshold: name: g0 move threshold still_threshold: name: g0 still threshold g1: move_threshold: name: g1 move threshold still_threshold: name: g1 still threshold g2: move_threshold: name: g2 move threshold still_threshold: name: g2 still threshold g3: move_threshold: name: g3 move threshold still_threshold: name: g3 still threshold g4: move_threshold: name: g4 move threshold still_threshold: name: g4 still threshold g5: move_threshold: name: g5 move threshold still_threshold: name: g5 still threshold g6: move_threshold: name: g6 move threshold still_threshold: name: g6 still threshold g7: move_threshold: name: g7 move threshold still_threshold: name: g7 still threshold g8: move_threshold: name: g8 move threshold still_threshold: name: g8 still threshold light_threshold: name: light threshold text_sensor: - platform: ld2410 version: name: "presence sensor version" mac_address: name: "presence sensor mac address" switch: - platform: ld2410 engineering_mode: name: "engineering mode" bluetooth: name: control Bluetooth binary_sensor: - platform: ld2410 has_target: name: Presence has_moving_target: name: Moving Target has_still_target: name: Still Target # ------------------------------------------------------------------------------- # Local LED colour control based on still distance interval: - interval: 2s then: - lambda: |- float dist = id(moving_distance_sensor).state; if (dist <= 0) { // Turn off via ESPHome action auto call = id(neo_pixel_light).make_call(); call.set_state(false); call.perform(); return; } // Decide colour float r = 0.0, g = 0.0, b = 0.0; if (dist < 100) { r = 0.0; g = 1.0; b = 0.0; } // Green else if (dist < 200) { r = 1.0; g = 1.0; b = 0.0; } // Yellow else if (dist < 300) { r = 1.0; g = 0.5; b = 0.0; } // Orange else if (dist < 400) { r = 1.0; g = 0.0; b = 0.0; } // Red else { r = 0.0; g = 0.0; b = 1.0; } // Blue // Turn on NeoPixel via ESPHome light action auto call = id(neo_pixel_light).make_call(); call.set_state(true); call.set_rgb(r,g,b); call.set_brightness(1.0); call.perform(); |
En op bijna magische wijze – in Home Assistant…



Dat is het voorlopig – om hier echt verder mee te gaan, heb ik een ESP met meer geheugen nodig – of veel meer kennis 🙂
Zoals je hierboven kunt zien, werken de sensoren WEL… en die ingebouwde WS2812 RGB-led wordt automatisch aangestuurd – de kleur van het icoon verandert op magische wijze met de afstand. Oorspronkelijk deed ik de aansturing via Home Assistant – en dat kan ook… of niet… Het is meer een extraatje dan een noodzaak. Ik vind het prettig om visuele feedback te hebben over de werking van het apparaat.
Je kunt al die sensoren naar behoefte gebruiken in Home Assistant-automatiseringen. Ik gebruik zelf vaak alleen de sensoren voor ‘bewegend doel’ en ‘stilstaand doel’.
Aanvullingen en opmerkingen zijn welkom.
Koop deze op Aliexpress en steun dit kanaal
Ondersteun mijn website’s, kanaal en inhoud en mijn voortdurende inspanningen via Patreon:
https://patreon.com/Colani
Suc6
Terry van Erp






