Help with program for LED matrix slideshow

Continuing the discussion from Flag led matrix:

Hello Everyone. I see this is a very long chat that has been going on. I have a very similar project (using WS2801 12v LEDs but kinda the same) yet I am having with a different thing. I believe thespaghettilord got this frame from holidaycoro who sell 32x16 plastic frames for LEDs. I think this because I have the same thing. I am making something for a lightshow but I don't want a flag I want to make a slideshow. that displays this:

I modified it to use dashes and hashtags based on the previous messages I saw on this thread. Here is the actual text of it:

#############################################################################################################################################################################################

#############################################################################################################################################################################################

---------------------------------------------------------------------------------#------------#----------------------------------------------------------------------------------------------

---------------##---------------########-########-########-#--####------#------#-#------------#--------#------#-########-#--##--#-#####-----########-#------#---------------##---------------

-----------##########-----------------#--#------#--##----#--##----#------#-----#-########-----########--#-----#--------#-#--##--#-----#-----#------#-#------#-----------##########-----------

------------#-#--#-#------------------#--#------#--##----#--#-----#-------#----#--------#------------#---#----#--------#-#--##--#-----#-----#------#--#-----#------------#-#--#-#------------

-------------#----#-------------------#--#------#--####--#-#------#--------#--#---------#------------#----#--#---------#-#--##--#-----#-----#------#---#----#-------------#----#-------------

-------------#----#-------------------#--#------#--####--#-#------#-------#####---------#------------#---#####---------#-#--##--#-----------#------#----#---#-------------#----#-------------

------------#-#--#-#------------------#--#------#--------#-#------#------#----#--------#------------#---#----#---------#-#--##--#-----------#------#-----#--#------------#-#--#-#------------

-----------##########-----------------#--#------#--------#-#------#-----#-----#-------#------------#---#-----#---------#-#--##--#-----------#------#------#-#-----------##########-----------

---------------##---------------------#--#------#-########-#---#### ----#------#--####---------####----#------#--------#--##--##------------########-#######----------------##---------------


#############################################################################################################################################################################################

#############################################################################################################################################################################################


My mom wants to make this for some family friends. They are lyrics to a song that she wants to show, not just displaying this on the matrix but as lyrics that move across the slideshow. I guess I can just make 157 frames and have a for loop of an array that just displays the next frame but that seems like a big waste of time. Also don't know anything about memory that was also mentioned here. I am using an Arduino Uno but can upgrade to an Arduino Mega if I need to. Can anybody help me make this into a slideshow for my LED matrix?

Please do not hijack the others thread, make a new one.

Please don't hijack threads @lpinkshee. I have split your post out to its own topic.

Hijacking is against the Arduino forum rules. The reason is that it may sidetrack the discussion, even preventing the creator of the topic from getting the assistance they need. It also reduces your own chances of getting assistance.

This is basic forum etiquette, as explained in the "How to get the best out of this forum" guide. It contains a lot of other useful information. Please read it.

Thanks in advance for your cooperation.

Format your text-ascii using the <CODE> button in the reply box... it will look like this:

#############################################################################################################################################################################################
#############################################################################################################################################################################################
---------------------------------------------------------------------------------#------------#----------------------------------------------------------------------------------------------
---------------##---------------########-########-########-#--####------#------#-#------------#--------#------#-########-#--##--#-#####-----########-#------#---------------##---------------
-----------##########-----------------#--#------#--##----#--##----#------#-----#-########-----########--#-----#--------#-#--##--#-----#-----#------#-#------#-----------##########-----------
------------#-#--#-#------------------#--#------#--##----#--#-----#-------#----#--------#------------#---#----#--------#-#--##--#-----#-----#------#--#-----#------------#-#--#-#------------
-------------#----#-------------------#--#------#--####--#-#------#--------#--#---------#------------#----#--#---------#-#--##--#-----#-----#------#---#----#-------------#----#-------------
-------------#----#-------------------#--#------#--####--#-#------#-------#####---------#------------#---#####---------#-#--##--#-----------#------#----#---#-------------#----#-------------
------------#-#--#-#------------------#--#------#--------#-#------#------#----#--------#------------#---#----#---------#-#--##--#-----------#------#-----#--#------------#-#--#-#------------
-----------##########-----------------#--#------#--------#-#------#-----#-----#-------#------------#---#-----#---------#-#--##--#-----------#------#------#-#-----------##########-----------
---------------##---------------------#--#------#-########-#---#### ----#------#--####---------####----#------#--------#--##--##------------########-#######----------------##---------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#############################################################################################################################################################################################
#############################################################################################################################################################################################

