Arduino > Wemos D1 Mini Matrix Shield

1.  Installation

2.  Code de base

Global :

// INCLUDE LIBRARY:
#include <Adafruit_GFX.h>
#include <WEMOS_Matrix_GFX.h>

// INSTANTIATE MATRIX OBJECT:
MLED matrix(7); // SET TO MAXIMUM INTENSITY (7).

Dans loop() :

// EFFACER LE CONTENU PRECEDENT:
matrix.clear();

// DESSINER UN PIXEL:
matrix.drawPixel(x, y, LED_ON);

// DESSINER UNE LIGNE:
matrix.drawLine( x0, y0, x1, y1, LED_ON);

// DESSINER UN RECTANGLE VIDE:
matrix.drawRect( x , y, width, height , LED_ON);

// REMPLIR UN RECTANGLE:
matrix.fillRect(x, y, width, height  , LED_ON);

// DESSINER UN CERCLE VIDE:
matrix.drawCircle( x , y, radius, LED_ON);

// REMPLIR UN CERCLE:
matrix.fillCircle(x, y, radius, LED_ON);

// DESSINER UN TRIANGLE VIDE:
matrix.drawTriangle(x0, y0, x1, y1,  x2, y2, LED_ON );

// REMPLIR UN TRIANGLE:
matrix.fillTriangle(ux0, y0, x1, y1,  x2, y2, LED_ON);

// TEXTE:
matrix.setTextSize(1);
matrix.setTextWrap(false);  // NO TEXT WRAP
matrix.setTextColor(LED_ON);
matrix.setCursor(x,y);
matrix.print("text");

// METTRE A JOUR LES PIXELS A LA MATRICE:
matrix.writeDisplay();  // write the changes we made to the display

// FOR MORE, SEE:
// https://learn.adafruit.com/adafruit-gfx-graphics-library/graphics-primitives

3.  Dessiner des images

Définir les images dans l'espace global (avant setup() ) :

// EN BINAIRE :
const unsigned char image_name[] PROGMEM = {
        B00111100,
        B01000010,
        B10100101,
        B10000001,
        B10100101,
        B10011001,
        B01000010,
        B00111100 };

// OU

// EN HEXADECIMALE :
const unsigned char image_name [] PROGMEM = {
        0xff, 0xff, 0xbd, 0xff,0xff, 0xbd, 0xc3, 0xff
};

Dans loop() :

matrix.drawBitmap(x, y, image_name , 8, 8, LED_ON);

Convertir les images avec image2cpp  :

4.  Exemples

4.1  Demo


#include <Adafruit_GFX.h>
#include <WEMOS_Matrix_GFX.h>

MLED matrix(7); //set intensity=7 (maximum)

void setup() {
        Serial.begin(57600);
        Serial.println("8x8 LED Matrix Test");


}

static const uint8_t PROGMEM
smile_bmp[] =
{ B00111100,
        B01000010,
        B10100101,
        B10000001,
        B10100101,
        B10011001,
        B01000010,
        B00111100 },
neutral_bmp[] =
{ B00111100,
        B01000010,
        B10100101,
        B10000001,
        B10111101,
        B10000001,
        B01000010,
        B00111100 },
frown_bmp[] =
{ B00111100,
        B01000010,
        B10100101,
        B10000001,
        B10011001,
        B10100101,
        B01000010,
        B00111100 };

void loop() {
        matrix.clear();
        matrix.drawBitmap(0, 0, smile_bmp, 8, 8, LED_ON);
        matrix.writeDisplay();
        delay(500);

        matrix.clear();
        matrix.drawBitmap(0, 0, neutral_bmp, 8, 8, LED_ON);
        matrix.writeDisplay();
        delay(500);

        matrix.clear();
        matrix.drawBitmap(0, 0, frown_bmp, 8, 8, LED_ON);
        matrix.writeDisplay();
        delay(500);

        matrix.clear();      // clear display
        matrix.drawPixel(0, 0, LED_ON);
        matrix.writeDisplay();  // write the changes we just made to the display
        delay(500);

        matrix.clear();
        matrix.drawLine(0,0, 7,7, LED_ON);
        matrix.writeDisplay();  // write the changes we just made to the display
        delay(500);

        matrix.clear();
        matrix.drawRect(0,0, 8,8, LED_ON);
        matrix.fillRect(2,2, 4,4, LED_ON);
        matrix.writeDisplay();  // write the changes we just made to the display
        delay(500);

        matrix.clear();
        matrix.drawCircle(3,3, 3, LED_ON);
        matrix.writeDisplay();  // write the changes we just made to the display
        delay(500);

        matrix.setTextSize(1);
        matrix.setTextWrap(false);  // we dont want text to wrap so it scrolls nicely
        matrix.setTextColor(LED_ON);
        for (int8_t x=0; x>=-36; x--) {
                matrix.clear();
                matrix.setCursor(x,0);
                matrix.print("Hello");
                matrix.writeDisplay();
                delay(100);
        }
        matrix.setRotation(3);
        for (int8_t x=7; x>=-36; x--) {
                matrix.clear();
                matrix.setCursor(x,0);
                matrix.print("World");
                matrix.writeDisplay();
                delay(100);
        }
        matrix.setRotation(0);
}

