Ajuda com millis

Ola boa tarde, estou controlando uma fita de leds rgb com arduino, e gostaria de saber como utilizar o millis para fazer uma pausa de 5 segundos entre três cores.Ex
vermelho
millis 5 segundos
verde
millis 5 segundos
azul
millis 5 segundos

olá, eu dei uma procurada na documentação do Arduíno, e o comando millis não é para controlar o tempo e sim para Retornar o número de milissegundos passados desde que a placa Arduino começou a executar o programa atual.
se vc quiser controlar o tempo use o delay() :slight_smile:
aqui eu deixo a documentação dos dois comandos: millis e delay
conseguiu ai amigo?

Ola amigo, eu estou tentando utilizar o millis pois o delay trava o programa quando tento enviar os valores pela porta serial, eu conseguir fazer a pausa com o millis, só que as cores estão erradas. Eu envio vermelho,verde,azul e e a fita acende vermelho,verde pisca o vermelho rapidamente e acende o azul.

if (millis() - delay1 >= 5000) {

delay1 = millis();//5000

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

  pixels_0.pixels.setPixelColor(x, pixels_0.pixels.Color(valorSerialInt[3], valorSerialInt[4], valorSerialInt[5]));
  pixels_0.pixels.setBrightness(valorSerialInt[2]);
  pixels_0.pixels.show();

}

}//vermelho verde vermelho azul

if (millis() - delay2 >= 10000) {

delay2 = millis();//10000

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

  pixels_0.pixels.setPixelColor(x, pixels_0.pixels.Color(valorSerialInt[6], valorSerialInt[7], valorSerialInt[8]));
  pixels_0.pixels.setBrightness(valorSerialInt[2]);
  pixels_0.pixels.show();

}

}

if (millis() - delay3 >= 15000) {

delay3 = millis();

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

  pixels_0.pixels.setPixelColor(x, pixels_0.pixels.Color(valorSerialInt[9], valorSerialInt[10], valorSerialInt[11]));
  pixels_0.pixels.setBrightness(valorSerialInt[2]);
  pixels_0.pixels.show();

}

}

olá,
desculpa mas eu não tenho conhecimento sobre o controle de fitas led, mas posso tentar ajudar
esse é o codigo completo?
pelo o que eu entendi no seu código você está usando o millis para controlar o tempo de excussão de cada cor, certo?

essa seria a parte que liga alguma das 3 cores?, se sim não teria um código para desligar >a cor?

eu pesquisei um pouco e achei alguns sites e videos :
https://www.robocore.net/tutorials/controle-fita-led-com-arduino

talvez seja util, até

Ola amigo, a ligação já esta toda feita, se eu utilizar o delay tudo funciona perfeitamente, o porem é que para enviar outros valores tenho tenho que esperar os 15 segundos, abaixo vou deixar o sketch pra vc da uma olhada.

#include <EEPROM.h>
#include <Adafruit_NeoPixel.h>
class Pixels
{
public:
uint8_t effect;
uint8_t effects;
uint16_t effStep;
unsigned long effStart;
Adafruit_NeoPixel pixels;
Pixels(uint16_t leds, uint8_t pin, uint8_t toteffects, uint16_t pixelstype) : pixels(leds, pin, pixelstype) {
effect = -1;
effects = toteffects;
Reset();
}
void Reset() {
effStep = 0;
effect = (effect + 1) % effects;
effStart = millis();
}
};
struct Loop
{
uint8_t currentChild;
uint8_t childs;
bool timeBased;
uint16_t cycles;
uint16_t currentTime;
Loop(uint8_t totchilds, bool timebased, uint16_t tottime) {
currentTime = 0;
currentChild = 0;
childs = totchilds;
timeBased = timebased;
cycles = tottime;
}
};

Pixels pixels_0(60, 6, 60, NEO_GRB + NEO_KHZ800);
struct Loop pixels0loop0(1, false, 1);