(you were missing the bottom, white line of "-")

As you probably saw in the sketch, the "#" and "-" and "@" and "%" were place-holders for colors (any color, almost any character)

Can you describe the slide show?

The limit to the size of the display was memory on the Arduino... and then power distribution... but I think that was solved.

Oh yeah the bottom should be there, Thanks! The slideshow Im trying to go for looks like this:
ToEMc1
It slides across the screen like that. It should only be that, looking at the messages from the other post it looked like there maybe be enough memory - but do Arduino Unos or Arduino Megas have more memory? B/c if they do then I can use one of those instead to handle the memory needed.

What board were you intending to use ?
UNO & Nano have the same amount Mega has more.

This display is 24 * 6 pixels as far as i can tell, which comes down to 144 pixels, that will easily fit into a Nano / Pro-mini / UNO, with 3 bytes per pixel being required for the output buffer.
You will most probably need to use PROGMEM instead of RAM for the lyrics of the song, although even that may fit in RAM, but stuff that isn't modified is better of in PROGMEM (stored in flash as part of the program)

He/She simply got the led bulbs and nothing to mount it on. If you want to go for 32x16, that comes down to 512 pixels, at 3 bytes per pixel you end up at 1536 bytes as buffer, that is still OK.

You will also need to create binary output for each letter, although you may be able to use adafruit_GFX.h to actually generate the characters on 'screen' or even load in specific fonts, though if you do that into RAM you may run out of memory with a 32x16 screen. An UNO (atmega 328P) has 2KB of RAM and the output buffer would take up 3/4 of that. (although with some really clever programming you can address even more leds, but that is a bit beyond the scope of this)

memory and refresh rate. Power distribution should have been solved, but there was not the big PSU yet, and with several small ones it all gets really complex.

