/*
This sketch manages multiple marquees simultaneously at different
speeds. Text scrolls both to the right or to the left, so I guess
right-to-left languages can also be displayed.
Notice there is no gap between repetitions!
Written in 2024 by raphik
*/
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
char message1[]="I guess I am pretty slower than the marquee below. /// ";
char message2[]="The marquee above is absolutely right! /// ";
char message3[]=" \\\\\\ .segaugnal tfel-ot-thgir htiw llew gnola steg eeuqram sihT";
int minX1 = -6 * strlen(message1);
int minX2 = -6 * strlen(message2);
int minX3 = -6 * strlen(message3);
int colMarquee1 = display.width();
int colMarquee2 = display.width();
int colMarquee3 = minX3;
uint32_t chronoMarquee1 = millis();
uint32_t chronoMarquee2 = millis();
uint32_t chronoMarquee3 = millis();
void setup(){
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(WHITE, BLACK);
display.setTextSize(1);
display.setCursor(0,0);
display.println("1st and 2nd marquees");
display.println("at different speeds.");
display.println("The 3rd one is dis-");
display.println("playing an RTL text.");
display.setTextWrap(false); // this is really important!
}
void loop(){
uint32_t rightNow = millis();
if (rightNow > chronoMarquee1 + 60) {
chronoMarquee1 = rightNow;
display.setTextSize(1);
display.setCursor(colMarquee1,36);
display.print(message1);
display.setCursor(colMarquee1-minX1,36);
display.print(message1);
colMarquee1 -=1;
if(colMarquee1 < minX1) colMarquee1 -= minX1;
}
// speeding up!
if (rightNow > chronoMarquee2 + 50) {
chronoMarquee2 = rightNow;
display.setTextSize(1);
display.setCursor(colMarquee2,46);
display.print(message2);
display.setCursor(colMarquee2-minX2,46);
display.print(message2);
colMarquee2 -=2;
if(colMarquee2 < minX2) colMarquee2 -= minX2;
}
// this may be of useful for languages written from right to left
if (rightNow > chronoMarquee3 + 50) {
chronoMarquee3 = rightNow;
display.setTextSize(1);
display.setCursor(colMarquee3,56);
display.print(message3);
display.setCursor(colMarquee3+minX3,56);
display.print(message3);
colMarquee3 +=2;
if(colMarquee3 > -minX3 ) colMarquee3 += minX3;
}
display.display();
}