collegare in seriale 2 arduino e 1 esp

ciao, io vorrei collegare all'attuale accoppiata "arduino1+esp" un altro arduino1 che ho già in funzione per dare anche a lui la possibilità di comunicare in rete.
in questo secondo arduino1 ho liberi solo un pin digitale e 2 analogici, quindi vorrei sapere se posso usare come collegamento seriale con libreria softwareserial i pin analogici o servono proprio dei pin digitali.
questo perchè non vorrei andare a modificare l'impianto esistente.
grazie

Sulla UNO qualsiasi pin analogico e prima di tutto un pin digitale (esclusi A6 e A7 che, comunque, sulla UNO classica non ci sono) ... quindi ... :smiley:

Per completezza ...

#define PIN_A0   (14)
#define PIN_A1   (15)
#define PIN_A2   (16)
#define PIN_A3   (17)
#define PIN_A4   (18)
#define PIN_A5   (19)
#define PIN_A6   (20)
#define PIN_A7   (21)

static const uint8_t A0 = PIN_A0;
static const uint8_t A1 = PIN_A1;
static const uint8_t A2 = PIN_A2;
static const uint8_t A3 = PIN_A3;
static const uint8_t A4 = PIN_A4;
static const uint8_t A5 = PIN_A5;
static const uint8_t A6 = PIN_A6;
static const uint8_t A7 = PIN_A7;

Guglielmo

ottima notizia, grazie!
A6 e A7 che non li trovo scritti sarebbero 0 ed 1?

acuplush:
ottima notizia, grazie!
A6 e A7 che non li trovo scritti sarebbero 0 ed 1?

#define PIN_A6 (20)
#define PIN_A7 (21)

esclusi A6 e A7 che, comunque, sulla UNO classica non ci sono

:slight_smile:

>Patrick_M: .. mah ... mica leggono, danno una veloce occhiata e ... poi ecco quello che succede :confused:

Guglielmo

ho letto si, ma mi sono spiazzato nel momento in cui ho letto A6 ed A7 dato che qui sulla scheda non li ho, e anche cercando in rete il pinout della scedha quei due pin non li vedo

:smiley:

acuplush:
... ho letto A6 ed A7 dato che qui sulla scheda non li ho, e anche cercando in rete il pinout della scedha quei due pin non li vedo

... ma cosa NON ti è chiaro nella mia frase:

gpb01:
... esclusi A6 e A7 che, comunque, sulla UNO classica non ci sono ...

Guglielmo

gpb01:
... ma cosa NON ti è chiaro nella mia frase:
Guglielmo

Ops.. È meglio se alla sera non mi metto a fare queste cose :sweat_smile: scusate

Ma tu vuoi far comunicare i due Arduino tra loro o vuoi mettere in rete due Arduino con un ESP?

SukkoPera:
Ma tu vuoi far comunicare i due Arduino tra loro o vuoi mettere in rete due Arduino con un ESP?

Lo scopo principale è mettere in rete il secondo arduino, io avevo pensato di passare attraverso il primo Arduino che è già collegato con l'esp, ma ora che mi hai detto così mi hai illuminato.
Io potrei entrare con entrambi gli Arduino nell'esp, giusto? Nel traslatore di livelli ho due canali liberi. È fattibile o collegandoli insieme si danno "fastidio"?

Scordatelo :D. Per quello che costa un ESP, perche fare una cosa del genere poi?

SukkoPera:
Scordatelo :D. Per quello che costa un ESP, perche fare una cosa del genere poi?

Perché nella stanza del secondo arduino non prende il WiFi, ma ho già due fili liberi tra i due punti.
Quindi neanche Arduino B > Arduino A > esp è fattibile?

Quello si, comunicazione "Seriale" ... B invia ad A che a sua volta deve inviare a ESP ... al ritorno devi capire se la risposta è per B o per A e agire di conseguenza.

Non la vedo una cosa facilissima ... ::slight_smile:

Guglielmo

gpb01:
Quello si, comunicazione "Seriale" ... B invia ad A che a sua volta deve inviare a ESP ... al ritorno devi capire se la risposta è per B o per A e agire di conseguenza.

Non la vedo una cosa facilissima ... ::slight_smile:

Guglielmo

Ottimo, ho già in mente un sistema che nella teoria funziona, poi bisogna vedere nella pratica. :slight_smile:
Grazie

sto mettendo in atto la mia soluzione ma sto riscontrando dei problemi senza capirne il motivo.
partendo dal codice di arduino A che funziona bene nel ricevere i comandi dall’esp ed eseguire i vari casi, ho provato ad implementare un secondo seriale che riceve da arduino B per voi riversare su esp.
ma con questo codice modificato, ora funziona solo un verso, ovvero B > A > esp. la funzione originale esp > A non risponde più.
potete aiutarmi a capire dove stà l’inghippo? grazie