//[GLOBAL_VARIABLES]
String valorSerialString[18], tempoMil, tempoSeg, valores;
byte valorSerialInt[18];
int tempomil, temposeg, tempomilTotal, temposegTotal, numeroAleatorio0, numeroAleatorio1, numeroAleatorio2;
unsigned long delay1 = 0;
unsigned long delay2 = 0;
unsigned long delay3 = 0;

void setup() {

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

valorSerialInt[0] = EEPROM.read(0);
valorSerialInt[1] = EEPROM.read(1);
valorSerialInt[2] = EEPROM.read(2);
tempomil = EEPROM.read(3);
temposeg = EEPROM.read(4);

valorSerialInt[3] = EEPROM.read(5);
valorSerialInt[4] = EEPROM.read(6);
valorSerialInt[5] = EEPROM.read(7);

valorSerialInt[6] = EEPROM.read(8);
valorSerialInt[7] = EEPROM.read(9);
valorSerialInt[8] = EEPROM.read(10);

valorSerialInt[9] = EEPROM.read(11);
valorSerialInt[10] = EEPROM.read(12);
valorSerialInt[11] = EEPROM.read(13);

valorSerialInt[12] = EEPROM.read(14);
valorSerialInt[13] = EEPROM.read(15);
valorSerialInt[14] = EEPROM.read(16);

valorSerialInt[15] = EEPROM.read(17);
valorSerialInt[16] = EEPROM.read(18);
valorSerialInt[17] = EEPROM.read(19);

}

void valorSerial() {

if (Serial.available()) {

valores = Serial.readString();

Serial.println(valores);

valorSerialString[0] = valores.substring(0, 2);
valorSerialString[1] = valores.substring(3, 5);
valorSerialString[2] = valores.substring(6, 9);
tempoMil = valores.substring(10, 12);
tempoSeg = valores.substring(13, 15);

valorSerialString[3] = valores.substring(16, 19);
valorSerialString[4] = valores.substring(20, 23);
valorSerialString[5] = valores.substring(24, 27);

valorSerialString[6] = valores.substring(28, 31);
valorSerialString[7] = valores.substring(32, 35);
valorSerialString[8] = valores.substring(36, 39);

valorSerialString[9] = valores.substring(40, 43);
valorSerialString[10] = valores.substring(44, 47);
valorSerialString[11] = valores.substring(48, 51);

valorSerialString[12] = valores.substring(52, 55);
valorSerialString[13] = valores.substring(56, 59);
valorSerialString[14] = valores.substring(60, 63);

valorSerialString[15] = valores.substring(64, 67);
valorSerialString[16] = valores.substring(68, 71);
valorSerialString[17] = valores.substring(72, 75);

valorSerialInt[0] = (byte) valorSerialString[0].toInt();//customizacao
valorSerialInt[1] = (byte) valorSerialString[1].toInt();//efeito
valorSerialInt[2] = (byte) valorSerialString[2].toInt();//brilho
tempomil = (byte) tempoMil.toInt();//milissegundos
temposeg = (byte) tempoSeg.toInt();//segundos

valorSerialInt[3] = (byte) valorSerialString[3].toInt();//vermelho1
valorSerialInt[4] = (byte) valorSerialString[4].toInt();//verde1
valorSerialInt[5] = (byte) valorSerialString[5].toInt();//azul1

valorSerialInt[6] = (byte) valorSerialString[6].toInt();//vermelho2
valorSerialInt[7] = (byte) valorSerialString[7].toInt();//verde2
valorSerialInt[8] = (byte) valorSerialString[8].toInt();//azul2

valorSerialInt[9] = (byte) valorSerialString[9].toInt();//vermelho3
valorSerialInt[10] = (byte) valorSerialString[10].toInt();//verde3
valorSerialInt[11] = (byte) valorSerialString[11].toInt();//azul3

valorSerialInt[12] = (byte) valorSerialString[12].toInt();//vermelho4
valorSerialInt[13] = (byte) valorSerialString[13].toInt();//verde4
valorSerialInt[14] = (byte) valorSerialString[14].toInt();//azul4

valorSerialInt[15] = (byte) valorSerialString[15].toInt();//vermelho5
valorSerialInt[16] = (byte) valorSerialString[16].toInt();//verde5
valorSerialInt[17] = (byte) valorSerialString[17].toInt();//azul5

EEPROM.update(0, valorSerialInt[0]);
EEPROM.update(1, valorSerialInt[1]);
EEPROM.update(2, valorSerialInt[2]);
EEPROM.update(3, tempomil);
EEPROM.update(4, temposeg);

EEPROM.update(5, valorSerialInt[3]);
EEPROM.update(6, valorSerialInt[4]);
EEPROM.update(7, valorSerialInt[5]);

EEPROM.update(8, valorSerialInt[6]);
EEPROM.update(9, valorSerialInt[7]);
EEPROM.update(10, valorSerialInt[8]);

EEPROM.update(11, valorSerialInt[9]);
EEPROM.update(12, valorSerialInt[10]);
EEPROM.update(13, valorSerialInt[11]);

EEPROM.update(14, valorSerialInt[12]);
EEPROM.update(15, valorSerialInt[13]);
EEPROM.update(16, valorSerialInt[14]);

EEPROM.update(17, valorSerialInt[15]);
EEPROM.update(18, valorSerialInt[16]);
EEPROM.update(19, valorSerialInt[17]);

tempomil = EEPROM.read(3);

}
}

