Help hacking a laser tape measure?

Aug 05, 2019 Last reply: 4 years ago 23 Replies

Do you have code for arduino? Thanks

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

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

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); }

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required