[SOLUCIONADO]Mandar array por serie cada 300ms sin delay

Buenas señores

Tengo este codigo, el cual quiero que al pulsar un pulsador me mande un array 5 veces cada 300 ms,tal cual esta echo funciona, pero si en el momento que pulso para mandar el array S1, pulso para mandar el S2 no hace caso hasta que termina de enviar el primero, el problema creo que esta en los delay, de que forma puedo mandar 5 veces el array cada 300ms y que no interfiera si mando dos muy seguidos.

Gracias

#include <SPI.h>
#include "mcp_can.h"

const int SPI_CS_PIN = 9;
MCP_CAN CAN(SPI_CS_PIN);

#define pulsador1 2
#define pulsador2 3
#define pulsador3 4
#define pulsador4 5

int val1 = 0;
int val2 = 0;
int val3 = 0;
int val4 = 0;

unsigned char S1[8] = {0xF1, 0x88, 0x88, 0x00, 0x00, 0x00, 0x01, 0x00};
unsigned char S2[8] = {0xF1, 0x88, 0x88, 0x00, 0x00, 0x00, 0x02, 0x00};
unsigned char S3[8] = {0xF1, 0x88, 0x88, 0x00, 0x00, 0x00, 0x03, 0x00};
unsigned char S4[8] = {0xF1, 0x88, 0x88, 0x00, 0x00, 0x00, 0x04, 0x00};

void setup() {
  Serial.begin(115200);
  pinMode (pulsador1, INPUT);
  pinMode (pulsador2, INPUT);
  pinMode (pulsador3, INPUT);
  pinMode (pulsador4, INPUT);

  if (CAN_OK == CAN.begin(CAN_500KBPS))                  // init can bus : baudrate = 500k
  {
    Serial.println("CAN BUS Shield init ok!");
  }
  else
  {
    Serial.println("CAN BUS Shield init fail");
    Serial.println("Init CAN BUS Shield again");
    delay(100);
  }

}

void loop() {

  val1 = digitalRead(pulsador1);
  val2 = digitalRead(pulsador2);
  val3 = digitalRead(pulsador3);
  val4 = digitalRead(pulsador4);

  if (val1 == HIGH)
  {
    CAN.sendMsgBuf(0x15, 0, 8, S1);
    delay(300);
    CAN.sendMsgBuf(0x15, 0, 8, S1);
    delay(300);
    CAN.sendMsgBuf(0x15, 0, 8, S1);
    delay(300);
    CAN.sendMsgBuf(0x15, 0, 8, S1);
    delay(300);
    CAN.sendMsgBuf(0x15, 0, 8, S1);
  }
  if (val2 == HIGH)
  {
    CAN.sendMsgBuf(0x16, 0, 8, S1);
    delay(300);
    CAN.sendMsgBuf(0x16, 0, 8, S1);
    delay(300);
    CAN.sendMsgBuf(0x16, 0, 8, S1);
    delay(300);
    CAN.sendMsgBuf(0x16, 0, 8, S1);
    delay(300);
    CAN.sendMsgBuf(0x16, 0, 8, S1);
  }
  if (val3 == HIGH)
  {
    CAN.sendMsgBuf(0x17, 0, 8, S1);
    delay(300);
    CAN.sendMsgBuf(0x17, 0, 8, S1);
    delay(300);
    CAN.sendMsgBuf(0x17, 0, 8, S1);
    delay(300);
    CAN.sendMsgBuf(0x17, 0, 8, S1);
    delay(300);
    CAN.sendMsgBuf(0x17, 0, 8, S1);
  }
  if (val4 == HIGH)
  {
    CAN.sendMsgBuf(0x18, 0, 8, S1);
    delay(300);
    CAN.sendMsgBuf(0x18, 0, 8, S1);
    delay(300);
    CAN.sendMsgBuf(0x18, 0, 8, S1);
    delay(300);
    CAN.sendMsgBuf(0x18, 0, 8, S1);
    delay(300);
    CAN.sendMsgBuf(0x18, 0, 8, S1);
  }

}

