Porte A4 A5 con più dispositivi

Allora volevo farvi una domanda qui, perché ho un dubbio. Se metto due dispositivi in parallelo alla porte A4 e A5 di arduino e in più anche sia l'ethernet che usa i pin da D10 a D13 e più un display che usa i pin 11 e 13, sul software devo apportare qualche modifica per il discorso degli slave? Se si quale?

I pin A4/A5 sono quelli su cui è disponibile il protocollo di comunicazione i2c in hardware. Per sua natura, puoi collegarci tutti i dispositivi che vuoi, in parallelo, con l'aggiunta di due resistori di pull-up, che sono però spesso integrati sulle schede su cui sono montati i sensori.

I pin 11/12/13 sono quelli che implementano un altro protocollo di comunicazione, vagamente simile ma totalmente scorrelato da i2c: SPI. Anche qua puoi collegare in parallelo tutti i dispositivi che vuoi, ma per ogni dispositivo ti serve anche un pin separato, per poter selezionare il particolare dispositivo con cui vuoi parlare in un determinato momento (per questo si chiama SS: Slave Select). Credo che l'Ethernet Shield usi il pin 10, e il pin 4 per l'eventuale slot SD.

Per rispondere alla tua domanda: con i2c non sono necessarie particolari modifiche al software (se gli indirizzi sono corretti), con SPI devi invece dirgli di utilizzare il corretto pin SS per ogni dispositivo.

Quindi praticamente con i pin A4 e A5 basta che gli dico due volte sul software define 'nome' A4 e define 'nome' A4? Praticamente nei pin A4 e A5 ho sia l'rtc che il bmp 180, invece nei pin 11 e 13 ho sia l'ethernet perché li usa e sia il tft. In quel caso come faccio a dirgli di utilizzare l SPI corretto?
Grazie per la risposta SukkoPera :smiley:

Non capisco bene cosa vuoi dire. Prima di pensare ai pin, devi pensare ai protocolli:

  • Le librerie che si interfacciano con dispositivi che usano i2c solitamente non richiedono i pin da usare, perché sono comunque fissi, non puoi usare pin qualsiasi. Al massimo richiedono la configurazione dell’indirizzo del dispositivo, su cui di solito puoi intervenire almeno in minima parte (saldando/rimuovendo ponticelli sulla scheda a volte lo puoi cambiare). Ad esempio, la libreria per il BMP180 non richiede la configurazione di nessun pin, vedi esempio: https://github.com/sparkfun/BMP180_Breakout/blob/master/Libraries/Arduino/examples/SFE_BMP180_example/SFE_BMP180_example.ino

  • Allo stesso modo, le librerie che si interfacciano con dispositivi che usano SPI richiedono solo la configurazione del pin SS, visto che gli altri sono fissi anche qua. Ad esempio, la libreria ethercard, per le schede di rete ENC28J60, permette di configurarlo tramite il metodo begin():

    /**   @brief  Initialise the network interface
    *     @param  size Size of data buffer
    *     @param  macaddr Hardware address to assign to the network interface (6 bytes)
    *     @param  csPin Arduino pin number connected to chip select. Default = 8
    *     @return <i>uint8_t</i> Firmware version or zero on failure.
    */
    static uint8_t begin (const uint16_t size, const uint8_t* macaddr,
                          uint8_t csPin =8);

Nota che la condivisione dei pin deve essere permessa dal protocollo, non è una cosa che puoi fare a tuo piacimento ;).

Bhe si, sia il bmp 180 che l rtc ds3231 non richiedono di definire il pin, però come faccio a configurarli in modo che non si sovrappongano quando comunicano con arduino?
Anche per le SPI devo fare tipo quella configurazione che dici per collegarci sia display sia ethernet sulle porte 11 e 13 quindi... Scusa per le tante domande ma su questo sono proprio un neofita :wink: Grazie per l'aiuto!

Il BMP180 e il DS3231 non hanno niente da configurare, come spiegato sopra. Il bus i2c usa indirizzi, che dovrebbero essere già definiti nelle librerie, non essendo proprio arbitrari. In sostanza: se riesci a usarli separatamente, riuscirai a usarli anche insieme senza cambiare niente, banalmente collegandoli in parallelo.

Per lo SPI ripeto che devi solo preoccuparti dello SS. Lo shield Ethernet usa il 10 e non ci puoi fare niente, lo shield è fatto così. Per il display non ne ho idea, da solo riesci a usarlo? Con che codice?

Capito :wink: Il display è questo Tweaking4All.com - SainSmart 1.8" TFT Arduino Color LCD Display

