Sincronizzazione tra due arduino via radio

Salve a tutti sono un ingegnere elettronico sono nuovo sul forum e volevo chiedervi come posso sincronizzare due arduino tra di loro via radio. I miei arduino in questo caso immaginiamo A e B hanno entrambi un led e un push button e un modulo radio NRF24L01 + PA + LNA, il mio scopo è far si che quando premo uno dei due push button i led su arduino A e su arduino B inizino a lampeggiare velocemente ma in maniera sincroizzata, nel caso nessuno dei due push button è stato premuto voglio che i led invece lampeggino più lentamenete e sempre in modo sincronizzato... In breve il codice che ho scritto funziona per quanto riguarda il lampeggio dei led ma i due led non lampeggiano in contemporanea come devo risolvere??
NON MI FA CARICARE ALLEGATI QUINDI ALLEGO QUI IL CODICE:
ARDUINO A

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

const int buttonPin = 3;
const int ledPin = 4;

int buttonState = 0;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;

RF24 radio(9, 10);
const byte addresses[][6] = {"00001", "00002"};

unsigned long tempo = 0;
unsigned long tempo0 = 0;
int limite = 60000;  // 1 minuto
int Delay = 0;

int invio = 0;
int ricevo = 0;

void setup() {
  Serial.begin(9600);
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);

  radio.begin();
  radio.openWritingPipe(addresses[1]);
  radio.openReadingPipe(1, addresses[0]);
  radio.setPALevel(RF24_PA_MIN);
}

void loop() {
  tempo = millis();
  invio = 2;
  int reading = digitalRead(buttonPin);

  if (reading != buttonState) {
    lastDebounceTime = millis();
  }

  buttonState = reading;

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // Se il bottone è premuto
    if (buttonState == HIGH) {
      sendSyncSignal();// Invia un segnale al ricevitore (Arduino 2)
      blinkLED(180, 1);  // Lampeggia il LED per 1 minuto (1000 lampeggi al minuto)
    } else {
      digitalWrite(ledPin, HIGH);
      delay(500);
      digitalWrite(ledPin, LOW);
      delay(500);
    }
  }


    if (ricevo == 3) {
      Serial.println("Ricevuto");
      
       // Invia un segnale al ricevitore (Arduino 2)
      blinkLED(180, 1);  // Lampeggia il LED per 1 minuto (1000 lampeggi al minuto)
    }
  else {
      digitalWrite(ledPin, HIGH);
      delay(500);
      digitalWrite(ledPin, LOW);
      delay(500);
    }

  switch (Delay) {
    case 0:
      Tx();
      break;
    case 1:
      Rx();
      break;
  }
}

void Tx() {
  radio.startListening();
  while (radio.available()) {
    radio.read(&ricevo, sizeof(ricevo));
  }
}

void Rx() {
  radio.stopListening();
  radio.write(&invio, sizeof(invio));
  ricevo = 0;
}

void blinkLED(int blinkRate, int durationMinutes) {
  int blinkInterval = 60000 / blinkRate;

  for (int i = 0; i < blinkRate * durationMinutes; i++) {
    digitalWrite(ledPin, HIGH);
    delay(blinkInterval / 2);
    digitalWrite(ledPin, LOW);
    delay(blinkInterval / 2);
  }
   ricevo=0;
}

void sendSyncSignal() {
  int syncSignal = 4;
  radio.stopListening();
  radio.write(&syncSignal, sizeof(syncSignal));
  delay(100);
}

ARDUINO B

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

const int buttonPin = 3;
const int ledPin = 4;

int buttonState = 0;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;

RF24 radio(9, 10);
const byte addresses[][6] = {"00001", "00002"};

unsigned long tempo = 0;
unsigned long tempo0 = 0;
int limite = 60000;  // 1 minuto
int Delay = 0;

int invio = 0;
int ricevo = 0;

void setup() {
  Serial.begin(9600);
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);

  radio.begin();
  radio.openWritingPipe(addresses[0]);
  radio.openReadingPipe(1, addresses[1]);
  radio.setPALevel(RF24_PA_MIN);
}

