2 arduino nano con 2 moduli hc12 chi mi aiuta?

Ciao a tutti, ho un problema con il mio progetto, il progetto consiste in 2 arduino nano e due moduli hc12 per comunicare a distanza, uno lo chiameremo arduino B che sarà composto da 1 arduino nano 1 modulo hc12 due pulsanti e due led mentre l'altro lo chiameremo arduino A ed e composto da 1 arduino nano 1 modulo hc12 e 1 led e 1 pulsante, questo è quello che mi serve e che quasi sto ultimando, alla pressione del pulsante P7 di arduino B deve poter accendere il led di arduino A ma solo quando il pulsante di P7 e premuto diversamente deve essere spento, fin qui ci sono riuscito, mentre se alla breve pressione del pulsante P4 di arduino A deve far accendere per 10 secondi il led9 di arduino B per poi spegnersi, e fin qui ci sono riuscito, il problema nasce alla aggiunta del codice su arduino B del secondo pulsante P8, appena lo aggiungo questi mi entra in conflitto con il P7 non facendo più accendere quando premuto il led3 di arduino A, allego la foto del progetto e il codice mio originale + il codice di un collega che mi aveva proposto e che funzionava perfettamente fin quando non avevo aggiunto il secondo pulsante:

//ARDUINO A
#include<SoftwareSerial.h>
SoftwareSerial SUART(10, 11);
long t = 0;
long debounce_delay = 2000;
void setup()
{
  Serial.begin(9600);
  SUART.begin(9600);
  pinMode(2, OUTPUT);
  pinMode(3, INPUT_PULLUP);
}

void loop()
{
 
  if (digitalRead(3) == LOW)
  if ((millis())- t > debounce_delay){

    t= millis();
    SUART.print('4');
  }else
  {
    SUART.print('0');
  }
  
  
  delay(100);
  byte n = SUART.available();
  Serial.println(n);
  if (n != 0)
  {
    char y = SUART.read();
    if (y == '1')
    {
      digitalWrite(2, HIGH);
    }
    else
    {
      digitalWrite(2, LOW);
    }
  }
}

questo il codice di arduino A datomi da un collega e poi lo modificato per le mie esigenze adesso posto il codice di arduino B sempre datomi dal collega e modificato secondo le mie esigenze, ed e qui che non funziona qualcosa:

#include<SoftwareSerial.h>
SoftwareSerial SUART(10, 11); //SRX = 10, STX = 11

void setup()
{
  Serial.begin(9600);
  SUART.begin(9600);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
   pinMode(4, OUTPUT);
   pinMode(5, OUTPUT);
}

void loop()
{
  if (digitalRead(2) == LOW)
  {
    SUART.print('1');
  }
  else
  {
    SUART.print('0');
  }
  delay(100);

  byte n = SUART.available();
  Serial.println(n);
  if (n != 0)
  {
    char y = SUART.read();
    if (y == '4')
    {
      digitalWrite(4, HIGH);
      delay(10000);
      digitalWrite(4, LOW);
    }
     if (y == '5')
    {
      digitalWrite(5, HIGH);
      delay(10000);
      digitalWrite(5, LOW);
    }
  }
}

adesso posto il mio schema dei due moduli per come deve venire:


qualcuno può aiutarmi? allego mio cellulare: 3382275504 Filippo.

l'utilizzo di una libreria di pulsanti renderebbe molto più semplice la codifica ➜ ad esempio con la libreria Toggle

Potresti provare questo codice (digitato qui, quindi non testato)

Arduino A

// Arduino A
#include <Toggle.h> // https://github.com/Dlloydev/Toggle/blob/main/src/Toggle.h

#include<SoftwareSerial.h>
SoftwareSerial hc12(10, 11);

const byte btnP4Pin = 4;
const byte led3Pin  = 3;

Toggle btnP4(btnP4Pin);
const unsigned long lungoDurata = 2000;

void setup() {
  pinMode(led3Pin, OUTPUT);
  btnP4.begin(btnP4Pin);

  Serial.begin(115200); Serial.println();
  hc12.begin(9600);
}

void loop() {
  btnP4.poll();
  if (btnP4.pressedFor(lungoDurata)) hc12.write('4'); // true una volta solo se il pulsante è stato premuto per lungoDurata ms

  switch (hc12.read()) {
    case '7': digitalWrite(led3Pin, HIGH); break;
    case '0': digitalWrite(led3Pin, LOW);  break;
    default: break;
  }
}

Arduino B

// Arduino B
#include <Toggle.h> // https://github.com/Dlloydev/Toggle/blob/main/src/Toggle.h


#include<SoftwareSerial.h>
SoftwareSerial hc12(10, 11);

const byte btnP7Pin =  7;
const byte btnP8Pin =  8;
const byte led9Pin  =  9;
const byte led10Pin = 10;

Toggle btnP7(btnP7Pin);
Toggle btnP8(btnP8Pin);

unsigned long led9Chrono;

void startLed9() {
  digitalWrite(led9Pin, HIGH);
  led9Chrono = millis();
}

void setup() {
  pinMode(led9Pin, OUTPUT);
  pinMode(led10Pin, OUTPUT);
  btnP7.begin(btnP7Pin);
  btnP8.begin(btnP8Pin);

  Serial.begin(115200); Serial.println();
  hc12.begin(9600);
}

void loop() {

  btnP7.poll();
  btnP8.poll();

  if (btnP7.onPress())   hc12.write('7');
  if (btnP7.onRelease()) hc12.write('0');

  // gestire il pulsante p8 come si desidera
  if (btnP8.onPress())   Serial.println("btnP8 premuto");
  if (btnP8.onRelease()) Serial.println("btnP8 rilasciato");

  switch (hc12.read()) {
    case '4': startLed9(); break;
    default: break;
  }

  if ((digitalRead(led9Pin) == HIGH) && (millis() - led9Chrono >= 10000ul)) {
    digitalWrite(led9Pin, LOW);
  }
}
1 Like

Perfetto, funziona benissimo, ovviamente ho dovuto modificare alcuni parametri per adattarlo alle mie esigenze ma sono cose basilari, come assegnare al pulsante P8 la sua funzione etc. Grazie per l'aiuto.

@fifiddu: Il cross-posting (anche tra lingue diverse) è proibito dal regolamento e tu stai discutendo di questo argomento già QUI, pertanto ... questo thread viene chiuso.

Guglielmo

P.S.: I messaggi doppi fanno perdere tempo alle persone che cercano di aiutare. Altri potrebbe spendono 15 minuti per scrivere una risposta dettagliata su una discussione, senza sapere che qualcun altro ha già fatto lo stesso in un altra identica/simile discussione.

@J-M-L : cortesemente, prima di rispondere, controlla sempre che non ci siano già discussione identiche aperte dallo stesso autore. Grazie :wink:

di solito li vedo... forse me li sono persi.