I pin SDA e SCL sono collegati alle uscite digitali 11 e 13 il resto l'ho collegato da A1 ad A3, ho usato l'high speed

Lo schema per capirci è questo

E ti funziona? La vedo un po' dura... Forse non ti è chiara una cosa:

  • I pin SDA e SCL sono quelli caratteristici del protocollo i2c. Per interfacciare un dispositivo che ha questi pin con Arduino devi obbligatoriamente collegarli ad A4 e A5, rispettivamente.
  • I dispositivi che interfacci collegandoli a 11/12/13 sono quelli SPI, i cui pin hanno rispettivamente i seguenti nomi caratteristici: MOSI, MISO, SCK (oltre ad SS discusso nei post precedenti)

Per cui quel display devi collegarlo ad A4/A5!

(Nota che, in alternativa ai pin sopracitati, che valgono solo per la Uno e simili, puoi usare i pin del connettore ICSP per lo SPI e quelli in coda alla strip dei pin 8-13 per i2c, aggiunti dalla Uno R3 in avanti. Questi dovrebbero garantirti di essere sempre i pin corretti su tutte le schede)

Il protocollo I2C funziona con i due pin SDA e SCL e OGNI dispositivo I2C che colleghi ha un suo indirizzo.
Se l'indirizzo è identico tra più dispositivi allora NON li puoi collegare assieme.

No no sukko pera, funziona anche così... Lo ho proprio qui vicino ed è acceso... e segna tutti i dati
Appunto io li ho collegati come nello schema che ti ho mandato, non ad a4 ed a5 il display... ma su pin 11 e 13 e da A1 ad A3

Per nid, come faccio a sapere se l rtc e il bmp 180 usano lo stesso indirizzo? Cioè io sono confuso, se posso collegarli insieme in parallelo su A4 e A5 però allo stesso tempo non posso perché hanno lo stesso indirizzo?

Boh, evidentemente ha anche una modalità di funzionamento che non è i2c, o stai usando un'emulazione i2c software.

Per il BMP e l'RTC fai che collegarli e prova ad usarli, se funzionano sei a posto, se non funzionano non danneggi comunque niente.

Infatti ho ordinato l rtc :wink: Comunque niente emulazione, non ricordo perché funzionano, me l'avevo spiegato brunello su un altro topic, ma si collegano così a prescindere anche dallo schema di quel sito che ti ho mandato, non l'ho fatto solo io... I pin da A1 ad A3 invece l'ho fatto io, l'ho usati come pin digitali

Allora fa sia RTC ds3231 che bmp 180 insieme sulle porte A4 e A5 :smiley: Semplicemente mettendoli in parallelo

In ogni caso mi chiedevo... l'orario ovviamente adesso non si resetta se stacchi l'alimentazione, però le massime e minime si. Per non farle resettare è impossibile senza un datalogger giusto? Lo metterò con l'ethernet shield intanto visto che ha l sd...

Non avevo dubbi :).

Puoi scrivere massime e minime nella EEPROM.

Si l’ho modificato ma comunque segna 21 e 21, ho messo pure il float se no non mi segna con la virgola i numeri

TX20___DS18B20___DHT22___DISPLAY.ino (13.1 KB)

Beh, intanto le leggi rispettivamente dagli offset 1 e 2, ma le scrivi entrambe all'1...

Come scritto sopra l’ho modificato, però adesso leggo sempre 21 su tutte e due
21 cioè 21.00 anche se per esempio adesso la temperatura è 21.25 e dovrebbe mettere quel valore sulla temperatura max

HO RISOLTO AVEVO FATTO UNA CA…TA :smiley:

TX20___DS18B20___DHT22___DISPLAY.ino (13.1 KB)

Ecco lo sketch

Solo una cosa… Se per esempio faccio arrivare la massima a 22.44 poi dopo quando stacco la corrente, non mi dà la massima di 22.44 ma di 22.00 perché?
Cioè ho visto che può contenere valori da 0 a 255, se è così e basta non mi serve a molto… perché se va sotto zero per esempio? in più sono importanti i decimi…
Allora ho visto che ci sta eeprom put ed eeprom get, ma non riesco a usarli, ovvero una volta caricato non mi dà errore ma sulle massime e minime mi segna “nan”
Ho messo lo sketch aggiornato

Allora :smiley: Ho rimesso un’altra volta lo sketch, adesso pare che faccia, dimmi se ho fatto bene perché delle volte si perde qualcosa

TX20___DS18B20___DHT22___DISPLAY.ino (13.2 KB)

Allora dici che va bene? perché una volta mi ha segnato come minima 12 gradi senza senso, adesso ancora é segnata quindi funziona, peró…

Alla fine ho usato questo