void loop() {
  tempo = millis();
  invio = 2;
  int reading = digitalRead(buttonPin);

  if (reading != buttonState) {
    lastDebounceTime = millis();
  }

  buttonState = reading;

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // Se il bottone è premuto
    if (buttonState == HIGH) {
      sendSyncSignal();  // Invia un segnale al trasmettitore (Arduino 1)
      blinkLED(180, 1);  // Lampeggia il LED per 1 minuto (1000 lampeggi al minuto)
    } else {
      digitalWrite(ledPin, HIGH);
      delay(500);
      digitalWrite(ledPin, LOW);
      delay(500);
    }
  }


    if (ricevo == 4) {
      Serial.println("Ricevuto");
       // Invia un segnale al trasmettitore (Arduino 1)
      
      blinkLED(180, 1);  // Lampeggia il LED per 1 minuto (1000 lampeggi al minuto)
  }
  else {
      digitalWrite(ledPin, HIGH);
      delay(500);
      digitalWrite(ledPin, LOW);
      delay(500);
    }
    

  switch (Delay) {
    case 0:
      Tx();
      break;
    case 1:
      Rx();
      break;
  }
}

void Tx() {
  radio.startListening();
  while (radio.available()) {
    radio.read(&ricevo, sizeof(ricevo));
  }
}

void Rx() {
  radio.stopListening();
  radio.write(&invio, sizeof(invio));
  ricevo = 0;
}

void blinkLED(int blinkRate, int durationMinutes) {
  int blinkInterval = 60000 / blinkRate;

  for (int i = 0; i < blinkRate * durationMinutes; i++) {
    digitalWrite(ledPin, HIGH);
    delay(blinkInterval / 2);
    digitalWrite(ledPin, LOW);
    delay(blinkInterval / 2);
  }
   ricevo=0;
}

void sendSyncSignal() {
  int syncSignal = 3;
  radio.stopListening();
  radio.write(&syncSignal, sizeof(syncSignal));
  delay(100);
}

Buonasera e benvenuto nella sezione Italiana del forum,

cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

Non solo, ma ... sei sempre lo stesso che scriveva QUI?

Guglielmo

si sono io

E per quale motivo hai fatto un altro account? ... REGOLAMENTO, punto 16.12 ... dimmi quale account vuoi che elimini perché due non ne puoi avere ... :roll_eyes:

Guglielmo

se puoi eliminami l'atro account e questo lascialo grazie e scusami

Ok, l'altro account NON è più attivo, prosegui solo con questo, grazie.

Guglielmo

Se ti basi solo sul clock di sistema, difficilmente lampeggeranno in sincro ...

... ho idea che dovrai definire un Arduino come master e l'altro come slave ed il master dovrà dare, via radio, gli impulsi per la sincronizzazione di OGNI lampeggio o ... prima o poi il sincronismo si perde.

Guglielmo

quindi dovrei utilizzare un arduino come master e due come slave , o soltanto due arduino però con clock esterno?

Se ho ben capito tu vuoi che i DUE Arduino lampeggino in sincro ... in tal caso quello che definiamo master, quando decidere di accendere il LED lo deve comunicare a quello che chiamiamo slave ed idem quando decide di spegnere il LED ... in questo modo i due sono in sincro.

Guglielmo

ok e su questo sono d'accordo ma secondo te come dovrei modificare lo script ?

Devi mettere il lampeggiatore nel programma del dispositivo master, usando millis(), e trasmettere gli impulsi allo slave. Secondo i tempi che ti servono, potresti mandare solo gli impulsi di partenza.

mi postresti far vedere come modificare il codice?

Una cosa simile:

if(millis()-t_intermittenza>=1000)
  {
  t_intermittenza=millis();
  trigger=true;
  }

if(trigger)
  {
  // Fa lampeggiare usando millis();
  trasmetti();
  // Alla fine: trigger=false;
  }

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.