Go Down

Topic: Arduino mega valores errados (Read 1 time) previous topic - next topic

pr1nc3ssk3nny1997

Oct 13, 2019, 04:37 am Last Edit: Oct 13, 2019, 04:56 am by pr1nc3ssk3nny1997
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

bubulindo

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.
This... is a hobby.

pr1nc3ssk3nny1997

#2
Oct 13, 2019, 09:21 pm Last Edit: Oct 13, 2019, 09:26 pm by pr1nc3ssk3nny1997
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

bubulindo

E que função é que retorna esses valores?
This... is a hobby.

pr1nc3ssk3nny1997

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);

  }
}

bubulindo

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:

Code: [Select]
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif


No código?

This... is a hobby.

pr1nc3ssk3nny1997

#6
Oct 16, 2019, 07:01 am Last Edit: Oct 16, 2019, 07:02 am by pr1nc3ssk3nny1997
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

bubulindo

Como estás a enviar os dados?

This... is a hobby.

pr1nc3ssk3nny1997


Go Up