prima versione funzionante:

#include <SoftwareSerial.h>  //libreria seriale secondaria
#include <RCSwitch.h> //libreria rf433

#define SOFTRX 3 //pin ricevitore seriale secondario
#define SOFTTX 4 //pin trasmettitore seriale secondario
#define risc 5 //pin accensione riscaldamento

int pulsal = 8; //pulsante salita manuale
int puldis = 9; //pulsante discesa manuale
int ricezione; //cifra ricevuta
int comando = 0; //cifra per comandi
char statoriposo = 30; //cifra che non corrisponde a nessun caso per fermare i cicli
int tempomov = 20000; //durata movimento tapparelle
unsigned long iniziomov;
int flags = 0;
int flagd = 0;

RCSwitch mySwitch = RCSwitch();
SoftwareSerial Serialint(SOFTRX, SOFTTX);

void setup() {
  pinMode(SOFTTX, OUTPUT);
  pinMode(SOFTRX, INPUT);
  pinMode(risc, OUTPUT);
  pinMode(pulsal, INPUT_PULLUP);
  pinMode(puldis, INPUT_PULLUP);


  mySwitch.enableTransmit(10); //trasmettitore collegato al pin 10
  Serialint.begin(9600); //seriale con modulo wifi
  Serial.begin(9600);
  // Serial.println("Pronto a ricevere da Google");

}

void loop() {
  if (Serialint.available()) { // Controllo se vi è qualche comando in arrivo
    ricezione = Serialint.read(); //Metto nella variabile comando quanto ricevuto dalla seriale
    delay (15);
    comando = (int)ricezione - 48; //conversione valore ricevuto
    //Serial.println(comando); //lo scrivo anche nel seriale pc per controllare
  }
  //comando pulsante salita manuale
  if ((digitalRead(pulsal) == LOW) and (flags == 0) )
  {
    flags = 1;
    // Serial.println ("comando salita manuale");
  }
  if ((digitalRead(pulsal) == HIGH)  and (flags == 1))
  {
    comando = 2;
    flags = 0;
    // Serial.println ("inizio salita manuale");
    delay (500);
  }

  //comando pulsante discesa manuale
  if ((digitalRead(puldis) == LOW) and (flagd == 0) )
  {
    flagd = 1;
    // Serial.println ("comando discesa manuale");
  }
  if ((digitalRead(puldis) == HIGH)  and (flagd == 1))
  {
    comando = 1;
    flagd = 0;
    // Serial.println ("inizio discesa manuale");
    delay (500);
  }

  //------------------------------------------------

  switch (comando) {

    case 1: //chiusura totale
      // Serial.println("inizio chiusura totale");
      iniziomov = millis();
      while (millis() - iniziomov < (unsigned long)tempomov) {
        mySwitch.send(5772418, 24);

        if ((digitalRead(puldis) == LOW) or (digitalRead(pulsal) == LOW)) //blocco movimento
        {
          comando = statoriposo;
          // Serial.println("pressione pulsante arresto");
          delay (1000);
          break;
        }

        //  Serial.println("chiusura totale");
      }
      comando = statoriposo;
      break;

    case 2: //apertura totale
      // Serial.println("inizio apertura totale");
      iniziomov = millis();
      while (millis() - iniziomov < (unsigned long)tempomov) {
        mySwitch.send(5772417, 24);

        if ((digitalRead(puldis) == LOW) or (digitalRead(pulsal) == LOW)) //blocco movimento
        {
          comando = statoriposo;
          //  Serial.println("pressione pulsante arresto");
          delay (1000);
          break;
        }

        // Serial.println("apertura totale");
      }
      comando = statoriposo;
      break;

    case 3: //chiusura cucina
      // Serial.println("inizio chiusura cucina");
      iniziomov = millis();
      while (millis() - iniziomov < (unsigned long)tempomov) {
        mySwitch.send(408786, 24);
        //  Serial.println("chiusura cucina");
      }
      comando = statoriposo;
      break;

    case 4: //apertura cucina
      // Serial.println("inizio apertura cucina");
      iniziomov = millis();
      while (millis() - iniziomov < (unsigned long)tempomov) {
        mySwitch.send(408792, 24);
        //  Serial.println("apertura cucina");
      }
      comando = statoriposo;
      break;

    case 5: //chiusura camera
      //  Serial.println("inizio chiusura camera");
      iniziomov = millis();
      while (millis() - iniziomov < (unsigned long)tempomov) {
        mySwitch.send(410002, 24);
        //  Serial.println("chiusura camera");
      }
      comando = statoriposo;
      break;

    case 6: //apertura camera
      //  Serial.println("inizio apertura camera");
      iniziomov = millis();
      while (millis() - iniziomov < (unsigned long)tempomov) {
        mySwitch.send(410008, 24);
        //   Serial.println("apertura camera");
      }
      comando = statoriposo;
      break;

    case 7: //chiusura ripostiglio
      //  Serial.println("inizio chiusura ripostiglio");
      iniziomov = millis();
      while (millis() - iniziomov < (unsigned long)tempomov) {
        mySwitch.send(15250082, 24);
        //   Serial.println("chiusura ripostiglio");
      }
      comando = statoriposo;
      break;

    case 8: //apertura ripostiglio
      //  Serial.println("inizio apertura ripostiglio");
      iniziomov = millis();
      while (millis() - iniziomov < (unsigned long)tempomov) {
        mySwitch.send(15250081, 24);
        //    Serial.println("apertura ripostiglio");
      }
      comando = statoriposo;
      break;

    case 9: //accensione riscaldamento
      digitalWrite (risc, HIGH);
      delay (1500);
      digitalWrite(risc, LOW);
      //  Serial.println("riscaldamento acceso");
      comando = statoriposo;
      break;

    case 0: //accensione riscaldamento
      //    Serial.println("caso 0");
      comando = statoriposo;
      break;

  }

  delay(150);
}

