Korišćenjem PlatformIO plug-in-a, MS Visual Studio Code postaje veoma sofisticiran IDE za pisanje i razvoj aplikacija na mnogim razvojnim sistemima. Za razliku od Arduino IDE-a, koji ne podržava TI mikroprocesore i gde je potrebno koristiti Energia IDE, jedan broj TI ploča je podržan u PlatformIO okruženju. Takav je i slučaj sa kombinacijom MSP430FR5994 i BOOSTXL-EDUMKII pločom.
Iskoristili smo snagu mikrokontrolera sa prva i kolor LCD ekran, višebojnu diodu, tastere i džojstik na drugom i napisali veoma jednostavnu, ali ilustrativnu aplikaciju kojom se mogu menjanem R/G/B parametara na ekranu i na diodi dobiti svetlosti boje u skladu sa zadatim vrednostima svake od osnovnih boja.
Standard pri kodiranju boja za prikaz na ekranu je RGB, pri čemu se svaka od vrednosti ove tri boje kreće u rasponu od 0-255. Na ekranu je normalizovan prikaz na 100% kako bi intuitivnije mogli da posmatramo efekte mešanja.
Lepo napisane biblioteke za ove dve pločice (sa jednom napomenom!!!!) omogućavaju lako programiranje u Arduino stilu.
#include <Arduino.h>
// colourMixer magazinMehatronika eduIot projekat 2022
#include "LCD_screen.h"
#include "LCD_utilities.h"
#include "LCD_screen_font.h"
#include "LiquidCrystal.h"
#include <Screen_HX8353E.h>
#include "SPI.h"
Screen_HX8353E myScreen;
uint16_t valueBlue = 0;
uint16_t valueBlueO = 0;
uint16_t valueGreen = 0;
uint16_t valueGreenO = 0;
uint16_t valueRed = 0;
uint16_t valueRedO = 0;
#define joystickX 2
#define joystickY 26
uint16_t x, y;
int i=0;
int k = 0;
void setup() {
pinMode(GREEN_LED, OUT);
pinMode(RED_LED,OUT);
pinMode(37,OUT); // Blue
pinMode(38,OUT); // Green
pinMode(39,OUT); // Red
pinMode(45,INPUT_PULLUP);
pinMode(46,INPUT_PULLUP);
pinMode(32,INPUT);
pinMode(33,INPUT);
Serial.begin(9600);
myScreen.begin();
myScreen.clear();
myScreen.gText(10,110,"magazinMehatronika", whiteColour);
}
void loop() {
x = map(analogRead(joystickX), 0, 4096, 0, 128);
y = map(analogRead(joystickY), 0, 4096, 128, 0);
if (x < 60) x = 1;
if (x > 126) x = 126;
if (y < 1) y = 1;
if (y > 126) y = 126;
if ( x>80)
{ if (valueRed<100) { valueRedO=valueRed; valueRed++; k=1;}
}
if ( x<50)
{ if (valueRed>0) {valueRedO=valueRed; valueRed--; k=1;}
}
if ( digitalRead(32))
{ if (valueBlue<100) { valueBlueO=valueBlue; valueBlue++; k=1;}
}
if ( digitalRead(33))
{ if (valueBlue>0) {valueBlueO=valueBlue; valueBlue--; k=1;}
}
if ( y<50)
{ if (valueGreen<100) { valueGreenO=valueGreen; valueGreen++; k=1;}
}
if ( y>80)
{ if (valueGreen>0) {valueGreenO=valueGreen; valueGreen--; k=1;}
}
analogWrite(39,valueRed*32/100);
analogWrite(38,valueGreen*32/100);
analogWrite(37,valueBlue*32/100);
delay(200);
// myScreen.clear();
if (k==1) {
k=0;
myScreen.setFontSize(1);
myScreen.gText(15,80, String(valueRedO)+"%",blackColour);
myScreen.gText(15,80, String(valueRed)+"%",redColour);
for (i=0; i<10; i++) {myScreen.dRectangle(10+i,50+i,20-2*i,20-2*i,myScreen.calculateColour( valueRed*8*32/101, 0, 0));}
myScreen.gText(55,80, String(valueGreenO)+"%",blackColour);
myScreen.gText(55,80, String(valueGreen)+"%",greenColour);
for (i=0; i<10; i++) {myScreen.dRectangle(50+i,50+i,20-2*i,20-2*i, myScreen.calculateColour( 0, valueGreen*8*32/101, 0));}
myScreen.gText(95,80, String(valueBlueO)+"%",blackColour);
myScreen.gText(95,80, String(valueBlue)+"%",blueColour);
for (i=0; i<10; i++) {myScreen.dRectangle(90+i,50+i,20-2*i,20-2*i,myScreen.calculateColour( 0, 0, valueBlue*8*32/100));}
for (i=0; i<10; i++) {myScreen.dRectangle(40+i,10+i,20-2*i,20-2*i, myScreen.calculateColour( valueRed*8*32/101, valueGreen*8*32/101, valueBlue*8*32/101));
myScreen.dRectangle(60+i,10+i,20-2*i,20-2*i, myScreen.calculateColour( valueRed*8*32/101, valueGreen*8*32/101, valueBlue*8*32/101));}
}
}
NAPOMENA: Energia fajl za definiciju pinova pins_energia.c na lokaciji: C:\Users\User.platformio\packages\framework-energiamsp430\variants\MSP-EXP430FR5994LP mora se korigovati. Ti nije dobro dodelio vrednosti ponova 18 i 39. Na pinu 39 je crvena dioda i kako nije pridružena na TOB5, neće raditi PWM na tom pinu – logično. Dakle treba izmeniti ovu datoteku i promeniti linije od 457 do 510 i one treba da glase:
const uint8_t digital_pin_to_timer[] = {
NOT_ON_TIMER, /* dummy */
NOT_ON_TIMER, /* 1 - 3.3v */
T1A1, /* 2 - P1.2 */
NOT_ON_TIMER, /* 3 - P6.1 */
NOT_ON_TIMER, /* 4 - P6.0 */
NOT_ON_TIMER, /* 5 - P6.2 */
T1A2, /* 6 - P1.3 */
NOT_ON_TIMER, /* 7 - P5.2 */
NOT_ON_TIMER, /* 8 - P6.3 */
NOT_ON_TIMER, /* 9 - P7.1 */
NOT_ON_TIMER, /* 10 - P7.0 */
NOT_ON_TIMER, /* 11 - P8.1 */
NOT_ON_TIMER, /* 12 - P8.2 */
NOT_ON_TIMER, /* 13 - P8.3 */
NOT_ON_TIMER, /* 14 - P5.1 */
NOT_ON_TIMER, /* 15 - P5.0 */
NOT_ON_TIMER, /* 16 - RST */
NOT_ON_TIMER, /* 17 - P5.3 */
NOT_ON_TIMER, /* 18 - P4.4 */
NOT_ON_TIMER, /* 19 - P5.7 */
NOT_ON_TIMER, /* 20 - GND */
NOT_ON_TIMER, /* 21 - 5.0v */
NOT_ON_TIMER, /* 22 - GND */
NOT_ON_TIMER, /* 23 - P3.0 */
NOT_ON_TIMER, /* 24 - P3.1 */
NOT_ON_TIMER, /* 25 - P3.2 */
NOT_ON_TIMER, /* 26 - P3.3 */
NOT_ON_TIMER, /* 27 - P1.4 */
T0B2, /* 28 - P1.5 */
NOT_ON_TIMER, /* 29 - P4.7 */
NOT_ON_TIMER, /* 30 - P8.0 */
NOT_ON_TIMER, /* 31 - P4.1 */
NOT_ON_TIMER, /* 32 - P4.2 */
NOT_ON_TIMER, /* 33 - P4.3 */
NOT_ON_TIMER, /* 34 - P2.5 */
T0B1, /* 35 - P2.6 */
T4A1, /* 36 - P7.3 */
T0B3, /* 37 - P3.4 */
T0B4, /* 38 - P3.5 */
T0B5, /* 39 - P3.6 */
T0B6, /* 40 - P3.7 */
NOT_ON_TIMER, /* 41 - P2.0 */
NOT_ON_TIMER, /* 42 - P2.1 */
T0A1, /* 43 - P1.0 */
T0A2, /* 44 - P1.1 */
NOT_ON_TIMER, /* 45 - P5.6 */
NOT_ON_TIMER, /* 46 - P5.5 */
NOT_ON_TIMER, /* 47 - P4.0 */
NOT_ON_TIMER, /* 48 - P1.6 */
NOT_ON_TIMER, /* 49 - P2.2 */
NOT_ON_TIMER, /* 50 - P1.7 */
NOT_ON_TIMER, /* 51 - P7.2 */
};
Projekat možete preuzeti na GitHub-u: