Delay

O sketch ainda tem algumas linhas e tudo funciona perfeitamente mas não consigo que o delay funcione.
Este é o único delay em todo o sketch

if (inputString.indexOf("bt1=1")> -1) {
digitalWrite(CamaJuMotorDirFechar, HIGH);
digitalWrite(CamaJuMotorEsqAbrir, LOW);
digitalWrite(CamaJuMotorEsqFechar, HIGH);
delay(2000);
digitalWrite(CamaJuMotorDirAbrir, LOW);

Desde já um muito obrigado.

O que é que está na String inputString???

Penso que seja isto que quer saber. Obrigado por tentar ajudar

void Nextion_processing()
{
int i1;
String s1;
while (Serial.available()) {
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
inputString += inChar;
if (inChar != '|') return;
}

int i2=inputString.indexOf("=");
if (i2 > 0) {
#ifdef _debug_snd
Serial.print("Nextion: ");
Serial.print(inputString);
Serial.println(" - ");
Serial.print(inputString.substring(i2-2,i2));
Serial.print("=");
Serial.println(inputString[i2+1]);
#endif

O que colocaste não me diz nada...

Basicamente a string é recebida da porta série... mas quando é que a string é limpa? A string que vais receber, tem um tamanho fixo? Ou um tamanho minimo?

Já pensaste que os caracteres não são recebidos todos ao mesmo tempo e o teu código executa sem ter a string toda?

ca vai tudo.

//Ligações do Nextion ao Arduino
// TX - RX
// RX - TX

#define LuzTeto1 22
#define LuzTeto2 23
#define LuzTeto3 24
#define LuzTeto4 25
#define LuzCamaBia 26
#define LuzCamaJu 27
#define Disco 28
#define LuzMesa 29
#define CamaBiaMotorAbrir 30
#define CamaBiaMotorFechar 31
#define CamaJuMotorDirAbrir 32
#define CamaJuMotorDirFechar 33
#define MotorLuzMesaAbrir 34
#define MotorLuzMesaFechar 35
#define LuzRoupeiro500 36
#define CamaJuMotorEsqAbrir 38
#define CamaJuMotorEsqFechar 39
#define LuzRoupeiro1000 40

String inputString;
int bscheduler = 0;

void setup()
{
// init serial port for nextion communication.
Serial.begin(9600);
delay(250);

pinMode(LuzTeto1, OUTPUT);
pinMode(LuzTeto2, OUTPUT);
pinMode(LuzTeto3, OUTPUT);
pinMode(LuzTeto4, OUTPUT);
pinMode(LuzCamaBia, OUTPUT);
pinMode(LuzCamaJu, OUTPUT);
pinMode(Disco, OUTPUT);
pinMode(LuzMesa, OUTPUT);
pinMode(CamaBiaMotorAbrir, OUTPUT);
pinMode(CamaBiaMotorFechar, OUTPUT);
pinMode(CamaJuMotorDirAbrir, OUTPUT);
pinMode(CamaJuMotorDirFechar, OUTPUT);
pinMode(MotorLuzMesaAbrir, OUTPUT);
pinMode(MotorLuzMesaFechar, OUTPUT);
pinMode(LuzRoupeiro500, OUTPUT);
pinMode (CamaJuMotorEsqAbrir, OUTPUT);
pinMode (CamaJuMotorEsqFechar, OUTPUT);
pinMode(LuzRoupeiro1000, OUTPUT);

digitalWrite(LuzTeto1, HIGH);
digitalWrite(LuzTeto2, HIGH);
digitalWrite(LuzTeto3, HIGH);
digitalWrite(LuzTeto4, HIGH);
digitalWrite(LuzCamaBia, HIGH);
digitalWrite(LuzCamaJu, HIGH);
digitalWrite(Disco, HIGH);
digitalWrite(LuzMesa, HIGH);
digitalWrite(CamaBiaMotorAbrir, HIGH);
digitalWrite(CamaBiaMotorFechar, HIGH);
digitalWrite(CamaJuMotorDirAbrir, HIGH);
digitalWrite(CamaJuMotorDirFechar, HIGH);
digitalWrite(MotorLuzMesaAbrir, HIGH);
digitalWrite(MotorLuzMesaFechar, HIGH);
digitalWrite (CamaJuMotorEsqAbrir, HIGH);
digitalWrite (CamaJuMotorEsqFechar, HIGH);
digitalWrite(LuzRoupeiro500, LOW);
digitalWrite(LuzRoupeiro1000, LOW);

// init serial port for nextion communication.
Serial.begin(9600);
delay(250);
}

void loop()
{
// processing of incomming messages from nextion
Nextion_processing();
switch(bscheduler)
{
// transmit to nextion display
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
break;
}
bscheduler++;
if (bscheduler > 100) bscheduler = 0;
delay(10);
}

unsigned long StrToHex(String str, byte digits)
{
char ConvByte[10];
str.toCharArray(ConvByte, digits);
return (unsigned long) strtol(ConvByte, NULL, 16);
}

// ------ receiving and processing of incomming data from nextion
void Nextion_processing()
{
int i1;
String s1;
while (Serial.available()) {
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
inputString += inChar;
if (inChar != '|') return;
}

int i2=inputString.indexOf("=");
if (i2 > 0) {
#ifdef _debug_snd
Serial.print("Nextion: ");
Serial.print(inputString);
Serial.println(" - ");
Serial.print(inputString.substring(i2-2,i2));
Serial.print("=");
Serial.println(inputString[i2+1]);
#endif

// Funcionamento dos botões e relés

// -----------Luzes teto--------------------
if (inputString.indexOf("bt3=0")> -1) {
digitalWrite(LuzTeto1, HIGH);
}
else if(inputString.indexOf("bt3=1")> -1) {
digitalWrite(LuzTeto1, LOW);
}
if (inputString.indexOf("bt4=0")> -1) {
digitalWrite(LuzTeto2, HIGH);
}
else if(inputString.indexOf("bt4=1")> -1) {
digitalWrite(LuzTeto2, LOW);
}
if (inputString.indexOf("bt5=0")> -1) {
digitalWrite(LuzTeto3, HIGH);
}
else if(inputString.indexOf("bt5=1")> -1) {
digitalWrite(LuzTeto3, LOW);
}
if (inputString.indexOf("bt6=0")> -1) {
digitalWrite(LuzTeto4, HIGH);
}
else if(inputString.indexOf("bt6=1")> -1) {
digitalWrite(LuzTeto4, LOW);

// -----------Luz cama Bia--------------------
}
if (inputString.indexOf("bt7=0")> -1) {
digitalWrite(LuzCamaBia, HIGH);
}
else if(inputString.indexOf("bt7=1")> -1) {
digitalWrite(LuzCamaBia, LOW);

// -----------Luz cama Ju--------------------
}
if (inputString.indexOf("bt8=0")> -1) {
digitalWrite(LuzCamaJu, HIGH);
}
else if(inputString.indexOf("bt8=1")> -1) {
digitalWrite(LuzCamaJu, LOW);

// -----------Disco--------------------
}
if (inputString.indexOf("bt9=0")> -1) {
digitalWrite(Disco, HIGH);
}
else if(inputString.indexOf("bt9=1")> -1) {
digitalWrite(Disco, LOW);

// -----------Luz Mesa--------------------
// }
// if (inputString.indexOf("bt9=0")> -1) {
// digitalWrite(LuzMesa, HIGH);
// }
// else if(inputString.indexOf("bt9=1")> -1) {
// digitalWrite(LuzMesa, LOW);
// }
// if (inputString.indexOf("bt9=0")> -1) {
// digitalWrite(MotorLuzMesaAbrir, HIGH);
// }
// else if(inputString.indexOf("bt9=1")> -1) {
// digitalWrite(MotorLuzMesaFechar, LOW);

////////////////////////CAMAS////////////////////////////////////

// -----------Cama Bia Motor--------------------
}
if (inputString.indexOf("bt0=1")> -1) {
digitalWrite(CamaBiaMotorAbrir, LOW);
digitalWrite(CamaBiaMotorFechar, HIGH);
}
else if(inputString.indexOf("bt10=1")> -1) {
digitalWrite(CamaBiaMotorAbrir, HIGH);
digitalWrite(CamaBiaMotorFechar, LOW);

// -----------Cama Ju Motor--------------------
}
if (inputString.indexOf("bt1=1")> -1) {
digitalWrite(CamaJuMotorDirFechar, HIGH);
digitalWrite(CamaJuMotorEsqAbrir, LOW);
digitalWrite(CamaJuMotorEsqFechar, HIGH);
delay(2000);
digitalWrite(CamaJuMotorDirAbrir, LOW);
}
else if(inputString.indexOf("bt11=1")> -1) {
digitalWrite(CamaJuMotorDirFechar, LOW);
digitalWrite(CamaJuMotorEsqAbrir, HIGH);
digitalWrite(CamaJuMotorEsqFechar, LOW);
digitalWrite(CamaJuMotorDirAbrir, HIGH);

////////////////////////////////STOP CAMAS/////////////////////////////

}
if (inputString.indexOf("bt2=1")> -1) {
digitalWrite(CamaJuMotorDirAbrir, HIGH);
digitalWrite(CamaJuMotorDirFechar, HIGH);
digitalWrite(CamaJuMotorEsqAbrir, HIGH);
digitalWrite(CamaJuMotorEsqFechar, HIGH);
digitalWrite(CamaBiaMotorAbrir, HIGH);
digitalWrite(CamaBiaMotorFechar, HIGH);

} }

while(Serial.available()) {Serial.read();}
inputString = "";

}

Alguém por favor.

Explica-me o que é que este código deve fazer:

switch(bscheduler)
    {
        // transmit to nextion display               
          Serial.write(0xff);
          Serial.write(0xff);
          Serial.write(0xff);       
          break;
    }

Particularmente o uso do switch... e se tens erros de compilação.

Algum dos botões funciona? Ou só o botão em específico que meteste inicialmente?

O que tens configurado no NEXTION? E que strings é que estás a receber?

E o teu encadeamento de strings está incorrecto e atrasa ainda mais o código. Por exemplo:

     if (inputString.indexOf("bt3=0")> -1) {// A variável bt3 é boleana, ou é 1 ou 0. Aqui testas se é 0       
       digitalWrite(LuzTeto1, HIGH);     
    }
    else if(inputString.indexOf("bt3=1")> -1) { // Aqui o else só é processado se a variável for diferente de 0, ou seja 1, logo o if adicional apenas atrasa o código. 
       digitalWrite(LuzTeto1, LOW);
    }

Tira o segundo if para cada um dos botões que tens.

           // -----------Luz Mesa--------------------
//    }     
//  if (inputString.indexOf("bt9=0")> -1) {       
//       digitalWrite(LuzMesa, HIGH);     
//    }
//    else if(inputString.indexOf("bt9=1")> -1) {
//       digitalWrite(LuzMesa, LOW);
//    }     
//  if (inputString.indexOf("bt9=0")> -1) {       
//       digitalWrite(MotorLuzMesaAbrir, HIGH);     
//    }
//    else if(inputString.indexOf("bt9=1")> -1) {
//       digitalWrite(MotorLuzMesaFechar, LOW);

Se este código não faz nada, tira-o do programa. Podes sempre fazer paste do código no fundo do programa onde não causa confusão nenhuma.

Obrigado pela resposta.

Tenho que confessar que apesar de ter feito isto e mais algumas coisas, ainda não entendo muitas das coisas que tem num código e provavelmente neste terá algumas coisas desnecessárias.

O ultimo código que falas, não esta ativo mas vai estar.

Tudo funciona perfeitamente, todos os botões cumprem a sua função sem falhas, apenas preciso do delay porque esta parte do código serve para ativar 2 motores para abrir/fechar uma cama e 1 destes motores esta um pouco mais rápido que o outro (chines) então o Delay servia para atrasar o arranque.

Antes tinha tudo a funcionar com um tablet com ligação por Bluetooth mas a ligação ia abaixo muitas vezes, então decidi fazer funcionar através de um tft nextion 3.2" logo o código teve que mudar.

Aqui fica um video que mostra tudo a funcionar ainda com tablet, com o nextion ainda não fiz um video mas funciona igual
https://drive.google.com/open?id=1tA2-m6mfcNeafCtw1Oh1r6ojXmPe-LFteg

Vi o video. Muito fixe :slight_smile:

A instrução switch não está usada de forma correcta... mas não sei o que pretendes atingir com ela.

Estuda o exemplo blink without delay para veres como fazeres temporizações sem a função delay(). :wink:

Obrigado alkuentrus,
muito trabalho de mãos e "cabeça", pois todo o quarto foi remodelado por mim e sozinho, desde teto falso, camas, elétricidade, etc...

bubulindo,
já estive a ver o exemplo blink without delay e não percebo como posso usar para que funcione.
Eu arranjei na net um sketch e alterei para fazer o que queria (ainda não tenho conhecimento suficiente para começas de raiz), apaguei tudo o que não fazia falta, quando apagava algo e dava erro voltava atrás até que acabei como está.

Como já disse tudo funciona perfeitamente, apenas quero atrasar um dos motores +-2 segundos.

Agradeço a tua resposta e espero que me possas ajudar.

Amigo talvez eu não tenha entendido direito o seu código, mas da forma como ele está sequenciado, realmente não o imagino funcionando do jeito que você fala. Da forma como está os dois vão ligar juntos. Veja:

if (inputString.indexOf("bt1=1")> -1) {
digitalWrite(CamaJuMotorDirFechar, HIGH); //Envia o sinal para o motor Direito Fechar
digitalWrite(CamaJuMotorEsqAbrir, LOW); //Envia o sinal para o motor Esquerdo Não Abrir
digitalWrite(CamaJuMotorEsqFechar, HIGH); //Envia o sinal para o motor Esquerdo Fechar
delay(2000); //Espera 2 segundos
digitalWrite(CamaJuMotorDirAbrir, LOW); //Envia o sinal para o motor Direito NÃO Abrir
}

A não ser que sua lógica seja reversa, ou seja, o seu driver liga o motor com sinal baixo (LOW) o há um erro de lógica aí. Os dois comandos para ligar estão antes do delay(), o que significa que eles irão ligar juntos. Talvez o correto seria:

if (inputString.indexOf("bt1=1")> -1) {
digitalWrite(CamaJuMotorDirAbrir, LOW); //Envia o sinal para o motor Direito NÃO Abrir
digitalWrite(CamaJuMotorDirFechar, HIGH); //Envia o sinal para o motor Direito Fechar
delay(2000); //Espera 2 segundos
digitalWrite(CamaJuMotorEsqAbrir, LOW); //Envia o sinal para o motor Esquerdo Não Abrir
digitalWrite(CamaJuMotorEsqFechar, HIGH); //Envia o sinal para o motor Esquerdo Fechar
}

Mas não estou certo disso, seria mais seguro verificar as ligações antes, pois não sei como é o seu sistema eletro-mecânico, se pode quebrar, travar, queimar os motores.

StreamCast,

Tenho isto a funcionar ao contrario e tenho que corrigir, LOW ativa e HIGH desativa, mas não será esse o problema, ou será?

O seu problema é que os motores ligam juntos ou eles simplesmente não ligam?

StreamCast:
O seu problema é que os motores ligam juntos ou eles simplesmente não ligam?

O meu problema é que os motores ligam juntos.
Preciso colocar um atraso no motor dir. porque o motor esq. é um pouco mais lento e queria compensar com o delay.

Falta dizer que os motores são ativados por relés.

Problema resolvido finalmente.

Obrigado StreamCast
experimentei como disseste (não troquei LOW/HIGH) e funciona.

Antes:

if (inputString.indexOf("bt1=1")> -1) {
digitalWrite(CamaJuMotorDirFechar, HIGH);
digitalWrite(CamaJuMotorEsqAbrir, LOW);
digitalWrite(CamaJuMotorEsqFechar, HIGH);
delay(2000);
digitalWrite(CamaJuMotorDirAbrir, LOW);

Depois:

if (inputString.indexOf("bt1=1")> -1) {
digitalWrite(CamaJuMotorDirFechar, HIGH);
digitalWrite(CamaJuMotorEsqAbrir, LOW);
delay(2000);
digitalWrite(CamaJuMotorEsqFechar, HIGH);
digitalWrite(CamaJuMotorDirAbrir, LOW);

Agora olho e penso... tão simples.

Obrigado a todos.

Opa que bom que pude ajudar! Boa sorte!