Mistério da senóide

Amigas e amigos,
Fiz um programa (Arduino IDE) para gerar uma senoide de luz o mais perfeita possivel. Usei um arduino e uma anel de 35 leds neopixel. Isto foi em fevereiro deste ano. Deixo o programa em anexo.
Conferi o resultado fazendo um vídeo, onde o anel ilumina um plano branco. Processando a imagem (phyton opencv), o resultado é uma linda senoide, quase perfeita e com todos os ciclos iguais.
Porém, ontem, usando o mesmo programa no arduino IDE, a senoide está distorcida, e o primeiro ciclo aparece com mais intensidade que as outras, além de um ruído.
Troquei o anel, a placa arduino, os cabos, com fonte, sem fonte, versões antigas do programa (que também funcionavam), pinos de controle (10,8,3 etc), analisei as imagens com outros programas (matlab) e deu o mesmo resultado, a senoide distorcida.
Só restou a possibilidade de alguma biblioteca da adafruit ou do arduino. Ainda não achei nada, alguém teria algum palpite. Obrigado.

// LIGHT SIN by Caprario #include //biblioteca do anel #include #define NUMLED 35 //número de leds do anel #define PIN 10 // pino controle do anel Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMLED, PIN, NEO_GRB + NEO_KHZ800); // seta o anel

#define brilhopad 50
byte brilhot[510];
byte bmax = 255;
byte bmin = 20;
byte delta = (bmax - bmin);
int id = int(delta) * 2;
//double periodo[] = { 8000, 4000, 3000, 2000, 1000, 750, 500 };
double periodo[] = { 2000, 2000, 750 }; // digitar apenas o cliclo a ser ensaiado
float intervalo;
float a;
int NCICLOS = 10;
byte corR, corG, corB;

void setup() {
Serial.begin(9600);
strip.begin();
clearring();
}

void loop() {
int lote = sizeof(periodo) / sizeof(double); // quantidade de periodos slecionados
float tempo = 0;

corR = brilhopad;
corG = brilhopad;
corB = brilhopad;

for (int k = 0; k < (lote); k++) {
Serial.println("clique enter para começar");
while (!Serial.available()) {
// Aguarde até que haja dados disponíveis no buffer serial
}
// Limpe o buffer serial - se não fizer não rearma
while (Serial.available()) {
Serial.read();
}
Serial.print("**************** VAI COMEÇAR **************** ");
Serial.println(periodo[k]);
delay(2000); // corrida para preparar o ensaio, ligar a camêra etc.

intervalo = periodo[k] / (2 * float(delta));  // em milisegundos

for (int i = 0; i < id; i++) {
  a = float(delta / 2);
  a = a * (sin((2 * PI * intervalo * float(i) / periodo[k]) + 1.5 * PI) + 1);
  a = a + bmin;
  brilhot[i] = byte(a);
}
intervalo = intervalo * 1000;  // em microsegundos
clearring();
delay(500);

tempo = micros();

for (int l = 0; l < NCICLOS; l++) {
  for (int j = 0; j < id; j++) {
    strip.setBrightness(brilhot[j]);
    tempo = tempo + intervalo;
    while (micros() < tempo) {

      for (int i = 0; i < NUMLED; i++) {
        strip.setPixelColor(i, strip.Color(corR, corG, corB));
      }
      strip.show();
    }
  }
}
clearring();  //apaga o anel

}
Serial.println("c'est fini ");
delay(100);
}

void clearring() { //esta opção apaga o anel
for (int i = 0; i < NUMLED; i++) {
strip.setPixelColor(i, strip.Color(0, 0, 0));
}
strip.show();
}

:warning:

Postagem colocada na seção errada, os fóruns gerais são em inglês. ➜ Eu movi para o fórum em português para você desta vez...

Por favor, leve em consideração as recomendações listadas em Como obter o melhor desse Fórum


Corrija sua primeira postagem e adicione as tags de código, por favor.

Que é que mudou?

Quanto tempo tiveste a sinusóide a funcionar perfeitamente?

Porque é que usas delay? Poderá ser o delay o culpado?

Obrigado por responder. Gerei a senóide em um anel de 35 leds, ao registrar em um vídeo, processei cada fotograma (matlab e opencv/python) o resultado foi uma senoide. Sem mudar nada, ao repetir a experiência dois meses depois, a senoide resultante estava totalmente distorcida, sendo que o primeiro ciclo tinha uma intensidade maior, como uma explosão. Que fiz. Troquei o anel, o arduino, as fontes, o computador, com fonte, sem fonte, troquei os fios, isolei da rede elétrica e tentei versões anteriores (Arduino 2.2.1 e Adafruit_Neopixel 1.10.7) .

Testando em vários anéis, funcionou de setembro de 2023 até (com certeza) fevereiro de 2024. Verifiquei no final de abril quando percebi a distorção.

O deley não participa da geração do seno, uso a função micros(). Alguns delays tem outras funções como dar um tempo entre o comando na serial para início do seno e sair correndo para ligar a câmera.

Posso fazer um vídeo com os resultados antes e depois, é possível postar aqui no fórum?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.