void loop() {

valorSerial();

tempomilTotal = (tempomil * 100);
temposegTotal = (temposeg * 1000);

if (valorSerialInt[0] == 3) {

switch (valorSerialInt[1]) {

  case 5:

    mudarTresCores();
    break;

}

}

}

void mudarTresCores() {

if (millis() - delay1 >= 5000) {

delay1 = millis();//5000

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

  pixels_0.pixels.setPixelColor(x, pixels_0.pixels.Color(valorSerialInt[3], valorSerialInt[4], valorSerialInt[5]));
  pixels_0.pixels.setBrightness(valorSerialInt[2]);
  pixels_0.pixels.show();

}

}//vermelho verde vermelho azul

if (millis() - delay2 >= 10000) {

delay2 = millis();//10000

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

  pixels_0.pixels.setPixelColor(x, pixels_0.pixels.Color(valorSerialInt[6], valorSerialInt[7], valorSerialInt[8]));
  pixels_0.pixels.setBrightness(valorSerialInt[2]);
  pixels_0.pixels.show();

}

if (millis() - delay3 >= 15000) {

delay3 = millis();

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

  pixels_0.pixels.setPixelColor(x, pixels_0.pixels.Color(valorSerialInt[9], valorSerialInt[10], valorSerialInt[11]));
  pixels_0.pixels.setBrightness(valorSerialInt[2]);
  pixels_0.pixels.show();

}

}

}

}

tá, então vc quer controlar as cores pelo serial?, não seria melhor usar o while para o tempo com o millis, por exemplo:

unsigned long tempo_antes_da_execucao = millis();
unsigned long temporizador = 0;

while (temporizador <= 5000){
    temporizador = millis() - tempo_antes_da_execucao;
    //codigo_de_ativação_da_cor;
    //verificação_da_serial;
}

eu não coloquei o codigo de ativação de cor pq eu não sei, desculpa ai
dai quando o while for maior ele passa pra outro while de controle de tempo

boa tarde, acabei de finalizar o exemplo da ideia, como não sei mexer com a fita led utilizei 3 led de cores diferentes para o exemplo, aqui a foto dele feito no tinkercad:

e o código:
void setup(){
pinMode(2, OUTPUT);//azul
pinMode(3, OUTPUT);//verde
pinMode(4, OUTPUT);//vermelho
pinMode(7, INPUT);//chave
Serial.begin(9600);
}

