Vai al contenuto
PLC Forum


dubbio su I2C


D80

Messaggi consigliati

buona giornata a tutti

sto cercando di avvicinarmi ad Arduino, ho fatto qualche passo e ho imparato ad accendere dei relè sia tramite pulsanti, sensori etc, ma ora vorrei capire come usare correttamente il protocollo di comunicazione I2C: 

 

prima di tutto ho provato a vedere cos'è e come funziona , e da quello che ho capito e correggetemi se sbaglio,  vengono utilizzati 1 bit di start/stop della comunicazione ,  7 bit per l'indirizzo della periferica, 1 bit per abilitare la lettura o scrittura 1 bit di sincronismo, 1 bit di parità, oltre  i bit che contengono i dati da inviare o ricevere ( non ho capito quanti siano), 

il dubbio è che a quanto ho capito ben 4 dei 7 bit dell'indirizzo sono impostati di default dal costruttore della periferica e non sembrerebbero modificabili, per cui anche se ho un limite massimo di 128 dispositivi diversi sullo stesso bus  di fatto se i dispositivi sono dello stesso modello non ne potrei mettere più di 8 , ma se me ne servono  di più  uguali ci sarebbe qualche soluzione? 

 

Link al commento
Condividi su altri siti


  • Risposte 66
  • Created
  • Ultima risposta

Top Posters In This Topic

  • D80

    33

  • Livio Orsini

    21

  • ilguargua

    6

  • gabri-z

    2

Dipende da qauli dispositivi vuoi connettere.

Se usi il vecchio PCF8754, ad esempio, ai solo 3 linee di indirizzo, quindi massimo 8 dispositivi.

Ma ce ne sono altri che hanno 4 o più linee di indirizzo.

Comunque per Arduino non c'è da inventare niente, basta includere la libreria I2C ed è già tutto pronto.

In rete trovi anche uno sketch che esegue la scansione del bus I2C fornendoti tutti gli indirizzi eventuali delle perifrich collegate al bus.

Link al commento
Condividi su altri siti

Poi volendo se si utilizza il PCF8574 A se ne posso collegare altri 8 oltre ai primi 8 PCF8574 .Questo è fattibile perchè i primi 4 bit dell'indirizzo sono differenti tra le 2 versioni .

Link al commento
Condividi su altri siti

 

grazie per le risposte , buono a sapersi,

 

oggi sto provando a scrivere qualche riga di sketch per poter visualizzare un valore ottenuto da un sensore di umidità su uno schermo lcd 1602, poi, se ci riuscirò proverò ad

implementare il programma  con più display, più sensori, e magari un menù a scorrimento gestito da alcuni pulsanti per ciascun display.

 

Anche se sull'uso dei made in China molti storcono il naso,  ho deciso di imparare usando un Arduino Mega compatibile ( pagato la bellezza di 10€),  se faccio qualche errore almeno cerco di limitare i danni economici, ho visto che comunque usando  il programma scaricato dal sito ufficiale funziona lo stesso, poi quando avrò preso la mano comprerò l'originale

 

   

 

 

 

 

Link al commento
Condividi su altri siti

ho trovato una cosa che mi è piaciuta molto, ed la possibilità di esportare i dati ricevuti da un sensore su un foglio di calcolo , tramite un programma scaricabile gratuitamente in rete, e mi chiedevo se si potesse fare anche l'operazione inversa : partire da una tabella di dati,scritta in txt, csv, o altro,  far leggere   leggere i valori e mandarli in uscita ad un pin, qualcuno ne sa se è fattibile?

 

se è possibile, ora che sono arrivato a utilizzare anche  il display LCD, vorrei iniziare il primo "vero" progettino:  una automazione "smart" per  tenda, scaricando magari i dati meteo dalla rete e importarli su un   foglio di calcolo, sincronizzando i tempi, arduino decide sulla base dei dati nel foglio di calcolo quando è possibile aprire o chiudere la tenda, e di chiudere automaticamente la tenda in caso di allerta meteo 

 

Link al commento
Condividi su altri siti

La possibilità di importare dati dall'esterno tramite la seriale esiste, basta scrivere il Sw per farlo.

La tua tabella dati la invii alla seriale del PC in forma di file.txt ed arduino leggendo la seriale può memorizzare questi dati in memoria RAM o anche su altro supporto, tipo SD card, se ne è dotato (necessita di apposita shield e di relativo software).

Poi in base ai valori letti dai sensori ed ai dati di riferimento puoi far accadere determinati eventi.

Però per tutto questo è necessario scrivere il software dedicato.

Link al commento
Condividi su altri siti

grazie per la risposta 

 

 

 

domani proverò a scrivere qualche riga di sketch, attualmente possiedo solo i sensori di pioggia ed anemometro, oltre alla scheda relè ed al display e devo arrangiarmi con quelli, il resto delle shield mancanti  lo ordinerò in seguito, quindi per prima prova sarà un'automazione abbastanza banale:  posso impostare la modalità manuale o automatica, nella modalità automatica la tenda si apre se c'è sole, non piove ed  il vento è inferiore a un tot di m/s,  se una di queste condizioni non è verificata, lascia la tenda chiusa, oppure la chiude se è aperta, nella modalità manuale c'è la possibilità di comandare la tenda anche se le condizioni non si verificano o se Arduino è spento, sul display visualizzo lo stato della tenda e info vento e pioggia.

 

buona giornata  ferragosto a tutti

Link al commento
Condividi su altri siti

domani posterò una prima bozza dello sketch, comanderò la  tenda a seconda dei valori del vento o pioggia , 

 sto cercando qualche tutorial su come scaricare e aggiornare  i dati meteo dalla rete da memorizzare in automatico  per poterli sfruttare in qualche modo ma non trovo niente, devo per forza aggiornare a mano? 

 

Link al commento
Condividi su altri siti

Quote

come scaricare e aggiornare  i dati meteo dalla rete da memorizzare in automatico

 

Spiega meglio cosa vuoi fare.

Link al commento
Condividi su altri siti

scusate il ritardo ma sono incappato in un punto cieco: non riesco a visualizzare lo stato della tenda sul display quando uso la modalità manuale , ma non  voglio che mi diciate voi come fare, vorrei prima provare ad arrivarci da solo, se risolvo anche questo intoppo vi posterò lo sketch per intero, anche se per ora è abbastanza semplice da capire.

  

Quello che vorrei fare è semplice a dirsi, forse un po' meno a realizzarlo:

vorrei che Arduino si connettesse in automatico ad un sito che fornisce i dati meteo in un qualsiasi formato utilizzabile,tanto per fare un esempio su questo (sudo apt-get update) ,memorizza i dati nella sd e  se è previsto una allerta meteo , chiudesse in automatico la tenda un tot di tempo prima che si verificasse l'evento, se questo non è misurato prima dai sensori che fanno chiudere la tenda 

 

programmo arduino per connettersi tutti i giorni ad un sito meteo, quindi scarica i dati relativi alle condizioni climatiche, ( orari ed entità degli eventi)

se ad esempio è prevista un tot di mm di  pioggia per le ore 18, arduino , se alle 17.50 la tenda è aperta la chiude, sempre che non piova prima e il sensore di pioggia da il consenso alla chiusura prima dell'orario programmato,  stesso comportamento in caso di vento

Link al commento
Condividi su altri siti

Forsi dovresti cominciare a pensare ad almeno 2 schede, una per l'automazione e l'altra per la connessione ad internet e raccolta dati.

Con Raspberry avresti la macchina giusta per connetterti al Webb e fare la raccolta dati ed anche un'interfaccia HMI.

Link al commento
Condividi su altri siti

purtroppo il raspberry non lo conosco, anche se a guardare i video in rete sembra un assemblamento di un arduino ed un pc ,  

stavo pensando ad un ethernet shield e di memorizzare i dati in un cloud ( come ad esempio google drive) in modo da non dover utilizzare la sd,    ma  sto decidendo di rinunciare a questa sezione, visto che i dati meteo in formato xml li fanno pagare    e non li trovo da nessuna parte gratuitamente, 

 

qui il listino prezzi:

 https://www.ilmeteo.it/portale/dati-meteo-xml

mentre il formato gratuito in csv, xls e txt è solo per certe regioni,  

se conoscete qualche sito che  offre i dati  gratuitamente anche per la Sardegna fatemelo sapere , magari li potrei sfruttare anche per qualche applicazione un po' più seria , 

 

non ho ancora risolto il problema della visualizzazione dello stato della tenda quando è manovrata in modalità manuale, probabilmente dovrò aggiungere due finecorsa supplementari, ma non c'è lo spazio fisico,  spero di riuscirci il prima possibile, poi vi posterò lo sketch

 

 

Link al commento
Condividi su altri siti

L'idea è bella ma le previsioni meteo sono così precise a livello locale?

 

