Dúvida e Problema: delay variavel

Boa Tarde a todos.
Eu estou recebendo uma SMS por um módulo GSM, e enviando para o serial monitor.
O SMS é basicamente esse: "#vermelho45amarelo11verde37". Cada número (45, 11 e 37) vai ser utilizado como delay, para acender uma fase de um semáforo e é multiplicado por 1000.
Visualizando no Serial Monitor o retorno das variaveis que armazenam essa conta, os valores estão corretos.
Mas na hora de utiliza-las em um delay, por exemplo delay(verm), os leds não acendem. Se eu troco delay(verm) para delay (5000) funciona normalmente.
Alguem pode me dar uma ajuda?

Segue meu código:

int ledverm = 39;
int ledamar = 41;
int ledverd = 43;
long int vm;
long int vm1;
long int vm2;
long int am;
long int am1;
long int am2;
long int vd;
long int vd1;
long int vd2;
String strvm1;
String strvm2;
String stram1;
String stram2;
String strvd1;
String strvd2;

void setup()
{
  Serial1.begin(19200);
  Serial.begin(19200);
  pinMode(ledverm, OUTPUT);
  pinMode(ledamar, OUTPUT);
  pinMode(ledverd, OUTPUT);
  // Configure para receber mensagens de outros dispositivos
  // Entre as equipes dar tempo para processá-los
  Serial1.print("AT+CMGF=1\r");
  delay(300);
  Serial1.print("AT+IFC=1, 1\r");
  delay(300);
  Serial1.print("AT+CPBS=\"SM\"\r");
  delay(300);
  Serial1.print("AT+CNMI=1,2,2,1,0\r");
  delay(500);
  Serial1.print("AT+CMGD=1,4");
  delay(500);
  Serial.print("AT+CMGF=1\r");
  delay(300);
  Serial.print("AT+IFC=1, 1\r");
  delay(300);
  Serial.print("AT+CPBS=\"SM\"\r");
  delay(300);
  Serial.print("AT+CNMI=1,2,2,1,0\r");
  delay(500);
  Serial.print("AT+CMGD=1,4\r");
  delay(500);
}

String currStr = "";
// A variável tem o valor True, se a linha atual é a mensagem
boolean isStringMessage = false;

void loop()
{

  if (!Serial1.available())
    return;

  char currSymb = Serial1.read(); delay(2);   
  if ('\r' == currSymb) {
    if (isStringMessage) {

      strvm1 = currStr.substring(9,10);
     long  int testevm1 = strvm1.toInt();
      char charvm1[strvm1.length()+1];
      strvm1.toCharArray(charvm1, sizeof(charvm1));
    long   int vm1 = atoi(charvm1);
      Serial.print("\rstrvm1=");Serial.print(strvm1);
      Serial.print("\rvm1=");Serial.print(vm1);
      Serial.print("\rtestevm1=");Serial.print(testevm1);
      
      strvm2 = currStr.substring(10,11);
      int testevm2 = strvm2.toInt();
      char charvm2[strvm2.length()+1];
      strvm2.toCharArray(charvm2, sizeof(charvm2));
      int vm2 = atoi(charvm2);
      Serial.print("\rstrvm2=");Serial.print(strvm2);
      Serial.print("\rvm2=");Serial.print(vm2);
      Serial.print("\rtestevm2=");Serial.print(testevm2);

      stram1 = currStr.substring(18,19);
     long  int testeam1 = stram1.toInt();
      char charam1[stram1.length()+1];
      stram1.toCharArray(charam1, sizeof(charam1));
     long  int am1 = atoi(charam1);
      Serial.print("\rstram1=");Serial.print(stram1);
      Serial.print("\ram1=");Serial.print(am1);
      Serial.print("\rtesteam1=");Serial.print(testeam1);

      stram2 = currStr.substring(19,20);
     long  int testeam2 = stram2.toInt();
      char charam2[stram2.length()+1];
      stram2.toCharArray(charam2, sizeof(charam2));
    long   int am2 = atoi(charam2);
      Serial.print("\rstram2=");Serial.print(stram2);
      Serial.print("\ram2=");Serial.print(am2);
      Serial.print("\rtesteam2=");Serial.print(testeam2);

      strvd1 = currStr.substring(25,26);
     long  int testevd1 = strvd1.toInt();
      char charvd1[strvd1.length()+1];
      strvd1.toCharArray(charvd1, sizeof(charvd1));
    long   int vd1 = atoi(charvd1);
      Serial.print("\rstrvd1=");Serial.print(strvd1);
      Serial.print("\rvd1=");Serial.print(vd1);
      Serial.print("\rtestevd1=");Serial.print(testevd1);

      strvd2 = currStr.substring(26,27);
     long  int testevd2 = strvd2.toInt();  
      char charvd2[strvd2.length()+1];
      strvd2.toCharArray(charvd2, sizeof(charvd2));
     long  int vd2 = atoi(charvd2);
      Serial.print("\rstrvd2=");Serial.print(strvd2);
      Serial.print("\rvd2=");Serial.print(vd2);   
      Serial.print("\rtestevd2=");Serial.print(testevd2);   
      
    long   int vms = (vm1+vm2);      Serial.print("\rvms=");Serial.print(vms);      
     long  int ams = (am1+am2);      Serial.print("\rams=");Serial.print(ams);      
     long  int vds = (vd1+vd2);      Serial.print("\rvds=");Serial.print(vds);      
     long  int vm = (vms*1000);      Serial.print("\rvm=");Serial.print(vm);      
     long  int am = (ams*1000);      Serial.print("\ram=");Serial.print(am);      
     long  int vd = (vds*1000);      Serial.print("\rvd=");Serial.print(vd);      

   long    int vmteste=(testevm1+testevm2)*1000;      Serial.print("\rvmteste=");Serial.print(vmteste);      
     long  int amteste=(testeam1+testeam2)*1000;      Serial.print("\ramteste=");Serial.print(amteste);      
     long  int vdteste=(testevd1+testevd2)*1000;      Serial.print("\rvdteste=");Serial.print(vdteste);      
      
      
      isStringMessage = false;

      semaforo();
    } 
    else {
      if (currStr.startsWith("+CMT")) {
        // Se a linha atual começa com um "+ CMT",
        // A linha seguinte é a mensagem
        isStringMessage = true;
      }
    }
    currStr = "";
  } 
  else if ('\n' != currSymb) {
    currStr += String(currSymb);
    char carray[currStr.length()+1];
    currStr.toCharArray(carray, sizeof(carray));

  }
}

