DaveWare ledde styrelsen (3 / 5 steg)
Steg 3: Programmering datorn (teensy 3.1/3.2)
Det teensy 3.1/3.2 är en arduino kompatibel utveckling styrelsen som jag hade valt eftersom den har en stor mängd RAM-minne (64 Kb) som används för skärmbuffert. Kontinuerligt, den här skärmen buffert innehåll visas i 96 x 64 resolution LED-skärmen. Så, vi behöver en rutin/timerfunktion som utför denna uppgift .
Vi behöver en funktion för att få kommandon via WiFi nätverk genom modulen ESP8266. Detta kommer att läsa den information som skickas av PC (och även android i en nära framtid)
Men först måste vi ställa den Arduino IDE 1.6.5 programmeringsmiljön för stöd vår dator (teensy 3.1/3.2) och också ESP8266 - 01 WiFi modul. För detta, måste vi följa den här stammen:
- Hämta och installera den Arduino IDE 1.6.5 eller större
- Hämta och installera den Teensyduino filen (jag gjorde detta i Windows 7). Installationsprogrammet lägger till stödfiler som behövs till Arduino IDE för teensy 3.1/3.2 styrelsen/dator.
- Gjort, är vi redo för att programmera det teensy för kontroll RGB LED paneler arrangemanget med vår windows applikation av WiFi.
För det andra i teensy dator skissen måste vi definiera konfiguration av pins för ESP8266 (UART) och de första 32 x 32 RGB LED panelen.
/ * < br > *
* Ändrat av David Elías Flores Escalante, för hantera ett arrangemang av sex 32 x 32 RGB Led paneler för
* en 96 x 64 skärmupplösning.
*/
#include "glcdfont.h"
CONST uint8_t NPANELS = 6;
CONST uint8_t NTRAMA = 128;
CONST uint8_t SIZEX = 32 * NPANELS;
CONST uint8_t SIZEY = 32.
#include "logo.h"
#define swap (a, b) {int16_t t = a; en = b; b = t;}
PortC [0:11] = {15, 22, 23, 9, 10, 13, 11, 12, 28, 27, 29, 30}
PortD [0:7] = {2, 14, 7, 8, 6, 20, 21, 5}
Definiera pins
CONST uint8_t
PortC
APIN = 15, BPIN = 22, CPIN = 23, DPIN = 9,
CLOCKPIN = 10, LATCHPIN = 13, OEPIN = 11,
PortD
R1PIN = 2, R2PIN = 8,
G1PIN = 14, G2PIN = 6,
B1PIN = 7, B2PIN = 20;
uint8_t pinTable [13] = {
R1PIN, R2PIN, G1PIN, G2PIN, B1PIN, B2PIN,
APIN, BPIN, CPIN, DPIN, CLOCKPIN, LATCHPIN, OEPIN};
Tar 1/8 rader via en dekoder
uint16_t const A = 1, B = 2, C = 4, D = 8.
Fungerar som en 16-bitars skiftregister
uint16_t const SCLK = 16.
uint16_t const spärren = 32.
uint16_t const OE = 64;
uint16_t const abcVar [16] = {//Decoder counter var
0, A, B, A + B, C, C + A, C + B, A + B + C,
0 + D, A + D, B + D, A + B + D, C + D, C + A + D, C + B + D, A + B + C + D};
Data linjer för rad 1 röd och rad 9 röd, ect.
uint16_t const RED1 = 1, RED2 = 8;
uint16_t const GREEN1 = 2, GREEN2 = 16.
uint16_t const BLUE1 = 4, BLUE2 = 32.
statisk uint8_t gr, gg, gb;
statisk int peso = 25, patch = 1 / * minutos = 1, segundos = 0, * / modalidad = 1;
statisk int oldMinD = 60, oldMinU = 600, oldSegD = 60, oldSegU = 60, oldColor = 9393, tipo = 0;
Här är där data är alla läsa
statiska byte ScreenBuffer [SIZEX * SIZEY * 4];
int BufferIn [512];
BAM och avbryta variabler
uint8_t rowN = 0;
uint16_t BAM;
uint8_t BAMMAX = 7. nu 24 bitars färg! (0-7)
int cmd = 0;
byte prevVal1, prevVal2, val;
int datafromPC;
booleska dataIn = false;
int dataPos = 0;
Skissen ange modulen ESP8266 WiFi som AP (åtkomstpunkt), så, vi behöver inte ytterligare nätverksmaskinvara att ansluta våra laptop (eller dator med trådlös funktion) till LED styrelsen. För detta behöver vi att skicka till ESP8266 på kommandon av seriellt gränssnitt teensy UART stift:
/***************************************************************************<br> set ESP8266
***************************************************************************/
void setup_ESP8266()
{
Återställa ESP8266
Serial1.println("at+rst");
WaitOK();
Ställa in ESP8266 i CWMODE = 1: AP-läge
Serial1.println("at+CWMODE=1");
WaitOK();
Ställa in ESP8266 i CIPMODE = 1:
Serial1.println("at+CIPMODE=1");
WaitOK();
Be ESP8266 IP-nummer (AP och Station)
Serial1.println("at+CIFSR");
WaitOK();
AP-parametrarna. SSID, lösenord
Serial1.println("at+CWSAP=\"LED_BOARD\",\"321654\",5,0");
WaitOK();
Återställa ESP8266
Serial1.println("at+rst");
WaitOK();
Ange ESP8266 för flera anslutningar
Serial1.println("at+CIPMUX=1");
WaitOK();
Ställ in läge för ESP8266 Server, Port
Serial1.println("at+CIPSERVER=1,9999");
WaitOK();
Ange timeout för ESP8266 servern till 7200 sekunder
Serial1.println("at+CIPSTO=28800");
WaitOK();
}
Nu måste vi att läsa data från ESP8266 skickas av laptop/PC av WiFi.
om (Serial1.available()) < br > {
prevVal1 = prevVal2;
prevVal2 = val;
datafromPC = val = Serial1.read();
om (prevVal1 == 192 & & prevVal2 == 192) / / Peso
annat if (prevVal1 == "p" & & prevVal2 == "e" & & val =='s ")
{
dataPos = 0;
dataIn = sant;
CMD = 1;
IF(Serial)
Serial.println ("kommandot 1");
}
om (prevVal1 == 108 & & prevVal2 == 108) / / patch
annat if (prevVal1 == "i" & & prevVal2 =='n ' & & val =='t ')
{
dataPos = 0;
dataIn = sant;
CMD = 2;
IF(Serial)
Serial.println ("kommandot 2");
}
om (prevVal1 == 109 & & prevVal2 == 109) / / Modalidad
annat if (prevVal1 == är "& & prevVal2 =="o"& & val == hade")
{
dataPos = 0;
dataIn = sant;
CMD = 3;
IF(Serial)
Serial.println ("kommandot 3");
}
om (prevVal1 == 110 & & prevVal2 == 110) / / Cronometro
annat if (prevVal1 == är "& & prevVal2 =="o"& & val == hade")
{
dataPos = 0;
dataIn = sant;
CMD = 4;
IF(Serial)
Serial.println ("kommandot 4");
}
om (prevVal1 == 111 & & prevVal2 == 111) / / Atleta
annat if (prevVal1 == är "& & prevVal2 =="o"& & val == hade")
{
dataPos = 0;
dataIn = sant;
CMD = 5;
IF(Serial)
Serial.println ("kommandot 5");
}
om (prevVal1 == 112 & & prevVal2 == 112) / / Nombre Liga
annat if (prevVal1 == är "& & prevVal2 =="o"& & val == hade")
{
dataPos = 0;
dataIn = sant;
CMD = 6;
IF(Serial)
Serial.println ("kommandot 6");
}
om (prevVal1 == 140 & & prevVal2 == 140) / / Receso
{
dataPos = 0;
dataIn = sant;
CMD = 8.
IF(Serial)
Serial.println ("kommandot 8");
}
om (prevVal1 == 160 & & prevVal2 == 160) / / tipo pantalla
{
dataPos = 0;
dataIn = sant;
CMD = 9.
IF(Serial)
Serial.println ("kommandot 9");
}
om (prevVal1 == 170 & & prevVal2 == 170) / / nuevo
{
dataPos = 0;
dataIn = sant;
CMD = 20;
IF(Serial)
Serial.println ("kommandot 20");
}
om (prevVal1 == 113 & & prevVal2 == 113) / / Fecha y Hora
annat if (prevVal1 == är "& & prevVal2 =="o"& & val == hade")
{
dataPos = 0;
dataIn = sant;
CMD = 7.
IF(Serial)
Serial.println ("kommandot 7");
}
om (prevVal1 == 150 & & prevVal2 == 150 & & val == 150) / / FIN DE TRAMA
om (prevVal1 == 'f' & & prevVal2 == "i" & & val =='n ')
{
dataIn = false;
IF(CMD==1) //PESO
{
PrintScreen_Peso (& BufferIn[0]);
}
IF(CMD==2) //INTENTO
{
PrintScreen_Intento (& BufferIn[0]);
}
IF(CMD==3) //MODALIDAD
{
modalidad = BufferIn [0];
PrintScreen_Modalidad(modalidad);
}
IF(CMD==4) //CRONOMETRO
{
PrintScreen_Timer (& BufferIn[0]);
/ * om (sinne == 0 & & minU == 0 & & segD == 0 & & segU == 0)
oldMinD = oldMinU = oldSegD = 60. * /
}
IF(CMD==5) //ATLETA
{
PrintScreen_Atleta (& BufferIn[0]);
}
IF(CMD==8) //RECESO
{
PrintScreen_Receso (& BufferIn[0]);
}
IF(CMD==9) //tipo Pantalla
{
Tipo = BufferIn [0];
clrScreen();
Switch(Tipo)
{
fall 0:
PrintScreen_Logo();
bryta;
fall 1:
PrintScreen_Titulo_Levantamiento();
bryta;
fall 2:
PrintScreen_Titulo_Receso();
bryta;
fall 3:
TestScreen_01();
bryta;
};
PrintScreen_Tipo (& BufferIn[0]);
}
IF(CMD==7) //Fecha y Hora
{
PrintScreen_FechaHora (& BufferIn[0]);
}
CMD = 0;
val = "";
}
om (prevVal1 =='s "& & prevVal2 =="c"& & val =="c")
{
för (int jag = 0; jag < 4096 * NPANELS; i ++)
{
IF(Serial)
{
Serial.Print(ScreenBuffer[i]);
Serial.Print(",");
IF(i%96==0)
Serial.Print("\n\r");
}
}
val = "";
}
om (prevVal1 == "c" & & prevVal2 == 'l' & & val =='s ")
{
clrScreen();
IF(Serial)
{
Serial.println ("Pantalla Borrada");
}
val = "";
}
om (prevVal1 == 'f' & & prevVal2 == "i" & & val == 'l')
{
fillScreen (0xff, 0xff, 0x00);
IF(Serial)
{
Serial.println ("Prueba Pantalla");
}
val = "";
}
om (prevVal1 == 'r' & & prevVal2 =='s "& & val =='t ')
{
oldMinD = oldMinU = oldSegD = oldSegU = 60.
IF(Serial)
{
Serial.println ("Pantalla Reiniciada");
}
val = "";
}
om (prevVal1 == 'l' & & prevVal2 == "o" & & val == "g")
{
för (int jag = 0; jag < sizex * sizey * 4; i ++) = "" screenbuffer [i] = "logo [i];" = "" = "" = "" if(serial) = "" {= "" serial.println ("pantalla =" "muestra =" "logo =" "daveware"); = ""} = "" val = ""; = "" = ""} = "" = "" om (prevval1 = "='s '" & & = "" prevval2 = "="c"& &" {= "" string = "" msgstring = "DaveWare" msgstring.reserve(200); = "" scrooltext (0,0, msgstring = "", = "" 0x0000ff, = "" 1,50); = "" {= ""; = "" 1,25); = "" < = "" p = "" >< / sizex * sizey * 4; i ++) >
om (prevVal1 =='t ' & & prevVal2 =='s "& & val =="x")
{
TestScreen_01();
}
annat if(dataIn)
{
BufferIn [dataPos ++] = datafromPC;
}
}
}
Rutinen timer för dra slut buffert skärminnehåll LED styrelsen:
IntervalTimer timer1; < br >
void timerInit()
{
BAM = 0;
attackMatrix();
}
Uppdatera matrisen grejer händer här
varje par av rader tas genom dess BAM cykel
då rowNumber ökas och id gjort igen
void attackMatrix()
{
timer1.End();
uint16_t portData;
portData = 0; Tydliga data de kan ange
portData | = (abcVar [rowN]) | OE; ABC, OE
portData & = ~ spärren; SPÄRREN LÅG
GPIOC_PDOR = portData; Skriva till Port
uint8_t * starta = & ScreenBuffer [rowN * SIZEX * 8 + ((7-BAMMAX) + BAM) * 32 * NPANELS];
för (uint8_t jag = 0; jag < 32 * NPANELS; i ++)
{
GPIOD_PDOR = start [i]; Överföra data
GPIOC_PDOR | = SCLK; / / klocka hög
GPIOC_PDOR & = ~ SCLK; / / klocka låg
}
GPIOC_PDOR | = LATCH; / / spärren hög
GPIOC_PDOR & = ~ OE; / / OE låg, visar linje
#define LOOPTIME 1 //trial & fel får man både mjuka övergångar och lite flimmer
#define CALLOVERHEAD 0
timer1.BEGIN(attackMatrix,((LOOPTIME+CALLOVERHEAD) << bam)-calloverhead); = "" = "" om (bam = "" > = BAMMAX) //Checks BAMEN cykel till nästa gång.
{
IF(rowN == 15)
{
rowN = 0;
}
annat
{
rowN ++;
}
BAM = 0;
}
annat
{
BAM ++;
}
} < / bam)-calloverhead); >