Comunicazione tra 2 HC-12 e Ethernet Shield

Un saluto a tutto il forum. Sto aprendo un nuovo topic anche se è collegato al progetto "Funzionamento motore 12v con inversore" perché sto parlando di un nuovo progetto.

Dovrei far comunicare 2 HC-12 uno montato su un Arduino Uno collegato con un L298 che comunichi con un'altro che dista a 70mt montato sopra una Ethernet shield collegato ad un servizio MQTT come Telegram o ad un web server (questo suggerimento mi è stato consigliato da brunello22)..

Il progetto precedente prevedeva il movimento di un motore lungo un asse pilotato da un relè temporizzato, quindi la comunicazione degli HC-12 mi serve per accertarmi quando sono a lavoro se il motore è stato in funzione e non è rimasto fermo..

Quale sarebbe il mio problema?

Devo aggiungere nello sketch del modulo L298 le istruzioni per inviare con l' HC-12 i dati alla ricevente posta sulla Ethernet shield che visualizzerò come una conferma di esito positivo sul mio telefono..

L'idea sarebbe questa però se avete un metodo più semplice ben venga..
Vi posto lo sketch del motore inverso (l298) che funziona con 2 finecorsa, basterebbe prendere un input da uno dei finecorsa per ricevere un segnale alla ricevente.

Vi ringrazio per il tempo perso in questa lunga lettura..grazie a tutti

#define enA 11
#define in1 10
#define in2 9
#define fcS 13    //Finecorsa Sinistro ( posizione di reset iniziale )
#define fcD 12    //Finecorsa Destro
#define pin_sensore A0
byte stato_fc =  1 ;
byte velocita = 255 ; // Velocita motore 0-255

void motore_avanti() {
  analogWrite ( enA, velocita );
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
}

void motore_indietro() {
  analogWrite ( enA, velocita );
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
}

void motore_stop() {
  analogWrite ( enA, 0 );
  digitalWrite(in1, HIGH);
  digitalWrite(in2, HIGH);
}

void reset_motore() {
  while (digitalRead(fcS) == HIGH)  { // legge finecorsa sinistro
    motore_indietro(); // avvia motore indietro fino alla posizione iniziale
  }
  motore_stop();
}

void setup() {
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(fcS, INPUT_PULLUP);
  pinMode(fcD, INPUT_PULLUP);
  pinMode(pin_sensore, INPUT_PULLUP);
  reset_motore();   // Motore si mette in posizione di start
}

void loop() {
  int lettura = analogRead(A1);
  velocita=map(lettura,0,1023,100,255); 
 if (digitalRead(pin_sensore) == 0 ) { // attende lo start
    delay(100);
    stato_fc = 1 ;
    motore_avanti() ;
    while (stato_fc != 0 ) {
      if (digitalRead(fcD) == 0 )   {
        motore_stop();
        stato_fc = 0 ;
      }
    }
    delay(100);
    stato_fc = 1 ;
    motore_indietro() ;
    while (stato_fc != 0 ) {
      if (digitalRead(fcS) == 0 )   {
        motore_stop();
        stato_fc = 0 ;
      }
    }
    delay(100);
  }

}// fine loop

Ho dimenticato a dirvi che per questo sketch devo dire grazie a brunello22 che mi è stato di grande aiuto.. Grazie ancora

Ciao a tutti.
Leggendo questo articolo che spiega il funzionamento di un HC-12 link: [u]https://www.allaboutcircuits.com/projects/understanding-and-implementing-the-hc-12-wireless-transceiver-module/[/u] spiega come fare comunicare tra di loro due moduli uno di trasmissione ed uno come ricevente.

Lo sketch che indicano serve per questa comunicazione.

Domanda:

Come posso modificarlo per trasmettere un input da un finecorsa? Quale variabile devo aggiungere?
Siete gli unici che possono darmi questo suggerimento.

#include <SoftwareSerial.h>

const byte HC12RxdPin = 4;                      // "RXD" Pin on HC12
const byte HC12TxdPin = 5;                      // "TXD" Pin on HC12
const byte HC12SetPin = 6;                      // "SET" Pin on HC12

unsigned long timer = millis();                 // Delay Timer

char SerialByteIn;                              // Temporary variable
char HC12ByteIn;                                // Temporary variable
String HC12ReadBuffer = "";                     // Read/Write Buffer 1 for HC12
String SerialReadBuffer = "";                   // Read/Write Buffer 2 for Serial
boolean SerialEnd = false;                      // Flag to indicate End of Serial String
boolean HC12End = false;                        // Flag to indiacte End of HC12 String
boolean commandMode = false;                    // Send AT commands