Pero habria que saber que tiene que hacer en caso de que pulses mientras este enviando la secuencia de 5 anterior

deja de enviar esos 5 y comienza con la nueva

o bien acaba esa secuencia y comienza la siguiente?

Cuando pulse el siguiente tiene que terminar y enviar la nueva a la vez

buah le he tenido que dar tantas vueltas que te pongo mi propuesta de solución (cosa que no suelo hacer, me gusta mas guiar) espero que lo entiendas, y que funcione o te ayude a ver el camino

la idea es que al hacer

val1 = val1|digitalRead(pulsador1);

si esta a 1 y lee 0 no lo borre, pero si esta a cero y lee 1 lo deje a 1 (recuerda que en arduino 0= FALSE= LOW y >0 = TRUE = HIGH)

FUNCdelay()
{
boolean salir=false;
unsigned long previousMillis;

previousMillis=millis();
do
{
  val1 = val1|digitalRead(pulsador1);
  val2 = val2|digitalRead(pulsador2);
  val3 = val3|digitalRead(pulsador3);
  val4 = val4|digitalRead(pulsador4);
  if ( millis() - previousMillis >= 300) salir=true;
}while (!salir);
}


void loop() {
 
  


  val1 = val1|digitalRead(pulsador1);
  val2 = val2|digitalRead(pulsador2);
  val3 = val3|digitalRead(pulsador3);
  val4 = val4|digitalRead(pulsador4);

  leer =true;

  if (val1 == HIGH)
  {
    val1=LOW;
    CAN.sendMsgBuf(0x15, 0, 8, S1);
    FUNCdelay();
    CAN.sendMsgBuf(0x15, 0, 8, S1);
    FUNCdelay();
    CAN.sendMsgBuf(0x15, 0, 8, S1);
    FUNCdelay();
    CAN.sendMsgBuf(0x15, 0, 8, S1);
    FUNCdelay();
    CAN.sendMsgBuf(0x15, 0, 8, S1);
  }
  if (val2 == HIGH)
  {
    val2=LOW;
    CAN.sendMsgBuf(0x16, 0, 8, S1);
    FUNCdelay();
    CAN.sendMsgBuf(0x16, 0, 8, S1);
    FUNCdelay();
    CAN.sendMsgBuf(0x16, 0, 8, S1);
    FUNCdelay();
    CAN.sendMsgBuf(0x16, 0, 8, S1);
    FUNCdelay();
    CAN.sendMsgBuf(0x16, 0, 8, S1);
  }
  if (val3 == HIGH)
  {
    val3=LOW;
    CAN.sendMsgBuf(0x17, 0, 8, S1);
    FUNCdelay();
    CAN.sendMsgBuf(0x17, 0, 8, S1);
    FUNCdelay();
    CAN.sendMsgBuf(0x17, 0, 8, S1);
    FUNCdelay();
    CAN.sendMsgBuf(0x17, 0, 8, S1);
    FUNCdelay();
    CAN.sendMsgBuf(0x17, 0, 8, S1);
  }
  if (val4 == HIGH)
  {
    val4=LOW;
    CAN.sendMsgBuf(0x18, 0, 8, S1);
    FUNCdelay();
    CAN.sendMsgBuf(0x18, 0, 8, S1);
    FUNCdelay();
    CAN.sendMsgBuf(0x18, 0, 8, S1);
    FUNCdelay();
    CAN.sendMsgBuf(0x18, 0, 8, S1);
    FUNCdelay();
    CAN.sendMsgBuf(0x18, 0, 8, S1);
  }

}

Gracias por la ayuda,si no me llegas a poner el ejemplo no lo hubiera entendido.

Me ha funcionado.

Muchas gracias

de nada!