Ritorno di tensione su pin seriale

Prova a guardare la libreria PJON molto ben supportata dall'autore attivo anche qui sul forum, corredata di esempi e non è difficile da comprendere ed usare

Allora, ci sto dando un'occhiata e da quanto ho capito devo usare la libreria ThroughSerial, non sto riuscendo a capire pero' come dovro' fare per trasmettere prima dal mega e ricevere sul nano e poi invertire i ruoli.

Non ho capito... chiariscimi meglio la situazione hai un mega questo è collegato via RS485 ai due nano con il solito cavo giusto? Ovvero:
MEGA---------------
| |
NANO NANO
Se è così ogni dispositivo sul BUS di PJOn ha un suo ID devi solo indirizzare la comunicazione verso l'ID corretto.
Mettiamo che il mega ha indirizzo 13, un nano 20 e l'altro nano 33 il mega fa una send di un messaggio all'ID 20, questo lo riceve e lo elabora, deve restituire un valore alla mega? Se si allora il non farà una send si un messaggio all'ID 13

i 2 arduino nano sono sempre connessi indipendentemente e direttamente al mega su porte diverse (ognuno ha i suoi adattatori rs485) come detto in precedenza,
ovvero mega --> nano1
--> nano2

L'arduino mega deve inviare prima al nano1 dei valori interi e dei booleani, appena ricevuti questi valori, il nano1 deve trasmettere al mega un valore booleano.
La stessa cosa deve succedere tra mega e nano2 succesivamente.

Ok, ti sei voluto complicare la vita :slight_smile: potevi usare un unica seriale, un unico caso e tre adattatri invece di quattro ma poco cambia per la libreria ovvero:
Istanzi due oggetti PJON ThroughSerial (uno per persiale) sulla mega e assegni l'ID che ti pare (può essere anche il solito tanto sono due reti differenti) mentre sui nano te ne basta uno e anche qui di nuovo puoi assegnare il solito di ai due nano che tanto sono due reti differenti e poi comunichi tra il mega e il nano e viceversa indicando l'ID a cui spedire il messaggio

E' vero :slight_smile: , comunque ho voluto fare cosi' per eventuali espansioni future e tenere indipendenti i cablaggi.
Ti ringrazio per l'aiuto, allora continuo con PJON e ti faccio sapere.

Ormai hai cablato e quindi mantieni la cosa ma per espansioni future devi pensare che RS485 non è una seriale ma un BUS quindi con soli due cavi puoi collegare N dispositivi e indirizzare un singolo dispositivo grazie al suo ID, la libreria PJON ti permette di mandare anche un messaggio a tutti i dispositivi collegati se serve (broadcast), ad esempio io l'ho usato per sincronizzare i vari orologi dei dispositivi dal master che lo legge da internet.
A pensarci bene puoi, mantenendo i due cavi passati, creare un solo BUS collegando la coppia di cavi che hai sull'adattatore collegato seriale2 direttamente all'adattatore collegato alla seriale 1, elimini la resistenza dell'adattatore collegato alla MEGA cos' hai i due terminatori solo sui NANO che rende il BUS correttamente configurato (elettricamente parlando) con la giusta impedenza. A questo punto hai sulla MEGA un unico BUS e parli e ricevi a due ID distinti che rende il codice più pulito, però vedi tu...

Allora, mi sono messo a studiare un po come funziona PJON, solo che non riesco a capire in che modo ricevere i dati, da quanto ho capito, (per esempio sull'oggetto bus invio al dispositivo con id 10 "Hi!" che ha lunghezza 3) il trasmettitore dovra' chiamare:

bus.send_packet(10, "Hi!", 3);

Ma il ricevente dovra' prima definire lui una funzione da chiamare quando riceve correttamente qualcosa (che scandisce il pacchetto ricevuto e ne estrapola i dati) e poi impostarla come funzione da richiamare tramite bus.set_receiver(receiver_function);.

Il mio dubbio e' qui: se voglio trasmettere e ricevere un intero o dei caratteri, c'e' un metodo piu' diretto o devo fare in questo modo?

attualmente da quel che so PJON permette di inviare/ricevere solo stringhe quindi lato trasmissione se devi trasmettere un intero lo devi convertire con la funzione itoa() e lato ricezione lo riconverti con atoi().
Se invece hai una situazione mista ovvero devi poter inviare stringhe e/o numerici allora il consiglio è quello di stabilire un protocollo che trasmetta sempre e solo stringhe, con prefisso (uno due o tre caratteri vedi tu) il tipo di comando e subito dopo il comando vero e proprio Es:
INT3
OPNCiao
CLS12
in questo modo scomporrai sempre la stringa in ricezione per posizione ovvero i primi tre acratteri di diranno che tipo di dato/richiesta stai ricevendo e poi cosa farne del resto lo valuterai in base al comando ricevuto, nel primo e terzo caso farai una atoi() nel secondo leggerei la restante parte di stringa così com'è e la visualizzerai sul display (è un esempio).
Per chiarezza quando parlo di stringhe i riferisco a stringhe classiche del c (array di char) e non all'uso della classe String

Va bene, se e' per questo posso tranquillamente trasmettere e ricevere i dati sotto forma di stringhe (come gia' sto' facendo con il codice prova senza PJON che ho scritto), pero' non sono riuscito ancora a rendermi conto di come fare a ottenere la stringa inviata dal lato ricevente, devo scrivere io la funzione che estrapola i dati come mi e' sembrato di capire, o c'e' qualche metodo che mi sfugge?

Apri un esempio della libreria, la funzione di ricezione è definita copia e incolla, ovvio che il nome della funzione puoi cambiarlo a tuo piacimento ma i parametri devi usare quelli. Dentro la funzione cosa farne dei dati presenti nel buffer devi saperlo tu cosa farne e quindi dovrai trattare questo buffer secondo le tue specifiche.
Come consiglio generale di tico che è sempre bene definire un array di char lungo quanto la lunghezza del messaggio più uno e copiarvi dentro il buffer di ricezione immediatamente come prima cosa nella funzione di ricezione, perché se invii dati questo viene sovrascritto così come se tu dovessi ricevere più dati in contemporanea.