<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bus I2C Archives - Esperimenti con logiche programmabili</title>
	<atom:link href="https://logicaprogrammabile.it/tag/bus-i2c/feed/" rel="self" type="application/rss+xml" />
	<link>https://logicaprogrammabile.it/tag/bus-i2c/</link>
	<description>Tutorial in italiano per imparare a programmare usando Arduino, Raspberry PI, Netduino</description>
	<lastBuildDate>Fri, 01 Jun 2018 20:15:57 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.2</generator>

<image>
	<url>https://logicaprogrammabile.it/wp-content/uploads/2017/11/cropped-logicaprogrammabile-logo-02-32x32.png</url>
	<title>Bus I2C Archives - Esperimenti con logiche programmabili</title>
	<link>https://logicaprogrammabile.it/tag/bus-i2c/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Come usare il sensore di luminosità TSL2591</title>
		<link>https://logicaprogrammabile.it/arduino-tsl2591-sensore-luminosita/</link>
					<comments>https://logicaprogrammabile.it/arduino-tsl2591-sensore-luminosita/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Mon, 15 Feb 2016 15:07:29 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[Bus I2C]]></category>
		<category><![CDATA[sensori]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=5022</guid>

					<description><![CDATA[<p>Misurare l&#8217;intensità luminosa col sensore TSL2591 Il sensore TSL2591 permette di misurare l&#8217;intensità luminosa di un ambiente. Ha una buona capacità di campionamento ed in particolare permette con un solo sensore di rilevare sia lo spettro IR sia quello visibile. Il range di misurazione va...</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-tsl2591-sensore-luminosita/">Come usare il sensore di luminosità TSL2591</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Misurare l&#8217;intensità luminosa col sensore TSL2591</h1>
<p>Il <strong>sensore TSL2591</strong> permette di misurare l&#8217;intensità luminosa di un ambiente. Ha una buona capacità di campionamento ed in particolare permette con un solo sensore di rilevare sia lo <strong>spettro IR</strong> sia quello <strong>visibile</strong>. Il range di misurazione va da 188 Lux sino ad arrivare ad 88000 Lux (<a href="https://it.wikipedia.org/wiki/Lux" target="_blank">unità di misura Lux</a>).<br />
Nella figura seguente potete osservare il diagramma del circuito:</p>
<p><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-5027" src="https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Diagram.png" alt="TSL2591 Diagramma di funzionamento" width="588" height="272" srcset="https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Diagram.png 588w, https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Diagram-300x139.png 300w" sizes="(max-width: 588px) 100vw, 588px" /></p>
<p>La conversione dei due canali viene eseguita contemporaneamente. Al termine del ciclo di conversione i dati vengono memorizzati nei relativi registri (<strong>CH0 Data</strong> e <strong>CH1 Data</strong>). Dopo la memorizzazione dei dati viene automaticamente eseguita la misurazione successiva.</p>
<p><span id="more-5022"></span></p>
<p style="text-align: center;"><a href="http://www.amazon.it/gp/product/B00M40Y0NW/ref=as_li_ss_tl?ie=UTF8&amp;camp=3370&amp;creative=24114&amp;creativeASIN=B00M40Y0NW&amp;linkCode=as2&amp;tag=logicaprogram-21">Per questo tutorial ho acquistato questo articolo.</a></p>
<p>Il <strong>TSL2591</strong> possiede anche due livelli di soglia programmabili (Upper Limit e Lower Limit) che generano un interrupt se il valore della misurazione dell&#8217;intensità di luce eccede questi limiti, una funzionalità importante per ottimizzare il campionamento in base alle condizioni di luminosità dell&#8217;ambiente.</p>
<p>Il <strong>collegamento</strong> del sensore con un <strong>microcontrollore</strong> avviene utilizzando il <strong>bus I2C</strong>, l&#8217;indirizzo del dispositivo nel bus è <strong>0x29</strong> e non può essere modificato via software, come accade con analoghi dispositivi.</p>
<p>L&#8217;interazione microcontrollore sensore avviene scrivendo e leggendo i registri del dispositivo.</p>
<p>Nonostante esista una libreria che semplifica l&#8217;interfacciamento, credo che sia interessante capire come accedere ai registri del <strong>TSL2591</strong> utilizzando le semplici istruzioni della <strong>libreria Wire</strong> (bus i2C), questo per ottimizzare il codice in termini di dimensione e di prestazioni.</p>
<p>Sul datasheet sono presenti tutte le informazioni relative al <strong>TSL2591</strong>, tramite questo &#8216;manuale&#8217; possiamo capire quali registri dobbiamo leggere e scrivere. La tabella seguente elenca tutti i registri del <strong>TSL2591</strong>, il loro indirizzo e le informazioni sulla loro funzione:</p>
<p><img decoding="async" class="aligncenter size-full wp-image-5032" src="https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Registri.png" alt="TSL2591 accedere ai Registri" width="568" height="569" srcset="https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Registri.png 568w, https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Registri-150x150.png 150w, https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Registri-300x300.png 300w" sizes="(max-width: 568px) 100vw, 568px" /></p>
<p>Il primo registro che dobbiamo conoscere e il <strong>COMMAND</strong>, più che un registro è il primo dato che inviamo al TSL2591 suil bus I2C, che permette successivamente di accedere ad un registro specifico (indirizzi da 0x00 a 0x17), nel dettaglio il <strong>COMMAND</strong> è così composto:</p>
<p><img decoding="async" class="aligncenter size-full wp-image-5033" src="https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Registri_Command.png" alt="TSL2591 Command register" width="570" height="57" srcset="https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Registri_Command.png 570w, https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Registri_Command-300x30.png 300w" sizes="(max-width: 570px) 100vw, 570px" /></p>
<p>Il bit 7 deve essere impostato alto per poter rendere valido il commando. I bit 6 e 5 servono per definire l&#8217;uso dei bit da 0 a 4. Se i bit 6 e 5 vengono settati rispettivamente uno basso e uno alto, intendiamo accedere ad un indirizzo, se invece i bit 6 e 5 vengono impostati rispettivamente uno alto e uno basso, intendiamo specificare una funzione (maggiori dettagli sul datasheet del TSL2591).</p>
<p>Passiamo subito passare alla pratica per capire come funziona questo meccanismo. Andremmo a leggere il registro 0x12 che contiene l&#8217;identificativo del dispositivo, settato di default al valore 0x50.</p>
<p>Formiamo, usando la notazione binaria, il valore che deve avere il <strong>COMMAND</strong>. Il bit 7, abbiamo detto, deve essere messo a 1, i bit 6 e 5 devono essere 0 e 1 (poichè intendiamo scrivere nei bit da 0 a 4 un indirizzo e non abilitare una funzione) e i bit da 0 a 4 conterranno il valore del registro che voglio leggere o scrivere, in questo caso 0x12:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-5034" src="https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Registri_Command_2.png" alt="TSL2591 Setting command register" width="570" height="116" srcset="https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Registri_Command_2.png 570w, https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Registri_Command_2-300x61.png 300w" sizes="auto, (max-width: 570px) 100vw, 570px" /></p>
<p>Se questo è corretto dal registro 0x12 dovremmo leggere il valore 0x50:</p>
<pre class="nums:true lang:arduino decode:true">//inserisco la libreria I2C
#include &lt;Wire.h&gt;

void setup()
{
  //Attivo la seriale
  Serial.begin(9600);
  
  //inizializzo la porta I2C
  Wire.begin();

  //inizio la trasmissione specificando
  //l'indirizzo del TSL2591
  Wire.beginTransmission(0x29);
  //invio sul bus il valore del registro COMMAND
  Wire.write(0b10110010);
  //termino la trasmissione
  Wire.endTransmission();
  //richiedo al dispositivo il valore del registro
  //precedentemente selezionato
  Wire.requestFrom(0x29, 1);
  //leggo il valore del registro
  byte c = Wire.read();
  //invio al serial monitor il dato letto
  Serial.print("0b"); Serial.print(c ,BIN); Serial.print(" 0x"); Serial.print(c ,HEX);
}

void loop() {
  delay(50);

}</pre>
<p>Aprendo il Serial Monitor otterremo il valore aspettato:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-5036" src="https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Registri_Command_Result.png" alt="TSL2591 ID register result" width="224" height="139" /></p>
<p>Questo è il meccanismo che permette di accedere ai registri del <strong>TLS2591</strong>. Ora andremo a recuperare i valori dei registri interessati alla memorizzazione dei canali <strong>ADC CH0</strong> e <strong>CH1</strong>, relativi alla spettro visibile e alla spettro IR.<br />
Prima di eseguire la lettura dai registri 0x14, 0x15, 0x16 e 0x17 (Che contengono appunto il valore della conversione ADC) è necessario configurare alcuni registri del dispositivo come l&#8217;<strong>ENABLE</strong> (0x00) e il <strong>CONFIG</strong> (0x01).</p>
<p>Il registro <strong>ENABLE</strong> (0X00) è così composto:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-5039" src="https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Enable_Register.png" alt="TSL2591 Enable register" width="573" height="379" srcset="https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Enable_Register.png 573w, https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Enable_Register-300x198.png 300w" sizes="auto, (max-width: 573px) 100vw, 573px" /></p>
<p>Permette di &#8216;accendere&#8217; il dispositivo e di avviare l&#8217;<strong>ALS Data Register</strong> per memorizzare i dati provenienti dagli ADC. I bit 4, 6 e 7 servono per settare le funzioni di interrupt e power down. Per il momento non useremo questi bit.<br />
Quindi i bit 0 e 1 vengono impostati a 1 mentre gli altri bit impostati a 0.<br />
Il registro <strong>ENABLE</strong> avrà questo valore: <strong>0b00000011</strong>.</p>
<p>Un altro registro da configurare, prima di eseguire la lettura dai registri 0x14-0x17 e il <strong>CONTROL</strong> (0x01):</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-5041" src="https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Control_Register.png" alt="TSL2591 Control register" width="566" height="593" srcset="https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Control_Register.png 566w, https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Control_Register-286x300.png 286w" sizes="auto, (max-width: 566px) 100vw, 566px" /></p>
<p>Questo registro ci permette di selezionare tramite i bit 4 e 5 il guadagno dell&#8217;integratore dei due canali. Il valore del <strong>AGAIN</strong> permette di variare la sensibilità del sensore in base alle condizioni di luce, se andiamo a misurare ambienti molto luminosi useremmo un basso guadagno, viceversa in ambienti bui ne potremmo aumenteremmo il guadagno.<br />
Stesso discorso vale per il tempo di acquisizione, integration time <strong>ATIM</strong>, per ambienti luminosi potremmo impostare un basso tempo di integrazione (100 ms) mentre per ambienti poco luminosi un alto valore di integrazione (600ms).<br />
Il bit 7 va impostato a zero, altrimenti otterremo il reset del dispositivo.<br />
Impostiamo <strong>SRESET</strong> a uno (bit 7), <strong>AGAIN</strong> a 01 (medium Gain Mode) e <strong>ATIME</strong> a 100ms. Il registro avrà quindi questo valore <strong>0b00010000</strong>.</p>
<p>Ora non ci resta che leggere i 4 byte dei registri 0x14-0x17, per recuperare i dati relativi alla conversione dello spettro visibile e IR:</p>
<pre class="nums:true lang:arduino decode:true">//carico libreria i2c
#include &lt;Wire.h&gt;

void setup() {
  //init seriale
  Serial.begin(9600);

  //inizializzo la porta I2C della Arduino
  Wire.begin();
  delay(100);
 
  Wire.beginTransmission(0x29);
  Wire.write(0b10110010);//10110010
  Wire.endTransmission();
  Wire.requestFrom(0x29, 1);
  byte c = Wire.read();
  Serial.print("0b"); Serial.print(c ,BIN); Serial.print(" 0x"); Serial.print(c ,HEX);
 
  //attiva il tsl2195
  Wire.beginTransmission(0x29);
  //attiva seleziono il registro 0x00 (enable)
  Wire.write(0b10100000);
  //attiva
  Wire.write(0b00000011);
  Wire.endTransmission();
 
  //configuro il sensore gain e timing
  Wire.beginTransmission(0x29);
  //seleziono il registro 0x01 (Control)
  Wire.write(0b10100001);
  //imposto reset a 0 gain a 01 e timing a 000
  Wire.write(0b00010000);
  Wire.endTransmission();

  Wire.beginTransmission(0x29);
  //seleziono il registro 0x14
  Wire.write(0b10110100);
  Wire.endTransmission();

}

void loop() {

  //attendo almeno 100ms tra una lettura e l'altra
  delay(500);

  //leggo i dati dal registro 0x14 0x15 0x16 e 0x17
  Wire.requestFrom(0x29, 4);
  byte ByteLowVIS = Wire.read();
  byte ByteHighVIS = Wire.read();
  byte ByteLowIR = Wire.read();
  byte ByteHighIR = Wire.read();

  int valore = 0;

  //unisco i due byte del registro
  //0x14 con il registro 0x15
  valore = ByteHighVIS;
  valore &lt;&lt;= 8;
  valore |= ByteLowVIS;
  //invio il dato al serial monitor
  //luce visibile (CH0)
  Serial.print("LUCE VISIBILE ");
  Serial.println(valore);

  valore = 0;

  //unisco i due byte del registro
  //0x16 con il registro 0x17
  valore = ByteHighIR;
  valore &lt;&lt;= 8;
  valore |= ByteLowIR;
  //invio il dato al serial monitor
  //luce IR (CH1)
  Serial.print("LUCE IR ");
  Serial.println(valore);
}</pre>
<p>Caricando il codice otterremo  l&#8217;acquisizione dei dati:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-5046" src="https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Risultati.png" alt="TSL2591 CH0 e CH1 data register acquisition" width="288" height="326" srcset="https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Risultati.png 288w, https://logicaprogrammabile.it/wp-content/uploads/2016/02/TSL2591_Risultati-265x300.png 265w" sizes="auto, (max-width: 288px) 100vw, 288px" /></p>
<p>I risultati ottenuti sono valori grezzi che vengono recuperati direttamente dai registri di conversione. Tramite questi dati possiamo calcolare il valore della luminosità espresso in <strong>Lux</strong> oppure considerarli come semplici variazioni numeriche.</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-tsl2591-sensore-luminosita/">Come usare il sensore di luminosità TSL2591</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/arduino-tsl2591-sensore-luminosita/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>24LC256 utilizzare una memoria seriale su bus I2C</title>
		<link>https://logicaprogrammabile.it/utilizzare-una-memoria-seriale-24lc256/</link>
					<comments>https://logicaprogrammabile.it/utilizzare-una-memoria-seriale-24lc256/#comments</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Mon, 13 Jan 2014 23:06:15 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[Bus I2C]]></category>
		<category><![CDATA[I2C]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=3970</guid>

					<description><![CDATA[<p>Come usare una memoria 24LC256 su bus I2C Il limite di memoria di una scheda Arduino può essere superato utilizzando delle memorie esterne che permettono di aggiungere capacità di memorizzazione per tutte quelle applicazioni che richiedono la registrazione di dati. Possiamo scegliere tantissimi tipi di...</p>
<p>The post <a href="https://logicaprogrammabile.it/utilizzare-una-memoria-seriale-24lc256/">24LC256 utilizzare una memoria seriale su bus I2C</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Come usare una memoria 24LC256 su bus I2C</h3>
<p>Il limite di memoria di una scheda Arduino può essere superato utilizzando delle memorie esterne che permettono di aggiungere capacità di memorizzazione per tutte quelle applicazioni che richiedono la registrazione di dati. Possiamo scegliere tantissimi tipi di memorie a seconda del tipo di interfaccia (I2C, SPI, parallela&#8230;) e dalla loro capacità.</p>
<p>Per questo tutorial ho scelto una comunissima<strong> EEPROM Seriale</strong> prodotta da <strong>Microchip</strong>, la <strong>24LC256</strong>. Questa memoria può essere collegata alle schede Arduino tramite bus I2C e offre 256 Kbits di memoria (32KB). La pin function della memoria è rappresentata in figura:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2014/01/24LC256_PF.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3978" src="https://logicaprogrammabile.it/wp-content/uploads/2014/01/24LC256_PF.png" alt="24LC256" width="494" height="314" srcset="https://logicaprogrammabile.it/wp-content/uploads/2014/01/24LC256_PF.png 494w, https://logicaprogrammabile.it/wp-content/uploads/2014/01/24LC256_PF-300x190.png 300w" sizes="auto, (max-width: 494px) 100vw, 494px" /></a></p>
<p><span id="more-3970"></span></p>
<p>i pin <strong>A0</strong>, <strong>A1</strong>, <strong>A2</strong> permettono di specificare l&#8217;indirizzo del dispositivo sul bus I2C, i pin <strong>Vcc</strong> e <strong>Vss</strong> sono rispettivamente l&#8217;alimentazione (5Vdc) e la massa (Gnd), il pin <strong>WP</strong> (Write Protect) abilita (se collegato a Gnd) o disabilita (se collegato a Vcc) la scrittura della EEPROM, i pin <strong>SCL</strong> e <strong>SDA</strong> sono relativi al collegamento I2C.</p>
<p>secondo il datasheet del produttore possiamo riassumere alcune caratteristiche fondamentali:</p>
<table>
<tbody>
<tr>
<td>Massimo tempo di scrittura</td>
<td>5mS</td>
</tr>
<tr>
<td>Cicli di scrittura/lettura</td>
<td>100000</td>
</tr>
<tr>
<td>Conservazione dei dati</td>
<td>&gt;200 anni</td>
</tr>
<tr>
<td>Consumo di corrente in scrittura</td>
<td>3mA (alimentazione a 5Vdc)</td>
</tr>
<tr>
<td>Consumo di corrente in lettura</td>
<td>400uA (alimentazione a 5Vdc)</td>
</tr>
<tr>
<td>Consumo di corrente in stand-by</td>
<td>100nA (alimentazione a 5Vdc)</td>
</tr>
<tr>
<td>Intervallo di temperature versione industriale</td>
<td>da -40°C a +85°C</td>
</tr>
<tr>
<td>Intervallo di temperature versione automotive</td>
<td>da -40°C a +125°C</td>
</tr>
</tbody>
</table>
<p>Per questo tutorial ho utilizzato una <strong>Arduino Leonardo</strong>. La figura seguente mostra i collegamenti del circuito.</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2014/01/Schema.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3980" src="https://logicaprogrammabile.it/wp-content/uploads/2014/01/Schema.png" alt="Schema elettrico Leonardo 24LC256" width="398" height="349" srcset="https://logicaprogrammabile.it/wp-content/uploads/2014/01/Schema.png 398w, https://logicaprogrammabile.it/wp-content/uploads/2014/01/Schema-300x263.png 300w" sizes="auto, (max-width: 398px) 100vw, 398px" /></a></p>
<p>Nello schema possiamo osservare che i pin <strong>A0</strong>, <strong>A1</strong>, <strong>A2</strong> sono connessi a massa. Questi pin permettono di personalizzare l&#8217;indirizzo del dispositivo all&#8217;interno del bus I2C. Nel data sheet verifichiamo come viene formato il <strong>control byte address</strong>:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2014/01/AddressChip.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3989" src="https://logicaprogrammabile.it/wp-content/uploads/2014/01/AddressChip.png" alt="Control Byte Address" width="335" height="201" srcset="https://logicaprogrammabile.it/wp-content/uploads/2014/01/AddressChip.png 335w, https://logicaprogrammabile.it/wp-content/uploads/2014/01/AddressChip-300x180.png 300w" sizes="auto, (max-width: 335px) 100vw, 335px" /></a>i 4 bit più significativi sono preimpostati (<strong>Control Code</strong>) mentre i bit <strong>A0</strong>, <strong>A1</strong> e <strong>A2</strong> sono personalizzabili da noi. Il bit meno significativo <strong>R/W</strong>, serve per selezionare una operazione di scrittura o una operazione di lettura.<br />
Avendo a massa i pin A0, A1 e A2 i campi <strong>Chip Select Bits</strong> sono a zero. L&#8217;indirizzo del dispositivo è quindi il seguente:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2014/01/SetAddressChip.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3991" src="https://logicaprogrammabile.it/wp-content/uploads/2014/01/SetAddressChip.png" alt="Set address bit" width="334" height="116" srcset="https://logicaprogrammabile.it/wp-content/uploads/2014/01/SetAddressChip.png 334w, https://logicaprogrammabile.it/wp-content/uploads/2014/01/SetAddressChip-300x104.png 300w" sizes="auto, (max-width: 334px) 100vw, 334px" /></a></p>
<p style="text-align: left;">in esadecimale otteniamo il valore:</p>
<p style="text-align: center;"><strong>0x50</strong></p>
<p style="text-align: left;">Per poter eseguire operazioni di scrittura e lettura della memoria EEPROM del 24LC256, è necessario inviare, oltre al <strong>Control Byte</strong> (che specifica l&#8217;indirizzo del dispositivo nel busI2C), altri due byte che indicano l&#8217;indirizzo della locazione di memoria EEPROM del 24LC256 che vogliamo scrivere o leggere:</p>
<p style="text-align: left;"><a href="https://logicaprogrammabile.it/wp-content/uploads/2014/01/MemAddressAssignment.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3993" src="https://logicaprogrammabile.it/wp-content/uploads/2014/01/MemAddressAssignment.png" alt="Memoria EEPROM 24LC256" width="481" height="148" srcset="https://logicaprogrammabile.it/wp-content/uploads/2014/01/MemAddressAssignment.png 481w, https://logicaprogrammabile.it/wp-content/uploads/2014/01/MemAddressAssignment-300x92.png 300w" sizes="auto, (max-width: 481px) 100vw, 481px" /></a></p>
<p style="text-align: left;">il dispositivo <strong>24LC256</strong> possiede <strong>256Kbit</strong> di memoria, quindi le locazioni di memoria che possiamo scrivere e leggere sono<strong> 32000 byte</strong> (256000 / 8).<br />
Avendo a disposizione 2 byte per selezionare l&#8217;indirizzo (<strong>Address High Byte</strong> e <strong>Address Low Byte</strong>) possiamo utilizzare una <strong>variabile int</strong> (formata appunto da 2 Byte) che impiegheremmo per specificare il valore dell&#8217;indirizzo della locazione di memoria (da 0 a 31999).</p>
<p style="text-align: left;">La libreria <strong>Wire</strong> non permette comunque di passare un valore intero perciò potremmo semplicemente effettuare <a href="https://logicaprogrammabile.it/2012/operatori-spostare-bit/">una operazione bitwise</a> per dividere la variabile intera in due byte. Fortunatamente esistono già delle funzioni che semplificano questa operazione, <a href="http://arduino.cc/en/Reference/HighByte" target="_blank" rel="noopener">highByte </a>e <a href="http://arduino.cc/en/Reference/LowByte" target="_blank" rel="noopener">lowByte</a>.</p>
<p style="text-align: left;">Il codice di esempio seguente permette di scrivere tutti i  32000 byte della mem0rie a di eseguire una lettura degli stessi:</p>
<pre class="lang:arduino decode:true  ">#include &lt;Wire.h&gt;

int indirizzo = 0;
int data = 0;
int ciclo = 0;
void setup()
{
  //init seriale
  Serial.begin(9600);
  //per la Arduino Leonardo devo
  //attendere l'inizializzazione del modulo
  while (!Serial)
  {
    ;
  }

  //attendo ulteriori 5 secondi
  //prima di inviare un dato sulla seriale
  delay(5000);
  //invio un messaggio al serial monitor
  Serial.println("Start");
  //inizializzo la porta I2C della Arduino
  Wire.begin();
}

void loop()
{
  //avviso dell'inizio della
  //scrittura dei dati sulla seriale
  Serial.println("Inizio Scrittura");
  //init variabile
  indirizzo = 0;
  //eseguo ciclicamente la scrittura di
  //tutte e 32000 locazioni di memoria
  for (ciclo = 0; ciclo &amp; lt; 32000; ciclo++)
  {
    //invio il control byte specificando
    //una richiesta di scrittura
    Wire.beginTransmission(0x50);
    //invio due byte contenenti l'indirizzo della
    //locazione di memoria che voglio scrivere un byte
    Wire.write(highByte(indirizzo));
    Wire.write(lowByte(indirizzo));
    //scrivo un byte nella locazione di memoria
    //precedentemente selezionata
    Wire.write(byte(data));
    //fine trasmissione
    Wire.endTransmission();
    //incrementa il valore di data
    data++;
    //quando la variabile data arriva a 255
    //resetto il suo valore a zero
    if (data == 255)
      data = 0;

    //incrementa il valore dell'indirizzo
    indirizzo++;
    //attendi 5ms per poter terminare le operazioni di
    //scrittura sulla memoria
    delay(5);
  }

  //avvisami quando la scrittura di 32000 byte
  //è terminata
  Serial.println("Fine Scrittura");
  //attendi 1/2 secondo
  delay(500);
  //avvisami dell'inizio della lettura
  Serial.println("Inizio lettura");

  //init variabile
  indirizzo = 0;
  for (ciclo = 0; ciclo &amp; lt; 32000; ciclo++)
  {
    //invio il control byte specificando
    //una richiesta di scrittura
    Wire.beginTransmission(0x50);
    //invio due byte per selezionare la locazione
    //di memoria da leggere
    Wire.write(highByte(indirizzo));
    Wire.write(lowByte(indirizzo));
    Wire.endTransmission();
    //incremento la variabile indirizzo
    indirizzo++;
    //richiedo un byte al 24LC256
    Wire.requestFrom(0x50, 1);
    //attendo la disponibilità di dati sul bus i2c

    while (Wire.available())
    {
      Serial.print(ciclo);
      Serial.print(": ");
      //leggo dal bus il dato relativo alla
      //locazione di memoria precedentemente specificata
      byte c = Wire.read();
      //invio il dato al serial monitor
      Serial.println(c);
    }
  }
  delay(1000);
}
</pre>
<p>&nbsp;</p>
<p style="text-align: left;">la scrittura di 32000 byte richiederà qualche minuto poiché il codice impiega circa 5ms per scrivere un byte (32000 * 0.005 =&gt; 160 secondi). La lettura invece risulta più fluida ed è anche influenzata dalla velocità della seriale, che per questo esempio è impostata a 9600bps.</p>
<p style="text-align: left;">
<p>The post <a href="https://logicaprogrammabile.it/utilizzare-una-memoria-seriale-24lc256/">24LC256 utilizzare una memoria seriale su bus I2C</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/utilizzare-una-memoria-seriale-24lc256/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Comunicazione tra Arduino tramite I2C</title>
		<link>https://logicaprogrammabile.it/comunicazione-tra-arduino-tramite-i2c/</link>
					<comments>https://logicaprogrammabile.it/comunicazione-tra-arduino-tramite-i2c/#comments</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Wed, 10 Oct 2012 12:49:36 +0000</pubDate>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[Bus I2C]]></category>
		<category><![CDATA[comunicazione tra circuiti]]></category>
		<category><![CDATA[I2C]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=3081</guid>

					<description><![CDATA[<p>Come collegare due Arduino usando il bus I2C. Una caratteristica che reputo molto interessante è la possibilità di espandere Arduino tramite l&#8217;uso di shield. La maggior parte di queste schede aggiuntive sono però progettate per compiere una funzione specifica, non programmabile. Esistono alcuni metodi che...</p>
<p>The post <a href="https://logicaprogrammabile.it/comunicazione-tra-arduino-tramite-i2c/">Comunicazione tra Arduino tramite I2C</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Come collegare due Arduino usando il bus I2C.</h3>
<p>Una caratteristica che reputo molto interessante è la possibilità di espandere Arduino tramite l&#8217;uso di shield. La maggior parte di queste schede aggiuntive sono però progettate per compiere una funzione specifica, non programmabile.<br />
Esistono alcuni metodi che permettono di comunicare con altri dispositivi utilizzando come canale di trasmissione dati i protocolli seriali (I2C, SPI o RS232). Questo rende possibile demandare ad una scheda slave funzioni di elaborazione gravose, che non vogliamo far eseguire alla scheda master. Ho realizzato questo piccolo tutorial usando il bus I2C per creare uno scambio dati tra un Arduino ed un chip ATmega328 standalone.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3088" title="Bus_i2c" src="https://logicaprogrammabile.it/wp-content/uploads/2012/10/Bus_i2c.png" alt="Bus i2c" width="630" height="255" srcset="https://logicaprogrammabile.it/wp-content/uploads/2012/10/Bus_i2c.png 630w, https://logicaprogrammabile.it/wp-content/uploads/2012/10/Bus_i2c-300x121.png 300w" sizes="auto, (max-width: 630px) 100vw, 630px" /></p>
<p>Il bus I2C, basandosi su due fili, non permette la comunicazione contemporanea tra Master e Slave. Lo scambio dati deve essere gestito dal Master tramite gli indirizzi (univoci) degli slave. Il flusso può essere sintetizzato in questo modo</p>
<ol>
<li>Il Master invia sul bus un bit di start</li>
<li>Il Master invia sul bus l&#8217;indirizzo dello slave con cui vuole comunicare</li>
<li>Il Master decide se scrivere o leggere dal dispositivo</li>
<li>Lo Slave legge o scrive in base alla richiesta del Master</li>
</ol>
<p><span id="more-3081"></span></p>
<p>La <a href="http://arduino.cc/en/Reference/Wire" target="_blank">libreria Wire</a> dispone di tutte le funzioni necessarie alla realizzazione Master-Slave tra due schede Arduino. Lo schema del circuito che ho realizzato è visibile nella figura seguente.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3094" title="I2C_Master_Slave" src="https://logicaprogrammabile.it/wp-content/uploads/2012/10/I2C_Master_Slave.png" alt="Collegamento Master Slave tra due Arduino UNO" width="423" height="391" srcset="https://logicaprogrammabile.it/wp-content/uploads/2012/10/I2C_Master_Slave.png 423w, https://logicaprogrammabile.it/wp-content/uploads/2012/10/I2C_Master_Slave-300x277.png 300w" sizes="auto, (max-width: 423px) 100vw, 423px" /></p>
<p>Come detto precedentemente lo schema si basa su Arduino Uno impiegato come Master e con un ATmega328 impiegato come slave.</p>
<p>Il codice permette di inviare un dato numerico allo slave, che provvederà ad incrementarlo per poi rispedirlo al Master.</p>
<p>[c]<br />
//MASTER<br />
#include &lt;Wire.h&gt;</p>
<p>byte x = 0;<br />
byte num = 0;</p>
<p>void setup()<br />
{<br />
  //inizializzo la libreria Wire come Master<br />
  Wire.begin();</p>
<p>  //init seiale<br />
  Serial.begin(9600);<br />
  //avviso che il programma è avviato<br />
  Serial.println(&quot;START&quot;);</p>
<p>}</p>
<p>void loop()<br />
{<br />
  //invio sul bus I2C un byte al device<br />
  //che ha come indirizzo il valore 0x04<br />
  //start trasmissione<br />
  Wire.beginTransmission(0x04);<br />
  //invio un byte<br />
  Wire.write(x);<br />
  //fine trasmissione<br />
  Wire.endTransmission();</p>
<p>  delayMicroseconds(500);</p>
<p>  //richiedo un byte allo slave che ha indirizzo 0x04<br />
  Wire.requestFrom(0x04, 1);</p>
<p>  //attendo la disponibilità di dati sul bus i2c<br />
  while(Wire.available())<br />
  {<br />
    //quando è presente un dato avvia<br />
    //la lettura<br />
    num = Wire.read();<br />
  }</p>
<p>  //incrementa il valore del byte<br />
  x++;</p>
<p>  //verifico che il byte letto dallo slave sia stato<br />
  //incrementato<br />
  if(num != x)<br />
    Serial.println(&quot;ERRORE&quot;);</p>
<p>  delay(5);</p>
<p>}</p>
<p>[/c]</p>
<p>Il codice seguente è relativo allo Slave</p>
<p>[c]<br />
//SLAVE<br />
#include &lt;Wire.h&gt;</p>
<p>byte x = 0;</p>
<p>void setup()<br />
{<br />
  //inizializzo la libreria<br />
  //imposto l&#8217;indirizzo dello slave<br />
  Wire.begin(0x04);</p>
<p>  //eventi per la ricezione del dato<br />
  //e per la richiesta del dato<br />
  Wire.onReceive(receiveEvent);<br />
  Wire.onRequest(requestEvent);<br />
}</p>
<p>void loop()<br />
{<br />
  //esegui qualcosa<br />
  delay(1000);<br />
}</p>
<p>void receiveEvent(int data)<br />
{<br />
 //questo evento viene generato quando sul bus<br />
 //è presente un dato da leggere</p>
<p> //eseguo la lettura<br />
  x = Wire.read();</p>
<p>  //elaboro il dato letto<br />
  x++;<br />
}</p>
<p>void requestEvent()<br />
{<br />
  //questo evento viene generato quando il master<br />
  //richiede ad uno specifico slave<br />
  //una richiesta di dati</p>
<p>  //spedisco il dato al Master<br />
  Wire.write(x);</p>
<p>}</p>
<p>[/c]</p>
<p>I commenti presenti nel codice permettono di capire ciò che avviene tra i due dispositivi.</p>
<p>Di seguito uno screenshot dei dati scambiati sul bus</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3107" title="TEK00004" src="https://logicaprogrammabile.it/wp-content/uploads/2012/10/TEK00004.png" alt="Scambio dati master slave su bus i2c" width="640" height="480" srcset="https://logicaprogrammabile.it/wp-content/uploads/2012/10/TEK00004.png 640w, https://logicaprogrammabile.it/wp-content/uploads/2012/10/TEK00004-300x225.png 300w" sizes="auto, (max-width: 640px) 100vw, 640px" /></p>
<p>Di seguito invece la trasmissione del Master</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3108" title="TEK00005" src="https://logicaprogrammabile.it/wp-content/uploads/2012/10/TEK00005.png" alt="Trasmissione i2c Master" width="640" height="480" srcset="https://logicaprogrammabile.it/wp-content/uploads/2012/10/TEK00005.png 640w, https://logicaprogrammabile.it/wp-content/uploads/2012/10/TEK00005-300x225.png 300w" sizes="auto, (max-width: 640px) 100vw, 640px" /></p>
<p>The post <a href="https://logicaprogrammabile.it/comunicazione-tra-arduino-tramite-i2c/">Comunicazione tra Arduino tramite I2C</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/comunicazione-tra-arduino-tramite-i2c/feed/</wfw:commentRss>
			<slash:comments>15</slash:comments>
		
		
			</item>
		<item>
		<title>Netduino e bus I2C, collegamento al sensore MCP9803</title>
		<link>https://logicaprogrammabile.it/netduino-bus-i2c-collegamento-sensore-mcp9803/</link>
					<comments>https://logicaprogrammabile.it/netduino-bus-i2c-collegamento-sensore-mcp9803/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Thu, 14 Apr 2011 08:25:01 +0000</pubDate>
				<category><![CDATA[Tutorial Netduino]]></category>
		<category><![CDATA[Bus I2C]]></category>
		<category><![CDATA[MCP9803]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=787</guid>

					<description><![CDATA[<p>MCP9803 leggere i registri del sensore di temperatura Continuiamo gli articoli sul bus I2C, utilizzando sempre il nostro amato sensore di temperatura MCP9803. Questa volta ho utilizzato il Netduino per &#8216;colloquiare&#8217; con il sensore per fare un po di &#8216;pratica&#8217; con le varie classi esposte...</p>
<p>The post <a href="https://logicaprogrammabile.it/netduino-bus-i2c-collegamento-sensore-mcp9803/">Netduino e bus I2C, collegamento al sensore MCP9803</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>MCP9803 leggere i registri del sensore di temperatura</h1>
<p>Continuiamo gli articoli sul bus <strong>I2C</strong>, utilizzando sempre il nostro amato sensore di temperatura <strong>MCP9803</strong>. Questa volta ho utilizzato il <strong>Netduino</strong> per &#8216;colloquiare&#8217; con il sensore per fare un po di &#8216;pratica&#8217; con le varie classi esposte dal <strong>.Net micro framework</strong> che permettono di utilizzare il bus <strong>I2C</strong>.</p>
<p>Devo dire che con <strong>MikroC</strong> ho un controllo maggiore (giustamente) sulla comunicazione con il sensore. L&#8217;esperienza con <strong>Netduino</strong> invece mi ha lasciato un po perplesso, forse è una mia impressione ma avrei preferito un codice più snello, forse più a basso livello.</p>
<p>Lo schema elettrico che ho creato per questa esperienza è il seguente:</p>
<p><img loading="lazy" decoding="async" class="aligncenter wp-image-2189 size-full" title="Netduino_MCP98031" src="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Netduino_MCP98031.gif" width="643" height="336" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/04/Netduino_MCP98031.gif 643w, https://logicaprogrammabile.it/wp-content/uploads/2011/04/Netduino_MCP98031-300x156.gif 300w" sizes="auto, (max-width: 643px) 100vw, 643px" /></p>
<p><span id="more-787"></span>Anche in questo caso i pin A0 A1 A2 servono per personalizzare l&#8217;indirizzo del sensore. Il pin1(SDA) del sensore è collegato al pin4(SDA) del Netduino. Il pin2(SCLK) del sensore è collegato al pin5(SCL) del Netduino.<br />
Il circuito invia i dati al pc utilizzando la porta seriale. Lo schema per la comunicazione seriale è quello utilizzato negli <a title="Netduino e collegamento alla seriale(RS232) del pc" href="https://logicaprogrammabile.it/netduino-e-collegamento-alla-serialers232-del-pc/">esperimenti precedenti</a>.</p>
<p>Il codice seguente riassume tutte le fasi necessarie per leggere il valore della temperatura dal Temperature Register del sensore MCP9803.</p>
<pre class="lang:c# decode:true ">using System;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;

using System.IO.Ports;
using System.Text;

namespace NetduinoApplication1
{
public class Program
{
public static void Main()
{
Byte[] tx = new Byte[1];
Byte[] rx = new Byte[2];

SerialPort UART1 = new SerialPort("COM1", 9600, Parity.None,
8, StopBits.One);
//apro la porta seriale
UART1.Open();

//Configurazione contenente l'indirizzo del sensore e la frequenza
//di del bus i2c
I2CDevice.Configuration cnf = new I2CDevice.Configuration(0x48, 400);

//Creo un oggetto per eseguire le richieste di lettura e scrittura
I2CDevice sensore = new I2CDevice(cnf);

//creo un oggetto I2CReadTransaction che viene associato al buffere rx
I2CDevice.I2CReadTransaction[] rd = new I2CDevice.I2CReadTransaction[]
{I2CDevice.CreateReadTransaction(rx)};

//creo un oggetto I2CWriteTransaction che viene associato al buffere tx
I2CDevice.I2CWriteTransaction[] wr = new I2CDevice.I2CWriteTransaction[]
 {I2CDevice.CreateWriteTransaction(tx)};

//Ciclo infinito
while (true)
{
//eseguo una richiesta di lettura
sensore.Execute(rd, 100);
//invio i dati sulla seriale
UART1.Write(rx, 0, rx.Length);
//attendo 2 secondi
Thread.Sleep(2000);
}

UART1.Close();
}
}
}</pre>
<p>&nbsp;</p>
<p>L&#8217;esempio è molto sintetico e tutto il codice ruota attorno alla classe <strong>I2CDevice</strong>.</p>
<p>Per utilizzare il modulo I2C del Netduino dobbiamo prima creare un oggetto di configurazione tramite la classe I2CDevice.Configuration. I parametri da passare al costruttore sono due, uno riguarda l&#8217;indirizzo del sensore (ottenuto con i 4 bit fissi preimpostati dalla casa costruttrice e i tre scelti dall&#8217;utente, A0 A1 A2, che nel nostro caso sono 1001 + 000 = 1001000 = 0x48 in esadecimale) e l&#8217;altro la frequenza di clock del segnale SCL (che stabilisce la velocità di comunicazione) impostato a 400Khz.<br />
Ora creo un oggetto I2CDevice necessario per eseguire le richieste di lettura e scrittura sul bus I2C. Il costruttore richiede come parametro l&#8217;oggetto I2CDevice.Configuration (nel nostro caso l&#8217;oggetto cnf creato precedentemente).</p>
<p>Per leggere e scrivere dal bus I2C dobbiamo creare due oggetti I2CTransaction, il primo associa al comando di lettura il buffer dove verranno contenuti i byte letti dal sensore, il secondo associa al comando di scrittura il buffer dove sono contenuti i dati da inviare al sensore.</p>
<p><strong>Netduino</strong> esegue ciclicamente (ciclo while) il metodo Execute relativo all&#8217;oggetto sensore. I parametri da passare al metodo sono l&#8217;oggetto I2CTransaction (che può essere quello di lettura o scrittura) e il tempo di timeout della richiesta.</p>
<p>Nell0 specifico il comando <em>sensore.Execute(rd, 100);</em> esegue una lettura sul bus I2C, l&#8217;oggetto rd permette di scrivere i dati letti dal sensore nel buffer rx.</p>
<p>Infine Netduino invia sulla seriale i byte relativi al registro di temperatura del sensore <strong>MCP9803</strong>.</p>
<p>Il .net micro framework rende semplice l&#8217;uso del bus I2C occupandosi di impostare il bit per la lettura/scrittura e per la gestione degli acknowledgee.<br />
In pratica ci dobbiamo solo occupare di specificare l&#8217;indirizzo del sensore e la grandezza dei buffer di lettura e scrittura.</p>
<p>Come sempre suggerimenti e critiche sono sempre graditi.</p>
<p>&nbsp;</p>
<div id="_mcePaste" class="mcePaste" style="position: absolute; left: -10000px; top: 754px; width: 1px; height: 1px; overflow: hidden;">Byte[] tx = new Byte[1];<br />
Byte[] rx = new Byte[2];SerialPort UART1 = new SerialPort(&#8220;COM1&#8221;, 9600, Parity.None,<br />
8, StopBits.One);<br />
UART1.Open();// Create a new I2C bus instance at startup.<br />
I2CDevice.Configuration cnf = new I2CDevice.Configuration(0x48, 400);<br />
I2CDevice sensore = new I2CDevice(cnf);<br />
I2CDevice.I2CReadTransaction[] rd = new I2CDevice.I2CReadTransaction[] {I2CDevice.CreateReadTransaction(rx)};<br />
I2CDevice.I2CWriteTransaction[] wr = new I2CDevice.I2CWriteTransaction[] {I2CDevice.CreateWriteTransaction(tx)};while (true)<br />
{<br />
sensore.Execute(rd, 100);<br />
UART1.Write(rx, 0, rx.Length);Thread.Sleep(2000);<br />
}UART1.Close();</div>
<p>The post <a href="https://logicaprogrammabile.it/netduino-bus-i2c-collegamento-sensore-mcp9803/">Netduino e bus I2C, collegamento al sensore MCP9803</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/netduino-bus-i2c-collegamento-sensore-mcp9803/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
