I'm running this code on Nano 33 IOT with NeoMatrix.
#include <ArduinoBLE.h>
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#define BLE_UUID_TEST_SERVICE "9A48ECBA-2E92-082F-C079-9E75AAE428B1"
#define BLE_UUID_FILE_NAME "2D2F88C4-F244-5A80-21F1-EE0224E80658"
#define BLE_UUID_TX_CHAR "00002A58-0000-1000-8000-00805f9b34fb"
BLEService bleService(BLE_UUID_TEST_SERVICE);
BLEStringCharacteristic strRecCharacteristic(BLE_UUID_FILE_NAME, BLEWriteWithoutResponse | BLEWrite, 20);
BLEByteCharacteristic txChar(BLE_UUID_TX_CHAR, BLERead | BLENotify | BLEBroadcast);
//Pin where DIN is connected
#define DATA_PIN 6
//Number of LEDs
#define COLUMNS 60
#define ROWS 10
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(COLUMNS, ROWS, DATA_PIN,
NEO_MATRIX_TOP + NEO_MATRIX_LEFT +
NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG +
NEO_GRB + NEO_KHZ800);
String strRec = "";
unsigned int colors[3];
char dataRec[20];
int pixelPerChar = 4;
int maxDisplacement;
int x = matrix.width();
unsigned int dMode = 0;
void setup()
{
Serial.begin(9600);
delay(3000);
while(!BLE.begin()){
Serial.print(".");
}
Serial.println();
Serial.println("BLE Initiated...");
BLE.setDeviceName("Nano 33 BLE");
BLE.setLocalName("Nano 33 BLE");
BLE.setAdvertisedService(bleService);
bleService.addCharacteristic(strRecCharacteristic);
BLE.addService(bleService);
strRecCharacteristic.writeValue(strRec);
BLE.advertise();
Serial.println("Started!!!");
matrix.begin();
matrix.setTextWrap(false);
matrix.setBrightness(80);
matrix.setTextColor(matrix.Color(255, 0, 0));
}
unsigned int timeX = 0;
uint16_t i=0, j=0, c=0;
void loop()
{
BLEDevice central = BLE.central();
if (central)
{
Serial.print("Connected to central: ");
Serial.println(central.address());
while (central.connected())
{
if (strRecCharacteristic.written())
{
strRec = strRecCharacteristic.value();
Serial.print("Received from mobile: ");
Serial.println(strRec);
char fChar = strRec[0];
switch(fChar){
case 'c':
{
strRec[0] = ' ';
strRec.toCharArray(dataRec, sizeof(dataRec));
char* pch = strtok(dataRec, ";");
int b = 0;
while (pch != NULL)
{
colors[b] = atoi(pch);
Serial.println(colors[b]);
pch = strtok(NULL, ";");
b++;
}
matrix.fillScreen(matrix.Color(colors[0], colors[1], colors[2]));
matrix.show();
Serial.println("Display a single color");
dMode = 1;
}
break;
case 'r':
{
matrix.fillScreen(0);
Serial.println("Starting Rainbow");
dMode = 2;
timeX = millis();
}
break;
case 'd':
{
Serial.println("Start displaying the text");
matrix.fillScreen(0);
dMode = 3;
timeX = millis();
}
break;
}
txChar.writeValue(1);
}
if(dMode == 3) {
scroll("UpWork SG", 50);
}
if(dMode == 2) {
doRainbow(20);
}
}
Serial.print(F("Disconnected from central: "));
Serial.println(central.address());
}
}
void scroll(char* message,int delays) {
maxDisplacement = strlen(message) * pixelPerChar + matrix.width();
matrix.fillScreen(0);
matrix.setCursor(x, 0);
matrix.print(String(message));
if(--x < -maxDisplacement) {
x = matrix.width();
matrix.setTextColor(matrix.Color(0, 0, 255));
}
matrix.show();
delay(delays);
}
void doRainbow(uint8_t wait) {
for(j = 0; j < 256; j++) {
for(c = 0; c < 10; c++){
for(i = 0; i < 60; i++) {
matrix.drawPixel(i, c, Wheel((i*1+j) & 255));
}
matrix.show();
delay(wait);
}
}
}
uint32_t Wheel(byte WheelPos) {
if(WheelPos < 85) {
return matrix.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}
else if(WheelPos < 170) {
WheelPos -= 85;
return matrix.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
else {
WheelPos -= 170;
return matrix.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
}
I'm using an android app to send some strings to nano board.
There 3 modes,
1 - Single color for whole matrix
2 - Rainbow cycle
3 - Text scrolling
I can change 1 mode with any color for many times, it will work.
But when I changed into Rainbow or Text Scrolling app get disconnected. Loop doesn't seems to be breaking though, it doesn't show "Disconnected"
This doesn't happen with 1st mode.
Workaround - I re-wrote rainbow code without delay and it doesn't get disconnected, but need to send the command to switch to 1st mode at least 10 times.
Or if I don't run Rainbow and Textscrolling it works well, I receive the message from phone, no disconnect issue.