@lpinkshee

  • Your banner of ascii-text is 189 x 14 (cols x rows) = 2646 characters
  • I think the size was intended to be 192 x 16 = 3072 for even multiple of 16
  • 192x16 pixels will fill five 32col x 16row (512 pixel) panels
  • For reading, your banner would need to be shifted (right to left) one or two pixels per step
  • I have only done "page flipping", reading from right to left
  • Each character from PROGMEM would be placed at something like ROW * ((COL + STEP) + COL

Here is your banner in a simulation...

Here is the sketch for your banner...

// https://forum.arduino.cc/t/help-with-program-for-led-matrix-slideshow/1191399/

#include <FastLED.h>
#include <avr/pgmspace.h> // for PROGMEM

#define ROWS 16 // rows of Neopixels
#define COLS 32 // columns per row
#define NUMPIX (ROWS * COLS)
#define PAGE 5 // 192 columns displayed on 32 column matrix
#define MATRIX_PIN 2
#define MAXBRIGHT 255

CRGB led[NUMPIX];

const PROGMEM char song[] = { // sizeof() = 14 rows * 189 columns
  "------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------" // ROW  0
  "################################################################################################################################################################################################" // ROW  1
  "################################################################################################################################################################################################" // ROW  2
  "----------------------------------------------------------------------------------#------------#------------------------------------------------------------------------------------------------" // ROW  3
  "---------------##----------------########-########-########-#--####------#------#-#------------#--------#------#-########-#--##--#-#####-----########-#------#-----------------##---------------" // ROW  4
  "-----------##########------------------#--#------#--##----#--##----#------#-----#-########-----########--#-----#--------#-#--##--#-----#-----#------#-#------#-------------##########-----------" // ROW  5
  "------------#-#--#-#-------------------#--#------#--##----#--#-----#-------#----#--------#------------#---#----#--------#-#--##--#-----#-----#------#--#-----#--------------#-#--#-#------------" // ROW  6
  "-------------#----#--------------------#--#------#--####--#-#------#--------#--#---------#------------#----#--#---------#-#--##--#-----#-----#------#---#----#---------------#----#-------------" // ROW  7
  "%------------#----#--------------------#--#------#--####--#-#------#-------#####---------#------------#---#####---------#-#--##--#-----------#------#----#---#---------------#----#------------%" // ROW  8
  "------------#-#--#-#-------------------#--#------#--------#-#------#------#----#--------#------------#---#----#---------#-#--##--#-----------#------#-----#--#--------------#-#--#-#------------" // ROW  9
  "-----------##########------------------#--#------#--------#-#------#-----#-----#-------#------------#---#-----#---------#-#--##--#-----------#------#------#-#-------------##########-----------" // ROW 10
  "---------------##----------------------#--#------#-########-#---#### ----#------#--####---------####----#------#--------#--##--##------------########-#######------------------##---------------" // ROW 11
  "------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------" // ROW 12
  "################################################################################################################################################################################################" // ROW 13
  "################################################################################################################################################################################################" // ROW 14
  "------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------" // ROW 15
};

void setup() {
  FastLED.addLeds<WS2812B, MATRIX_PIN, GRB>(led, NUMPIX);
  FastLED.setBrightness(MAXBRIGHT); // Adjust the brightness value as needed
  FastLED.clear(); // clear pixel buffer
  FastLED.show(); // display cleared buffer
  Serial.begin(115200);

  // showSong();

  //******************
  // TEST FUNCTIONS **
  //******************
  // Serial.println(strlen(song)); // number of characters in the banner
  // serialSong(); // print banner (in PROGMEM) to serial monitor
  // randomSeed(analogRead(A0)); // increase randomness - not needed
  // fillByRowsCols();
  // fillByNumber();
  // showCorners(); // color corners of matrix

  FastLED.show(); // last function called for pixels to be displayed
}

void loop() {
  showSong();
  // randomPixels();
}

void showSong() {
  int column = 0, row = 0, page = 0, asciiChar;
  for (int k = PAGE; k >= 0 ; k--) { // reading RIGHT to LEFT
    for (int i = 0; i < ROWS; i++) {
      for (int j = 0; j < COLS; j++) {
        asciiChar = pgm_read_byte_near(song + (i * 192 + j) + (k * COLS)); // read 32 (chars), skip 192 (cols), repeat
        if (asciiChar == '-') // white
          led[i * COLS + j] =  CRGB(255, 255, 255); // WHITE
        if (asciiChar == '#') // blue
          led[i * COLS + j] =  CRGB(0, 0, 255); // BLUE
        if (asciiChar == '%') // dim white
          led[i * COLS + j] =  CRGB(63, 63, 63); // dim white to show first and last page
      }
    }
    FastLED.show();
    delay(500);
  }
}

void serialSong() { // show in serial monitor
  for (int i = 0; i < strlen(song); i++) {
    if (i % (strlen(song) / ROWS) == 0) // 14 rows of 189 pixels
      Serial.println(); // separate the rows
    int pix = pgm_read_byte_near(song + i);
    Serial.write(pix);
  }
}

void fillByRowsCols() {
  int pix, rows, cols;
  for (int i = 0; i < ROWS; i++) {
    rows++;
    for (int j = 0; j < COLS; j++) {
      led[i * COLS + j] = CRGB(random(2) * 255, random(2) * 255, random(2) * 255); // six primary colors
      cols++;
      pix++;
    }
  }
  Serial.print("Rows: ");
  Serial.println(rows);
  Serial.print("Cols: ");
  Serial.println(cols / rows);
  Serial.print("Pixs: ");
  Serial.println(pix);
}

void fillByNumber() { // show fill order
  int pix = 1; // for counting, not coloring
  for (int i = 0; i < ROWS * COLS - 1; i++) {
    led[i] = CRGB(random(2) * 255, random(2) * 255, random(2) * 255); // six primary colors
    pix++;
  }
  Serial.print("Rows: ");
  Serial.println(ROWS);
  Serial.print("Cols: ");
  Serial.println(COLS);
  Serial.print("Pixs: ");
  Serial.println(pix);
}

void showCorners() {
  led[0]   =  CRGB(255, 000, 000); // bottom, left
  led[31]  =  CRGB(000, 000, 255); // bottom, right
  led[480] =  CRGB(255, 255, 000); // top, left
  led[511] =  CRGB(000, 255, 000); // top, right
}

/*
    15*32+0+f               15*32+31+f
    led[480]                  led[511]
    +--------------------------------+
    |15                              |
    |                                |
    | PROGMEM ASCII to PIXEL         |
    | PIX = row * COLS + col  |
    |                                |
    +0_____________________________31+
    led[0]                     led[31]
    0 * 32 + 0             0 * 32 + 31
*/

void randomPixels() { // random pixel in random PRIMARY and SECONDARY color on ROWS x COLS matrix
  led[random(ROWS) * random(COLS)] = CRGB((random(2) * 255), (random(2) * 255), (random(2) * 255));
  FastLED.show();
}

... AND... it fits on a Nano!

Sketch uses 7766 bytes (25%) of program storage space. Maximum is 30720 bytes.
Global variables use 1812 bytes (88%) of dynamic memory, leaving 236 bytes for local variables. Maximum is 2048 bytes.

The gif was just an example of what I am trying to make, I am using a 32x16 structure like thespaghettilord which is why I thought they had the same frame I had but who knows. So 512 LEDs and 189x16 (I did make that mistake it should be 16 not 14 thank you xfpd for pointing that out) I made it 189 because the star on the IS flag seemed to be an 8x8 character so I made all the letters be an 8x8 character which came out to 189 but I can definitely make a space between the words to get to 192 for a nice and even number, just worried about memory.

Does the 512 LEDs still work with an UNO or do I need a mega? Also what is PROGMEM? Is it just a bigger RAM?

Also the example code that xfpd wrote was very cool but something I realized was that it was only 6 frames, not the 157 I previously had. Having that many frames is a lot so I get not wanting to have all of those frames but is there a way for me to have all those 157 frames? I'm new to Arduino so I don't know all the specs and stuff so I don't really know what PROGMEM is or how these for loops work so if I can increase the amount of frames even a little bit that would be cool. Thank you so much for already putting a bunch of work into this so quickly

If you click the link to the simulation and press the green button with the white ">" , you can see the five pages of the first banner you made... reading right to left.

Yes.

Not yet... : )