// Software Serial ports Rx and Tx are opposite the HC12 Rx and Tx
// Create Software Serial Port for HC12
SoftwareSerial HC12(HC12TxdPin, HC12RxdPin);

void setup() {

  HC12ReadBuffer.reserve(64);                   // Reserve 64 bytes for Serial message input
  SerialReadBuffer.reserve(64);                 // Reserve 64 bytes for HC12 message input

  pinMode(HC12SetPin, OUTPUT);                  // Output High for Transparent / Low for Command
  digitalWrite(HC12SetPin, HIGH);               // Enter Transparent mode
  delay(80);                                    // 80 ms delay before operation per datasheet
  Serial.begin(9600);                           // Open serial port to computer
  HC12.begin(9600);                             // Open software serial port to HC12
}

void loop() {

  while (HC12.available()) {                    // While Arduino's HC12 soft serial rx buffer has data
    HC12ByteIn = HC12.read();                   // Store each character from rx buffer in byteIn
    HC12ReadBuffer += char(HC12ByteIn);         // Write each character of byteIn to HC12ReadBuffer
    if (HC12ByteIn == '\n') {                   // At the end of the line
      HC12End = true;                           // Set HC12End flag to true
    }
  }

  while (Serial.available()) {                  // If Arduino's computer rx buffer has data
    SerialByteIn = Serial.read();               // Store each character in byteIn
    SerialReadBuffer += char(SerialByteIn);     // Write each character of byteIn to SerialReadBuffer
    if (SerialByteIn == '\n') {                 // Check to see if at the end of the line
      SerialEnd = true;                         // Set SerialEnd flag to indicate end of line
    }
  }

  if (SerialEnd) {                              // Check to see if SerialEnd flag is true

    if (SerialReadBuffer.startsWith("AT")) {    // Has a command been sent from local computer
      HC12.print(SerialReadBuffer);             // Send local command to remote HC12 before changing settings
      delay(100);                               //
      digitalWrite(HC12SetPin, LOW);            // Enter command mode
      delay(100);                               // Allow chip time to enter command mode
      Serial.print(SerialReadBuffer);           // Echo command to serial
      HC12.print(SerialReadBuffer);             // Send command to local HC12
      delay(500);                               // Wait 0.5s for a response
      digitalWrite(HC12SetPin, HIGH);           // Exit command / enter transparent mode
      delay(100);                               // Delay before proceeding
    } else {
      HC12.print(SerialReadBuffer);             // Transmit non-command message
    }
    SerialReadBuffer = "";                      // Clear SerialReadBuffer
    SerialEnd = false;                          // Reset serial end of line flag
  }

  if (HC12End) {                                // If HC12End flag is true
    if (HC12ReadBuffer.startsWith("AT")) {      // Check to see if a command is received from remote
      digitalWrite(HC12SetPin, LOW);            // Enter command mode
      delay(100);                               // Delay before sending command
      Serial.print(SerialReadBuffer);           // Echo command to serial.
      HC12.print(HC12ReadBuffer);               // Write command to local HC12
      delay(500);                               // Wait 0.5 s for reply
      digitalWrite(HC12SetPin, HIGH);           // Exit command / enter transparent mode
      delay(100);                               // Delay before proceeding
      HC12.println("Remote Command Executed");  // Acknowledge execution
    } else {
      Serial.print(HC12ReadBuffer);             // Send message to screen
    }
    HC12ReadBuffer = "";                        // Empty buffer
    HC12End = false;                            // Reset flag
  }
}

