Arduino mega valores errados

Ola boa noite, estou desenvolvendo uma aplicação com arduino para controlar um fita de leds rgb. Estou pegando os valores do monitor serial e gravando na eeprom,ate ai tudo bem. visualizo os valores e percebo que os dois últimos estão faltando como na imagem (valores errados), mas se eu deixa o sketch (valores certos) os valores são recebidos normalmente como na imagem (valores certos),mas se eu deixar o sketch (valores errados) da o erro,alguém pode me ajudar?

valores que estou mandando:
5 1 255 1 3 255.000.000 000.255.000 000.000.255 255.000.255 000.255.255

Leds_Infinito_Valores_Certos.ino (5.96 KB)

Leds_Infinito_Valores_Errados.ino (6.5 KB)

Acho que tens de te explicar melhor. Eu não percebi o que te está a acontecer.

Não tenhas medo de colocar aqui o código para vermos em vez de fazeres em anexo.

for (int x = 0; x < 60; x++) {

pixels.setPixelColor(x, pixels.Color(red1, green1, blue1)); //seta os leds que irão acender
pixels.setBrightness(brilho);//seta o brilho dos leds
pixels.show();//acende os leds
** delay(milissegundos);//delay para acende os leds**

}

delay(segundos);//delay para trocar de cor

Se eu apagar ou comentar a parte que esta em negrito ele retorna o valor certo, mas se eu deixar a parte em negrito o valor retorna errado .

valor certo -> 5 1 255 1 3 255.000.000 000.255.000 000.000.255 255.000.255 000.255.255

valor errado -> 5 1 255 1 3 255.000.000 000.255.000 000.000.255 255.000.255 000

E que função é que retorna esses valores?

Eu pego todos os valores da serial, e outro coisa que esqueci de comentar, quando abro o monitor serial e envio os valores, as vezes ele demora um tempo para retornar. E agora vou postar o código completo.

#include <Adafruit_NeoPixel.h>
#ifdef AVR
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
#define PIN 6
#define NUMPIXELS 60

Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
#include <EEPROM.h>
String vermelho0 = "0", verde0 = "0", azul0 = "0", vermelho1 = "0", verde1 = "0", azul1 = "0", vermelho2 = "0", verde2 = "0", azul2 = "0", vermelho3 = "0", verde3 = "0", azul3 = "0", vermelho4 = "0", verde4 = "0", azul4 = "0";//declaração da variaveis do tipo texto
String customizacaoLeds = "0", valores = "0", tempoSeg = "0", tempoMil = "0", valorBrilho = "0", efeitoLeds = "0"; //declaração da variaveis do tipo texto
byte red0 = 0, green0 = 0, blue0 = 0, red1 = 0, green1 = 0, blue1 = 0, red2 = 0; //declaração da variaveis do tipo Inteiro
byte customizacao = 0, efeito = 0, green2 = 0, blue2 = 0, red3 = 0, green3 = 0, blue3 = 0, red4 = 0, green4 = 0, blue4 = 0, brilho;
int milissegundos = 0, segundos = 0;

void setup() {

#if defined(AVR_ATtiny85) && (F_CPU == 16000000)
clock_prescale_set(clock_div_1);
#endif

pixels.begin();
Serial.begin(9600);

customizacao = EEPROM.read(10);
efeito = EEPROM.read(30);

brilho = EEPROM.read(50);
milissegundos = EEPROM.read(60);
segundos = EEPROM.read(80);
red0 = EEPROM.read(100);
green0 = EEPROM.read(110);
blue0 = EEPROM.read(120);

red1 = EEPROM.read(130);
green1 = EEPROM.read(140);
blue1 = EEPROM.read(150);

red2 = EEPROM.read(160);
green2 = EEPROM.read(170);
blue2 = EEPROM.read(180);

red3 = EEPROM.read(190);
green3 = EEPROM.read(200);
blue3 = EEPROM.read(210);

red4 = EEPROM.read(220);
green4 = EEPROM.read(230);
blue4 = EEPROM.read(240);

}

