<?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>DataLogger Archives - Esperimenti con logiche programmabili</title>
	<atom:link href="https://logicaprogrammabile.it/tag/datalogger/feed/" rel="self" type="application/rss+xml" />
	<link>https://logicaprogrammabile.it/tag/datalogger/</link>
	<description>Tutorial in italiano per imparare a programmare usando Arduino, Raspberry PI, Netduino</description>
	<lastBuildDate>Fri, 26 Aug 2022 13:29:39 +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>DataLogger Archives - Esperimenti con logiche programmabili</title>
	<link>https://logicaprogrammabile.it/tag/datalogger/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Datalogger con Raspberry SQLite e Arduino</title>
		<link>https://logicaprogrammabile.it/datalogger-remoto-raspberry-sqlite-arduino/</link>
					<comments>https://logicaprogrammabile.it/datalogger-remoto-raspberry-sqlite-arduino/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Sun, 28 Aug 2022 06:00:30 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[Tutorial Raspberry PI]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[DataLogger]]></category>
		<category><![CDATA[dht11]]></category>
		<category><![CDATA[Ethernet Shield]]></category>
		<category><![CDATA[raspberry]]></category>
		<category><![CDATA[Sqlite]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=6691</guid>

					<description><![CDATA[<p>Costruire un datalogger remoto con Raspberry e Arduino Codice Python sul Raspberry SQLite Codice sull&#8217;Arduino MKR Zero Il progetto che ho realizzato riguarda il monitoraggio di temperatura e umidità all&#8217;interno di un locale tecnico. I dati rilevati da un sensore DHT22 vengono acquisti da una...</p>
<p>The post <a href="https://logicaprogrammabile.it/datalogger-remoto-raspberry-sqlite-arduino/">Datalogger con Raspberry SQLite e Arduino</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Costruire un datalogger remoto con Raspberry e Arduino</h1>
<ul>
<li><a href="#Raspberry_Sqlite">Codice Python sul Raspberry SQLite</a></li>
<li><a href="#Arduino_MKR_Zero">Codice sull&#8217;Arduino MKR Zero</a></li>
</ul>
<p>Il progetto che ho realizzato riguarda il monitoraggio di temperatura e umidità all&#8217;interno di un locale tecnico. I dati rilevati da un <a href="https://amzn.to/3q5qLpr" target="_blank" rel="noopener">sensore DHT22</a> vengono acquisti da una <a href="https://amzn.to/3cpgcu0" target="_blank" rel="noopener">Arduino MKR Zero</a> e tramite una <a href="https://amzn.to/3ArbPGB" target="_blank" rel="noopener">shield MKR ETH</a> inviati a un computer <a href="https://amzn.to/3R8XhSU" target="_blank" rel="noopener">Raspberry PI 4</a> che dopo averli acquisiti li memorizza all&#8217;interno di una tabella <a href="https://sqlite.org/index.html" target="_blank" rel="noopener">SQLite</a>.</p>
<p>Il protocollo utilizzato per l&#8217;invio dei dati si basa su UDP come abbiamo <a href="https://logicaprogrammabile.it/comunicazione-python-udp-computer-raspberry/" target="_blank" rel="noopener">visto in questo articolo</a>.</p>
<p><img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-6740" src="https://logicaprogrammabile.it/wp-content/uploads/2022/08/Ardu_Raspi.png" alt="Arduino Raspberry sqlite" width="458" height="451" srcset="https://logicaprogrammabile.it/wp-content/uploads/2022/08/Ardu_Raspi.png 458w, https://logicaprogrammabile.it/wp-content/uploads/2022/08/Ardu_Raspi-300x295.png 300w, https://logicaprogrammabile.it/wp-content/uploads/2022/08/Ardu_Raspi-150x148.png 150w, https://logicaprogrammabile.it/wp-content/uploads/2022/08/Ardu_Raspi-80x80.png 80w" sizes="(max-width: 458px) 100vw, 458px" /></p>
<p>I dati sarebbero potuti essere memorizzati in un semplice file di testo ma ho preferito usare un database in modo tale da estrarli in modo rapido utilizzando semplici query. Il database contiene per ora una tabella contenente i seguenti campi:</p>
<table align="center">
<tbody>
<tr>
<th>Nome Campo</th>
<th>Tipo Campo</th>
</tr>
<tr>
<td>ID</td>
<td>
<div>
<div>INTEGER PRIMARY KEY AUTOINCREMENT</div>
</div>
</td>
</tr>
<tr>
<td>Data</td>
<td>
<div>
<div>TIMESTAMP DEFAULT CURRENT_TIMESTAMP</div>
</div>
</td>
</tr>
<tr>
<td>
<div>
<div>Temperatura</div>
</div>
</td>
<td>
<div>
<div>VARCHAR(50) NOT NULL</div>
</div>
</td>
</tr>
<tr>
<td>
<div>
<div>Umidita</div>
</div>
</td>
<td>
<div>
<div>VARCHAR(50) NOT NULL</div>
</div>
</td>
</tr>
</tbody>
</table>
<p id="Raspberry_Sqlite">Il codice seguente gira sul Raspberry Pi 4; ho inserito diversi commenti che spiegano le varie istruzioni contenute nel programma:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import sqlite3
import socket
import threading
import time

#IP computer locale
UDP_IP_ADDR = "192.168.178.50"
#Porta computer locale
UDP_PORT_NUMBER = 20002

ip_port_Data = (UDP_IP_ADDR, UDP_PORT_NUMBER)
   
def client_Receive_Data():
    print("Avvio THREAD Receive Data...")
    serversocket1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    serversocket1.bind(("192.168.178.30", 20001))
    msgToSend = str.encode("DB_OK")
    
    #crea connessione al database
    connection = sqlite3.connect('lopro.db')
    cursor = connection.cursor()
        
    try:            
        while True:            
            data, address = serversocket1.recvfrom(1024)
            strData = bytes.decode(data).split(":")
         
            sql = """ INSERT INTO tbl_log(Temperatura, Umidita) VALUES ('{}', '{}');""".format(strData[0], strData[1])
            
            print(sql)
            
            cursor.execute(sql)
            connection.commit()

            #invia al device una risposta
            serversocket1.sendto(msgToSend, ip_port_Data)
            time.sleep(1)
    except:
        print("errore")
        msgToSend = str.encode("ERRORE")
        serversocket1.sendto(msgToSend, ip_port_Data)
        connection.close()

def crea_tabella():
    #una volta creata la tabella possiamo evitare di chiamare
    #questa funzione ad ogni esecuzione del programma
    #crea connessione al database
    connection = sqlite3.connect('lopro.db')
    cursor = connection.cursor()
 
    #Se esiste la tabella cancellala
    #cursor.execute("DROP TABLE IF EXISTS tbl_log")
 
    # Crea la tabella se non esiste
    table = """ CREATE TABLE IF NOT EXISTS tbl_log (
            ID INTEGER PRIMARY KEY AUTOINCREMENT,
            Data TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
            Temperatura VARCHAR(50) NOT NULL,
            Umidita VARCHAR(50) NOT NULL      
        ); """
 
    cursor.execute(table)
    cursor.close()
    connection.close()

 
def list_rows():
    print("list rows..")
    #crea connessione al database
    connection = sqlite3.connect('lopro.db')

    sql = """ SELECT * FROM tbl_log;"""

    cursor = connection.cursor()
    cursor.execute(sql)
    rows = cursor.fetchall()

    for row in rows:
        print(row)

    # Close the connection
    connection.close()

if __name__=="__main__":
    #Rimuovere il commento per creare la tabella
    #crea_tabella()
    #list_rows()
    #Avvio un thred
    print("Start program")
    t1 = threading.Thread(target=client_Receive_Data)
    t1.start()</pre>
<p id="Arduino_MKR_Zero">Questo è invece il codice che gira sulla Arduino MKR Zero; ho inserito diversi commenti che spiegano le varie istruzioni contenute nel programma:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="cpp">#include &lt;SPI.h&gt;
#include &lt;Ethernet.h&gt;
#include &lt;EthernetUdp.h&gt;
#include &lt;DHT.h&gt;

#define DHTPIN 6
#define DHTTYPE DHT22

// creo un MAC address e un IP address per la scheda Arduino
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 178, 50);

//creo un ip address per il raspberry
IPAddress ip_remote(192, 168, 178, 30);
//creo una porta per la scheda Arduino
unsigned int localPort = 20002; 

//creo degli array di char per la ricezione e l'invio dei
//dati via udp
char packetBuffer[UDP_TX_PACKET_MAX_SIZE];
char chrBuffer[11];

//altre variabili 
String strTempUmid = "";
byte ciclo = 0;

// Creo degli oggetti per l'utilizzo di udp e del 
//sensore dht
EthernetUDP Udp;
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  //inizializzo lo shield mkr eth
  Ethernet.init(5);

  //inizializzo la scheda di rete
  Ethernet.begin(mac, ip);

  //inizializzo la seriale
  Serial.begin(9600);
  
  // verifico la ethernet shield
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("MKR ETH non presente o configurata in modo errato!");
    while (true) {
      delay(1);
    }
  }

  //inizializzo l'oggetto udp
  Udp.begin(localPort);
  //inizializzo l'oggetto dht
  dht.begin();
}