Ciao a tutti.. In questi giorni ho studiato il funzionamento di un modulo HC-12 ed ho inserito nello sketch del sistema motore inverso (l298) le istruzioni per mandare un segnale(int buttonPin = 8 :wink: alla ricevente,questo segnale lo prendo dal finecorsa che inverte la polarità.
ho copiato ed inserito uno scketch dove trasmette un segnale digitale di un pulsante.
Però ho un problema dentro il loop,mi dà errore in questa istruzione ( expected unqualified-id )if (digitalRead(pin_sensore) == 0 ) {
e questo errore alla fine del loop ( extraneous closing brace ). Capisco che il problema è nelle parentesi {} ma pur provando tante volte non riesco a risolvere questo errore...

Qualcuno capisce dove ho sbagliato??

#include <SoftwareSerial.h>

#define enA 11 // Segnale L298
#define in1 10
#define in2 9
#define fcS 13    //Finecorsa Sinistro ( posizione di reset iniziale )
#define fcD 12    //Finecorsa Destro ( inverte il motore )
#define pin_sensore A0
byte stato_fc =  1 ;
byte velocita = 128 ; // Velocita motore 0-255
SoftwareSerial mySerial(2, 3); //RX, TX
int buttonPin = 8; 
boolean onOff = 0;

void motore_avanti() {
  analogWrite ( enA, velocita );
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
}

void motore_indietro() {
  analogWrite ( enA, velocita );
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
}

void motore_stop() {
  analogWrite ( enA, 0 );
  digitalWrite(in1, HIGH);
  digitalWrite(in2, HIGH);
}

void reset_motore() {
  while (digitalRead(fcS) == HIGH)  { // legge finecorsa sinistro
    motore_indietro(); // avvia motore indietro fino alla posizione iniziale
  }
  motore_stop();
    delay(1000);
}

void setup() {
  pinMode(enA, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(fcS, INPUT_PULLUP);
  pinMode(fcD, INPUT_PULLUP);
  pinMode(pin_sensore, INPUT_PULLUP);
  reset_motore();   // Motore si mette in posizione di start
  pinMode(buttonPin, INPUT); 
    mySerial.begin(9600);
}

void loop() {
    int buttonState = digitalRead(buttonPin);//read button state 
    if(buttonState == 1){//if button is down 
        mySerial.println(1111);//send unique code to the receiver to turn on. In this case 1111 
        onOff = 1;//set boolean to 1 
        } 
    if(buttonState == 0 && onOff == 1){//Verifier to send off signal once 
        mySerial.println(0000);//send unique code to the receiver to turn off. In this case 0000 } 
    delay(20);//delay little for better serial communication 
    }
  if (digitalRead(pin_sensore) == 0 ) { // attende lo start
    delay(100);
    stato_fc = 1 ;
    motore_avanti() ;
    while (stato_fc != 0 ) {
    int lettura = analogRead(A1); // Potenziometro
  velocita=map(lettura,0,1023,100,255); 
  analogWrite (enA, velocita);
      if (digitalRead(fcD) == 0 )   {
        motore_stop();
                delay(1000);
        stato_fc = 0 ;
      }
    }
    delay(100);
    stato_fc = 1 ;
    motore_indietro() ;
    while (stato_fc != 0 ) {
      if (digitalRead(fcS) == 0 )   {
        motore_stop();
        delay(1000);
        stato_fc = 0 ;
      }
    }
    delay(100);
  }

}// fine loop

Problema risolto,non mi ero accorto che dovevo mettere a capo ( mySerial.begin(9600)

pinMode(buttonPin, INPUT); 
    mySerial.begin(9600);

.. Uso un telefono android qualche volta qualcosa sfugge...

Se qualcuno vuole controllare lo sketch e ritiene che ho impostato qualcosa male mi faccia sapere...

Faccio teoria aspettando che mi arrivano i moduli hc-12 per metterlo in pratica...

Ciao e grazie

Di nuovo qui a rompete le "bolle"..
Finalmente mi sono arrivati i due moduli hc-12 wireless... Ieggendo il datasheet consigliano di mettere un condensatore da 22uf ed uno da 1nf tra VCC e GND, ma del 22uf ne ho solo uno e poi non ho altro, mi sono rimasti solo quelli da 104.. Cosa succede se non metto nulla solo per fare delle prove??
Fatemi sapere
Ciao

I problemi non finiscono mai..
Ho collegato correttamente gli hc-12 con i condensatori da 22uf e un diodo 1N4007 nel VCC,con il seriale trasmette quello che scrivo e con i comandi AT mi restituisce le risposte ma quando metto un pulsante nella trasmittente per accendere un led nella ricevente non vuole funzionare, eppure ho eseguito alla lettera ogni passaggio da questo sito www.instructables.com/id/Long-Range-18km-Arduino-to-Arduino-Wireless-Commun/%3famp_page=true per accendere un led sul pin 13 nella ricevente.. Sapete darmi un consiglio ?

L'hai messa una resistenza sul pulsante ?

Resistenza da 1k messa

Niente da fare, gli hc-12 comunicano tra loro ma quando devo trasmettere un input non succede nulla.. Provati diversi sketch di questo genere ma proprio non vuole funzionare... Le impostazioni sono ancora di default, non capisco se devo cambiare impostazioni o altro..
Qualcuno ha mai avuto questi problemi?

Ma non hai detto che in seriale comunicano tra di loro ?
Cioè se scrivi "pippo", appare sull'altro ?

brunello22:
Cioè se scrivi "pippo", appare sull'altro ?

Si questo lo fa ma quando metto un pulsante sulla trasmittente sulla ricevente non ho alcun segnale...ne ho provato diversi tipi di sistemi ma nulla...quando metto il pulsante neanche con il seriale comunica più

mettere schema e sketch, grazie

Questo e' lo sketch della trasmittente con pulsante

#include <SoftwareSerial.h>

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

int buttonPin = 8;

void setup() {
  pinMode(buttonPin, INPUT);
  mySerial.begin(9600);
}

void loop() {
 
  int buttonState = digitalRead(buttonPin);
  
  if(buttonState == 1){//if button is down
    mySerial.println(1234);//send unique code to the receiver in this case 1234
  }
  delay(20);//delay little for better serial communication
}

con questo schema

questo e' lo sketch della ricevente

#include <SoftwareSerial.h>

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

int ledPin = 13;
unsigned long last = millis();//set timer

void setup() {
  mySerial.begin(9600);
  pinMode(ledPin, OUTPUT);
}

void loop() {

  boolean ledState = digitalRead(ledPin);//check if the LED is turned on or off. Returns 1 or 0
  
  if(mySerial.available() > 1){    
    int input = mySerial.parseInt();//read serial input and convert to integer (-32,768 to 32,767)    

    if(millis() - last > 250){//if time now is 250 milliseconds greater than last time
      if(ledState == 0 && input == 1234){//if LED is off and button code is ok
          digitalWrite(ledPin, HIGH);
      }else if(ledState == 1 && input == 1234){//if LED is on and button code is ok
          digitalWrite(ledPin, LOW);
      }
      
    }
    
    mySerial.flush();//clear the serial buffer for unwanted inputs   
    last = millis();//reset timer   
  }
  delay(20);//delay little for better serial communication
 
}

con questo schema

dubito possa andare, se non per una pura coincidenza
a bottone premuto la trasmittente trasmette di continuo, un numero, senza separatori, terminatori, nulla
male impostato e anche l'uso della flush sulla Ricevente, la dice tutta...
lo hai trovato in rete, OK, sei stato scalognato, ritenta, ne troverai di meglio

si l'ho trovato in rete ma anche altri sketch se pur diversi mi hanno dato lo stesso problema

Cerca qui, ne esistono varii, che vanno, con le loro belle discussioni

grazie l'ho fatto e sto continuando a cercare

cicciozuc:
Si questo lo fa ma quando metto un pulsante sulla trasmittente sulla ricevente non ho alcun segnale...ne ho provato diversi tipi di sistemi ma nulla...quando metto il pulsante neanche con il seriale comunica più

Io controllerei come hai collegato il pulsante, visto che NON deve interferire in nessun modo nell'invio dei dati

Domanda:
Cosa deve accadere nella ricevente quando ti si chiude un contatto nella trasmittente
O meglio, cosa devi fare ?

Ps, ho provato quegli sketch e anche se sono fatti male, funzionano

mi serve per capire se con un input comunica con la ricevente e da un output.. questo poi lo incrementero' con un finecorsa (funzionamento motore inversione) tramite la ethernet shield per vedere un segnale nel web (ne abbiamo gia' parlato). il pulsante e' collegato con il 5v e con una resistenza tra pulsante e GND sempre da qui esce un segnale collegato al pin 9 (INPUT) di Arduino

Ho caricato questi due skech ma nella ricevente non succede nulla

TRASMITTENTE

#include <SoftwareSerial.h>

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

int buttonPin = 9;
boolean onOff = 0;
void setup() {
  pinMode(13, OUTPUT); // signal button pressed
  pinMode(buttonPin, INPUT);
  mySerial.begin(9600);
}

void loop() {

  int buttonState = digitalRead(buttonPin);//read button state

  if (buttonState == 1) { //if button is down
    digitalWrite(13,HIGH); // signal button pressed
    mySerial.println(1111);//send unique code to the receiver to turn on. In this case 1111
    onOff = 1;//set boolean to 1
  }
  if (buttonState == 0 && onOff == 1) { //Verifier to send off signal once
    digitalWrite(13,LOW);
    mySerial.println(0000);//send unique code to the receiver to turn off. In this case 0000
  }
  delay(200);//delay little for better serial communication


}

RICEVENTE

#include <SoftwareSerial.h>

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

int ledPin = 13; //zur Überprüfung

void setup() {
  mySerial.begin(9600);
  pinMode(ledPin, OUTPUT);
  pinMode(5,OUTPUT);
}

void loop() {

  if (mySerial.available() > 1) {
    int input = mySerial.parseInt();//read serial input and convert to integer (-32,768 to 32,767)
    delay(1000);
    if (input == 1111) { //if on code is received
      digitalWrite(ledPin, HIGH);//turn LED on
      digitalWrite(5, HIGH);//turn LED on
      delay(50);

      digitalWrite(ledPin, LOW);
   
      delay(500);
      


    }
    if (input == 0000) { //if off code is received
      digitalWrite(ledPin, LOW);//turn LED off
      digitalWrite(5, LOW);
    }
  }
  mySerial.flush();//clear the serial buffer for unwanted inputs

  delay(200);//delay little for better serial communication

}

Allego schema collegamento