Yes. PROGMEM stores data into Flash memory space rather than SRAM, where programs reside. RAM is faster than Flash, so you want RAM to hold programs and Flash to hold data.

The basic algorithm for flipping pages 32x16 at a time is ready for any size. I think the question is only "will it all fit?" Is the first banner you made 5 frames of the 157 or just one frame of 157? Post all the banners here. (this might be the time we discover "Mega" or "Uno" : )... with this method.

HOWEVER; have a look at @marco_c MDParola library. It does magic with LED matrix panels. It seems you can even create your own font, so memory will not be an issue.

Are you wanting to display the entire banner at one time (using a 192 x 16 LED matrix), or scroll the banner across a 32 x 16 LED matrix?

Is the entire banner composed of just two colors?

Using a single 32 x 16 LED matrix, I do not see any problem using an UNO. Where are you getting 157 frames from? My guess is 157 + 32 = 189, which is the length of the banner, but that does not allow for the circular scroll where the beginning scrolls in as the ending scrolls out. Regardless, you only need a single array to store the actual banner, the code just shifts the position of the banner being displayed for each frame.

I want the banner to scroll like in the gif I posted above but I'll repost here: ToEMc1
I got 157 frames because 1 frame is 32 "units" long and the next frame is an additional 32 just moved one unit to the left and doing that until the very end gets 157 frames.

The entire banner is 189 characters long and by having 32 as one frame and then shifting the frame by one, I have a new frame, and doing that until the very end gives me 157 frames. The banner is 189 characters long and 157 frames. The banner is 189/32 = 5.9 so I see where the 5 comes from but the slideshow should basically start from the right and then shift one unit to the left. Repeat that 157 (Or 156) times until it gets to the very end.

The page-flipping algorithm "reads ahead" by 32 pixels now. The scrolling in your image requires moving the data "forward" on the panel one pixel at a time (maybe a few more, as our eyes might allow more than just one pixel shift and still see smooth movement).

Major thing... I have the current page-flipping reading from the right side of the "banner" to the left side. The scrolling (your image) will require the image to enter from the left and scroll to the right.

Trying to get the details in the open.

Be sure to post the "complete" banner.

White and blue on a Neopixel (not LED).

The stanza in the current code is 5 chunks of 157 chunks. Each stanza is 192 pixels long (5 chunks). The whole thing is a song.

I would have a visual pause. Let the old data scroll off before starting the new data.

Sorry, I think of addressable LEDs as LEDs sometimes. The reason I asked about the number of colors is that a two-color image allows the image to be stored as binary data instead of a char array, much less memory.