void semaforo(){

  digitalWrite(ledverm, HIGH);
  digitalWrite(ledamar, LOW);
  digitalWrite(ledverd, LOW);
  delay(vm);

  digitalWrite(ledverm, LOW);
  digitalWrite(ledamar, HIGH);
  digitalWrite(ledverd, LOW);
  delay(am);

  digitalWrite(ledverm, LOW);
  digitalWrite(ledamar, LOW);
  digitalWrite(ledverd, HIGH);
  delay(vd);
}

Bom amigo na minha opiniao ao ler o teu codigo vejo o de uma forma nao "human readable" ou seja completamente confuso.
Axo que tornaste um simples problema uma enorme confusao para algo de modo simples.
Eu arrumava fora o uso da Strings e usava arrays de char correctamente terminados com o caracter '\0' para se transformarem em strings.
A maneira como programas parece que nao sabes que o microcontrolador tem RAM limitada ...
Ja agora que modem GSM estas a usar?

#vermelho45amarelo11verde37

Porque algo mais simples como :
R45,Y11,G37//R de RED Y de Yellow e G de Green
Passas a informaçao na mesma de uma forma mais simples e poucas recursos.
Depois o que eu faria era ler a SMS e ler todo o seu conteudo pra dentro de um char array e depois com pequenas funçoes interpretar onde estao as virgulas e copiar partes da mensagem para outros arrays e depois termina-los correctamente e no final usar a funçao atoi()

// Entre as equipes dar tempo para processá-los
Serial1.print("AT+CMGF=1\r");
delay(300);
Serial1.print("AT+IFC=1, 1\r");
delay(300);
Serial1.print("AT+CPBS="SM"\r");
delay(300);
Serial1.print("AT+CNMI=1,2,2,1,0\r");
delay(500);
Serial1.print("AT+CMGD=1,4");
delay(500);
Serial.print("AT+CMGF=1\r");
delay(300);
Serial.print("AT+IFC=1, 1\r");
delay(300);
Serial.print("AT+CPBS="SM"\r");
delay(300);
Serial.print("AT+CNMI=1,2,2,1,0\r");
delay(500);
Serial.print("AT+CMGD=1,4\r");
delay(500);

Nao sei que modem usas pois nao indicaste, mas para ler uma simples SMS parece me demasiados comandos.Eu uso o Siemens MC35 que me parece ter comandos AT similares aos que usas, se assim for como sabes que receveste uma SMS?
Certo que tens esta instruçao Serial.print("AT+CNMI=1,2,2,1,0\r"); para o modem te indicar que recebeste uma SMS mas como depois tratas isso?