#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#include <math.h>
#include "pictos.h"
#define MATRIX_WIDTH 10
#define MATRIX_HEIGHT 15
#define PIN 6
#define RED 0xF800 // Vermelho
#define GREEN 0x07E0 // Verde
#define BLUE 0x001F // Azul
#define YELLOW 0xFFE0 // Amarelo
#define CYAN 0x07FF // Ciano
#define MAGENTA 0xF81F // Magenta
#define WHITE 0xFFFF // Branco
#define BLACK 0x0000 // Preto
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(MATRIX_WIDTH, MATRIX_HEIGHT, PIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_ROWS + NEO_MATRIX_ZIGZAG,
NEO_GRB + NEO_KHZ800);
void drawSmileFromAdc(uint16_t concavity, uint8_t parab_width, uint16_t color)
{
// Equação da curva --> ax² + bx + c
// a = concavidade / resolução
// b e c = 0
float a = (concavity / 512.0);
for (int x = 0; x < MATRIX_WIDTH; x++)
{
int y = a * (pow(x - (MATRIX_WIDTH - 1) / 2.0, 2) / parab_width);
if (y >= 0 && y < MATRIX_HEIGHT)
{
matrix.drawPixel(x, y, color);
}
}
matrix.show();
}
void drawLine(uint8_t xi, uint8_t yi, uint8_t xf, uint8_t yf, uint16_t color)
{
// Linha inicial = Linha final
if(yi == yf)
{
for(int i = xi; i <= xf; i++)
{
matrix.drawPixel(i, yi, color);
}
}
// Coluna inicial = Coluna final
else if(xi == xf)
{
for(int i = yi; i <= yf; i++)
{
matrix.drawPixel(xi, i, color);
}
}
// Linha inicial != Linha final OU Coluna inicial != Coluna final
else
{
// Equação da reta ---> y = ax + b
// a = delta y - delta x
// b = y - ax
float a = (float)(yf-yi) / (float)(xf-xi);
float b = (float)yf - a*(float)xf;
for(int x = xi; x <= xf; x++)
{
int y = a*x + b;
matrix.drawPixel(x, y, color);
}
}
matrix.show();
}
void drawRectangle(uint8_t xi, uint8_t yi, uint8_t w, uint8_t h, uint16_t color)
{
for(int x = xi; x < w + xi; x++)
{
for(int y = yi; y < h + yi; y++)
{
matrix.drawPixel(x, y, color);
}
}
matrix.show();
}
void drawSpiraling(uint16_t color)
{
int xc = MATRIX_WIDTH / 2;
int yc = MATRIX_HEIGHT / 2;
int i, xa = xc, ya = yc;
for(i = 0; i < xc; i++)
{
for(xa; xa <= xc + i; xa++)
{
matrix.drawPixel(xa, ya, color);
delay(300);
matrix.show();
}
for(ya; ya <= yc + i; ya++)
{
matrix.drawPixel(xa, ya, color);
delay(300);
matrix.show();
}
for(xa; xa >= xc - i; xa--)
{
matrix.drawPixel(xa, ya, color);
delay(300);
matrix.show();
}
for(ya; ya >= yc - i; ya--)
{
matrix.drawPixel(xa, ya, color);
delay(300);
matrix.show();
}
}
}
void drawImageFromRGB565(uint16_t * image, uint16_t image_width, uint16_t image_height)
{
uint16_t i, x, y;
// Varre os pixels da imagem
for(i = 0; i < image_width * image_height; i++)
{
// Define coordenada e sua respectiva cor
y = i / 10;
x = i % 10;
matrix.drawPixel(x, y, image[i]);
} matrix.show(); // Exibe a imagem na matriz
}
uint16_t receiveCommand(uint8_t * buff)
{
uint16_t n = Serial.readBytes(buff, 4);
buff[n] = '\0';
Serial.println((char)buff[0]);
Serial.println((char)buff[3]);
if(buff[0] == 'M' && buff[3] == 'm')
return true;
else
return false;
}
void treatCommand(uint8_t * buff)
{
uint16_t data = buff[2];
if(buff[1] == 'l')
{
matrix.fillScreen(0);
matrix.show();
}
else if(buff[1] == 'p')
{
switch(data)
{
case '1':
drawImageFromRGB565(picto_1, MATRIX_WIDTH, MATRIX_HEIGHT);
break;
case '2':
drawImageFromRGB565(picto_2, MATRIX_WIDTH, MATRIX_HEIGHT);
break;
default:
Serial.println("Comando inválido");
}
}
}
void setup()
{
Serial.begin(9600);
matrix.begin();
matrix.setBrightness(255);
}
// Variaveis do escopo loop()
uint8_t cmd[5];
void loop()
{
if(Serial.available() > 0)
{
if(receiveCommand(cmd))
{
Serial.print("Comando recebido: ");
for(uint16_t i = 0; i < 4; i++)
Serial.print((char)cmd[i]);
treatCommand(cmd);
}
else
Serial.println("Comando inválido");
}
drawImageFromRGB565(picto_1, MATRIX_WIDTH, MATRIX_HEIGHT);
delay(3000);
matrix.fillScreen(0);
drawImageFromRGB565(picto_2, MATRIX_WIDTH, MATRIX_HEIGHT);
delay(3000);
matrix.fillScreen(0);
}