seconda versione non funzionante:

#include <SoftwareSerial.h>  //libreria seriale secondaria
#include <RCSwitch.h> //libreria rf433

#define SOFTRX 3 //pin ricevitore seriale secondario
#define SOFTTX 4 //pin trasmettitore seriale secondario
#define risc 5 //pin accensione riscaldamento
#define RISCRX 6 //pin ricevitore seriale verso riscaldamento
#define RISCTX 7 //pin trasmettitore seriale verso riscaldamento

int pulsal = 8; //pulsante salita manuale
int puldis = 9; //pulsante discesa manuale
int ricezione; //cifra ricevuta
int comando = 0; //cifra per comandi
int risposta; //risposta da riscaldamento
char statoriposo = 30; //cifra che non corrisponde a nessun caso per fermare i cicli
int tempomov = 20000; //durata movimento tapparelle
unsigned long iniziomov;
int flags = 0;
int flagd = 0;

RCSwitch mySwitch = RCSwitch();
SoftwareSerial Serialint(SOFTRX, SOFTTX); //seriale secondaria
SoftwareSerial Serialrisc(RISCRX, RISCTX); //seriale terziaria

void setup() {
  pinMode(SOFTTX, OUTPUT);
  pinMode(SOFTRX, INPUT);
  pinMode(RISCTX, OUTPUT);
  pinMode(RISCRX, INPUT);
  pinMode(risc, OUTPUT);
  pinMode(pulsal, INPUT_PULLUP);
  pinMode(puldis, INPUT_PULLUP);


  mySwitch.enableTransmit(10); //trasmettitore collegato al pin 10
  Serialint.begin(9600); //seriale con modulo wifi
  Serialrisc.begin(9600); //seriale con modulo wifi
  Serial.begin(9600);
  // Serial.println("Pronto a ricevere da Google");

}

