Help hacking a laser tape measure?

Do you have code for arduino? Thanks

Reply to
Thang tran dang
Loading thread data ...

Interesting info , I've downloaded for later . Just got back to this tide-gauge project, the optics part of it anyway. The bored hole through the lens has to be offset from centre by the half-inch of the separation of the laser output port and the centre of the large lens. Also covering over the small inset lens, so as not to confuse the range setting procedure. Some stainless steel "reusable drinks straws" I found for guiding the laser thru the lens without side-scatter being returned to the receiving lens. Just trying out a pan of water , shrouded against false returns, to check out over 20 metres initially. For real over tidal water comes later.

--
Global sea level rise to 2100 from curve-fitted existing altimetry data
Reply to
N_Cook

I'm way off trying to use this SPI coding , and I'm no codesmith , but for anyone else landing here, there may be an error in the

7segment/decimal conversion block

else if(c == 0x3F) decimal[i] = '0'; else if (c == 0x06) decimal[i] = '1'; else if (c == 0x6D) decimal[i] = '2'; else if (c == 0x4F) decimal[i] = '3'; else if (c == 0x56) decimal[i] = '4'; else if (c == 0x5B) decimal[i] = '5'; else if (c == 0x7B) decimal[i] = '6'; else if (c == 0x0E) decimal[i] = '7'; else if (c == 0x7F) decimal[i] = '8'; else if (c == 0x5F) decimal[i] = '9';

The hex 6D and 5B may need swapping around for the '2' and '5'

--
Global sea level rise to 2100 from curve-fitted existing altimetry data
Reply to
N_Cook

responding to

formatting link
bronek wrote: int get_segment(int SegmentNo) // return 1if LCD segment SegmentNo is ON { int group,byte,bit; group = SegmentNo / 80; byte = (SegmentNo / 8) % 10; bit = SegmentNo % 8; uint8_t Bit = (1 << bit); uint8_t c = raw_segment_data[group * 10 + byte]; if(c & Bit) return 1; return 0;

} uint8_t raw_segment_data[40]; void analyze_data(void) // analyze 71bytes laser_buffer[71] { uint8_t data[6]; uint8_t decimal[8]; uint8_t buffer[32]; float distance = 0; long int distance_mm = 0; static long int last_distance_mm = 0; uint8_t c; int i; // remove LCD_commands, only use LCD data for(i = 0; i < 10;i++) raw_segment_data[i + 0] = laser_buffer[22+i]; for(i = 0; i < 10;i++) raw_segment_data[i + 10] = laser_buffer[35+i]; for(i = 0; i < 10;i++) raw_segment_data[i + 20] = laser_buffer[48+i]; for(i = 0; i < 10;i++) raw_segment_data[i + 30] = laser_buffer[61+i]; memset(data,0,6); // sign minus have SegmenNo 59, I do not use it if(get_segment(300)) data[0] |= 0x02 | 0x04; if(get_segment(61)) data[1] |= 0x01; if(get_segment(141)) data[1] |= 0x02; if(get_segment(221)) data[1] |= 0x04; if(get_segment(301)) data[1] |= 0x08; if(get_segment(220)) data[1] |= 0x10; if(get_segment(60)) data[1] |= 0x20; if(get_segment(140)) data[1] |= 0x40;

if(get_segment(63)) data[2] |= 0x01; if(get_segment(143)) data[2] |= 0x02; if(get_segment(223)) data[2] |= 0x04; if(get_segment(303)) data[2] |= 0x08; if(get_segment(222)) data[2] |= 0x10; if(get_segment(62)) data[2] |= 0x20; if(get_segment(142)) data[2] |= 0x40;

if(get_segment(49)) data[3] |= 0x01; if(get_segment(129)) data[3] |= 0x02; if(get_segment(209)) data[3] |= 0x04; if(get_segment(289)) data[3] |= 0x08; if(get_segment(288)) data[3] |= 0x10; if(get_segment(128)) data[3] |= 0x20; if(get_segment(208)) data[3] |= 0x40;

if(get_segment(51)) data[4] |= 0x01; if(get_segment(131)) data[4] |= 0x02; if(get_segment(211)) data[4] |= 0x04; if(get_segment(291)) data[4] |= 0x08; if(get_segment(290)) data[4] |= 0x10; if(get_segment(130)) data[4] |= 0x20; if(get_segment(210)) data[4] |= 0x40;

if(get_segment(53)) data[5] |= 0x01; if(get_segment(133)) data[5] |= 0x02; if(get_segment(213)) data[5] |= 0x04; if(get_segment(293)) data[5] |= 0x08; if(get_segment(292)) data[5] |= 0x10; if(get_segment(132)) data[5] |= 0x20; if(get_segment(212)) data[5] |= 0x40;

for(i = 0; i < 6; i++) { c = data[i]; if(c == 0x00) decimal[i] = '0'; // Prazdne uvodne miesta else if(c == 0x3F) decimal[i] = '0'; else if (c == 0x06) decimal[i] = '1'; else if (c == 0x6D) decimal[i] = '2'; else if (c == 0x4F) decimal[i] = '3'; else if (c == 0x56) decimal[i] = '4'; else if (c == 0x5B) decimal[i] = '5'; else if (c == 0x7B) decimal[i] = '6'; else if (c == 0x0E) decimal[i] = '7'; else if (c == 0x7F) decimal[i] = '8'; else if (c == 0x5F) decimal[i] = '9'; else decimal[i] = 'X'; } decimal[6] = 0; distance_mm = atol((char*)decimal); if(distance_mm == last_distance_mm) return; last_distance_mm = distance_mm; if(!distance_mm) return; distance = (float)(distance_mm) / 1000; if(get_segment(54) && get_segment(134))// metre i = sprintf((char*)buffer, "%.3f[m]\n\r",distance); if(get_segment(294)) // ft i = sprintf((char*)buffer, "%.3f[m]\n\r",distance * 0.3048); // if(get_segment(214) && get_segment(134)) // inch //i = sprintf((char*)buffer, "Zmen inch na m\n\r"); usart_print(buffer,i); }

Reply to
bronek

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.