Trasmissione HC 12

Buongiorno a tutti, ho una situazione che non riesco a spiegarmi, e vorrei avere elucidazioni in merito.

Ho due apparati HC-12 dove il primo trasmette una sillaba al secondo, e fin qui nessun problema.

La ricezione mi viene però ripetuta 3 volte; qualcuno mi sa dire il perché???

Allego gli sketch ed il risultato della trasmissione.

TX

#include <SoftwareSerial.h>


SoftwareSerial HC12(52, 50); // HC-12 TX Pin, HC-12 RX Pin CORRETTO

const int v_ON = A0;
const int v_t1 = 18;  //
const int v_t2 = 17;  // 2 turni
const int v_t3 = 16;  // 1 turno
const int v_prova = 15;
const int v_2min = 14;

const int v_3f = 19;
const int v_6f = 20;

const int p_verde = A15;
const int p_giallo = A14;
const int p_rosso = A13;


int nr1 = 0; // on/off
int nr2 = 0; // avviso
int nr3 = 0; // prova
int nr4 = 0; // volee 3 o 6
int nr5 = 0; // turni 1, 2 o 3
int nr6 = 0; // recupero da 1 a 6
int nr7 = 0;  // pulsanti

long v_gara = 0;
char stato ;
char stringa = 'e';
int v_alt = 0;
int v_diretto = 0;
char stato_old ;


void setup() {

  pinMode(v_3f, INPUT); // volee di 3 frecce
  pinMode(v_6f, INPUT); // volee di 6 frecce
  pinMode(v_ON, INPUT); // accende i tabelloni
  pinMode(v_prova, INPUT); // prevede una volee di prova
  pinMode(v_2min, INPUT); // prevede l'avviso di 2 minuti

  pinMode(v_t1, INPUT);
  pinMode(v_t2, INPUT);
  pinMode(v_t3, INPUT);

  pinMode( p_verde, INPUT);
  pinMode( p_giallo, INPUT);
  pinMode( p_rosso, INPUT);


  Serial.begin(9600);
  HC12.begin(9600);
}

