Via een artikel in Elektor magazine over het verbeteren van de WiFi-connectie van de ESP32-C3 door een aanpassing aan de antenne (hier) kwam ik op de website van de auteur Peter Neufeld terecht. Zeer interessante artikelen o.a. dus ook over Annex32. Dat van de antenneaanpassing wil ik nog een keer gaan uitproberen.
Op zijn site kwam ik o.a. een interessant artikel tegen over het inzetten van een LD2410L-radarsensor. Ik had zo een module al een tijdje in huis, maar had er nog niet iets mee gedaan. Op mijn werk hebben we namelijk een proef lopen met de inzet van dit soort modules om de aanwezigheid van medewerkers te monitoren rondom flexwerkplekken, waar altijd een groot gebrek aan is. Ik dacht dat wel leuk zou zijn om dat na te bootsen met deze modules.
Hij gebruikt in zijn artikel een M5Stack Atom light ESP32 die blijkbaar twee seriële poorten heeft. In zijn programma gebruikt hij deze tweede poort. En jammer genoeg zit die niet op de ESP die ik heb: ESP32-C3 Super Mini. Ik heb het script aan gepast met GPIO20 (Rx) en GPIO21 (Tx). Maar werken doet het nog (!) niet. Ook een andere module gaf hetzelfde resultaat te zien.
Ik heb Peter om hulp gevraagd.