In pratica in un sistema come quello descritto è fortemente probabile che lavorerebbero sempre i sensori locali e che gli indici previsionali facciano chiudere la tenda quando non serve.

 

In un sistema provvisto di

 

barometro

igrometro (non indispensabile)

termometro

pluviometro

rilevatore di temporali

 

interpretando come si deve i dati, non si otterrebbe un risultato migliore di quanto possa fornire una previsione da oltre

250€/anno ?

 

Personalmente credo di sì e userei una raspberry pi3 aggiungendo anche una webcam  :whistling:

 

 

Link al commento
Condividi su altri siti

Quote

Personalmente credo di sì e userei una raspberry pi3

 

Concordo.
 

Quote


purtroppo il raspberry non lo conosco, anche se a guardare i video in rete sembra un assemblamento di un arduino ed un pc ,

 

 

No raspberry è un vero PC con SO linux.

La versine pi3, l'ultima, è veramente molto potente.

Per automatizzare la tenda i sensori indispensabili sono l'anemometro ed un misuratore di luminosità. Se poi ci aggiungi i sensori che ha elencato Stefano avrai una stazioncina meteo non male.

Link al commento
Condividi su altri siti

per quanto riguarda il punto cieco in cui ero incappato non ho proprio risolto nella maniera che mi sarebbe piaciuta , ma ... funge:

 