void loop() {
  if (Serialint.available()) { // Controllo se vi è qualche comando in arrivo
    ricezione = Serialint.read(); //Metto nella variabile comando quanto ricevuto dalla seriale
    delay (15);
    comando = (int)ricezione - 48; //conversione valore ricevuto
    //Serial.println(comando); //lo scrivo anche nel seriale pc per controllare
  }
  if (Serialrisc.available()) { // Controllo se vi è qualche comando in arrivo
    risposta = Serialrisc.read(); //Metto nella variabile comando quanto ricevuto dalla seriale
    delay (15);
    Serialint.print(risposta); //mando la risposta all'esp
    Serial.print (risposta);
  }
  //comando pulsante salita manuale
  if ((digitalRead(pulsal) == LOW) and (flags == 0) )
  {
    flags = 1;
    // Serial.println ("comando salita manuale");
  }
  if ((digitalRead(pulsal) == HIGH)  and (flags == 1))
  {
    comando = 2;
    flags = 0;
    // Serial.println ("inizio salita manuale");
    delay (500);
  }

  //comando pulsante discesa manuale
  if ((digitalRead(puldis) == LOW) and (flagd == 0) )
  {
    flagd = 1;
    // Serial.println ("comando discesa manuale");
  }
  if ((digitalRead(puldis) == HIGH)  and (flagd == 1))
  {
    comando = 1;
    flagd = 0;
    // Serial.println ("inizio discesa manuale");
    delay (500);
  }

  //------------------------------------------------

  switch (comando) {

    case 1: //chiusura totale
      // Serial.println("inizio chiusura totale");
      iniziomov = millis();
      while (millis() - iniziomov < (unsigned long)tempomov) {
        mySwitch.send(5772418, 24);

        if ((digitalRead(puldis) == LOW) or (digitalRead(pulsal) == LOW)) //blocco movimento
        {
          comando = statoriposo;
          // Serial.println("pressione pulsante arresto");
          delay (1000);
          break;
        }

        //  Serial.println("chiusura totale");
      }
      comando = statoriposo;
      break;

    case 2: //apertura totale
      // Serial.println("inizio apertura totale");
      iniziomov = millis();
      while (millis() - iniziomov < (unsigned long)tempomov) {
        mySwitch.send(5772417, 24);

        if ((digitalRead(puldis) == LOW) or (digitalRead(pulsal) == LOW)) //blocco movimento
        {
          comando = statoriposo;
          //  Serial.println("pressione pulsante arresto");
          delay (1000);
          break;
        }

        // Serial.println("apertura totale");
      }
      comando = statoriposo;
      break;

    case 3: //chiusura cucina
      // Serial.println("inizio chiusura cucina");
      iniziomov = millis();
      while (millis() - iniziomov < (unsigned long)tempomov) {
        mySwitch.send(408786, 24);
        //  Serial.println("chiusura cucina");
      }
      comando = statoriposo;
      break;

    case 4: //apertura cucina
      // Serial.println("inizio apertura cucina");
      iniziomov = millis();
      while (millis() - iniziomov < (unsigned long)tempomov) {
        mySwitch.send(408792, 24);
        //  Serial.println("apertura cucina");
      }
      comando = statoriposo;
      break;

    case 5: //chiusura camera
      //  Serial.println("inizio chiusura camera");
      iniziomov = millis();
      while (millis() - iniziomov < (unsigned long)tempomov) {
        mySwitch.send(410002, 24);
        //  Serial.println("chiusura camera");
      }
      comando = statoriposo;
      break;

    case 6: //apertura camera
      //  Serial.println("inizio apertura camera");
      iniziomov = millis();
      while (millis() - iniziomov < (unsigned long)tempomov) {
        mySwitch.send(410008, 24);
        //   Serial.println("apertura camera");
      }
      comando = statoriposo;
      break;

    case 7: //chiusura ripostiglio
      //  Serial.println("inizio chiusura ripostiglio");
      iniziomov = millis();
      while (millis() - iniziomov < (unsigned long)tempomov) {
        mySwitch.send(15250082, 24);
        //   Serial.println("chiusura ripostiglio");
      }
      comando = statoriposo;
      break;

    case 8: //apertura ripostiglio
      //  Serial.println("inizio apertura ripostiglio");
      iniziomov = millis();
      while (millis() - iniziomov < (unsigned long)tempomov) {
        mySwitch.send(15250081, 24);
        //    Serial.println("apertura ripostiglio");
      }
      comando = statoriposo;
      break;

    case 9: //accensione riscaldamento
      digitalWrite (risc, HIGH);
      delay (1500);
      digitalWrite(risc, LOW);
      Serial.println("riscaldamento acceso");
      comando = statoriposo;
      break;

    case 0: //accensione riscaldamento
      //    Serial.println("caso 0");
      comando = statoriposo;
      break;

  }

  switch (risposta) {

    case 89: //spegnimento riscaldamento

      Serialint.print("Y");
      risposta = statoriposo;
      //Serial.print ("preso");
      break;

    case 90: //accensione riscaldamento

      Serialint.print("Z");
      risposta = statoriposo;
      // Serial.print ("preso");
      break;

  }

  delay(150);
}

... non funziona perché, come al solito, NON studiate i reference di ciò che usate !

Prova a leggere il paragrafo "Limitations" e vedi se scopri da solo l'arcano ... ::slight_smile:

Guglielmo

P.S.: Ah, per i pin usati dalla SoftwareSerial, NON occorre fare il pinMode(), ci pensa la SoftwareSerial ad impostarli come gli servono.

gpb01:
... non funziona perché, come al solito, NON studiate i reference di ciò che usate !

Prova a leggere il paragrafo "Limitations" e vedi se scopri da solo l'arcano ... ::slight_smile:

Guglielmo

P.S.: Ah, per i pin usati dalla SoftwareSerial, NON occorre fare il pinMode(), ci pensa la SoftwareSerial ad impostarli come gli servono.

Grazie @gpb01, chiaro come sempre!
grazie al tuo consiglio utilizzo entrambe le librerie ( una verso arduino B e una verso l'esp) e tutto funziona a dovere.

ho letto nelle limitazioni della altsoftserial che disattiva i pwm, io nel pin10 ho collegato il trasmettitore rf, il quale sembra funzionare ancora. mica lavora col pwm lui?

acuplush:
ho letto nelle limitazioni della altsoftserial che disattiva i pwm, io nel pin10 ho collegato il trasmettitore rf, il quale sembra funzionare ancora. mica lavora col pwm lui?

Non credo proprio ... :wink:

Guglielmo