Added setTubeSegments()
Added the setTubeSegments(TubeNum tube_num,uint16_t segments); which allows you to set specific segments on or off for a given tube.
This commit is contained in:
110
examples/display_specific_segments/display_specific_segments.ino
Normal file
110
examples/display_specific_segments/display_specific_segments.ino
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
display_basic.ino
|
||||||
|
Example for displaying specific segments on a tube.
|
||||||
|
|
||||||
|
|
||||||
|
Author : dagwoodland
|
||||||
|
Create Time: Sep 2019
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Wire.h"
|
||||||
|
#include "grove_alphanumeric_display.h"
|
||||||
|
|
||||||
|
// Keeps track of the current stage of tube 2's animation.
|
||||||
|
int currentSegment = 0;
|
||||||
|
|
||||||
|
// The frames of tube 2's animation.
|
||||||
|
uint16_t tubeTwoFrames[] = {
|
||||||
|
SEGMENT_TOP,
|
||||||
|
SEGMENT_TOP_LEFT,
|
||||||
|
SEGMENT_TOP_LEFT_DIAGONAL,
|
||||||
|
SEGMENT_TOP_VERTICAL,
|
||||||
|
SEGMENT_TOP_RIGHT_DIAGONAL,
|
||||||
|
SEGMENT_TOP_RIGHT,
|
||||||
|
SEGMENT_MIDDLE_LEFT,
|
||||||
|
SEGMENT_MIDDLE_RIGHT,
|
||||||
|
SEGMENT_BOTTOM_LEFT,
|
||||||
|
SEGMENT_BOTTOM_LEFT_DIAGONAL,
|
||||||
|
SEGMENT_BOTTOM_VERTICAL,
|
||||||
|
SEGMENT_BOTTOM_RIGHT_DIAGONAL,
|
||||||
|
SEGMENT_BOTTOM_RIGHT,
|
||||||
|
SEGMENT_BOTTOM
|
||||||
|
};
|
||||||
|
|
||||||
|
// -----------------------------------------------------------
|
||||||
|
// TIP - You can use shorthand notation to avoid long lines.
|
||||||
|
// Shorthand is simply 'SEG_' and then the first letter of each
|
||||||
|
// word. Eg. 'SEGMENT_TOP_LEFT_DIAGANOL' becomes 'SEG_TLD'.
|
||||||
|
// -----------------------------------------------------------
|
||||||
|
|
||||||
|
// Reference to the Seeed_Digital_Tube.
|
||||||
|
Seeed_Digital_Tube tube;
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// Setup wire using default I2C pins.
|
||||||
|
Wire.begin();
|
||||||
|
|
||||||
|
// If using four digital tubes, use this configuration.
|
||||||
|
tube.setTubeType(TYPE_4, TYPE_4_DEFAULT_I2C_ADDR);
|
||||||
|
|
||||||
|
// If using two digital tubes, use this configuration.
|
||||||
|
// tube.setTubeType(TYPE_2,TYPE_2_DEFAULT_I2C_ADDR);
|
||||||
|
|
||||||
|
tube.setBrightness(15);
|
||||||
|
tube.setBlinkRate(BLINK_OFF);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display the top and bottom segments on the first tube.
|
||||||
|
void displayTubeOne() {
|
||||||
|
// To display specific segments add together their values.
|
||||||
|
tube.setTubeSegments(FIRST_TUBE, SEGMENT_TOP + SEGMENT_BOTTOM);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display an animation going through all 14 segments in turn.
|
||||||
|
void displayTubeTwo() {
|
||||||
|
// Increment tube 2's animation frame.
|
||||||
|
currentSegment += 1;
|
||||||
|
|
||||||
|
// Restart the animation if it has finished.
|
||||||
|
if (currentSegment >= 14) {
|
||||||
|
currentSegment = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Display the current frame of tube 2's animation.
|
||||||
|
tube.setTubeSegments(SECOND_TUBE, tubeTwoFrames[currentSegment]);
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
// Clear the tube's buffer. Using tube.clearBuf() prevents
|
||||||
|
// the display blinking because the display is not updated
|
||||||
|
// until tube.display() is called, unlike tube.clear()
|
||||||
|
tube.clearBuf();
|
||||||
|
|
||||||
|
displayTubeOne();
|
||||||
|
displayTubeTwo();
|
||||||
|
|
||||||
|
// Display the new contents of both tube's buffers.
|
||||||
|
tube.display();
|
||||||
|
|
||||||
|
delay(200);
|
||||||
|
}
|
||||||
@@ -129,6 +129,8 @@ uint16_t g_display_font2[]={
|
|||||||
0x0000, // ilegal num
|
0x0000, // ilegal num
|
||||||
};
|
};
|
||||||
|
|
||||||
|
uint16_t segments4Tubes[] = {0x10,0x4000,0x80,0x40,0x2,0x2000,0x200,0x100,0x400,0x8,0x1000,0x20,0x4,0x800};
|
||||||
|
uint16_t segments2Tubes[] = {0x4,0x40,0x20,0x1,0x8,0x10,0x2,0x1000,0x2000,0x100,0x200,0x8000,0x800,0x400};
|
||||||
|
|
||||||
Seeed_Digital_Tube::Seeed_Digital_Tube()
|
Seeed_Digital_Tube::Seeed_Digital_Tube()
|
||||||
{
|
{
|
||||||
@@ -316,6 +318,37 @@ void Seeed_Digital_Tube::setPoint(bool first_dot,bool second_dot)
|
|||||||
else{}
|
else{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Seeed_Digital_Tube::setTubeSegments(TubeNum tube_num,uint16_t segments)
|
||||||
|
{
|
||||||
|
uint16_t value = 0;
|
||||||
|
|
||||||
|
if( TYPE_4 == _type )
|
||||||
|
{
|
||||||
|
for (int i=0; i<16; i++) {
|
||||||
|
if (bitRead(segments, i) == 1) {
|
||||||
|
value += segments4Tubes[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_buffer[tube_num*2] = value;
|
||||||
|
_buffer[tube_num*2+1] = value >> 8;
|
||||||
|
replace_bit12(tube_num,value&0x02,value&0x04);
|
||||||
|
}
|
||||||
|
else if (TYPE_2 == _type)
|
||||||
|
{
|
||||||
|
for (int i=0; i<16; i++) {
|
||||||
|
if (bitRead(segments, i) == 1) {
|
||||||
|
value += segments2Tubes[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set tube_num to 1 if it's 2, and 2 if it's 1, so that it's compatible with the hardware.
|
||||||
|
tube_num = (TubeNum) (((int)tube_num+1) & (~(int)tube_num));
|
||||||
|
|
||||||
|
_buffer[tube_num*2] = value >> 8;
|
||||||
|
_buffer[tube_num*2+1] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Seeed_Digital_Tube::setTubeBuf(TubeNum tube_num,char byte)
|
void Seeed_Digital_Tube::setTubeBuf(TubeNum tube_num,char byte)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -51,7 +51,37 @@
|
|||||||
|
|
||||||
#define MAX_TUBE_COUNT 4
|
#define MAX_TUBE_COUNT 4
|
||||||
|
|
||||||
|
// Long hand segment definitions.
|
||||||
|
#define SEGMENT_TOP 0x1
|
||||||
|
#define SEGMENT_TOP_LEFT 0x2
|
||||||
|
#define SEGMENT_TOP_LEFT_DIAGONAL 0x4
|
||||||
|
#define SEGMENT_TOP_RIGHT 0x8
|
||||||
|
#define SEGMENT_TOP_RIGHT_DIAGONAL 0x10
|
||||||
|
#define SEGMENT_TOP_VERTICAL 0x20
|
||||||
|
#define SEGMENT_MIDDLE_LEFT 0x40
|
||||||
|
#define SEGMENT_MIDDLE_RIGHT 0x80
|
||||||
|
#define SEGMENT_BOTTOM 0x100
|
||||||
|
#define SEGMENT_BOTTOM_LEFT 0x200
|
||||||
|
#define SEGMENT_BOTTOM_LEFT_DIAGONAL 0x400
|
||||||
|
#define SEGMENT_BOTTOM_RIGHT 0x800
|
||||||
|
#define SEGMENT_BOTTOM_RIGHT_DIAGONAL 0x1000
|
||||||
|
#define SEGMENT_BOTTOM_VERTICAL 0x2000
|
||||||
|
|
||||||
|
// Short hand segment definitions.
|
||||||
|
#define SEG_T 0x1
|
||||||
|
#define SEG_TL 0x2
|
||||||
|
#define SEG_TLD 0x4
|
||||||
|
#define SEG_TR 0x8
|
||||||
|
#define SEG_TRD 0x10
|
||||||
|
#define SEG_TV 0x20
|
||||||
|
#define SEG_ML 0x40
|
||||||
|
#define SEG_MR 0x80
|
||||||
|
#define SEG_B 0x100
|
||||||
|
#define SEG_BL 0x200
|
||||||
|
#define SEG_BLD 0x400
|
||||||
|
#define SEG_BR 0x800
|
||||||
|
#define SEG_BRD 0x1000
|
||||||
|
#define SEG_BV 0x2000
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
@@ -127,6 +157,13 @@ public:
|
|||||||
* @prarm lower_on if true,the second point light on ,otherwise turn off;
|
* @prarm lower_on if true,the second point light on ,otherwise turn off;
|
||||||
* */
|
* */
|
||||||
void setPoint(bool first_dot,bool second_dot);
|
void setPoint(bool first_dot,bool second_dot);
|
||||||
|
|
||||||
|
/**@brief Set the values of tube_num's segments.
|
||||||
|
* @param tube_num The number of tube, depending on the device you are using (2 or 4).
|
||||||
|
* @prarm segments The segments that should be turned on.
|
||||||
|
* */
|
||||||
|
void setTubeSegments(TubeNum tube_num,uint16_t segments);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void display_one_tube(TubeNum tube_num,uint16_t value);
|
void display_one_tube(TubeNum tube_num,uint16_t value);
|
||||||
void replace_bit12(TubeNum tube_num,bool bit1,bool bit2);
|
void replace_bit12(TubeNum tube_num,bool bit1,bool bit2);
|
||||||
|
|||||||
Reference in New Issue
Block a user