nrf24l01 mandare dati solo se soddisfa condizione

Salve a tutti, sto lavorando ad un progetto di un semplice veicolo "autonomo", un piccolo autobus che deve girare in un plastico, per muoversi usa un semplice codice con dei line follower per lo sterzo e un sensore di distanza per farlo muovere o per fermarsi in caso di ostacolo;
Da un po' ho aggiunto un arduino mega al plastico, che comunica via radio con l'arduino nel veicolo, per ora ci sono dei sensori magnetici nel plastico, che, se attivati da una calamita posta sotto al pianale dell'autobus, lo fanno fermare, mandando lo stato del sensore via radio.
Dato che alcuni sensori sono posti vicino a dei semafori, vorrei che il dato del sensore magnetico fosse mandato solo se la luce rossa del semaforo e' accesa, cosi' facendo l'autobus si fermerebbe solo se il semaforo e' rosso.
Il problema e' che non riesco a far funzionare il modulo radio MENTRE il semaforo fa il suo lavoro, mi spiego: se nel [void loop] del codice c'e' solo il sistema radio per i sensori, allora non ci sono problemi tutto lavora come descritto, se io invece inserisco anche un piccolo loop per il semaforo(cioe' tipo led rosso high, led verde low, delay tot secondi, led rosso low, led verde high, delay tot secondi) il modulo radio sembra non mandare dati o comunque li manda solo dopo al loop del semaforo;
Posto qui sotto i codici di entrambi, essendo in fase di test c'e' solo un sensore magnetico, e solo il led rosso.

Plastico:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte addresses[6] = "Free1";
const int sm1 = 30;
int dataWrite[1];
int statsm1;
int SaR = 20;

void setup() {
  radio.begin();
  radio.setPALevel(RF24_PA_MIN);
  radio.setDataRate(RF24_1MBPS);
  radio.setRetries(0, 15);
  radio.openWritingPipe(addresses);
  radio.stopListening();
  pinMode(sm1, INPUT);
  pinMode(SaR, OUTPUT);
}

void loop() {

digitalWrite(SaR, HIGH);
delay(2000);
digitalWrite(SaR, LOW);
delay(2000);

statsm1 = digitalRead(sm1);
dataWrite[0] = statsm1;
radio.write(dataWrite, sizeof(dataWrite));

}

Autobus:

//-----------------------------------------------------------
//--------------------- sistema sterzo ----------------------
//-----------------------------------------------------------
#include <Servo.h>
int sd = 3;
int ss = 2;
Servo sterzo;
int pos = 90;
//-----------------------------------------------------------
//--------------------- sistema motore ----------------------
//-----------------------------------------------------------
#include <HCSR04.h>
int triggerPin = 10;
int echoPin = 9;
const int avanti = 4;
const int indietro = 5;


UltraSonicDistanceSensor distanceSensor(triggerPin, echoPin);

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 radio(7, 8); // CE, CSN
const byte addresses[6] = "Free1";
int dataRead[1];

void setup() {
  pinMode(avanti , OUTPUT);
  pinMode(indietro , OUTPUT);
  pinMode(sd, INPUT);
  pinMode(ss, INPUT);
  sterzo.attach(6);
  Serial.begin(9600);
  
  radio.begin();  
  radio.setPALevel(RF24_PA_MIN);
  radio.setDataRate(RF24_1MBPS);      
  radio.setRetries(0, 15);
  radio.openReadingPipe(1, addresses);
  radio.startListening();

}

void loop() {
//-------------------------------------------------------------
//-------------------- controllo sterzo -----------------------
//-------------------------------------------------------------
  if(digitalRead(ss) && digitalRead(sd)){
    sterzo.write(90);
  }
  if(!(digitalRead(ss)) && !(digitalRead(sd))){
    sterzo.write(90);
  }
  if(!(digitalRead(ss)) && digitalRead(sd)){
    sterzo.write(120);
  }
  if(digitalRead(ss) && !(digitalRead(sd))){
    sterzo.write(60);
  }  
//-------------------------------------------------------------
//-------------------- controllo marcia -----------------------
//-------------------------------------------------------------  

double distance = distanceSensor.measureDistanceCm();
Serial.println(distance);
delay(10);   

if(distance > 5){
  if( radio.available()) {    
     radio.read(dataRead, sizeof(dataRead));  
    if(dataRead[0] == LOW){
      digitalWrite(avanti, LOW);
      digitalWrite(indietro, LOW);      
    }
    if(dataRead[0] == HIGH){
      digitalWrite(avanti, HIGH);
      digitalWrite(indietro, LOW);      
    }
  }
}
else if(distance < 5){
  digitalWrite(avanti, LOW);
  digitalWrite(indietro, LOW);  
}
Serial.println(dataRead[0]);
}

Come potrei risolvere?

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Qui una serie di link utili, NON necessariamente inerenti alla tua domanda:
- serie di schede by xxxPighi per i collegamenti elettronici vari: ABC - Arduino Basic Connections
- pinout delle varie schede by xxxPighi: Pinout
- link generali utili: Link Utili

Fatto, scusa ma ero un po' di fretta e ho dimenticato di postare la presentazione

... il tuo problema è l'uso della funzione delay() che, notoriamente, è bloccante e quindi il programma NON può fare altro per tutto il periodo.

Prova a studiarti come si usa la funzione millis(), prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... vedrai che troverai una soluzione :wink:

Guglielmo

Ok grazio, ora con millis funziona, pero' mi pare strano, lo avevo provato giorni fa, e sembrava non funzionare, ho semplicemente fatto lampeggiare il semaforo con i millis, e gli ho detto di mandare data via radio ma non funzionava, ora ho scritto la stessa cosa e va; dannato io che non mi sono accorto di qualcosa sbagliato i giorni scorso allora! ahaha