void loop() {

  //verifico presenza pacchetti udp in arrivo
  int packetSize = Udp.parsePacket();
  
  //se coi sono pacchetti
  if (packetSize) {
    //Serial.println(packetSize);
    //leggo i pacchetti e gli inserisco nell'array di char
    Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
    //printo i dati ricevuti
    Serial.println(packetBuffer);
  }

  //leggo umidità e temperatura dal sensore dht
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  //creo una stringa del tipo temp:umid
  strTempUmid = "";
  strTempUmid.concat(t);
  strTempUmid.concat(":");
  strTempUmid.concat(h);
  //printo la stringa sul ser mon
  Serial.println(strTempUmid);
  //converto la stringa in un array di char
  strTempUmid.toCharArray(chrBuffer, strTempUmid.length());

  //inizializzo la connessione con ip e porta del Raspberry
  Udp.beginPacket(ip_remote, 20001);
  //Scrivo i dati nel buffer
  Udp.write(chrBuffer);
  //invio i dati
  Udp.endPacket();

  //attendo un minuto prima del prossimo invio
  for (ciclo = 0; ciclo &lt; 60; ciclo++)
    delay(1000);

}</pre>
<p>Ogni minuto viene inviata una unica stringa contenente i dati di temperatura e umidita che il codice python provvederà a separate in due dati distinti per essere caricati sul database.</p>
<h2>Memorizzare solo le variazioni significative su Raspberry SQLite</h2>
<p>Possiamo ottimizzare lo spazio sulla tabella (e di conseguenza sul filesystem del Raspberry) memorizzando solo i dati che hanno una variazione significativa. In questo modo il monitoraggio rimane costante perché comunque l&#8217;Arduino legge e invia i dati ogni minuto ma posso risparmiare spazio sul database salvando solo le variazioni significative. Sulla tabella memorizzo anche il timestamp e quindi posso ricostruire l&#8217;andamento di temperatura e umidità interpolando i dati.</p>
<p>Il codice seguente mostra la modifica alla funzione client_Receive_Data() in modo tale da memorizzare solo i dati che hanno una variazione di 0.5 rispetto ai dati della lettura precedente rilevata dalla scheda Arduino:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def client_Receive_Data():
    print("Avvio THREAD Receive Data...")
    serversocket1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    serversocket1.bind(("192.168.178.30", 20001))
        
    # crea connessione al database
    connection = sqlite3.connect('lopro.db')
    cursor = connection.cursor()
    #creo due variabili per memorizzare i dati delle 
    #letture di temp e umid
    temp_prec = 0
    umid_prec = 0
    
    try:
        while True:
            data, address = serversocket1.recvfrom(1024)
            strData = bytes.decode(data).split(":")

            #verifico se i dati appena letti differiscono di 0.5 dai valori della lettuare precedente
            if (abs(temp_prec - float(strData[0])) &gt; 0.5) or (abs(umid_prec - float(strData[1])) &gt; 0.5) :
                print("Variazione di Temp e Hum")  
                sql = """ INSERT INTO tbl_log(Temperatura, Umidita) VALUES ('{}', '{}');""".format(strData[0], strData[1])

                #memorizzo i dati per poterli confrontare con quelli
                #che arrivano dalla scheda arduino
                temp_prec = float(strData[0])
                umid_prec = float(strData[1])
                #visualizzo la stringa sql
                print(sql)
                #eseguo la stringa sql insert avviando una transazione
                cursor.execute(sql)
                #confermo la transazione
                connection.commit()
                
                # invia al device una risposta
                msgToSend = str.encode("DB_OK")
                serversocket1.sendto(msgToSend, ip_port_Data)
            else:
                print("Nessuna variazione di Temp e Hum")  
                # invia al device una risposta
                msgToSend = str.encode("DB_NOK")
                serversocket1.sendto(msgToSend, ip_port_Data)
            
            time.sleep(1)
    except:
        print("errore")
        msgToSend = str.encode("ERRORE")
        serversocket1.sendto(msgToSend, ip_port_Data)
        connection.close()</pre>