void pegarValores() {

if (Serial.available()) {//retorna o número de bytes (caracteres) disponíveis para leitura da porta serial

valores = Serial.readString();//pega os valores recebidos do java ou do monitor serial

Serial.println(valores);

customizacaoLeds = valores.substring(0, 1);//pega a customizacao dos leds
efeitoLeds = valores.substring(2, 3); //pega o efeito dos leds
valorBrilho = valores.substring(4, 7);//pega o valor do brilho que varia entre 0 e 255
tempoMil = valores.substring(8, 9);//pega o delay em milissegundos
tempoSeg = valores.substring(10, 11);//pega o delay em segundos

//pega os valores em rgb que varia de 0 a 255 (vermelho,verde,azul)
vermelho0 = valores.substring(12, 15);
verde0 = valores.substring(16, 19);
azul0 = valores.substring(20, 23);

//pega os valores em rgb que varia de 0 a 255 (vermelho,verde,azul)
vermelho1 = valores.substring(24, 27);
verde1 = valores.substring(28, 31);
azul1 = valores.substring(32, 35);

vermelho2 = valores.substring(36, 39);
verde2 = valores.substring(40, 43);
azul2 = valores.substring(44, 47);

//pega os valores em rgb que varia de 0 a 255 (vermelho,verde,az
vermelho3 = valores.substring(48, 51);
verde3 = valores.substring(52, 55);
azul3 = valores.substring(56, 59);

//pega os valores em rgb que varia de 0 a 255 (vermelhom,verde,azul)
vermelho4 = valores.substring(60, 63);
verde4 = valores.substring(64, 67);
azul4 = valores.substring(68, 71);

customizacao = (byte) customizacaoLeds.toInt();
efeito = (byte) efeitoLeds.toInt();

brilho = (byte) valorBrilho.toInt();
milissegundos = (byte) tempoMil.toInt();
segundos = (byte) tempoSeg.toInt();

red0 = (byte) vermelho0.toInt();
green0 = (byte) verde0.toInt();
blue0 = (byte) azul0.toInt();

red1 = (byte) vermelho1.toInt();
green1 = (byte) verde1.toInt();
blue1 = (byte) azul1.toInt();

red2 = (byte) vermelho2.toInt();
green2 = (byte) verde2.toInt();
blue2 = (byte) azul2.toInt();

red3 = (byte) vermelho3.toInt();
green3 = (byte) verde3.toInt();
blue3 = (byte) azul3.toInt();

red4 = (byte) vermelho4.toInt();
green4 = (byte) verde4.toInt();
blue4 = (byte) azul4.toInt();

EEPROM.update(10, customizacao);
EEPROM.update(30, efeito);
EEPROM.update(50, brilho);
EEPROM.update(60, milissegundos);
EEPROM.update(80, segundos);

EEPROM.update(100, red0);
EEPROM.update(110, green0);
EEPROM.update(120, blue0);

EEPROM.update(130, red1);
EEPROM.update(140, green1);
EEPROM.update(150, blue1);

EEPROM.update(160, red2);
EEPROM.update(170, green2);
EEPROM.update(180, blue2);

EEPROM.update(190, red3);
EEPROM.update(200, green3);
EEPROM.update(210, blue3);

EEPROM.update(220, red4);
EEPROM.update(230, green4);
EEPROM.update(240, blue4);

}

}

void loop() {

pegarValores();

milissegundos = EEPROM.read(60);
segundos = EEPROM.read(80);
milissegundos = (milissegundos * 100);
segundos = (segundos * 1000);

if (customizacao == 5 && efeito == 1) {

for (int x = 0; x < 60; x++) {

pixels.setPixelColor(x, pixels.Color(red0, green0, blue0)); //seta os leds que irão acender
pixels.setBrightness(brilho);//seta o brilho dos leds
pixels.show();//acende os leds
delay(milissegundos);//delay para acende os leds

}

delay(segundos);

for (int x = 0; x < 60; x++) {

pixels.setPixelColor(x, pixels.Color(red1, green1, blue1)); //seta os leds que irão acender
pixels.setBrightness(brilho);//seta o brilho dos leds
pixels.show();//acende os leds
delay(milissegundos);//delay para acende os leds

}

delay(segundos);

for (int x = 0; x < 60; x++) {

pixels.setPixelColor(x, pixels.Color(red2, green2, blue2)); //seta os leds que irão acender
pixels.setBrightness(brilho);//seta o brilho dos leds
pixels.show();//acende os leds
delay(milissegundos);//delay para acende os leds

}

delay(segundos);

for (int x = 0; x < 60; x++) {

pixels.setPixelColor(x, pixels.Color(red3, green3, blue3)); //seta os leds que irão acender
pixels.setBrightness(brilho);//seta o brilho dos leds
pixels.show();//acende os leds
delay(milissegundos);//delay para acende os leds

}

delay(segundos);

for (int x = 0; x < 60; x++) {

pixels.setPixelColor(x, pixels.Color(red4, green4, blue4)); //seta os leds que irão acender
pixels.setBrightness(brilho);//seta o brilho dos leds
pixels.show();//acende os leds
delay(milissegundos);//delay para acende os leds

}

delay(segundos);

}
}

Um problema óbvio que vejo no código em cima é que tu assumes que os teus valores a serem lidos da porta série chegam todos ao mesmo tempo.

Isso não é verdade, logo ao pegares os valores recebidos pela porta série existe uma probabilidade de estares a pegar em metade ou quase tudo do que enviaste pela porta e é por isso que protocolos de comunicação incluem padrões de inicio e fim de trama para confirmar que tudo foi recebido e não apenas metade. Isso será algo que podes fazer.

Outro problema que convém verificar é que a tua trama é enorme e o Arduino pode não ter espaço suficiente no buffer para guardar isso tudo.
Isto é simples de mudar num define das bibliotecas do Arduino, mas é também outro problema.

Porque é que tens isto:

#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif

No código?

Ola amigo, aparentemente consegui resolver o problema modificando os arquivos abaixo e adicionando o #define SERIAL_TX_BUFFER_SIZE 75 no código ,só que esta demorando uns 5 segundos para enviar os dados, isso é normal?

C:\arduino-1.8.10\hardware\arduino\avr\cores\arduino\HardwareSerial

SERIAL_TX_BUFFER_SIZE 64
SERIAL_TX_BUFFER_SIZE 75

SERIAL_RX_BUFFER_SIZE 64
SERIAL_RX_BUFFER_SIZE 75

C:\arduino-1.8.10\hardware\arduino\avr\libraries\SoftwareSerial\src\SoftwareSerial

#define _SS_MAX_RX_BUFF 75 // RX buffer size

C: \ Usuários \ nome usuario\ AppData \ Local \ Arduino15 \ packages \ arduino \ hardware \ avr \ 1.8.1 \ cores \ arduino \ HardwareSerial.h

SERIAL_TX_BUFFER_SIZE 64
SERIAL_TX_BUFFER_SIZE 75

SERIAL_RX_BUFFER_SIZE 64
SERIAL_RX_BUFFER_SIZE 75

Como estás a enviar os dados?

Pelo monitor serial