void loop(){ 
  unsigned long tempo_antes_da_execucao = millis();
  unsigned long temporizador = 0;
  int estadochave = digitalRead(7); //chave de controle 
  digitalWrite(4,0);
  
  while (temporizador <= 1000){
    temporizador = millis() - tempo_antes_da_execucao;
    Serial.println(temporizador);
    estadochave = digitalRead(7);
    if (estadochave == 0){//apaga tudo
      digitalWrite(2,0);
      digitalWrite(3,0);
      digitalWrite(4,0);
    }
    else{
      digitalWrite(2,1);//acende o azul
    }
  }
  while (temporizador <= 2000){
    digitalWrite(2,0);// apaga azul
    temporizador = millis() - tempo_antes_da_execucao;
    Serial.println(temporizador);
    estadochave = digitalRead(7);
    if (estadochave == 0){//apaga tudo
      digitalWrite(2,0);
      digitalWrite(3,0);
      digitalWrite(4,0);
    }
    else{
      digitalWrite(3,1);//acende o verde
   }}
  while (temporizador <= 3000){
    digitalWrite(3,0);//apaga verde
    temporizador = millis() - tempo_antes_da_execucao;
    Serial.println(temporizador);
    estadochave = digitalRead(7);
    if (estadochave == 0){//apaga tudo
      digitalWrite(2,0);
      digitalWrite(3,0);
      digitalWrite(4,0);
    }
    else{
      digitalWrite(4,1);//acende o vermelho
    }}}

Ola amigo, desculpa a demora para responder,estava ate agora quebrando a cabeça. Gostaria de te agradecer por ter me ajudado, admiro muito pessoas como vc, que não tem tanto conhecimento em um determinado assunto e mesmo assim esta disposto a ajudar. Dando uma olhada rápida no seu código e quebrando um pouco a cabeça kkk, me deu a luz que precisava, muito obrigado mesmo.

#include <Adafruit_NeoPixel.h>
#ifdef AVR
#include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
#define PIN 6 // On Trinket or Gemma, suggest changing this to 1

#define NUMPIXELS 60 // Popular NeoPixel ring size

Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

long tempoAnterior0 = 0;
long tempoAnterior1 = 0;
long tempoAnterior2 = 0;

long teste0 = 5000;
long teste1 = 10000;
long teste2 = 15000;

void setup() {

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

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

}

void loop() {

if (millis() == teste0) {

tempoAnterior0 = millis();
teste0 = teste0 + 15000;

for (int i = 0; i < 60; i++) { // For each pixel...

  pixels.setPixelColor(i, pixels.Color(0, 255, 000));
  pixels.show();   // Send the updated pixel colors to the hardware.

}

}

if (millis() == teste1) {

tempoAnterior1 = millis();
teste1 = teste1 + 15000;

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

  pixels.setPixelColor(i, pixels.Color(255, 255, 000));
  pixels.show();   // Send the updated pixel colors to the hardware.

}

}

if (millis() == teste2) {//15 30 45 60 75

tempoAnterior2 = millis();
teste2 = teste2 + 15000;

for (int i = 0; i < 60; i++) { // For each pixel...

  pixels.setPixelColor(i, pixels.Color(000, 255, 255));
  pixels.show();   // Send the updated pixel colors to the hardware.

}

}

}

valeu pelo elogio e até mais tarde
:upside_down_face:

Pessoal, só uma dica. Quando postar código, coloque entre 3 backticks (apostos ao contrário, que geralmente fica embaixo do ~) no começo e no fim

```
código
```

exemplo

unsigned long tempo_antes_da_execucao = millis();
unsigned long temporizador = 0;

while (temporizador <= 5000){
    temporizador = millis() - tempo_antes_da_execucao;
    //codigo_de_ativação_da_cor;
    //verificação_da_serial;
}

ficará muito mais fácil de ler e copiar

valeu pela dica,
Eu tava usando o botão de texto pré-formatado mas esse ai é bem mas fácil e bonito para o código

Porque você não usa : delay(5); .