4028

A handy distance sensor / rangefinder based on portable M5Stack-Fire and a TOF-sensor VL53LOX.

My M5Stack fire became - thanks to its LiPol battery - together with some ANNEX32 code and an I2C VL53LOX (~10€) a very handy rangefinder.


This VL53LOX-TOF-sensor works  in two ranges from 0 to 60cm to 200cm..

The accuracy has three levels with influence on the measuring speed.

The range and the accuracy can be selected via two of the  hardware buttons or the webinterface
Distance ist shown  in millimeter  on the build-in display and on the web interface.

The firmware used in this project is ANNEX32 for ESP32/M5 hardware. So the code is a BASIC script, which can easily be adapted to other needs.   
Take a look at the ANNEX-FORUM

  

 ' #START##########BASIC-CODE for ANNEX32#############################
 ' TOF Distance-Sensor
 ' -M5Stack-Hardware with
 ' -3 pulldown-buttons at pin 37,38,39
 ' -TOF Sensor VL53LOX via I2C
 '  Range: 0-200cm 
 ' peter.neufeld@gmx.de
 VERSION$       = "V1.0"

 '-----TFT-DISPLAY-setup
 COL_BACKGROUND = tft.rgb(00,00,0)
 COL_TEXT       = tft.rgb(00,255,100)
 TFT.INIT 1
 TFT.FILL         COL_BACKGROUND
 TFT.TEXT.COL     COL_TEXT,COL_BACKGROUND

 '-----TOF-Sensor-setup
 ACCURACY$=""
 RANGE$=""

 while not VL53L0X.init ' Test for TOF device
   gosub         NO_TOF_SENSOR
   onhtmlreload  NO_TOF_SENSOR
   pause 1000
 wend
 TFT.FILL COL_BACKGROUND

 'VL53L0X.SetAccuracy 0 ' set the refresh rate at 33  msec (min accuracy)
 VL53L0X.SetAccuracy 1 ' set the refresh rate at 200 msec (med accuracy)
 'VL53L0X.SetAccuracy 2 ' set the refresh rate at 400 msec (max accuracy)

 'VL53L0X.SetRange 0 ' set the range at 60 mm ( 6o cm )
 VL53L0X.SetRange 1

 BUTTON_A         = 39
 BUTTON_B         = 38
 BUTTON_C         = 37
 BUTTON_Pressed   = 0

 DIST$            = ""
 X$               = ""
 'pin.mode BUTTON_A,input
 'pin.mode BUTTON_B,input
 'pin.mode BUTTON_C,input
 '

 ' set initial accuracy and range
 BUT1_IDX     = 2
 BUT2_IDX     = 0
 gosub        BUT_1
 gosub        BUT_2

 gosub        WebInterface
 onhtmlreload WebInterface
 onhtmlchange WebInterface

 ' ----endless MAIN LOOP----
 timer1 750, MAIN_PRG
 wait
 end

 ' #############################################
 MAIN_PRG:
 gosub TEST_M5_BUTTON
 gosub READ_TOF
 gosub PAINT_DISPLAY
 return

 ' #############################################
 READ_TOF:
 d = VL53L0X.Distance ' get the distance
 ' suppress all out-of-range values 
 If (RANGE$ ="60cm")   and (d > 660)  then d= -1
 If (RANGE$ ="200cm")  and (d > 2200) then d= -1
 DIST$= str$(d,"%4.0f") +"mm "
 return

 ' #############################################
 TEST_M5_BUTTON:
 if pin(BUTTON_A)+pin(BUTTON_B)+pin(BUTTON_C) <3 then
   pause 10 'Press longer than 10ms
   if pin(BUTTON_A)= 0 then gosub BUT_1
   if pin(BUTTON_B)= 0 then gosub BUT_2
   if pin(BUTTON_C)= 0 then gosub BUT_3
 else
   BUTTON_Pressed=0
 end if
 return

 ' #########################################################################
 BUT_1:
 BUTTON_Pressed = 1
 BUT1_IDX= (BUT1_IDX +1) mod 3
 IF BUT1_IDX = 0 then    ACCURACY$ = "LOW but FAST  "
 IF BUT1_IDX = 1 then    ACCURACY$ = "MEDIUM        "
 IF BUT1_IDX = 2 then    ACCURACY$ = "HIGH but SLOW "

 VL53L0X.SetAccuracy BUT1_IDX
 'gosub BUTTON_ACTION
 return

 ' #########################################################################
 BUT_2:
 BUTTON_Pressed = 2
 BUT2_IDX= (BUT2_IDX +1) mod 2
 If BUT2_IDX = 0 then   RANGE$ = "60cm"
 If BUT2_IDX = 1 then   RANGE$ = "200cm"

 VL53L0X.SetRange  BUT2_IDX
 'gosub BUTTON_ACTION
 return
 ' #########################################################################
 BUT_3:
 BUTTON_Pressed = 3
 'gosub BUTTON_ACTION
 return
 ' #########################################################################
 BUT_0:
 BUTTON_Pressed = 0
 gosub BUTTON_ACTION
 return


 ' #############################################
 PAINT_DISPLAY:
 ' do not forgett to set M5 Display at config-page.
 ' There seem to be two types of displays in M5Stack.
 ' Colors may bee inverted with older(?) display 
 tft.text.size 1
 tft.text.pos 80,2
 TFT.PRINT "@: HTTP://";WORD$(IP$,1)

 tft.text.size 3
 tft.text.pos 120,25
 tft.print "TOF-"
 tft.text.pos 20,50
 tft.print "distance-sensor"

 tft.text.size 8
 tft.text.pos 20,110
 tft.print DIST$

 tft.text.size 1
 tft.text.pos 5,195
 tft.print "A C C U R A C Y :"
 tft.text.pos 5,210
 tft.print ACCURACY$+"  "

 tft.text.size 1
 tft.text.pos 130,195
 tft.print "R A N G E :"
 tft.text.pos 130,210
 tft.print RANGE$+"   "

 TFT.LINE 000, 190, 320, 190, COL_TEXT
 TFT.LINE 110, 190, 110, 240, COL_TEXT
 TFT.LINE 210, 190, 210, 240, COL_TEXT
 return

 ' #########################################################################
 WebInterface:
 cls
 autorefresh 800
 a$=""
 a$ = a$ + "

+- - - - - - - - - - - - - - - - - - - - - -+"


 a$ = a$ + "

- TOF-DISTANCE-SENSOR - -"


 a$ = a$ + "

########### "+ VERSION$ +  " ###########"


 a$ = a$ + "
"
 a$ = a$ +  TEXTBOX$(DIST$,"cssTB")
 a$ = a$ + "

"
 a$ = a$ +  TEXTBOX$(ACCURACY$,"cssTB1")
 a$ = a$ +  TEXTBOX$(RANGE$,"cssTB1")
 a$ = a$ +  TEXTBOX$(x$,"cssTB1")
 a$ = a$ +  "
"
 a$ = a$ + BUTTON$("set ACCURACY", BUT_1,"cssBT")
 a$ = a$ + BUTTON$("set RANGE", BUT_2,"cssBT")
 a$ = a$ + BUTTON$("-------", BUT_3,"cssBT")
 a$ = a$ +  "

+- - - - - - - - - - - - - - - - - - - - - -+