Lego Interactive Brick Program: Difference between revisions
Jump to navigation
Jump to search
Created page with "==== Lego Interactive Brick Program ====" |
No edit summary |
||
| (One intermediate revision by the same user not shown) | |||
| Line 1: | Line 1: | ||
==== | '' | ||
//Demonstration Program for Interactive LCD Touch Screen Lego 70455 Interface | |||
#include <tinyFAT.h> | |||
#include <UTFT.h> | |||
#include <UTFT_tinyFAT.h> | |||
#include <UTouch.h> | |||
#include <LegoTechnic.h> | |||
// Declare which fonts we will be using | |||
extern uint8_t SmallFont[]; | |||
UTFT LEGO_Display(ITDB32S, 38, 39, 40, 41); // Remember to change the model parameter to suit your display module! | |||
UTFT_tinyFAT LEGO_Files(&LEGO_Display); | |||
UTouch LEGO_Touch( 6, 5, 4, 3, 2); | |||
LegoTechnic brick(8, 9, 10, 11, 12, 13, 0, 1); | |||
int picsize_x, picsize_y; | |||
word resource; | |||
// Display locations | |||
int x_HotSpot=85; | |||
int y_HotSpot=163; | |||
int HotSpot_width=202; | |||
int HotSpot_height=72; | |||
int x_slider = 86; | |||
int y_slider = 173; | |||
int slider_space = 19; | |||
int slider_width = 10; | |||
int slider_height = 10; | |||
int x_indicator = 259; | |||
int y_indicator = 59; | |||
int indicator_space = 34; | |||
int indicator_width = 5; | |||
int indicator_height = 5; | |||
int x_button = 277; | |||
int y_button = 73; | |||
int button_width = 19; | |||
int button_height = 40; | |||
int x_output = 86; | |||
int y_output = 140; | |||
int output_space = 107; | |||
int output_width = 200; | |||
int output_height = 10; | |||
void setup() | |||
{ | |||
// Initialize LEGO brick | |||
brick.Port_Initialize(); | |||
// Prepare Display | |||
LEGO_Display.InitLCD(); | |||
LEGO_Display.clrScr(); | |||
LEGO_Display.setColor(255,255,255); | |||
LEGO_Display.setFont(SmallFont); | |||
picsize_x=LEGO_Display.getDisplayXSize(); | |||
picsize_y=LEGO_Display.getDisplayYSize(); | |||
// Prepare Touch Screen | |||
LEGO_Touch.InitTouch(); | |||
LEGO_Touch.setPrecision (PREC_MEDIUM); | |||
LEGO_Display.setBackCol or(0, 0, 255); | |||
// LEGO Library has Serial Monitor Functions | |||
Serial.begin(9600); | |||
// Load Interface Image | |||
file.initFAT(); | |||
resource=LEGO_Files.loadBitmap(0, 0, picsize_x, picsize_y, "LEGOPIC.RAW"); | |||
} | |||
void loop() | |||
{ | |||
int hold_value[6]={0,0,0,0,0,0}; | |||
int x,y; | |||
int Previous_I0, Present_I0; | |||
int Previous_I1, Present_I1; | |||
int button_value; | |||
// Draw Screen Elements | |||
Sliders(); | |||
Outputs(); | |||
brick.Verbose(LOW); | |||
UpdateDisplay(); | |||
Previous_I0 = -1; | |||
Previous_I1 = -1; | |||
while (true) | |||
{ | |||
// Check for change to input values | |||
Present_I0 = brick.Input_Port(6); | |||
Present_I1 = brick.Input_Port(7); | |||
if (Present_I0 != Previous_I0) | |||
{ | |||
Previous_I0 = Present_I0; | |||
DrawIndicatorValue(6,Present_I0); | |||
DrawOutputValue(0,Present_I0); | |||
} | |||
if (Present_I1 != Previous_I1) | |||
{ | |||
Previous_I1 = Present_I1; | |||
DrawIndicatorValue(7,Present_I1); | |||
DrawOutputValue(1,Present_I1); | |||
} | |||
// Test for touch screen input | |||
if (LEGO_Touch.dataAvailable()) | |||
{ | |||
LEGO_Touch.read(); | |||
x=LEGO_Touch.getX(); | |||
y=LEGO_Touch.getY(); | |||
EvaluateTouch(x,y); | |||
delay(100); | |||
while(LEGO_Touch.dataAvailable()) | |||
{ | |||
LEGO_Touch.read(); | |||
} | |||
} | |||
} | |||
} | |||
// Determine if touch screen input is within an active zone | |||
void EvaluateTouch(int x, int y) | |||
{ | |||
if ((x >= x_HotSpot) && (x <= x_HotSpot + HotSpot_width)) | |||
if ((y >= y_HotSpot) && (y <= y_HotSpot + HotSpot_height)) | |||
EvaluateSliders(x,y); | |||
if ((x >= x_button) && (x <= x_button + button_width)) | |||
if ((y >= y_button) && (y <= y_button + button_height)) | |||
ExecuteButton(x,y); | |||
} | |||
// Reset Button for Outputs | |||
void ExecuteButton(int x,int y) | |||
{ | |||
for(int x=0; x< 6; ++x) | |||
{ | |||
EraseSliderValue(x, int (brick.Port_PWM_Value(x)/25)); | |||
brick.PWM_Port(x, 0); | |||
} | |||
UpdateDisplay(); | |||
} | |||
// Determine which slider was "touched" | |||
void EvaluateSliders(int x,int y) | |||
{ | |||
int line_number = (5 - (y-y_HotSpot)/(slider_height+1)); | |||
int line_value = (x-x_HotSpot)/(slider_space); | |||
EraseSliderValue(line_number, int (brick.Port_PWM_Value(line_number)/25)); | |||
brick.PWM_Port(line_number, int (line_value * 25)); | |||
DrawSliderValue(line_number, line_value); | |||
DrawIndicatorValue(line_number,brick.Port_PWM_Value(line_number)); | |||
} | |||
// Update Screen Elements | |||
void UpdateDisplay() | |||
{ | |||
for(int x=0;x<8;++x) | |||
{ | |||
if (x < 6) | |||
{ | |||
DrawSliderValue(x,brick.Port_PWM_Value(x)); | |||
DrawIndicatorValue(x,brick.Port_PWM_Value(x)); | |||
} | |||
else | |||
DrawIndicatorValue(x,brick.Input_Port(x)); | |||
} | |||
} | |||
// Draw All Sliders | |||
void Sliders() | |||
{ | |||
for(int x=0; x < 6; ++x) | |||
{ | |||
y_slider = 224-(x*(slider_height+2)); | |||
DrawSlider(x); | |||
DrawSliderValue(x,0); | |||
} | |||
} | |||
// Draw each Slider | |||
void DrawSlider(int line) | |||
{ | |||
String label=" Line "; | |||
label.concat(char(48+line)); | |||
LEGO_Display.setColor(255,255,255); | |||
LEGO_Display.setBackColor(0,0,0); | |||
LEGO_Display.print(label, LEFT,224-(line*(slider_height+2))); | |||
LEGO_Display.print(" OFF", 53, 224-(line*(slider_height+2))); | |||
LEGO_Display.print(" MAX", RIGHT, 224-(line*(slider_height+2))); | |||
LEGO_Display.setColor(0,0,0); | |||
LEGO_Display.drawLine(x_slider,224-(line*(slider_height+2))+(slider_height/2),x_slider+slider_width+(10*slider_space),224-(line*(slider_height+2))+(slider_height/2)); | |||
for(int x=0;x<11;++x) | |||
{ | |||
LEGO_Display.drawLine(x_slider+(slider_width/2)+(x*slider_space),224-(line*(slider_height+2)),x_slider+(slider_width/2)+(x*slider_space),224-(line*(slider_height+2))+(slider_height)); | |||
} | |||
} | |||
// Display Slider Value on Screen | |||
void DrawSliderValue(int line, int value) | |||
{ | |||
if (line < 6) | |||
LEGO_Display.setColor(255, 0, 0); | |||
else | |||
LEGO_Display.setColor(0, 255, 0); | |||
if (value == 0) | |||
LEGO_Display.setColor(0,0,0); | |||
LEGO_Display.fillRoundRect(x_slider+(value*slider_space), 224-(line*(slider_height+2)), x_slider+slider_width+(value*slider_space), 224-(line*(slider_height+2)) + slider_height); | |||
LEGO_Display.setColor(0, 0, 0); | |||
LEGO_Display.drawRoundRect (x_slider+(value*slider_space), 224-(line*(slider_height+2)), x_slider+slider_width+(value*slider_space), 224-(line*(slider_height+2)) + slider_height); | |||
if (value == 0) | |||
{ | |||
LEGO_Display.setColor(255,255,255); | |||
LEGO_Display.drawRoundRect (x_slider+(value*slider_space)+1, 224-(line*(slider_height+2))+1, x_slider+slider_width+(value*slider_space)-1, 224-(line*(slider_height+2)) + slider_height-1); | |||
} | |||
} | |||
// Remove Slider value from Screen | |||
void EraseSliderValue(int line, int value) | |||
{ | |||
LEGO_Display.setColor(0, 255, 255); | |||
LEGO_Display.fillRoundRect(x_slider+(value*slider_space), 224-(line*(slider_height+2)), x_slider+slider_width+(value*slider_space), 224-(line*(slider_height+2)) + slider_height); | |||
LEGO_Display.setColor(0,0,0); | |||
LEGO_Display.drawLine (x_slider+(value*slider_space), 224-(line*(slider_height+2))+(slider_height/2), x_slider+slider_width+(value*slider_space), 224-(line*(slider_height+2))+(slider_height/2)); | |||
LEGO_Display.drawLine(x_slider+(slider_width/2)+(value*slider_space),224-(line*(slider_height+2)),x_slider+(slider_width/2)+(value*slider_space),224-(line*(slider_height+2))+(slider_height)); | |||
} | |||
// Draw Indicator Dots on Screen | |||
void Indicators() | |||
{ | |||
for(int x=0; x < 8; ++x) | |||
{ | |||
DrawIndicatorValue(x,0); | |||
} | |||
} | |||
// Display Input and Output Status on Screen | |||
void DrawIndicatorValue(int line, int value) | |||
{ | |||
LEGO_Display.setColor(50,50,50); | |||
if (line < 6) | |||
{ | |||
if (value != 0) | |||
LEGO_Display.setColor(255,0,0); | |||
} | |||
else | |||
{ | |||
if (value > 511) | |||
LEGO_Display.setColor(0,255,0); | |||
Serial.println(value); | |||
} | |||
LEGO_Display.fillRoundRect(x_indicator-(line*indicator_space), y_indicator, x_indicator-indicator_width-(line*indicator_space), y_indicator + indicator_height); | |||
LEGO_Display.setColor(0,0,0); | |||
LEGO_Display.drawRoundRect(x_indicator-(line*indicator_space), y_indicator, x_indicator-indicator_width-(line*indicator_space), y_indicator + indicator_height); | |||
} | |||
// Draw All Input Display on Screen | |||
void Outputs() | |||
{ | |||
for(int x=0;x<2;++x) | |||
{ | |||
DrawOutput(x); | |||
DrawOutputValue(x,LOW); | |||
} | |||
} | |||
// Draw each Input Display on Screen | |||
void DrawOutput(int line) | |||
{ | |||
String label=" Output "; | |||
label.concat(char(48-line+7)); | |||
label.concat(" "); | |||
LEGO_Display.setColor(255,255,255); | |||
LEGO_Display.setBackColor(0,0,0); | |||
LEGO_Display.print(label, LEFT,y_output+(line*(output_height+2))); | |||
LEGO_Display.print(" ", RIGHT, y_output+(line*(output_height+2))); | |||
LEGO_Display.setColor(0,0,0); | |||
LEGO_Display.drawRoundRect(x_output, y_output+(line*(output_height+2)), x_output+output_width, y_output+(line*(output_height+2)) + output_height); | |||
} | |||
// Draw Input Display based on Value to Screen | |||
void DrawOutputValue(int line, int value) | |||
{ | |||
if (line == 0) | |||
line = 1; | |||
else | |||
line = 0; | |||
if (value > 511) | |||
{ | |||
LEGO_Display.setColor(0,255,0); | |||
LEGO_Display.fillRoundRect(x_output, y_output+(line*(output_height+2)), x_output+output_width, y_output+(line*(output_height+2)) + output_height); | |||
} | |||
else | |||
{ | |||
LEGO_Display.setColor(50,50,50); | |||
LEGO_Display.fillRoundRect(x_output, y_output+(line*(output_height+2)), x_output+output_width, y_output+(line*(output_height+2)) + output_height); | |||
} | |||
LEGO_Display.setColor(0,0,0); | |||
LEGO_Display.drawRoundRect(x_output, y_output+(line*(output_height+2)), x_output+output_width, y_output+(line*(output_height+2)) + output_height); | |||
} | |||
'' | |||
Latest revision as of 21:17, 18 January 2016
//Demonstration Program for Interactive LCD Touch Screen Lego 70455 Interface
#include <tinyFAT.h> #include <UTFT.h> #include <UTFT_tinyFAT.h> #include <UTouch.h> #include <LegoTechnic.h> // Declare which fonts we will be using extern uint8_t SmallFont[]; UTFT LEGO_Display(ITDB32S, 38, 39, 40, 41); // Remember to change the model parameter to suit your display module! UTFT_tinyFAT LEGO_Files(&LEGO_Display); UTouch LEGO_Touch( 6, 5, 4, 3, 2); LegoTechnic brick(8, 9, 10, 11, 12, 13, 0, 1); int picsize_x, picsize_y; word resource; // Display locations int x_HotSpot=85; int y_HotSpot=163; int HotSpot_width=202; int HotSpot_height=72; int x_slider = 86; int y_slider = 173; int slider_space = 19; int slider_width = 10; int slider_height = 10; int x_indicator = 259; int y_indicator = 59; int indicator_space = 34; int indicator_width = 5; int indicator_height = 5; int x_button = 277; int y_button = 73; int button_width = 19; int button_height = 40; int x_output = 86; int y_output = 140; int output_space = 107; int output_width = 200; int output_height = 10;
void setup()
{
// Initialize LEGO brick
brick.Port_Initialize();
// Prepare Display
LEGO_Display.InitLCD();
LEGO_Display.clrScr();
LEGO_Display.setColor(255,255,255);
LEGO_Display.setFont(SmallFont);
picsize_x=LEGO_Display.getDisplayXSize();
picsize_y=LEGO_Display.getDisplayYSize();
// Prepare Touch Screen
LEGO_Touch.InitTouch();
LEGO_Touch.setPrecision (PREC_MEDIUM);
LEGO_Display.setBackCol or(0, 0, 255);
// LEGO Library has Serial Monitor Functions
Serial.begin(9600);
// Load Interface Image
file.initFAT();
resource=LEGO_Files.loadBitmap(0, 0, picsize_x, picsize_y, "LEGOPIC.RAW");
}
void loop()
{
int hold_value[6]={0,0,0,0,0,0};
int x,y;
int Previous_I0, Present_I0;
int Previous_I1, Present_I1;
int button_value;
// Draw Screen Elements
Sliders();
Outputs();
brick.Verbose(LOW);
UpdateDisplay();
Previous_I0 = -1;
Previous_I1 = -1;
while (true)
{
// Check for change to input values
Present_I0 = brick.Input_Port(6);
Present_I1 = brick.Input_Port(7);
if (Present_I0 != Previous_I0)
{
Previous_I0 = Present_I0;
DrawIndicatorValue(6,Present_I0);
DrawOutputValue(0,Present_I0);
}
if (Present_I1 != Previous_I1)
{
Previous_I1 = Present_I1;
DrawIndicatorValue(7,Present_I1);
DrawOutputValue(1,Present_I1);
}
// Test for touch screen input
if (LEGO_Touch.dataAvailable())
{
LEGO_Touch.read();
x=LEGO_Touch.getX();
y=LEGO_Touch.getY();
EvaluateTouch(x,y);
delay(100);
while(LEGO_Touch.dataAvailable())
{
LEGO_Touch.read();
}
}
}
}
// Determine if touch screen input is within an active zone
void EvaluateTouch(int x, int y)
{
if ((x >= x_HotSpot) && (x <= x_HotSpot + HotSpot_width))
if ((y >= y_HotSpot) && (y <= y_HotSpot + HotSpot_height))
EvaluateSliders(x,y);
if ((x >= x_button) && (x <= x_button + button_width))
if ((y >= y_button) && (y <= y_button + button_height))
ExecuteButton(x,y);
}
// Reset Button for Outputs
void ExecuteButton(int x,int y)
{
for(int x=0; x< 6; ++x)
{
EraseSliderValue(x, int (brick.Port_PWM_Value(x)/25));
brick.PWM_Port(x, 0);
}
UpdateDisplay();
}
// Determine which slider was "touched"
void EvaluateSliders(int x,int y)
{
int line_number = (5 - (y-y_HotSpot)/(slider_height+1));
int line_value = (x-x_HotSpot)/(slider_space);
EraseSliderValue(line_number, int (brick.Port_PWM_Value(line_number)/25));
brick.PWM_Port(line_number, int (line_value * 25));
DrawSliderValue(line_number, line_value);
DrawIndicatorValue(line_number,brick.Port_PWM_Value(line_number));
}
// Update Screen Elements
void UpdateDisplay()
{
for(int x=0;x<8;++x)
{
if (x < 6)
{
DrawSliderValue(x,brick.Port_PWM_Value(x));
DrawIndicatorValue(x,brick.Port_PWM_Value(x));
}
else
DrawIndicatorValue(x,brick.Input_Port(x));
}
}
// Draw All Sliders
void Sliders()
{
for(int x=0; x < 6; ++x)
{
y_slider = 224-(x*(slider_height+2));
DrawSlider(x);
DrawSliderValue(x,0);
}
}
// Draw each Slider
void DrawSlider(int line)
{
String label=" Line ";
label.concat(char(48+line));
LEGO_Display.setColor(255,255,255);
LEGO_Display.setBackColor(0,0,0);
LEGO_Display.print(label, LEFT,224-(line*(slider_height+2)));
LEGO_Display.print(" OFF", 53, 224-(line*(slider_height+2)));
LEGO_Display.print(" MAX", RIGHT, 224-(line*(slider_height+2)));
LEGO_Display.setColor(0,0,0);
LEGO_Display.drawLine(x_slider,224-(line*(slider_height+2))+(slider_height/2),x_slider+slider_width+(10*slider_space),224-(line*(slider_height+2))+(slider_height/2));
for(int x=0;x<11;++x)
{
LEGO_Display.drawLine(x_slider+(slider_width/2)+(x*slider_space),224-(line*(slider_height+2)),x_slider+(slider_width/2)+(x*slider_space),224-(line*(slider_height+2))+(slider_height));
}
}
// Display Slider Value on Screen
void DrawSliderValue(int line, int value)
{
if (line < 6)
LEGO_Display.setColor(255, 0, 0);
else
LEGO_Display.setColor(0, 255, 0);
if (value == 0)
LEGO_Display.setColor(0,0,0);
LEGO_Display.fillRoundRect(x_slider+(value*slider_space), 224-(line*(slider_height+2)), x_slider+slider_width+(value*slider_space), 224-(line*(slider_height+2)) + slider_height);
LEGO_Display.setColor(0, 0, 0);
LEGO_Display.drawRoundRect (x_slider+(value*slider_space), 224-(line*(slider_height+2)), x_slider+slider_width+(value*slider_space), 224-(line*(slider_height+2)) + slider_height);
if (value == 0)
{
LEGO_Display.setColor(255,255,255);
LEGO_Display.drawRoundRect (x_slider+(value*slider_space)+1, 224-(line*(slider_height+2))+1, x_slider+slider_width+(value*slider_space)-1, 224-(line*(slider_height+2)) + slider_height-1);
}
}
// Remove Slider value from Screen
void EraseSliderValue(int line, int value)
{
LEGO_Display.setColor(0, 255, 255);
LEGO_Display.fillRoundRect(x_slider+(value*slider_space), 224-(line*(slider_height+2)), x_slider+slider_width+(value*slider_space), 224-(line*(slider_height+2)) + slider_height);
LEGO_Display.setColor(0,0,0);
LEGO_Display.drawLine (x_slider+(value*slider_space), 224-(line*(slider_height+2))+(slider_height/2), x_slider+slider_width+(value*slider_space), 224-(line*(slider_height+2))+(slider_height/2));
LEGO_Display.drawLine(x_slider+(slider_width/2)+(value*slider_space),224-(line*(slider_height+2)),x_slider+(slider_width/2)+(value*slider_space),224-(line*(slider_height+2))+(slider_height));
}
// Draw Indicator Dots on Screen
void Indicators()
{
for(int x=0; x < 8; ++x)
{
DrawIndicatorValue(x,0);
}
}
// Display Input and Output Status on Screen
void DrawIndicatorValue(int line, int value)
{
LEGO_Display.setColor(50,50,50);
if (line < 6)
{
if (value != 0)
LEGO_Display.setColor(255,0,0);
}
else
{
if (value > 511)
LEGO_Display.setColor(0,255,0);
Serial.println(value);
}
LEGO_Display.fillRoundRect(x_indicator-(line*indicator_space), y_indicator, x_indicator-indicator_width-(line*indicator_space), y_indicator + indicator_height);
LEGO_Display.setColor(0,0,0);
LEGO_Display.drawRoundRect(x_indicator-(line*indicator_space), y_indicator, x_indicator-indicator_width-(line*indicator_space), y_indicator + indicator_height);
}
// Draw All Input Display on Screen
void Outputs()
{
for(int x=0;x<2;++x)
{
DrawOutput(x);
DrawOutputValue(x,LOW);
}
}
// Draw each Input Display on Screen
void DrawOutput(int line)
{
String label=" Output ";
label.concat(char(48-line+7));
label.concat(" ");
LEGO_Display.setColor(255,255,255);
LEGO_Display.setBackColor(0,0,0);
LEGO_Display.print(label, LEFT,y_output+(line*(output_height+2)));
LEGO_Display.print(" ", RIGHT, y_output+(line*(output_height+2)));
LEGO_Display.setColor(0,0,0);
LEGO_Display.drawRoundRect(x_output, y_output+(line*(output_height+2)), x_output+output_width, y_output+(line*(output_height+2)) + output_height);
}
// Draw Input Display based on Value to Screen
void DrawOutputValue(int line, int value)
{
if (line == 0)
line = 1;
else
line = 0;
if (value > 511)
{
LEGO_Display.setColor(0,255,0);
LEGO_Display.fillRoundRect(x_output, y_output+(line*(output_height+2)), x_output+output_width, y_output+(line*(output_height+2)) + output_height);
}
else
{
LEGO_Display.setColor(50,50,50);
LEGO_Display.fillRoundRect(x_output, y_output+(line*(output_height+2)), x_output+output_width, y_output+(line*(output_height+2)) + output_height);
}
LEGO_Display.setColor(0,0,0);
LEGO_Display.drawRoundRect(x_output, y_output+(line*(output_height+2)), x_output+output_width, y_output+(line*(output_height+2)) + output_height);
}