Go Down

Topic: Creare un ciclo di "scan" per trasmissione dati moduli RF (Read 60 times) previous topic - next topic

Jakex

Salve a tutti, in sostanza sto cercando di far si che il mio controllore (parte rx) per 7 secondi resti ad ascoltare il trasmettitore che ogni secondo invia un messaggio, e qualora dopo sette secondi il ricevitore  non riesca a ricevere nulla, di conseguenza accenda un led.
Sketch RX:
Code: [Select]

void loop()
{
  for(;;)
  {
     unsigned char status = SPI_Read(STATUS);
     if(status&RX_DR)                                             "se il dato è pronto nella fifo rx"
    {
      SPI_Read_Buf(RD_RX_PLOAD, rx_buf, TX_PLOAD_WIDTH);             // read playload to rx_buf
      SPI_RW_Reg(FLUSH_RX,0);                                        // clear RX_FIFO
      memcpy(&nrf_data, rx_buf, sizeof(nrf_data));
       if ((nrf_data.counter) == 0)
      {
      digitalWrite(led,LOW);
      delay(800);
      goto STEP; 
      }
    }
    digitalWrite(led,HIGH);
    STEP:
    SPI_RW_Reg(WRITE_REG+STATUS,status);                             // clear RX_DR or TX_DS or MAX_RT interrupt flag
    delay(100);
  }}



Io vorrei trovare un modo per iterare per sette secondi questa parte di codice :

Code: [Select]

if(status&RX_DR)                                             "se il dato è pronto nella fifo rx"
    {
      SPI_Read_Buf(RD_RX_PLOAD, rx_buf, TX_PLOAD_WIDTH);             // read playload to rx_buf
      SPI_RW_Reg(FLUSH_RX,0);                                        // clear RX_FIFO
      memcpy(&nrf_data, rx_buf, sizeof(nrf_data));
       if ((nrf_data.counter) == 0)
      {
      digitalWrite(led,LOW);
      delay(800);
      goto STEP; 
      }


e nel caso in cui dopo sette secondi esso non abbia ricevuto nulla di conseguenza accende un led,
però nel aso in cui esso riceva un messaggio nel range di sette secondi, ovviamente, il led restera' spento. So che è una domanda banale, ma date le mie scarse conoscenze, non riesco ad ovviare al problema e il mio led lampeggia, non svolgendo il dovere di segnalare che la connessione con il tx è andata persa.

torn24

Ciao! Io risolverei con una variabile stato, che assume tre valori, tramite funzione millis() calcolo il trascorrere di 7 secondi, passati sette secondi  abilito una condizione if().

Mi sembra in questo caso che sia più chiaro un esempio di codice che delle parole

Esempio:


Code: [Select]


byte stato=0;
unsigned long tempo=0;

void loop(){

      if(condizione per cui inizia il conteggio di 7 secondi){

              tempo=millis();
              stato=1;

      }

      switch(stato){
   
           case 0:
                  tempo=millis();
                  stato=1;
                  break;

            case 1:
                   if(millis()-tempo>=7000){// Se sono passati 7 secondi

                         stato=2;
                   }
                   break;
            case 2:
                    if(ho ricevuto dati){

                           
                            Spengo led
                            stato=3; // Non fa più niente, se vuoi ricominciare stato=0;

                    }else{

                          Accendo led

                    }
                    break;
      }
}


Go Up