Yes, I was looking how to package the volume of empty space in the sizeof(char 192x16) and building an in-sketch translator

  • on/off could be one bit (monochrome LED)
  • minimum color choice could be three bits (red on/off, grn on/off, blu on/off) - RGBLED and Neopix
  • large color choice could be fifteen bits for thirty-two levels - for Neopixels, but gaining no memory
    -- (red b00000 - b11111, grn b00000 - b11111, blu b00000 - b11111)

Oops....

Only two lines changed from page-flipping to scrolling "x" pixel columns each step, but the change caused the loss of a necessary "multiplication by zero" (COLS was my 0) to start on the LAST page (left-most), rather than the first (right-most). You can see the green pixels show "start=lower right pixel" and "stop=lower left pixel"... This is my inwork-copy, so the original still works as a page flipper. I won't move this copy to the working original until I figure out my multiplication problem.

** IN-WORK COPY- NOT WORKING **

// https://forum.arduino.cc/t/help-with-program-for-led-matrix-slideshow/1191399/

#include <FastLED.h>
#include <avr/pgmspace.h> // for PROGMEM

#define ROWS 16 // rows of Neopixels
#define COLS 32 // columns per row
#define NUMPIX (ROWS * COLS)
// #define SCROLL 5 // 192 columns displayed on 32 column matrix make 6 pages
#define SCROLL 192
#define MATRIX_PIN 2
#define MAXBRIGHT 255

CRGB led[NUMPIX];

const PROGMEM char song[] = { // sizeof() = 16 rows * 192 columns
  "------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------" // ROW  0
  "################################################################################################################################################################################################" // ROW  1
  "################################################################################################################################################################################################" // ROW  2
  "----------------------------------------------------------------------------------#------------#------------------------------------------------------------------------------------------------" // ROW  3
  "---------------##----------------########-########-########-#--####------#------#-#------------#--------#------#-########-#--##--#-#####-----########-#------#-----------------##---------------" // ROW  4
  "-----------##########------------------#--#------#--##----#--##----#------#-----#-########-----########--#-----#--------#-#--##--#-----#-----#------#-#------#-------------##########-----------" // ROW  5
  "------------#-#--#-#-------------------#--#------#--##----#--#-----#-------#----#--------#------------#---#----#--------#-#--##--#-----#-----#------#--#-----#--------------#-#--#-#------------" // ROW  6
  "-------------#----#--------------------#--#------#--####--#-#------#--------#--#---------#------------#----#--#---------#-#--##--#-----#-----#------#---#----#---------------#----#-------------" // ROW  7
  "-------------#----#--------------------#--#------#--####--#-#------#-------#####---------#------------#---#####---------#-#--##--#-----------#------#----#---#---------------#----#-------------" // ROW  8
  "------------#-#--#-#-------------------#--#------#--------#-#------#------#----#--------#------------#---#----#---------#-#--##--#-----------#------#-----#--#--------------#-#--#-#------------" // ROW  9
  "-----------##########------------------#--#------#--------#-#------#-----#-----#-------#------------#---#-----#---------#-#--##--#-----------#------#------#-#-------------##########-----------" // ROW 10
  "---------------##----------------------#--#------#-########-#---#### ----#------#--####---------####----#------#--------#--##--##------------########-#######------------------##---------------" // ROW 11
  "------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------" // ROW 12
  "################################################################################################################################################################################################" // ROW 13
  "################################################################################################################################################################################################" // ROW 14
  "%----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------%" // ROW 15
};

void setup() {
  FastLED.addLeds<WS2812B, MATRIX_PIN, GRB>(led, NUMPIX);
  FastLED.setBrightness(MAXBRIGHT); // brightness as needed
  FastLED.clear(); // clear pixel buffer
  FastLED.show(); // display cleared buffer
  // Serial.begin(9600);

  listOfFunctions(); // offload the list for a shorter setup() function
}

void loop() {
  showSong();
  // randomPixels();
}

void listOfFunctions() {
  //********************
  //** TEST FUNCTIONS **
  //********************
  // Serial.println(strlen(song)); // number of characters in the banner
  // serialSong(); // print banner (in PROGMEM) to serial monitor
  // randomSeed(analogRead(A0)); // increase randomness - not needed
  // fillByRowsCols();
  // fillByNumber();
  // showCorners(); // color corners of matrix

  FastLED.show(); // last function called for pixels to be displayed
}