utilizzo i contatti dei finecorsa   di apertura e chiusura per alimentare dei  dei relè ( due per l'apertura e due per la chiusura)  utilizzo  il contatto di un relè per il comando del motore ed il contatto di un secondo relè lo utilizzo come digital input per  l'indicazione di tenda aperta o chiusa  , in questo modo potrò visualizzare lo stato della tenda  qualsiasi sia la modalità impostata, aggiungendo però due ulteriori input nell' Arduino e ben 4 relè in più ( due di potenza e due non di potenza , tutti con boboina a 230V ) , è poco ortodosso  per il momento non mi viene in mente altro, 

     

 

ho valutato anche la possibilità che i dati forniti dal servizio meteo non fossero del tutto attendibili, e per questo volevo fare in modo che  fossero utilizzati solo se concordi ai valori degli strumenti, ma visto che non ho trovato nessun sito che li possa fornire gratuitamente, questa sezione la tralascio per ragioni ....economiche

 

 

Link al commento
Condividi su altri siti

C'è Walter, c'è.

Anzi è meglio di re ci sono.

Sono complementi alla libreria Wire e sono specialistici per alcuni dispositivi e shield di Arduino, tra cui anche il PCF8574. Non gli viene dato il titolo di I2C proprio per i problemi di marchio che hai citato.

Io ne uso (ho usato perchè è parecchio che non ne faccio oso) una che comprende anche uno scanner del bus I2C che ti da indirizzo e presenza di tutti i dispositivi presenti sul bus.

Link al commento
Condividi su altri siti

scusate la mia momentanea assenza ma ho avuto un grosso intoppo   e mi trovo ricoverato in ospedale, finalmente mi hanno portato il pc e posso rispondervi, cercherò non appena possibile di terminare almeno lo sketch,  per l' Hardware purtroppo dovrò fare solamente da ... direttore dei lavori ,

 

sono nati diversi problemi nella scrittura dello sketch, tra cui quello del vento che soffia ad una velocità nell'intorno della soglia impostata, generando l' apertura e la chiusura continua  della tenda, stessa cosa col sensore di luminosità in giornate nuvolose,  sto ancora cercando di risolvere questi problemi, essendo però alle prime armi mi viene un po' difficile, sinceramente trovo decisamente più semplice il linguaggio dei plc rispetto ad Arduino,   ad esempio mi trovo ancora  male ad applicare le funzioni booleane And Or e Not col linguaggio di Arduino, 

 

 

 

 

ps come mai dallo smartphone  non riuscivo ad entrare nel sito?  mi da "impossibile stabilire una connessione protetta"

Link al commento
Condividi su altri siti

Per prima cosa ti faccio i miei sinceri auguri di poter superare velocemente le problematiche di salute che ti costringono in ospedale.

 

In ordine alle difficoltà di accedere al forum tramite smartphone non so che dirti, visto che ci sono parecchi utenti che si collegano con questi dispositivi.

Il tuo è basato su android o su di un altro SO?

 

Per quanto riguarda il linguaggio arduino si programma con un linguaggio che è praticamente guale al "C" standard. Le librerie son tutte scritte in "C++". Personalemnte trovo più semplice il "C" piuttosto che il linguaggi per PLC.

 

In ordine alle chiusure-aperture della tenda in caso di raffiche  di vento o di tempo con nuvole sparse.

Io affronterei il problema usando sia livelli di isteresi sia tempi di ritardo.

Ad esempio, se chiudo la tenda quando la velocità del vento supera 2ms, per riaprirla attendo che la velocità del vento sia scesa sotto 1ms e si mantenga al disotto di questo limite per almeno 10' continuativi.

Link al commento
Condividi su altri siti

 

ti ringrazio Livio per gli auguri e per la risposta celere che mi hai dato,

uso un vecchio galaxy ace gt-s 5830 con android 2.3.5, 

 

proverò a seguire il tuo consiglio, stavo pensando ad una soluzione un po' diversa: la possibiltà di effettuare la chiusura in automatico se viene superata la soglia ( fissa per apertura e chiusura) del vento o luminosità per più di n volte in un tot di tempo e l'apertura se gli eventi non si verificano per un tempo continuativo prestabilito 

 

 

 

che vuol dire questo errore? 

exit status 1
stray '\303' in program

 

 

Link al commento
Condividi su altri siti

Quote

che vuol dire questo errore? 

exit status 1
stray '\303' in program

 

Probabilmente è un errore di compilazione fornito dal gcc (compilatore alla base del toolset di arduino). Hai usato, per caso, qualche carattere strano all'interno del tuo codice?
Copiato qualche riga da pagine HTML prima di compilare?

 

Link al commento
Condividi su altri siti

non so esattamente a cosa possa essere riferito, mi è apparso dopo che ho aggiunto un conteggio per far si che al terzo superamento della soglia del vento la tenda si chiudesse automaticamente, non ho copiato da nessuna pagina html ma sto facendo tutto in "work in progress", forse ho scritto male qualche riga utilizzando i simboli > e <, ho cercato qualche soluzione ma non l'ho trovata , ora sto provando  a fare come mi ha suggerito Livio, 

Link al commento
Condividi su altri siti

eccovi una prima bozza dello sketch, è ancora senza la sezione del display,

 

quando torno a casa  mi devo creare un piccolo pcb per poter regolare le soglie minime e massime del vento e della luminosità, utilizzando qualche resistenza, un quadruplo operazionale,  2 diodi zener,  3 potenziometri e 3 microrelè, (o fotoaccopiatori, devo vedere ciò che ho a casa), metterò i potenziometri nella stessa scatola portafrutti del doppio pulsante, giusto per comodità

 

la parte che riguarda il display non l'ho ancora fatta, la farò non appena prenderò un po' più di confidenza col display,

 

 

 

 

non riesco ad allegare il file originale, quindi vi faccio copia e incolla del testo del programma, ho inserito anche dei commenti per cercare di rendere comprensibile il tutto, 


const int manualmode = 31;    // interruttore man/auto: man = chiuso(HIGH), auto = aperto (LOW)
const int P1 = 33;            // pulsante apertura manuale (N.O.)
const int P2 = 35;            // pulsante chiusura manuale (N.O.)     N.B:  P1+P2 = pulsante doppio N.O.  con interblocco meccanico 
const int fcap = 37;          // finecorsa tenda aperta (N.C.)
const int fcch = 39;          // finecorsa tenda chiusa (N.C.)
const int sventomin = 41;     // contatto(N.C.)sensore vento soglia minima (soglia tarabile tramite potenziometro pot1)
const int sventomax =43;      // contatto(N.C.)sensore vento soglia massima (soglia tarabile tramite potenziometro pot2)
const int spioggia = 45;      // contatto  sensore pioggia (N.O. in assenza di pioggia)
const int slum = 47;          // contatto rele sensore luminosità (N.O. in condizioni di bassa luminosità tarabile tramite potenziometro pot3)
const int out1 = 49;          // uscita relè apertura
const int out2 = 51;          // uscita relè chiusura


// impostazione stati iniziali degli ingressi

int manualmodeState = 0;
int P1State = 0;         
int P2State = 0; 
int fcapState = 0;
int fcchState = 0;
int sventominState = 0;
int sventomaxState =0;
int spioggiaState = 0;
int slumState = 0;
 

// settaggio ingressi/uscite:

 
 void setup(){
  
pinMode(manualmode,INPUT);
pinMode(P1, INPUT);
pinMode(P2, INPUT);
pinMode(fcap, INPUT);
pinMode(fcch, INPUT);
pinMode(sventomin, INPUT);
pinMode(sventomax, INPUT);
pinMode(spioggia, INPUT);
pinMode(slum, INPUT);
pinMode(out1,OUTPUT);
pinMode(out2,OUTPUT);
}

// istruzioni:


void loop() {

 
if (out1 == HIGH )
   {digitalWrite(out2,LOW);}                                                                    // autoesclusione di chiusura se apertura è attiva

if (out2 == HIGH)
   {digitalWrite(out1,LOW);}                                                                    // autoesclusione di apertura se chiusura è attiva


   // modalità manuale:

   // apertura tenda
 
if (digitalRead(manualmode == HIGH),digitalRead(P1 == HIGH),digitalRead (fcap == HIGH)  )   // modalità manuale impostata,pulsante apertura premuto, finecorsa apertura a riposo
     {digitalWrite(out1, HIGH); }                                                           // azionamento relè apertura tenda

if (digitalRead(manualmode == HIGH),digitalRead(P1 == HIGH),digitalRead (fcap == LOW)  )    // modalità manuale impostata,pulsante apertura premuto, finecorsa apertura attivo
   {digitalWrite(out1, LOW); }                                                              // apertura non attiva se arriva a finecorsa e si continua a tenere premuto il pulsante

if (digitalRead(manualmode == HIGH),digitalRead(P1 == LOW),digitalRead (fcap == HIGH)  )    // modalità manuale impostata,pulsante apertura non premuto, finecorsa apertura a riposo
   {digitalWrite(out1, LOW); }                                                              // apertura non attiva

if  (digitalRead(manualmode == HIGH),digitalRead(P1 == LOW),digitalRead (fcap == LOW)  )    // modalità manuale impostata,pulsante apertura non premuto, finecorsa apertura attivo
    {digitalWrite(out1, LOW); }                                                             // apertura non attiva

// chiusura tenda

if (digitalRead(manualmode == HIGH),digitalRead(P2 == HIGH),digitalRead (fcch == HIGH)  )    // modalità manuale impostata,pulsante chiusura premuto, finecorsa chiusura a riposo
     {digitalWrite(out2, HIGH); }                                                            // azionamento relè chiusura tenda

if (digitalRead(manualmode == HIGH),digitalRead(P2 == HIGH),digitalRead (fcch == LOW)  )     // modalità manuale impostata,pulsante chiusura premuto, finecorsa chiusura attivo
     {digitalWrite(out2, LOW); }                                                             // disinserzione relè chiusura tenda se arriva a finecorsa e si continua a tenere premuto il pulsante

if (digitalRead(manualmode == HIGH),digitalRead(P2 == LOW),digitalRead (fcch == HIGH)  )     // modalità manuale impostata,pulsante chiusura non premuto, finecorsa chiusura a riposo
   {digitalWrite(out2, LOW); }                                                               // chiusura non attiva

if  (digitalRead(manualmode == HIGH),digitalRead(P2 == LOW),digitalRead (fcch == LOW)  )     // modalità manuale impostata,pulsante apertura non premuto, finecorsa apertura attivo
    {digitalWrite(out2, LOW); }                                                              // chiusura non attiva

// modalità automatica:

 

// apertura:
if (digitalRead(manualmode == LOW),digitalRead(sventomin == LOW),digitalRead(spioggia==LOW), digitalRead(slum==HIGH),digitalRead(fcap==HIGH)) //verifica condizioni
   {delay (5000);}                                                                                                                            // attende 5 secondi
if (digitalRead(manualmode == LOW),digitalRead(sventomin == LOW),digitalRead(spioggia==LOW), digitalRead(slum==HIGH),digitalRead(fcap==HIGH)) //seconda verifica condizioni
   {digitalWrite(out1, HIGH); }                                                                                                               // apertura della tenda se si ripetono le condizioni iniziali
else
   {digitalWrite(out1, LOW);}                                                                                                                 // altrimenti non apre la tenda

 

// chiusura:

if  (digitalRead(manualmode == LOW),digitalRead(sventomin == LOW),digitalRead(spioggia==LOW), digitalRead(slum==HIGH),digitalRead(fcch==LOW)) // verifica condizioni
{digitalWrite(out2, LOW);}                                                                                                                    // se sono rispettate le condizioni non chiude la tenda   
else
   {digitalWrite(out2, HIGH);}                                                                                                                 // altrimenti chiude la tenda
                                                          
 }

 

 

     

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora

×
×
  • Crea nuovo/a...