4.2  Neige

wemos_matrix_gfx_snow.zip

4.3  Serveur pour afficher du texte

Changer le ssid et le mot de passe pour votre configuration réseau!

wemos_matrix_gfx_server.zip

4.4  Image par UDP

Code Arduino

Changer le ssid et le mot de passe pour votre configuration réseau! Choisir aussi une adresse IP unique!

// SEND AN ASCII MASSAGE BY UDP TO DRAW THE PIXELS.
// A AN ASCII MASSAGE IS A MESSAGE THAT STARTS WITH AN "ADDRESS".
// IT IS THEN FOLLOWED BY VALUES SEPARATED BY SPACES.
// IT ENDS WITH A NEW LINE (ASCII CODE 10).

// DRAW AN IMAGE
////////////////

// SEND THE FOLLOWING MASSAGE TO DRAW AN IMAGE:
// img row0 row1 row2 row3 row4 row5 row6 row7

// EACH rowX DATA IS A NUMBER BETWEEN 0-255 THAT REPRESENTS
// THE 8 PIXELS FOR THAT ROW.

// EXAMPLES:
// CLEAR:
// img 0 0 0 0 0 0 0 0
// FILL:
// img 255 255 255 255 255 255 255 255
// FACE:
// img 255 255 189 255 255 189 195 255
// FROWN:
// img 255 255 189 255 255 195 189 255

// DRAW A PIXEL
////////////////

// SEND THE FOLLOWING MASSAGE TO DRAW A PIXEL
// pix x y state

// x AND y IS THE POSITION OF THE PIXEL.
// state IS EITHER 0 OR 1 (OFF OR ON).

// INCLUDE ESP8266WiFi:
#include <ESP8266WiFi.h>

const char* ssid     = "*****";
const char* password = "*****";
IPAddress ip(10, 5, 0, 120);
IPAddress gateway(10, 5, 0, 1);
IPAddress subnet(255, 255, 255, 0);

// INCLUDE ESP8266 UDP
#include <WiFiUdp.h>
WiFiUDP udp;

// INCLUDE MASSAGE PARSER
#include <AsciiMassageParser.h>

// PACKER(FOR SENDING) AND PARSER(FOR RECEIVING) INSTANCES.
AsciiMassageParser inbound;

// WEMOS MATRIX SHIELD:
#include <Adafruit_GFX.h>
#include <WEMOS_Matrix_GFX.h>

MLED matrix(7); //set intensity=7 (maximum)

///////////
// SETUP //
///////////
void setup() {

        // INITIATE SERIAL COMMUNICATION.
        Serial.begin(57600);

        WiFi.config(ip , gateway , subnet );
        WiFi.begin(ssid, password);
        while (WiFi.status() != WL_CONNECTED) {
                Serial.print("Waiting for connection: ");
                Serial.print(millis());
                Serial.println(" ms");
                delay(50);
        }

        Serial.println("WiFi connected");
        Serial.println("IP address: ");
        Serial.println(WiFi.localIP());

        // START LISTENING ON UDP PORT 7777.
        udp.begin(7777);

}


//////////
// LOOP //
//////////
void loop() {

        // RECEIVE PACKETS OVER UDP

        if ( udp.parsePacket() ) {
                if ( inbound.parseStream( &udp ) ) {
                        if ( inbound.fullMatch("img") ) {
                                matrix.clear();

                                for ( int y = 0 ; y < 8 ; y++ ) {
                                        byte p = inbound.nextByte();

                                        for ( int x = 0; x < 8; x++) {
                                                if ( bitRead(p, x) ) matrix.drawPixel( x , y , LED_ON);
                                        }

                                }

                                matrix.writeDisplay();
                        } else if ( inbound.fullMatch("pix") ) {
                                byte x = inbound.nextByte();
                                byte y = inbound.nextByte();
                                byte state = inbound.nextByte();
                                matrix.drawPixel( x , y , state);
                                matrix.writeDisplay();
                        }
                }
        }


}

Code Max

Choisir l'adresse IP de votre Wemos!