' HLK-LD2410c_test.bas
' HLK-LD2410 RADAR module from Hi-Link connected to an ESP32
' for very reliable detection of moving or non-moving persons
' - Connected via serial2 to an ESP32 (e.g. M5Stack ATOM matrix ESP32pico with 5x5 neopixel matrix)
' - Switches the radar unit to engineering mode to report more details.
' - Selects the data indicating a moving person (= moving target).
' - Selects the data indicating a non-moving but breathing person (= static target)
' - Creates a Webpage to ..
' -- Visualize the energy of the moving targets in 9 distance ranges by bar graphs
' -- Visualize the energy of the static targets in 7 distance ranges by bar graphs
' -- Visualize the internal detection for a moving target by a LED symbol
' -- Visualize the internal detection for a static target by a LED symbol
Version$ = "1.0" ' DB9JG 2023/03/
RX_pin = 0 'pin for serial2 input comming from LD2410 TX-pin
TX_pin = 1 'pin for serial2 output going to LD2410 RX-pin
toggle = 0
t$ = ""
RADAR$ = ""
RADAR_X$ = ""
Target_state$= ""
count = 0
moving_LED = 1 'green
static_LED = 1 'green
TState = 0
MTDis1 = 0
MTDis2 = 0
ETE_val = 0
STDIS_val1 = 0
STDis_val2 = 0
STE_val = 0
DetDis1 = 0
DetDis2 = 0
MMD_gate = 0
MSD_gate = 0
static_range0=0 : moving_range0=0
static_range1=0 : moving_range1=0
static_range2=0 : moving_range2=0
static_range3=0 : moving_range3=0
static_range4=0 : moving_range4=0
static_range5=0 : moving_range5=0
static_range6=0 : moving_range6=0
static_range7=0 : moving_range7=0
static_range8=0 : moving_range8=0
gosub SETUP_LD2410_RADAR
gosub webpage
onhtmlreload webpage
onhtmlchange webpage
onserial2 SER2RX
timer0 1000, TICK
wait
end
'#########################
SER2RX:
'#########################
count=count+1
toggle=1-toggle
'pause 1
serial2.read_iobuff(toggle)
size = iobuff.len(toggle)
' use only each second incomming frame (toggle =0),
' but only the engineering frames with size=45
if (toggle=0) and (size = 45) then
TState =iobuff.read(0,8)
MT_Dis1 =iobuff.read(0,9)
MT_Dis2 =iobuff.read(0,10)
ETE_val =iobuff.read(0,11)
STDIS_val1 =iobuff.read(0,12)
STDis_val2 =iobuff.read(0,13)
STE_val =iobuff.read(0,14)
Det_Dis1 =iobuff.read(0,15)
Det_Dis2 =iobuff.read(0,16)
MMD_gate =iobuff.read(0,17)
MSD_gate =iobuff.read(0,18)
moving_range0=iobuff.read(0,19)
moving_range1=iobuff.read(0,20)
moving_range2=iobuff.read(0,21)
moving_range3=iobuff.read(0,22)
moving_range4=iobuff.read(0,23)
moving_range5=iobuff.read(0,24)
moving_range6=iobuff.read(0,25)
moving_range7=iobuff.read(0,26)
moving_range8=iobuff.read(0,27)
static_range0=iobuff.read(0,28)
static_range1=iobuff.read(0,29)
static_range2=iobuff.read(0,30)
static_range3=iobuff.read(0,31)
static_range4=iobuff.read(0,32)
static_range5=iobuff.read(0,33)
static_range6=iobuff.read(0,34)
static_range7=iobuff.read(0,35)
static_range8=iobuff.read(0,36)
'Tstate regards the actual (default?) energy limits,
' for each distance gate and for the maned time
SELECT CASE TState
CASE 0
Target_state$ = "No target detected"
moving_LED = 1 'green
static_LED = 1 'green
CASE 1
Target_state$ = "Moving target detected"
moving_LED = 0 'red
static_LED = 1 'green
CASE 2
Target_state$ = "Static target detected"
moving_LED = 1 'green
static_LED = 0 'red
CASE 3
Target_state$ = "Moving+static target detected"
moving_LED = 0 'red
static_LED = 0 'red
END SELECT
endif
return
'#########################
WEBPAGE:
'#########################
A$ = ""
A$ = A$ + "<H3>LD2410 radar-sensor visualizer v" + Version$ +"</H3>"
A$ = A$ + textbox$(T$) + "<br>"
A$ = A$ + textbox$(Target_state$) + " m:" + LED$(moving_LED) + " s:" + LED$(static_LED)+ "<br><br>"
A$ = A$ + "Targets energy in distance ranges: <br>"
A$ = A$ + "_________________<u>moving</u>_____<u>static+breathing</u><br>"
'A$ = A$ + " 0: 0.00m - 0.75m _ "+ meter$(moving_range0,0,100)+ " _ " + meter$(static_range0,0,100)+"<br>"
'A$ = A$ + " 1: 0.75m - 1.50m _ "+ meter$(moving_range1,0,100)+ " _ " + meter$(static_range1,0,100)+"<br>"
A$ = A$ + " 0: 0.00m - 0.75m _ "+ meter$(moving_range0,0,100)+ "<br>"
A$ = A$ + " 1: 0.75m - 1.50m _ "+ meter$(moving_range1,0,100)+ "<br>"
A$ = A$ + " 2: 1.50m - 2.25m _ "+ meter$(moving_range2,0,100)+ " _ " + meter$(static_range2,0,100)+"<br>"
A$ = A$ + " 3: 2.25m - 3.00m _ "+ meter$(moving_range3,0,100)+ " _ " + meter$(static_range3,0,100)+"<br>"
A$ = A$ + " 4: 3.00m - 3.75m _ "+ meter$(moving_range4,0,100)+ " _ " + meter$(static_range4,0,100)+"<br>"
A$ = A$ + " 5: 3.75m - 4.50m _ "+ meter$(moving_range5,0,100)+ " _ " + meter$(static_range5,0,100)+"<br>"
A$ = A$ + " 6: 4.50m - 5.25m _ "+ meter$(moving_range6,0,100)+ " _ " + meter$(static_range6,0,100)+"<br>"
A$ = A$ + " 7: 5.25m - 6.00m _ "+ meter$(moving_range7,0,100)+ " _ " + meter$(static_range7,0,100)+"<br>"
A$ = A$ + " 7: 6.00m - 6.75m _ "+ meter$(moving_range8,0,100)+ " _ " + meter$(static_range8,0,100)+"<br>"
cls
autorefresh 250
html A$
return
'#########################
TICK:
'#########################
t$=time$
RADAR$=IObuff.ToHex$(0)
'wlog t$, count ,RADAR$
wlog t$, count, Tstate
count=0
return
'#########################
SETUP_LD2410_RADAR:
'#########################
serial2.mode 256000,RX_pin,TX_pin
Enable_config$ ="fdfcfbfa0400ff00010004030201"
Enable_engineering_mode$ ="fdfcfbfa0200620004030201"
End_config$ ="fdfcfbfa0200fe0004030201"
'movement: 8 gates; static: 8 gates; unmaned duration: 5s
Default1$ ="fdfcfbfa1400600000000800000001000800000002000500000004030201"
IObuff.FromHex(1, Enable_config$)
SERIAL2.WRITE_IOBUFF(1)
pause 100
IObuff.FromHex(1, Enable_engineering_mode$)
SERIAL2.WRITE_IOBUFF(1)
pause 100
IObuff.FromHex(1, Default1$)
SERIAL2.WRITE_IOBUFF(1)
pause 100
IObuff.FromHex(1, End_config$)
SERIAL2.WRITE_IOBUFF(1)
pause 100
return
Met behulp van Peter alles toch werkend gekregen! Om Serial2 te gebruiken moest ik blijkbaar GPIO0 (Tx) en GPIO1 (Rx) gebruiken. En toen werkte alles naar behoren. Zie hieronder de webpagina op de ESP.
