Go Down

Topic: Delay (Read 1 time) previous topic - next topic

BlueShark40

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.

bubulindo

O que é que está na String inputString???
This... is a hobby.

BlueShark40

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     

bubulindo

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?
This... is a hobby.

BlueShark40

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 = "";

  }

BlueShark40

Alguém por favor.

bubulindo

Explica-me o que é que este código deve fazer:
Code: [Select]
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:

Code: [Select]

     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.

Code: [Select]
           // -----------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.

This... is a hobby.

BlueShark40

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

alkuentrus

Vi o video. Muito fixe :)

bubulindo

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(). ;)
This... is a hobby.

BlueShark40

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.

StreamCast

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.

BlueShark40

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á?


StreamCast

#13
Feb 09, 2019, 11:06 am Last Edit: Feb 09, 2019, 11:12 am by StreamCast
O seu problema é que os motores ligam juntos ou eles simplesmente não ligam?

BlueShark40

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.

Go Up