void loop() {

  /* controllo dei valori di gara*/
  if (digitalRead(v_ON)  == LOW) {
    nr1 = 2;
  } else {
    nr1 = 1;
    //    digitalWrite(v_LedOn, HIGH);
  }

  if (digitalRead(v_2min) == HIGH) {
    nr2 = 1;
  } else {
    nr2 = 0;
  }

  if (digitalRead(v_prova)  == HIGH) {
    nr3 = 1;
  } else {
    nr3 = 0;
  }

  if ((digitalRead(v_3f) == LOW) && (digitalRead(v_6f) == HIGH)) {
    nr4 = 1;
  }  else  if ((digitalRead(v_3f) == HIGH) && (digitalRead(v_6f) == LOW)) {
    nr4 = 2;
  }

  if ((digitalRead(v_t1) == HIGH) && (digitalRead(v_t2) == LOW) && (digitalRead(v_t3) == LOW)) {
    nr5 = 3;  // O.R.
  } else if ((digitalRead(v_t1) == LOW) && (digitalRead(v_t2) == HIGH) && (digitalRead(v_t3) == LOW))  {
    nr5 = 2; // 2 turni
  }  else if ((digitalRead(v_t1) == LOW) && (digitalRead(v_t2) == LOW) && (digitalRead(v_t3) == HIGH)) {
    nr5 = 1;  // 1 turno
  } else  {
    nr5 = 0;
  }


  if (digitalRead(p_verde) == LOW) {
    nr7 = 1;  // Avvio
  } else if (digitalRead(p_giallo) == LOW)  {
    nr7 = 2;  // azzera
  }  else if (digitalRead(p_rosso) == LOW) {
    nr7 = 3;  // stop
  }

  v_gara = (nr1 * 10000) + (nr2 * 1000) + (nr3 * 100) + (nr4 * 10) + (nr5);

  if ((v_gara == 10020) || (v_gara == 10010)) {
    /*

    stringa = 'd';
    if (v_diretto == 0) {
      HC12.println(stringa);
      delay(100);
      Serial.print("Trasmetto1: ");
      Serial.println(stringa);
      v_diretto = 1;
    }

  } else if (v_gara >= 20000)  {
       stringa = 'e';
    if (v_diretto == 1) {
      HC12.println(stringa);
      delay(100);
      Serial.print("Trasmetto2: ");
      Serial.println(stringa);
      v_diretto = 0;
    }


  
  } else if ((v_gara == 10011) && (nr6 == 0))  {

    stringa = 'v';

  }

  trasmetti();

  if (stato != stringa ) {
    stato = stringa;
  }
}

void trasmetti() {

  if ((nr7 > 0) && (stringa != 'e')) {

    if ((nr7 == 1) && (v_alt == 0)) {
    

      HC12.println(stringa);
      delay(100);
      Serial.print("Trasmetto3: ");
      Serial.println(stringa);

    } else if ((nr7 == 2) && (v_alt == 0)) {
     
      stringa = 'b';

      HC12.println(stringa);
      delay(100);
      Serial.print("Trasmetto4: ");
      Serial.println(stringa);

    } else if ((nr7 == 3) && (v_alt == 0)) {
      
      v_alt = 1;
      stringa = 'c';

      HC12.println(stringa);
      delay(100);
      Serial.print("Trasmetto5: ");
      Serial.println(stringa);

    } else if (v_alt == 1)   {

      if ((nr7 == 1) || (nr7 == 2)) {
        
        stringa = 'a';
        v_alt = 0;
        HC12.println(stringa);
        delay(100);
        Serial.print("Trasmetto6: ");
        Serial.println(stringa);
      }
    }
    delay(250);
  }

  nr7 = 0;
}

RX

#include <SoftwareSerial.h>

SoftwareSerial HC12(2, 3); // RX, TX

const int p_verde = 4;
const int p_giallo = 5;
const int p_rosso = 6;
const int l_verde = 7;
const int l_giallo = 8;
const int l_rosso = 9;
const int l_ricevuto = 11;
const int l_acceso = 12;

char stringa2 = 'e';
int nr7 = 0;  // pulsanti
int v_alt = 0;

void setup() {
  Serial.begin(9600);
  HC12.begin(9600);
  Serial.println("** Ritrasmettitore per portatile **");
  Serial.println("** Release 1.3 **");
  Serial.println("** Ripetizione dell'ultimo comando **");
  Serial.println("** Enrico Bianchetto - 03.03.19 **");
  Serial.println("** Collegato a CodificaGara_9_5 **");
  Serial.println("** Aggiunta spie pulsanti e blocco**");
  pinMode(p_verde, INPUT);
  pinMode(p_giallo, INPUT);
  pinMode(p_rosso, INPUT);
  pinMode(l_verde, OUTPUT);
  pinMode(l_giallo, OUTPUT);
  pinMode(l_rosso, OUTPUT);
  pinMode(l_ricevuto, OUTPUT);
  pinMode(l_acceso, OUTPUT);
  digitalWrite(l_acceso, HIGH);
}

void loop() {
  // riceve la codifica della stringa da inviare

  if (HC12.available()>0 ) {
    stringa2  = HC12.read();//read string
    Serial.print(" Ricevuto2: ");
    Serial.println(stringa2);
    HC12.flush();
    delay(100);
  }

  if (stringa2 != 'e') {
    digitalWrite(l_ricevuto, HIGH);
    if (digitalRead(p_verde) == HIGH) {
      nr7 = 3;  // Avvio
      digitalWrite(l_verde, HIGH);
    } else if (digitalRead(p_giallo) == HIGH)  {
      nr7 = 2;  // azzera
      digitalWrite(l_giallo, HIGH);
    }  else if (digitalRead(p_rosso) == HIGH) {
      nr7 = 1;  // stop
      digitalWrite(l_rosso, HIGH);
    }

    if (nr7 > 0) {
      Serial.print("nr7: ");
      Serial.println(nr7);
      trasmetti();
      delay(250);
    }

  } else {
    digitalWrite(l_ricevuto, LOW);
  }
}

void trasmetti() {

  if (nr7 > 0)  {

    if (nr7 == 1)  {
      /*
          invia l'istruzione di avvio
      */

      HC12.println(stringa2);

    } else if (nr7 == 2) {
      /*
         azzera il tiner
      */

      stringa2 = 'b';

      HC12.println(stringa2);

    } else if ((nr7 == 3) && (v_alt == 0)) {
      /*
         invia l'istruzione di STOP
      */
      v_alt = 1;
      stringa2 = 'c';

      HC12.println(stringa2);

    } else if (v_alt == 1)   {

      if ((nr7 == 1) || (nr7 == 2)) {
        /*
          invia l'istruzione di Ripresa gara
        */
        stringa2 = 'a';
        v_alt = 0;
        HC12.println(stringa2);
      }
    }
    delay(150);
    Serial.print("Trasmesso: ");
    Serial.println(stringa2);
  }

  delay(150);
  nr7 = 0;

  digitalWrite(l_verde, LOW);
  digitalWrite(l_giallo, LOW);
  digitalWrite(l_rosso, LOW);
}

ed ecco il risultato.

Enrico

Risultato.pdf (174 KB)

Con HC12.println() invii anche due uteriori byte per il ritorno a capo, prova solo con HC12.print()

Grazie zef ora funziona tutto perfettamente.

Come immaginavo la soluzione era così semplice che non la vedevo!!!

Grazie ancora, ciao. Enrico