2021-09-11 11:15:39 +01:00
//
// NopSCADlib Copyright Chris Palmer 2021
// nop.head@gmail.com
// hydraraptor.blogspot.com
//
// This file is part of NopSCADlib.
//
// NopSCADlib is free software: you can redistribute it and/or modify it under the terms of the
// GNU General Public License as published by the Free Software Foundation, either version 3 of
// the License, or (at your option) any later version.
//
// NopSCADlib is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
// without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
// See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with NopSCADlib.
// If not, see <https://www.gnu.org/licenses/>.
//
//
2021-10-26 12:24:59 +01:00
//! 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.
2021-09-11 11:15:39 +01:00
//
include < ../utils/core/core.scad >
2023-07-28 10:39:07 +01:00
use < ../utils/pcb_utils.scad >
2021-09-11 11:15:39 +01:00
function 7_segment_size ( type ) = type [ 1 ] ; //! Size of the body
2021-10-26 08:47:35 +01:00
function 7_segment_digit_size ( type ) = type [ 2 ] ; //! Size of the actual digit and segment width and angle
2021-09-11 11:15:39 +01:00
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
2021-10-26 12:24:59 +01:00
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 ] ) ) ) ;
2021-09-11 11:15:39 +01:00
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 ) ;
2021-10-26 12:24:59 +01:00
t = digit [ 2 ] ;
a = digit [ 3 ] ;
digits = 7 _segment_digits ( type ) ;
pitch = size . x / digits ;
has_dp = ( pins . x * pins . y ) > 7 + digits ;
2021-09-11 11:15:39 +01:00
color ( grey ( 95 ) )
linear_extrude ( size . z )
square ( [ size . x - 0.1 , size . y ] , center = true ) ;
color ( grey ( 15 ) )
translate_z ( size . z )
cube ( [ size . x - 0.1 , size . y , eps ] , center = true ) ;
color ( colour )
2021-10-26 12:24:59 +01:00
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 ) ;
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 ) ;
square ( [ t / 5 , 10 ] , 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 ) ;
translate ( [ x * t / 2 , - x * t / 2 ] )
square ( [ t , t ] , center = true ) ;
}
}
2021-09-11 11:15:39 +01:00
}
2021-10-26 12:24:59 +01:00
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 ) ;
2021-09-11 11:15:39 +01:00
}
color ( silver )
2023-07-28 10:39:07 +01:00
for ( x = [ 0 : 1 : pins . x - 1 ] , y = [ 0 : 1 : pins . y - 1 ] )
translate ( [ ( x - ( pins . x - 1 ) / 2 ) * pin_pitch . x , ( y - ( pins . y - 1 ) / 2 ) * pin_pitch . y ] ) {
vflip ( )
2023-10-29 21:56:08 +00:00
cylinder ( d = pin_pitch [ 2 ] , h = pin_length , $fn = fn ) ;
2023-07-28 10:39:07 +01:00
solder ( ) ;
}
2021-09-11 11:15:39 +01:00
}
module 7_segment_digits ( type , n , colour = grey ( 70 ) , pin_length = 6.4 , cutout = false ) { //! Draw n digits side by side
size = 7 _segment_size ( type ) ;
if ( cutout )
linear_extrude ( 100 )
square ( [ n * size . x , size . y ] , center = true ) ;
else
for ( i = [ 0 : 1 : n - 1 ] )
translate ( [ ( i - ( n - 1 ) / 2 ) * size . x , 0 ] )
7 _segment_digit ( type , colour , pin_length ) ;
}