<pre><code>
----------begin_max5_patcher----------
1445.3oc6ZszaaiCD9rKP+OHnyYMDkjkj2SsX2K8PAJP28TSgAsDsMyJSJPR
k3rE6+8kOzaKoJmHmzBzDXKmY3P9wONyvgz4au8MKr2ROg31V+t0WrVr3aRI
KzxTRVTJXg8Q3o3THW2P6iHNGtGYeSgRA5jPq3Va7w8VtqVoeAhVW+40U+8s
jasqLMESPwzbh1d2RozbQJRHdLCY.lss0WK0QxOhIRs7VVfSz.ft8tey0uEv
hooTloabV5bSi2.Kcp61LnH9.lreCCEKLMGrZkpYtgg5GdZi7BZZEW7XpFi0
yHI9LvWCPPo3s6aADuv.+PfBHdQ9d.e0mzu0nyKLw8RrYOClfQF5rwXuCmlp
6rMkjpsAN80D86fKCocrtBytqc.qCzV6rNxw27IoHPG9+rtXJ8vff.R1aVWb
CUqZ8zhLFMixDXJQ0LYWtt29IWPaRoxNS2p+6suQ8T93lmeTSF9jkqkuki87
3+6MS9+qhhzMKzU8HzSGE39K2+e49+Tb+InGjdm838yPYHRhkLJ3x8+A83+C
VaOAmZu0Ocm54OEfZaSm1+NOIC.QiQFgZRvrwF.37xxEPACeJVvRafPF7HRf
XaPD3Vy.6LHMjh4B6aJdVCYF8A8.DMcGFuI3v3p8T.NNUOt.Vx853w7cJzZd
7fF0AxMvvGlGtfvebBm5kbjeVQPyF4DLJ4T3r.V+CK4LvqYpPjwHG.vTUQzq
A2DSOdTsk1YbymU6DINfrxfw+CJw5HTShRQLZ99CV+8e9ok1SNwxJmwX.e.P
m80USD9d9ZJ3xRr3L+Tvec.ys34a0HFwzLAWyIeDdxpvqRJfpk89O+Ge3CUz
zNJSlV+BXH+Q2q1MxvI9guFLzfErXA4wX7GMy4OobTXR+h4o3Eev3AMQMHDv
pfmSI4EKvETPIGrvVV9G5dDiWTaXY6WXCyxZHeQSiTT2clhVCuoVFlXj4UKi
gtGW1E90hgL4bUHmn4LC5OETcLdUOQSPLRNtNr2rXVBsZJJvTXmqY+5.ecJX
+nlNMpZbSop36lEXHW3j0ghIx5Q4x.CXUswU5SP6f4ohM6nDAG+uZbpyh0WC
1AiQCaNQVmidZ9dFFVU.j57K3DJQAj1TuRd4PptXByxeq4jtIDXVelK8rjDz
PZ4xIaNeKjoVYJJ6xsRqfRSaqq1xTzNQg9LLgzkPEzrQzxv6OLl0aoRsGGs6
0p3axIF0ajwthMb38cXdALMsHZtyHbBRvxLVHA1rdH2xtRqoFzC7XFMMs871
n599TkH8uiQOfSDGJNwTCURCvYkNV10K6IXYJUQGgB3ddGQmGbKkUkpdi.cL
KUNa5zhV2vWqn1l4.aqnStPS9i5.xgRkMXI.ClQyWmQyKpwIQ7ZErNv7tmL8
MUUt81Y1fIInSMSiTs4PYNkmLIooiVC1HaEbNG5L.GB99bnNePH3YSgfWaJr
8dtcpaUPgiytXhXLB1a.B1yahdotlaBy+7CJeAT7KJmIn7GOtkl9z8JGJx1y
epg1N5pTVs9mFRSVmi5X..mq.qsZptZdl5WB+4g0DT73DV6Kp4BhOClJo4.t
ZwmMpzR8cVMz9oZvoZv.zImlyhKIjxImUGfJKTPfIUUf9kZeGUKm9p5kClUS
FLdWev3OUv3d8wh2jIF+qNX.SFKAihkRE0GjxVU6bxFywE1.EBFdatv3r25L
hWXorxiasElVTlZ0YeFut15xeqP4reT9imtyhfDKySxVxU47eGLIQd9OtL4+
RYQUKAtNVuS8EkXEJ+YdNhu2DNgewkB4FELC2Klwz1osJ3st9dkr2Y9bQs74
FveyGzveq20oIOdAuvimOXJCX6r.1TVh49S.uXHP8O2fEnGH3LCPv8ElzUeS
cSe.uJr9zff5qT+pw5fW5XKf2TFvRlo+jIctKP8X08N.6d+e8b2eibuemcme
ZLHe6+wlYTmB
-----------end_max5_patcher-----------
</code></pre>