diff --git a/readme.md b/readme.md index bb476b0..ab4c1cc 100644 --- a/readme.md +++ b/readme.md @@ -52,7 +52,10 @@ A list of changes classified as breaking, additions or fixes is maintained in [C --- ## 7_segments -7 Segment displays +7 Segment displays. + +Can be single digits stacked side by side or can be multiple digits in one unit. This is determined by the overall width compared to the width of a digit. +Presence of a decimal point is determined by the number of pins. Its position is determined by a heuristic. [vitamins/7_segments.scad](vitamins/7_segments.scad) Object definitions. diff --git a/tests/7_segments.scad b/tests/7_segments.scad index 367b13f..a6cd2ee 100644 --- a/tests/7_segments.scad +++ b/tests/7_segments.scad @@ -21,9 +21,11 @@ use <../utils/layout.scad> include <../vitamins/7_segments.scad> +function digits(s) = 7_segment_digits(s) < 2 ? 2 : 1; + module 7_segments() - layout([for(s = 7_segments) 7_segment_size(s).x * 2], 5) let(s = 7_segments[$i]) - 7_segment_digits(s, 2); + layout([for(s = 7_segments) 7_segment_size(s).x * digits(s)], 3) let(s = 7_segments[$i]) + 7_segment_digits(s, digits(s)); if($preview) 7_segments(); diff --git a/tests/png/7_segments.png b/tests/png/7_segments.png index 80e1390..007763b 100644 Binary files a/tests/png/7_segments.png and b/tests/png/7_segments.png differ diff --git a/vitamins/7_segment.scad b/vitamins/7_segment.scad index fb60844..c4d1631 100644 --- a/vitamins/7_segment.scad +++ b/vitamins/7_segment.scad @@ -18,7 +18,10 @@ // // -//! 7 Segment displays +//! 7 Segment displays. +//! +//! Can be single digits stacked side by side or can be multiple digits in one unit. This is determined by the overall width compared to the width of a digit. +//! Presence of a decimal point is determined by the number of pins. Its position is determined by a heuristic. // include <../utils/core/core.scad> @@ -28,12 +31,20 @@ function 7_segment_digit_size(type) = type[2]; //! Size of the actual digit and function 7_segment_pins(type) = type[3]; //! [x, y] array of pins function 7_segment_pin_pitch(type) = type[4]; //! x and y pin pitches and pin diameter +function 7_segment_digits(type) = let(d = 7_segment_digit_size(type)) floor(7_segment_size(type).x / (d.x + d.y * tan(d[3]))); + module 7_segment_digit(type, colour = grey(95), pin_length = 6.4) { //! Draw the specified 7 segment digit size = 7_segment_size(type); digit = 7_segment_digit_size(type); pins = 7_segment_pins(type); pin_pitch = 7_segment_pin_pitch(type); + t = digit[2]; + a = digit[3]; + digits = 7_segment_digits(type); + pitch = size.x / digits; + has_dp = (pins.x * pins.y) > 7 + digits; + color(grey(95)) linear_extrude(size.z) square([size.x - 0.1, size.y], center = true); @@ -43,48 +54,48 @@ module 7_segment_digit(type, colour = grey(95), pin_length = 6.4) { //! Draw the cube([size.x - 0.1, size.y, eps], center = true); color(colour) - translate_z(size.z) - linear_extrude(2 * eps) { - t = digit[2]; - a = digit[3]; - sq = [digit.x - 2 * t, (digit.y - 3 * t) / 2]; + for(i = [0 : digits - 1]) + translate([(i - (digits - 1) / 2) * pitch, 0, size.z]) + linear_extrude(2 * eps) { + sq = [digit.x - 2 * t, (digit.y - 3 * t) / 2]; - multmatrix([ // Skew - [1, tan(a), 0, 0], - [0, 1, 0, 0], - [0, 0, 1, 0], - [0, 0, 0, 1] - ]) - difference() { - square([digit.x, digit.y], center = true); + multmatrix([ // Skew + [1, tan(a), 0, 0], + [0, 1, 0, 0], + [0, 0, 1, 0], + [0, 0, 0, 1] + ]) + difference() { + square([digit.x, digit.y], center = true); - for(y = [-1, 1], x = [-1, 1]) { - translate([0, y * (t + sq.y) / 2]) - square(sq, center = true); + for(y = [-1, 1], x = [-1, 1]) { + translate([0, y * (t + sq.y) / 2]) + square(sq, center = true); - translate([x * digit.x / 2, y * digit.y / 2]) - rotate(-45 * x * y) { - square([10, t], center = true); + translate([x * digit.x / 2, y * digit.y / 2]) + rotate(-45 * x * y) { + square([10, t], center = true); - square([t / 5, 10], center = true); - } + square([t / 5, 10], center = true); + } - translate([x * (digit.x - t) / 2, 0]) - rotate(45) { - square([t / 5, t * 2], center = true); + translate([x * (digit.x - t) / 2, 0]) + rotate(45) { + square([t / 5, t * 2], center = true); - square([t * 2, t / 5], center = true); + square([t * 2, t / 5], center = true); - translate([x * t / 2, -x * t / 2]) - square([t, t], center = true); - } + translate([x * t / 2, -x * t / 2]) + square([t, t], center = true); + } + } } + r = 1.25 * t / 2; + if(has_dp) + translate([max(digit.x / 2 + digit.y / 2 * tan(a) - r, digit.x / 2 - digit.y /2 * tan(a) + r * 1.25), -digit.y / 2 + r]) + circle(r); } - r = 1.25 * t / 2; - translate([digit.x / 2 - r + digit.y / 2 * tan(a), -digit.y / 2 + r]) - circle(r); - } color(silver) translate_z(-pin_length) diff --git a/vitamins/7_segments.scad b/vitamins/7_segments.scad index 3a30c3c..de4adf6 100644 --- a/vitamins/7_segments.scad +++ b/vitamins/7_segments.scad @@ -21,8 +21,10 @@ //! 7 Segment displays // +02531A = ["02531A", [15.0, 8, 4.0], [3.5, 6.2, 0.7, 5], [5, 2], [inch(0.1), inch(0.1), 0.45]]; +02352A = ["02352A", [15.0, 8, 4.0], [3.5, 6.2, 0.6, 5], [6, 2], [inch(0.1), 5.52, 0.45]]; WT5011BSR = ["WT5011BSR", [12.7, 19, 8.2], [7.2, 12.7, 1.2, 10], [5, 2], [inch(0.1), inch(0.6), 0.4]]; -7_segments = [ WT5011BSR ]; +7_segments = [02531A, 02352A, WT5011BSR]; use <7_segment.scad>