void showSong() { // display text residing in PROGMEM
  int column = 0, row = 0, page = 0, asciiChar;
  for (int k = SCROLL; k >= 0 ; k--) { // read banner RIGHT to LEFT "SCROLL" size steps
    for (int i = 0; i < ROWS; i++) {
      for (int j = 0; j < COLS; j++) {
        // asciiChar = pgm_read_byte_near(song + (i * 192 + j) + (k * COLS)); // read 32 (chars), skip 192 (cols), repeat
        asciiChar = pgm_read_byte_near(song + (i * 192 + j) + k); // read 32 (chars), skip 32 (cols), repeat
        if (asciiChar == '-') // white
          led[i * COLS + j] =  CRGB(255, 255, 255); // WHITE
        if (asciiChar == '#') // blue
          led[i * COLS + j] =  CRGB(0, 0, 255); // BLUE
        if (asciiChar == '%') // dim white
          led[i * COLS + j] =  CRGB(63, 255, 63); // GREEN to show first and last page
      }
    }
    FastLED.show();
    // delay(250);
    delay(50);
  }
}

void serialSong() { // show in serial monitor
  for (int i = 0; i < strlen(song); i++) {
    if (i % (strlen(song) / ROWS) == 0) // 14 rows of 189 pixels
      Serial.println(); // separate the rows
    int pix = pgm_read_byte_near(song + i);
    Serial.write(pix);
  }
}

void fillByRowsCols() {
  int pix, rows, cols;
  for (int i = 0; i < ROWS; i++) {
    for (int j = 0; j < COLS; j++) {
      led[i * COLS + j] = CRGB(random(2) * 255, random(2) * 255, random(2) * 255); // six primary colors
    }
  }
}

void fillByNumber() { // show fill order
  int pix = 1; // for counting, not coloring
  for (int i = 0; i < ROWS * COLS - 1; i++) {
    led[i] = CRGB(random(2) * 255, random(2) * 255, random(2) * 255); // six primary colors
  }
}

void showCorners() {
  led[0]   =  CRGB(255, 000, 000); // bottom, left
  led[31]  =  CRGB(000, 000, 255); // bottom, right
  led[480] =  CRGB(255, 255, 000); // top, left
  led[511] =  CRGB(000, 255, 000); // top, right
}

/*
    15*32+0+f               15*32+31+f
    led[480]                  led[511]
    +--------------------------------+
    |15                              |
    |                                |
    | PROGMEM ASCII to PIXEL         |
    | PIX = row * COLS + col  |
    |                                |
    +0_____________________________31+
    led[0]                     led[31]
    0 * 32 + 0             0 * 32 + 31
*/

void randomPixels() { // random pixel in random PRIMARY and SECONDARY color on ROWS x COLS matrix
  led[random(ROWS) * random(COLS)] = CRGB((random(2) * 255), (random(2) * 255), (random(2) * 255));
  FastLED.show();
}

As you were discussing boards, i realized later that an ESP board which includes WiFi might be the perfect choice for you. (way !) More memory, onboard file system (SPIFFS) and the possibility to upload & select different texts on the fly.

I think Hebrew is available for adafruit_GFX as well and also a banner display. Tapping in can quite easily be done thru the

virtual void writePixel(int16_t x, int16_t y, uint16_t color);

But maybe the MD_parola is easier.

That would be good... remove the need for PROGMEM.

What would be the expected increase? Nano uses 25% program space using 88% dynamic variable space.

Is this the full text/first banner (I am having trouble copy/pasting it due to direction of words):

עם ישראל לא לפחד השם אלקיך הולך איתך עם ישראל לא מפחד השם אלקינו השם אחד כל העולם הוא גשר צר והעיקר לא לפחד כלל ומלמעלה הוא שומר זר ואויב לא יתקרב אח ואח ביד ביד ישראל זה עם אחד ומלמעלה הוא עוזר שומר שומר ישראל עם ישראל לא לפחד השם אלקיך הולך איתך עם ישראל לא מפחד השם אלקינו השם אחד

First banner:
עם ישראל לא מפחד

An ESP8266 already comes with 80KB, but admittedly, a fair amount does get used by the webserver if you use one, and for the LED signal generation that is not disturbing the WiFi also a fair bit gets used, still way more than the 2KB a Nano has though. An ESP32 has even more (256KB) and pricewise you can purchase them for less than $10,-