<p>L&#8217;utilizzo congiunto di Raspberry e Arduino ci permette di realizzare progetti che superano i limiti dati dalle singole schede.</p>
<p>&nbsp;</p>
<p>The post <a href="https://logicaprogrammabile.it/datalogger-remoto-raspberry-sqlite-arduino/">Datalogger con Raspberry SQLite e Arduino</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/datalogger-remoto-raspberry-sqlite-arduino/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Come usare l&#8217;integrato PCF8591</title>
		<link>https://logicaprogrammabile.it/arduino-usare-integrato-pcf8591/</link>
					<comments>https://logicaprogrammabile.it/arduino-usare-integrato-pcf8591/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Wed, 23 Oct 2013 14:28:26 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[DataLogger]]></category>
		<category><![CDATA[I2C]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=3854</guid>

					<description><![CDATA[<p>Utilizzare Arduino per controllare l&#8217;integrato PCF8591 L&#8217;integrato PCF8591 prodotto da NXP dispone di 4 ingressi analogici con risoluzione di 8 bit e di una uscita analogica sempre ad 8 bit. La sua gestione avviene tramite bus I2C, permettendo così il collegamento nel bus di diversi...</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-usare-integrato-pcf8591/">Come usare l&#8217;integrato PCF8591</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Utilizzare Arduino per controllare l&#8217;integrato PCF8591</h1>
<p>L&#8217;integrato <strong>PCF8591</strong> prodotto da NXP dispone di <strong>4 ingressi analogici</strong> con risoluzione di 8 bit e di <strong>una uscita analogica</strong> sempre ad <strong>8 bit</strong>. La sua gestione avviene tramite<strong> bus I2C</strong>, permettendo così il collegamento nel bus di diversi integrati (per un massimo di 127 unità). Avendo una gestione software semplice ed un costo intorno ai 3€ viene impiegato in diversi <strong>shield Arduino</strong> per aumentare il numero di <strong>porte ADC</strong>, inoltre la presenza di una uscita analogica programmabile (DAC) permette di generare segnali utili in diversi progetti e applicazioni.</p>
<p>Nella figura seguente viene mostrato lo schema a blocchi del <strong>PCF8591:</strong></p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/10/SchedaBlocchiPCF8591P.png"><img decoding="async" class="aligncenter size-full wp-image-3860" src="https://logicaprogrammabile.it/wp-content/uploads/2013/10/SchedaBlocchiPCF8591P.png" alt="Schema Blocchi PCD8591P" width="640" height="373" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/10/SchedaBlocchiPCF8591P.png 640w, https://logicaprogrammabile.it/wp-content/uploads/2013/10/SchedaBlocchiPCF8591P-300x174.png 300w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>
<p><span id="more-3854"></span></p>
<p>Per specificare l&#8217;<strong>indirizzo</strong> del dispositivo all&#8217;interno del <strong>bus I2C</strong> vengono impiegati i<strong> pin A0, A1 e A2</strong>. La scelta del canale ADC che vogliamo impiegare avviene tramite il registro control byte, configurabile via software come anche la gestione dell&#8217;uscita analogica, che in questo tutorial non verrà trattata.</p>
<p>Il circuito di esempio che  utilizza un integrato PCF8591P ed un Arduino UNO, di seguito lo schema:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/10/SchemaElettricoPCF8591P.png"><img decoding="async" class="aligncenter size-full wp-image-3866" src="https://logicaprogrammabile.it/wp-content/uploads/2013/10/SchemaElettricoPCF8591P.png" alt="Schema Elettrico PCF8591P" width="414" height="295" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/10/SchemaElettricoPCF8591P.png 414w, https://logicaprogrammabile.it/wp-content/uploads/2013/10/SchemaElettricoPCF8591P-300x213.png 300w" sizes="(max-width: 414px) 100vw, 414px" /></a></p>
<p>I <strong>pin A0, A1,e A2</strong> sono collegati a massa, quindi il loro valore logico è pari a zero. Sul datasheet del componente possiamo dedurre quale sarà l&#8217;indirizzo sul bus I2C seguendo questa tabella:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/10/PCF8591_Address.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3868" src="https://logicaprogrammabile.it/wp-content/uploads/2013/10/PCF8591_Address.png" alt="PCF8591 Table Address" width="679" height="132" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/10/PCF8591_Address.png 679w, https://logicaprogrammabile.it/wp-content/uploads/2013/10/PCF8591_Address-300x58.png 300w" sizes="auto, (max-width: 679px) 100vw, 679px" /></a></p>
<p>i quattro bit piu significativi sono fissi e non possono essere cambiati, mentre i tre bit meno significativi sono appunto collegati ai pin A0 A1 e A2. Nello schema essendo collegati a massa, otterremo l&#8217;indirizzo del dispositivo che  corrisponderà, al valore binario seguente:</p>
<p style="text-align: center;"><strong>0b1001000</strong></p>
<p>che convertito in esadecimale diventa:</p>
<p style="text-align: center;"><strong>0x48</strong></p>
<p>Una volta stabilito l&#8217;indirizzo, è necessario configurare il dispositivo tramite il registro &#8216;control byte&#8217;. Questo registro permette di scegliere il canale analogico da rendere attivo per l&#8217;acquisizione (bit 0 e bit 1 A/D Channell Number) e la configurazione degli ingressi analogici (bit4 e bit5 Analog Input Programming).<br />
Le informazioni di questo registro sono riassunte in questo schema, presente nel datasheet:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/10/ControlRegister.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3873" src="https://logicaprogrammabile.it/wp-content/uploads/2013/10/ControlRegister.png" alt="Control register" width="443" height="654" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/10/ControlRegister.png 443w, https://logicaprogrammabile.it/wp-content/uploads/2013/10/ControlRegister-203x300.png 203w" sizes="auto, (max-width: 443px) 100vw, 443px" /></a></p>
<p>Tralasciamo il bit per l&#8217;uscita analogica (bit6) e il bit  auto increment (bit2), assegnandoli il valore logico zero.<br />
I valori da assegnare al control byte per selezionare i diversi ingressi analogici in configurazione <strong>four single-ended inputs </strong>(bit4 e bit5 a zero) dovranno essere:</p>
<p style="text-align: center;"><strong>0b00000000 -&gt; 0x00 -&gt; attiva l&#8217;ingrasso analogico AIN0</strong><br />
<strong>0b00000001 -&gt; 0x01 -&gt; attiva l&#8217;ingrasso analogico AIN1</strong><br />
<strong>0b00000010 -&gt; 0x02 -&gt; attiva l&#8217;ingrasso analogico AIN2</strong><br />
<strong>0b00000011 -&gt; 0x03 -&gt; attiva l&#8217;ingrasso analogico AIN3</strong></p>
<p>La sequenza di byte da inviare è la seguente:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/10/PCF8591P_ControlByte.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3869" src="https://logicaprogrammabile.it/wp-content/uploads/2013/10/PCF8591P_ControlByte.png" alt="Registro controllo" width="427" height="104" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/10/PCF8591P_ControlByte.png 427w, https://logicaprogrammabile.it/wp-content/uploads/2013/10/PCF8591P_ControlByte-300x73.png 300w" sizes="auto, (max-width: 427px) 100vw, 427px" /></a></p>
<p>quindi tramite le dovute istruzioni, invieremo sul bus I2C un primo byte contenente l&#8217;indirizzo del dispositivo e un secondo byte riguardante la configurazione interna del dispositivo.<br />
L&#8217;integrato PCF8591 è così pronto ad acquisire ed inviare il dato sul canale I2C.<br />
Il codice seguente permette di acquisire un dato analogico sul pin AIN0 e sul pin AIN1 del dispositivo e di inviarlo al serial monitor dell&#8217; IDE Arduino:</p>
<pre class="lang:arduino decode:true ">//libreria I2C
#include &lt;Wire.h&gt;

void setup()
{
 //inizializzo la libreria Wire
 Wire.begin();
 //init seiale
 Serial.begin(9600);
 //avviso che il programma è avviato
 Serial.println("START");
}

void loop()
{
 //avvio una richiesta di scrittura al
 //dispositivo con indirizzo 0x48
 Wire.beginTransmission(0x48);
 //invio il byte di configurazione
 //in questo caso abilito il canale analogico AIN0
 Wire.write(byte(0x00));
 //fine trasmissione
 Wire.endTransmission();
 //richiedo un byte allo slave che ha indirizzo 0x48
 Wire.requestFrom(0x48, 1);
 //attendo la disponibilità di dati sul bus i2c
 while(Wire.available())
 {
  //leggo il byte che mi invia il PCD8591
  byte c = Wire.read();
  //invio il dato al serial monitor
  Serial.println(c);
 }
 //pausa 10 millis
 delay(10);
 //avvio una richiesta di scrittura al
 //dispositivo con indirizzo 0x48
 Wire.beginTransmission(0x48);
 //invio il byte di configurazione
 //in questo caso abilito il canale analogico AIN01
 Wire.write(byte(0x01));
 //fine trasmissione
 Wire.endTransmission();
 //richiedo un byte allo slave che ha indirizzo 0x04
 Wire.requestFrom(0x48, 1);
 //attendo la disponibilità di dati sul bus i2c
 while(Wire.available())
 {
  //leggo dal bus il dato relativo alla
  //conversione a/d sul pin AIN01
  byte c = Wire.read();
  //invio il dato al pc
  Serial.println(c);
 }
 //esegui il codice ogni secondo
 delay(1000);
}</pre>
<p>&nbsp;</p>
<p>Sinteticamente viene prima configurato, tramite il &#8216;control byte&#8217;, il dispositivo PCF8591 e successivamente viene avviata una richiesta di lettura dal dispositivo. Per eseguire la lettura dei quattro, è necessario eseguire quattro configurazioni e quattro letture.</p>
<p>&nbsp;</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-usare-integrato-pcf8591/">Come usare l&#8217;integrato PCF8591</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/arduino-usare-integrato-pcf8591/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Arduino datalogger con pc</title>
		<link>https://logicaprogrammabile.it/arduino-datalogger-con-pc/</link>
					<comments>https://logicaprogrammabile.it/arduino-datalogger-con-pc/#comments</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Sun, 06 Oct 2013 14:35:23 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[Comunicazione seriale]]></category>
		<category><![CDATA[comunicazione tra circuiti]]></category>
		<category><![CDATA[DataLogger]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=3831</guid>

					<description><![CDATA[<p>Come realizzare un datalogger utilizzando Arduino e un pc Il datalogger è uno di circuiti che fanno parte del bagaglio tecnico di chi come noi smanetta con l&#8217;elettronica e l&#8217;informatica. Il suo funzionamento è in effetti semplice ma allo stesso tempo utile per realizzare tutte...</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-datalogger-con-pc/">Arduino datalogger con pc</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h3>Come realizzare un datalogger utilizzando Arduino e un pc</h3>
<p>Il <strong>datalogger</strong> è uno di circuiti che fanno parte del bagaglio tecnico di chi come noi smanetta con l&#8217;elettronica e l&#8217;informatica. Il suo <strong>funzionamento</strong> è in effetti <strong>semplice</strong> ma allo stesso tempo <strong>utile</strong> per realizzare tutte quelle <strong>applicazioni</strong> in cui è necessario acquisire e <strong>registrare dati</strong> (digitali o analogici), pensiamo a tutti i sistemi di <strong>monitoring</strong> (energia, gas, acqua &#8230;) alle stazioni meteo o a sistemi di controllo. Esistono circuiti dedicati che eseguono funzioni di <strong>datalogging</strong> locale e remote, persino cloud, dai costi variabili da poche decine di euro a centinaia di euro a seconda della robustezza e della precisione dei circuiti.<br />
Per impadronirci anche di questo aspetto possiamo <strong>realizzare</strong> il nostro <strong>datalogger</strong> usando il nostro caro <strong>Arduino</strong>. Il logging può avvenire sia sui pin analogici che su quelli digitali a seconda dei segnali e dei sensori collegati alla scheda.</p>
<p>In questo <strong>tutorial</strong> utilizzerò i sei<strong> pin analogici</strong> della scheda per <strong>acquisire</strong> dei segnali analogici ed inviarli al <strong>pc</strong>, tramite la porta seriale, dove avverrà la memorizzazione dei dati. Ho deciso di non memorizzare i dati sulla scheda per far capire come inviare i dati e come sincronizzazione la comunicazione tra i due dispositivi.Come scheda ho impiegato la <strong>Arduino Ethernet</strong> e lato pc ho utilizzato <strong>Microsoft Visual C# 2012 (su Windows 8)</strong> per scrivere il programma di logging.</p>
<p><span id="more-3831"></span></p>
<p>Per mancanza di tempo non ho collegato alla scheda dei sensori o delle fonti analogiche ma ho lasciato i pin analogici &#8216;appesi&#8217;, questo perchè i dispositivi da collegare sono infiniti e quindi lascio a voi il compito di collegarne a piacimento.</p>
<p>Passiamo quindi direttamente al codice caricato sulla Arduino Ethernet:</p>
<p>[c]<br />
//questo arrai contiene i valori provenienti<br />
//dall&#8217;acquisizione analogica<br />
byte ana[12];<br />
//avalore intero per memorizzare il dato analogico<br />
int valAn = 0;<br />
//variabile per selezionare il canale analogico<br />
byte in_ana = 0;</p>
<p>void setup()<br />
{<br />
  //init seriale<br />
  Serial.begin(9600);<br />
}</p>
<p>void loop()<br />
{<br />
  //verifico la presenza di un dato sulla<br />
  //porta seriale<br />
  if(Serial.available() &gt; 0)<br />
  {<br />
    //se arriva un byte dal pc leggilo<br />
    byte data = Serial.read();<br />
    //controllo se il dato in arrivo dal pc corrisponde<br />
    //al carattere di avvio acquisizione<br />
    if(data == &#8216;#&#8217;)<br />
    {<br />
      //inizializzo la variabile per la selezione del<br />
      //primo canale analogico<br />
      in_ana = 0;<br />
      //eseguo un ciclo for per acquisire ciclicamente tutti i<br />
      //canali analogici da A0 a A5<br />
      for(int Ciclo = 0; Ciclo &lt;12; Ciclo += 2)<br />
      {<br />
        //leggo il canale analogico<br />
        valAn = analogRead(in_ana);<br />
        //il valore intero viene diviso in due byte e caricato<br />
        //nell&#8217;array dichiarato precedentemente<br />
        ana[Ciclo] = highByte(valAn);<br />
        ana[Ciclo + 1] = lowByte(valAn);<br />
        //piccolo delay tra una acquisizione e l&#8217;altra<br />
        delay(1);<br />
        //incremento il canale di acquisizione<br />
        in_ana++;<br />
      }<br />
      //dopo 6 cicli spedisco tutti e 12 i byte al pc<br />
      Serial.write(ana,12);<br />
    }<br />
  }<br />
}<br />
[/c]</p>
<p>Le parti più importanti di questo codice sono il secondo blocco <strong>if</strong> che ha il compito di verificare quando il byte ricevuto è uguale al carattere <strong>#</strong>, in questo modo l&#8217;invio dei dati è subordinato alle richieste del pc. Questo permette di avere una trasmissione concordata che evita l&#8217;utilizzo di sincronismi per poter leggere coerentemente i dati acquisiti.<br />
L&#8217;altro blocco è quello <strong>for</strong>, che ha il compito di acquisire il dato analogico e di caricarlo sull&#8217;array che verrà inviato al pc. Per farlo vengono utilizzate le istruzioni <strong>highByte()</strong> e <strong>lowByte()</strong> che hanno il compito di suddividere la variabile <strong>int valAn</strong>(composta da due byte) in due byte contenenti gli 8 bit più significativi e gli 8 bit meno significativi, questo infatti giustifica l&#8217;array da 12 byte.</p>
<p>La figura seguente mostra quanto detto:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/10/da_int_a_byte.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3839" alt="Conertire int a byte" src="https://logicaprogrammabile.it/wp-content/uploads/2013/10/da_int_a_byte.png" width="609" height="343" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/10/da_int_a_byte.png 609w, https://logicaprogrammabile.it/wp-content/uploads/2013/10/da_int_a_byte-300x168.png 300w" sizes="auto, (max-width: 609px) 100vw, 609px" /></a></p>
<p>volendo si potrebbe spedire direttamente il valore intero ma credo che questo approccio semplifica meglio la stesura e la comprensione dei programmi lato Arduino e lato pc.</p>
<h3>Il datalogger sul pc</h3>
<p>La finestra del programma che acquisisce e registra i dati è mostrata di seguito:</p>
<p><a href="https://logicaprogrammabile.it/wp-content/uploads/2013/10/Cattura.png"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3842" alt="Arduino datalogger" src="https://logicaprogrammabile.it/wp-content/uploads/2013/10/Cattura.png" width="480" height="325" srcset="https://logicaprogrammabile.it/wp-content/uploads/2013/10/Cattura.png 480w, https://logicaprogrammabile.it/wp-content/uploads/2013/10/Cattura-300x203.png 300w" sizes="auto, (max-width: 480px) 100vw, 480px" /></a></p>
<p>La parte principale del <strong>software di acquisizione</strong> dei dati da Arduino è la seguente:</p>
<p>[csharp]</p>
<p>//avvia l&#8217;acquisizione dei dati<br />
//inviando ad arduino il carattere #<br />
rs232.Write(&quot;#&quot;);</p>
<p>//entro nel ciclo<br />
while (Continua)<br />
{<br />
  //attendo che arduino invii i 12 byte<br />
  //contenenti i dati dalla conversione<br />
  //analogico digitale<br />
  if (rs232.BytesToRead == 12)<br />
  {<br />
    //leggo tutti i 12 byte e le assegno<br />
    //ad un array di byte<br />
    rs232.Read(dataRX, 0, 12);</p>
<p>    //prendo il primo ed il secondo byte e li unico per<br />
    //formare yn valore intero a 16 bit<br />
    myShort = (short)(dataRX[0] &lt;&lt; 8 | dataRX[1]);<br />
    txtValAn01.Text = myShort.ToString();</p>
<p>    myShort = (short)(dataRX[2] &lt;&lt; 8 | dataRX[3]);<br />
    txtValAn02.Text = myShort.ToString();</p>
<p>    myShort = (short)(dataRX[4] &lt;&lt; 8 | dataRX[5]);<br />
    txtValAn03.Text = myShort.ToString();</p>
<p>    myShort = (short)(dataRX[6] &lt;&lt; 8 | dataRX[7]);<br />
    txtValAn04.Text = myShort.ToString();</p>
<p>    myShort = (short)(dataRX[8] &lt;&lt; 8 | dataRX[9]);<br />
    txtValAn05.Text = myShort.ToString();</p>
<p>    myShort = (short)(dataRX[10] &lt;&lt; 8 | dataRX[11]);<br />
    txtValAn06.Text = myShort.ToString();</p>
<p>    //dopo aver acquisito i dati esco dal ciclo<br />
    break;<br />
  }<br />
}<br />
[/csharp]</p>
<p>Il programma acquisisce i dati provenienti dalla scheda e li visualizza nelle apposite caselle di testo, in contemporanea viene creato un file di testo, nella stessa cartella dove viene posto il fil eseguibile, dove verranno memorizzati i dati.</p>
<p>Per eseguire l&#8217;applicazione è necessario <strong>installare</strong> nel proprio pc il <strong>Microsoft .Net Framework 4.5</strong></p>
<p>In allegato trovate sia il file eseguibile sia il codice dell&#8217;applicazione.</p>
<p><strong>Download File eseguibile: <a href="https://logicaprogrammabile.it/wp-content/uploads/2013/10/ArduinoDataLogger.zip">ArduinoDataLogger (~7KB)</a></strong></p>
<p><strong>Download File sorgente: <a href="https://logicaprogrammabile.it/wp-content/uploads/2013/10/ArduinoDataLogger_Source.zip">ArduinoDataLogger_Source (~82KB)</a></strong></p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-datalogger-con-pc/">Arduino datalogger con pc</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/arduino-datalogger-con-pc/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title>MCP9700A Netduino e sensore di temperatura analogico</title>
		<link>https://logicaprogrammabile.it/mcp9700a-netduino-sensore-temperatura-analogico/</link>
					<comments>https://logicaprogrammabile.it/mcp9700a-netduino-sensore-temperatura-analogico/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Tue, 22 Mar 2011 14:03:51 +0000</pubDate>
				<category><![CDATA[Elettronica]]></category>
		<category><![CDATA[Tutorial Netduino]]></category>
		<category><![CDATA[DataLogger]]></category>
		<category><![CDATA[MCP9700A]]></category>
		<category><![CDATA[Sensore Temperatura]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=441</guid>

					<description><![CDATA[<p>MCP9700A come leggere il valore di temperatura Sfruttiamo il Netduino per la realizzazione di un dispositivo che permette la lettura della temperatura tramite il sensore MCP9700A. Il sensore fornisce una tensione analogica proporzionale alla temperatura rilevata. E&#8217; un dispositivo molto semplice e compatto, ha tre...</p>
<p>The post <a href="https://logicaprogrammabile.it/mcp9700a-netduino-sensore-temperatura-analogico/">MCP9700A Netduino e sensore di temperatura analogico</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>MCP9700A come leggere il valore di temperatura</h1>
<p>Sfruttiamo il <strong>Netduino </strong>per la realizzazione di un dispositivo che permette la lettura della temperatura tramite il sensore <strong>MCP9700A</strong>.<br />
Il sensore fornisce una tensione analogica proporzionale alla temperatura rilevata. E&#8217; un dispositivo molto semplice e compatto, ha tre pin, uno per l&#8217;alimentazione, uno per la massa e uno per la tensione analogica di uscita.</p>
<p style="text-align: left;"><img loading="lazy" decoding="async" class="aligncenter wp-image-448 size-medium" title="Sensore di temperatura tipo MCP9700A" src="https://logicaprogrammabile.it/wp-content/uploads/2011/03/SensTempPF-300x203.gif" alt="MCP9700A" width="300" height="203" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/03/SensTempPF-300x203.gif 300w, https://logicaprogrammabile.it/wp-content/uploads/2011/03/SensTempPF.gif 333w" sizes="auto, (max-width: 300px) 100vw, 300px" /></p>
<p style="text-align: left;">Per capire come collegare questo sensore al Netduino analizziamo prima le sue caratteristiche. Può essere alimentato da un intervallo di tensione che va da 2.3Vdc a 5.5Vdc, misura temperature che vanno da un minimo di -40°C a un massimo di 125°C con una precisione tipica di -+1°C (-+2°C massima). Ad una temperatura di 0°C il dispositivo eroga in uscita una tensione di 500mV utile come riferimento di partenza per il nostro circuito. La variazione di un grado produce una variazione di tensione di 10mV. La minima tensione in uscita dal sensore è di 100mV mentre quella massima è di 1.75V.<br />
Per approfondire tutti gli aspetti di questo sensore potete consultare il suo <a href="http://ww1.microchip.com/downloads/en/DeviceDoc/21942e.pdf" target="_blank">datasheet</a>.<br />
La tabella seguente mostra un riassunto di quanto detto:</p>
<table style="width: 315px;">
<tbody>
<tr>
<td style="text-align: center;">Descrizione</td>
<td></td>
<td style="text-align: center;">Valori</td>
</tr>
<tr>
<td>Alimentazione del sensore</td>
<td></td>
<td>da 2.3Vdc a 5.5Vdc</td>
</tr>
<tr>
<td>Intervallo di temperatura</td>
<td></td>
<td>da -40°C a 125°C</td>
</tr>
<tr>
<td>Precisione tipica</td>
<td></td>
<td>+/- 1°C da 0 a 70°C</td>
</tr>
<tr>
<td>Variazione di tensione</td>
<td></td>
<td>10mV per grado</td>
</tr>
<tr>
<td>Tensione di uscita a 0°C</td>
<td></td>
<td style="text-align: left;">500mV</td>
</tr>
<tr>
<td>Intervallo di tensione in uscita</td>
<td></td>
<td>da 100mV a 1.75V</td>
</tr>
</tbody>
</table>
<p>Il grafico seguente mostra invece la curva di risposta del sensore.</p>
<p style="text-align: center;"><img loading="lazy" decoding="async" class="aligncenter wp-image-476 size-full" title="Curva di risposta MCP9700A" src="https://logicaprogrammabile.it/wp-content/uploads/2011/03/Curvadirisposta.gif" alt="Curva di risposta MCP9700A" width="324" height="212" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/03/Curvadirisposta.gif 324w, https://logicaprogrammabile.it/wp-content/uploads/2011/03/Curvadirisposta-300x196.gif 300w" sizes="auto, (max-width: 324px) 100vw, 324px" /></p>
<p>La precisione del sensore è garantita alimentandolo a 3.3Vdc. In effetti, a parità di temperatura rilevata, alimentandolo prima a 3.3Vdc e poi a 5Vdc ho notato delle differenze di tensione in uscita dal sensore.<br />
Come sappiamo il gli ingressi analogici del Netduino possono accettare una tensione massima di 3.3Vdc, l&#8217;MCP9700A può essere collegato direttamente all&#8217;ingresso analogico poiché la sua massima tensione in uscita è pari a 1.75Vdc.<br />
Il Netduino dispone di un&#8217;alimentazione da 3.3Vdc che ho utilizzato per alimentare il sensore.</p>
<p><span id="more-441"></span>Il valore di tensione in uscita dal sensore viene collegato all&#8217;ingresso A0 del Netduino per essere digitalizzato; questo dato viene inviato al PC usando la <a title="Netduino e collegamento alla seriale(RS232) del pc" href="https://logicaprogrammabile.it/netduino-e-collegamento-alla-serialers232-del-pc/">comunicazione RS232</a>.</p>
<p>Il circuito elettrico è il seguente.</p>
<p style="text-align: center;"><img loading="lazy" decoding="async" class="aligncenter wp-image-447 size-full" title="Collegamento sensore di temperatura e Netduino" src="https://logicaprogrammabile.it/wp-content/uploads/2011/03/SensTemp.gif" alt="Netduino e sensore MCP9700A" width="623" height="423" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/03/SensTemp.gif 623w, https://logicaprogrammabile.it/wp-content/uploads/2011/03/SensTemp-300x203.gif 300w" sizes="auto, (max-width: 623px) 100vw, 623px" /></p>
<p style="text-align: center;"><img loading="lazy" decoding="async" class="aligncenter wp-image-606 size-full" title="Foto_Circuito" src="https://logicaprogrammabile.it/wp-content/uploads/2011/03/DSCF09331.jpg" alt="Foto_Circuito_Netduino" width="350" height="420" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/03/DSCF09331.jpg 350w, https://logicaprogrammabile.it/wp-content/uploads/2011/03/DSCF09331-250x300.jpg 250w" sizes="auto, (max-width: 350px) 100vw, 350px" /></p>
<p>Il software per la gestione del circuito è composto da una parte relativa all&#8217;acquisizione del segnale analogico del sensore e da una parte che gestisce la comunicazione RS232 con il PC.<br />
Di seguito il codice C#:</p>
<pre class="lang:c# decode:true ">public static void Main()
{
SerialPort UART1 = new SerialPort("COM1", 9600, Parity.None,
8, StopBits.One);
AnalogInput AN0 = new AnalogInput(Pins.GPIO_PIN_A0);
Byte[] IntToByte = new Byte[2];
Int16 Analog0 = 0;

UART1.Open();

while (true)
{
//acquisisci il valore analogico
Analog0 = (Int16)AN0.Read();

//copio il valore intero in due byte
IntToByte[0] = (byte)(Analog0 &amp; 0xff);
IntToByte[1] = (byte)((Analog0 &gt;&gt; 8) &amp; 0xff);

//invia al pc un informazione
UART1.Write(IntToByte, 0, IntToByte.Length);
//attendi 500 millisecondi
Thread.Sleep(500);
}

UART1.Close();
}</pre>
<p>&nbsp;</p>
<p>Dopo aver definito gli oggetti per la comunicazione seriale e per l&#8217;acquisizione del segnale analogico, il programma entra in un ciclo infinito e ogni 500 millisecondi la funzione Read() esegue una lettura del segnale analogico proveniente dal sensore MCP9700A, questo valore è memorizzato in una variabile intera.<br />
Per poter spedire questo valore tramite l&#8217;oggetto UART1, devo convertirlo in un array di Byte. Le istruzioni seguenti svolgono questo compito</p>
<pre class="lang:c# decode:true ">//copio il valore intero in due byte
IntToByte[0] = (byte)(Analog0 &amp; 0xff);
IntToByte[1] = (byte)((Analog0 &gt;&gt; 8) &amp; 0xff);</pre>
<p>&nbsp;</p>
<p>Queste istruzioni servono a mettere i primi 8bit della variabile Analog0(16bit) nel primo byte dell&#8217;array e i successivi bit nel secondo byte dell&#8217;array.<br />
Ho realizzato questa illustrazione per spiegare meglio cosa avviene utilizzando le funzioni precendenti:</p>
<p style="text-align: center;"><img loading="lazy" decoding="async" class="aligncenter wp-image-490 size-full" title="Conversione da In16 ad array di Byte" src="https://logicaprogrammabile.it/wp-content/uploads/2011/03/IntToByte.gif" alt="Conversione da In16 ad array di Byte" width="620" height="214" srcset="https://logicaprogrammabile.it/wp-content/uploads/2011/03/IntToByte.gif 620w, https://logicaprogrammabile.it/wp-content/uploads/2011/03/IntToByte-300x103.gif 300w" sizes="auto, (max-width: 620px) 100vw, 620px" /></p>
<p>Colleghiamo il Netduino al pc per alimentare il circuito ed eseguiamo il Debug(f5) per caricare il programma. A compilazione e programmazione avvenuta, avviamo<strong> hyper terminal</strong> per leggere i dati dalla seriale. Per maggiorni informazioni su hyper terminal potete rileggere l&#8217;articolo riguardante <a title="Netduino e collegamento alla seriale(RS232) del pc" href="https://logicaprogrammabile.it/netduino-e-collegamento-alla-serialers232-del-pc/">Netduino e RS232</a>.</p>
<p>Ora che tutto è funzionante dobbiamo ragionare sull&#8217;interpretazione dei dati inviati al pc. La proporzione seguente ci permette di ottenere il valore della tensione sull&#8217;ingresso analogico in base al valore intero che il Netduino invia al pc:</p>
<p style="text-align: center;"><strong>MaxTenADC : Risol_ADC = TensADC : ValInt</strong></p>
<blockquote>
<p style="text-align: left;">dove:<br />
<strong>MaxTenADC </strong>= 3.3Vdc tensione massima applicabile al pin analogico del Netduino<br />
<strong>Risol_ADC</strong> = 10bit (1024) massima risoluzione del convertitore analogico digitale del Netduino<br />
<strong>TensADC </strong>= tensione applicata al pin analogico<br />
<strong>ValInt </strong>= valore intero ottenuto dalla conversione</p>
</blockquote>
<p>Facciamo un esempio pratico, se il Netdino invia al pc un valore di 156 possiamo calcolare la tensione in ingresso in questo modo:</p>
<p style="text-align: center;">(MaxTenADC * ValInt) / Risol_ADC</p>
<p style="text-align: center;">(3.3Vdc * 156) / 1024 = 0.502 Vdc</p>
<p>quindi sull&#8217;ingresso analogico misureremo una tensione di circa 500 mVdc. Considerando la curva di risposta del sensore appuriamo che, con una tensione di 500mV, la temperatura misurata è di 0°C. Il datasheet ci dice che ad ogni variazione di grado corrisponde una variazione di 10mV, ciò ci permette di fare un calcolo per ottenere il valore in gradi in base al numero inviato dal Netduino via seriale.</p>
<p style="text-align: center;">(((3.3Vdc * 156) / 1024) &#8211; 0.5)/0.01 = 0.2°C</p>
<blockquote><p>dove:<br />
3.3Vdc è la tensione massima applicabile all&#8217;ingresso analogico<br />
156 è il valore intero ottenuto dalla conversione analogico digitale<br />
1024 è il massimo valore intero ottenibile con la conversione analogico digitale<br />
0.5 è la tensione del sensore a 0°C<br />
0.01 è la variazione di tensione per ogni grado (10mv/°C)</p></blockquote>
<p>con questo semplice esperimento abbiamo creato un termometro capace di inviare i dati ad un pc. Volendo possiamo acquistare un ulteriore sensore di temperatura e collegarlo ad un altro ingresso analogico per creare un termometro differenziale.<br />
In allegato trovate un file di progetto C# per leggere i dati dalla seriale.</p>
<p>Vi aspetto con commenti e suggerimenti e vi rimando al prossimo esperimento!</p>
<p>The post <a href="https://logicaprogrammabile.it/mcp9700a-netduino-sensore-temperatura-analogico/">MCP9700A Netduino e sensore di temperatura analogico</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/mcp9700a-netduino-sensore-temperatura-analogico/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
