<?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>dht11 Archives - Esperimenti con logiche programmabili</title>
	<atom:link href="https://logicaprogrammabile.it/tag/dht11/feed/" rel="self" type="application/rss+xml" />
	<link>https://logicaprogrammabile.it/tag/dht11/</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=7.0.2</generator>

<image>
	<url>https://logicaprogrammabile.it/wp-content/uploads/2017/11/cropped-logicaprogrammabile-logo-02-32x32.png</url>
	<title>dht11 Archives - Esperimenti con logiche programmabili</title>
	<link>https://logicaprogrammabile.it/tag/dht11/</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>Arduino dht11 lettura grezza dei dati</title>
		<link>https://logicaprogrammabile.it/arduino-dht11-lettura-grezza-dei-dati/</link>
					<comments>https://logicaprogrammabile.it/arduino-dht11-lettura-grezza-dei-dati/#respond</comments>
		
		<dc:creator><![CDATA[Marco Lai]]></dc:creator>
		<pubDate>Mon, 16 Jul 2018 11:56:49 +0000</pubDate>
				<category><![CDATA[Tutorial Arduino]]></category>
		<category><![CDATA[dht11]]></category>
		<category><![CDATA[Sensore di umidità]]></category>
		<category><![CDATA[Sensore Temperatura]]></category>
		<guid isPermaLink="false">https://logicaprogrammabile.it/?p=5783</guid>

					<description><![CDATA[<p>Come leggere i dati dal sensore DHT11 senza usare una libreria Il sensore di temperatura e umidità DHT11 è uno tra i più popolari nei progetti Arduino quando è necessario acquisire un valore di temperatura e di umidità. Solitamente per leggere i dati da questo...</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-dht11-lettura-grezza-dei-dati/">Arduino dht11 lettura grezza dei dati</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h1>Come leggere i dati dal sensore DHT11 senza usare una libreria</h1>
<p>Il sensore di temperatura e umidità DHT11 è uno tra i più popolari nei progetti Arduino quando è necessario acquisire un valore di temperatura e di umidità. Solitamente per leggere i dati da questo sensore viene utilizzata una libreria che permette con poche linee di codice di ottenere il dato di temperatura e dell&#8217;umidità.</p>
<p>Esistono numerosi tutorial che mostrano come impiegare queste librerie, in questo articolo cercheremo di capire invece, come leggere i dati del sensore DHT11 utilizzando direttamente le funzioni di Arduino UNO.</p>
<p><span id="more-5783"></span></p>
<p>Nello schema seguente potete osservare i collegamenti che ho effettuato tra la UNO e il sensore DHT11</p>
<p><img decoding="async" class="aligncenter size-full wp-image-5795" src="https://logicaprogrammabile.it/wp-content/uploads/2018/07/dht11_Arduino_UNO.png" alt="Arduino UNO collegamenti DHT11" width="297" height="284" /></p>
<p>Come si può notare i dati vengono ricevuti e trasmessi impiegando un solo filo.</p>
<p>Per prima cosa controlliamo nel datasheet del DHT11 come avviene lo scambio dei dati tra il microcontrollore e il sensore.</p>
<p>Sapendo che i dati transitano su un singolo filo dobbiamo utilizzare una porta digitale della UNO impostandola primariamente come uscita, per inviare la richiesta di acquisizione dati al sensore, secondariamente come ingresso, per ricevere i dati provenienti dal sensore.</p>
<p>Leggendo il datasheet notiamo che per ricevere dati dal sensore DHT11 è necessario inviargli un segnale digitale rispettando determinati tempi tra un livello logico basso ed uno alto; analizziamo nel dettaglio come sono composti questi segnali.</p>
<p>Una volta alimentato il sensore DHT11, questo si pone, dopo circa 1 secondo, in attesa di ricevere un comando. Avendo inserito una resistenza di pull-up, sulla linea dati sarà presente un segnale logico alto.</p>
<p>Per avviare la trasmissione dei dati dobbiamo mettere (tramite la porta della scheda UNO) la linea dati al livello logico basso per almeno 18 ms, e successivamente metterla nuovamente a livello logico alto, come visibile nel diagramma seguente:</p>
<p><img decoding="async" class="aligncenter size-full wp-image-5790" src="https://logicaprogrammabile.it/wp-content/uploads/2018/07/start.png" alt="invio sequenza di start al dht11" width="483" height="238" srcset="https://logicaprogrammabile.it/wp-content/uploads/2018/07/start.png 483w, https://logicaprogrammabile.it/wp-content/uploads/2018/07/start-300x148.png 300w" sizes="(max-width: 483px) 100vw, 483px" /></p>
<p>In questa fase dobbiamo configurare la porta digitale come un ingresso. Infatti il sensore risponderà mettendo la linea dati a livello logico basso per 80 microsecondi per poi tenerla a livello alto per altri 80 microsecondi:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-5791" src="https://logicaprogrammabile.it/wp-content/uploads/2018/07/dht11_start.png" alt="dht11 start sequence" width="526" height="218" srcset="https://logicaprogrammabile.it/wp-content/uploads/2018/07/dht11_start.png 526w, https://logicaprogrammabile.it/wp-content/uploads/2018/07/dht11_start-300x124.png 300w" sizes="auto, (max-width: 526px) 100vw, 526px" /></p>
<p>ora il sensore invierà al microcontrollore 40 bit di dati composti in questo modo, il bit a livello basso sarà composto da un livello logico basso di 50 us seguito da un livello logico alto di circa 27 us, mentre un bit a livello alto sarà composto da un segnale di livello basso per 50 us seguito da un livello logico alto per 70 us.</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-5792" src="https://logicaprogrammabile.it/wp-content/uploads/2018/07/dht11_SendData.png" alt="dht11 send data" width="583" height="272" srcset="https://logicaprogrammabile.it/wp-content/uploads/2018/07/dht11_SendData.png 583w, https://logicaprogrammabile.it/wp-content/uploads/2018/07/dht11_SendData-300x140.png 300w" sizes="auto, (max-width: 583px) 100vw, 583px" /></p>
<p>Quindi riepilogando avremmo una sequenza di trasmissione di questo tipo:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-5793" src="https://logicaprogrammabile.it/wp-content/uploads/2018/07/dht11_Signal.png" alt="dht11 signal diagram" width="849" height="273" srcset="https://logicaprogrammabile.it/wp-content/uploads/2018/07/dht11_Signal.png 849w, https://logicaprogrammabile.it/wp-content/uploads/2018/07/dht11_Signal-300x96.png 300w, https://logicaprogrammabile.it/wp-content/uploads/2018/07/dht11_Signal-768x247.png 768w, https://logicaprogrammabile.it/wp-content/uploads/2018/07/dht11_Signal-585x188.png 585w" sizes="auto, (max-width: 849px) 100vw, 849px" /></p>
<p>I 40 bit trasmessi sono suddivisi in questo modo:</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-5797" src="https://logicaprogrammabile.it/wp-content/uploads/2018/07/dht11_Data_Structure.png" alt="DHT11 Struttura dati" width="792" height="108" srcset="https://logicaprogrammabile.it/wp-content/uploads/2018/07/dht11_Data_Structure.png 792w, https://logicaprogrammabile.it/wp-content/uploads/2018/07/dht11_Data_Structure-300x41.png 300w, https://logicaprogrammabile.it/wp-content/uploads/2018/07/dht11_Data_Structure-768x105.png 768w, https://logicaprogrammabile.it/wp-content/uploads/2018/07/dht11_Data_Structure-585x80.png 585w" sizes="auto, (max-width: 792px) 100vw, 792px" /></p>
<p>I primi 8 bit contengono il valore intero del dato di umidità, i seguenti 8 bit contengono il valore decimale del dato di umidità, i successivi 8 bit contengono il valore intero del dato di temperatura, i seguenti 8 bit contengono il valore decimale del dato di temperatura. Gli ultimi 8 bit contengono il <a href="https://it.wikipedia.org/wiki/Checksum">valore di CRC</a>.</p>
<p>Il codice seguente permette di acquisire il dato di umidità e di temperatura. I commenti nel codice spiegano in dettaglio le istruzioni utilizzate:</p>
<pre class="lang:arduino decode:true">int pin = 2;

unsigned long duration;
unsigned long tmr = 0;
unsigned long tmr_prec = 0;
byte impulsi;
int message[42];
byte Htemperatura;
byte Ltemperatura;
byte Humidita;
byte Lumidita;
byte checksum;

void setup()

{
  //init seriale
  Serial.begin(115200);
  //definisco la porta 2 come uscita
  //in questa porta è collegato il sensore dht11
  pinMode(pin, OUTPUT);
}

void loop()
{
  delay(1000);

  //definisco la porta 2 come uscita
  //in questa porta è collegato il sensore dht11
  pinMode(pin, OUTPUT);
  //sappiamo che sul pin c'è un livello logico alto
  //avvendo inserito la resistenza di pullup
  //metto la linea alivello basso per 20 millisecondi (&gt;18ms)
  digitalWrite(pin, LOW);
  delay(20);
  
  //metto nuovamente la linea a livello logico alto
  digitalWrite(pin, HIGH);

  //imposto la lestta porta come ingresso
  //in modo da ricevere i dati dal sensore dht11
  pinMode(pin, INPUT);
  delayMicroseconds(10);
  
  //inizializzo la variabile a 0, questa variabile consente di tenere
  //traccia del numero di bit ricevuti
  impulsi = 0;
  
  //eseguo un ciclo continuo
  while (true)
  {

    //controllo solo quando è presente un livello alto
    if (digitalRead(2) == HIGH)
    {
      //memorizzo il tempo in microsecondi
      tmr_prec = micros();

      //eseguo un ciclo fintanto che il livello è alto
      while (digitalRead(2) == HIGH)
      {
        ;
      }

      //quando il livello logico diventa basso
      //misuro quanto tempo è durato il livello logico alto
      duration = micros() - tmr_prec;
 
      //memorizzo questo tempo nell'array
      message[impulsi] = duration;
      
      //incremento la variabile per tenere traccia dei bit inviati
      //dal sensore dht11
      impulsi++;
    }

    //quando ho raggiunto 41 bit interrompo il ciclo while
    //i bit sono 41, invece che 40, perchè questo codice
    //misura anche il primo livello alto di 80us che indica l'inizio
    //della trasmissione deii 40 bit di dati 
    if (impulsi == 41)
      break;
  }

  //ora che ho un array contenente i microsecondi di tutti i livelli alti che sono stati inviati
  //dal sensore dht11 devo convertirli in bit digitali
  //trasformo i millisecondi in bit

  //verifico che il primo dato sia di circa 80 us
  if ( message[0] &gt; 75 &amp;&amp; message[0] &lt; 95)
  {
    //bit di start ok    
    //elaboro i primo 8 bit e converto, in funzione della larghezza del
    //livello alto, se è un bit di valore 1 o di valore 0
    
    for (byte ciclo = 0; ciclo &lt; 8; ciclo++)
    {
      if (message[ciclo + 1] &gt; 15 &amp;&amp; message[ciclo + 1] &lt; 35)
        bitClear(Humidita, 7 - ciclo);

      if (message[ciclo + 1] &gt; 65 &amp;&amp; message[ciclo + 1] &lt; 80)
        bitSet(Humidita, 7 - ciclo);
    }

    //continua coni successivi 8 bit
    for (byte ciclo = 0; ciclo &lt; 8; ciclo++)
    {
      if (message[ciclo + 9] &gt; 15 &amp;&amp; message[ciclo + 9] &lt; 35)
        bitClear(Lumidita, 7 - ciclo);

      if (message[ciclo + 9] &gt; 65 &amp;&amp; message[ciclo + 9] &lt; 80)
        bitSet(Lumidita, 7 - ciclo);
    }

    //continua coni successivi 8 bit
    for (byte ciclo = 0; ciclo &lt; 8; ciclo++)
    {
      if (message[ciclo + 17] &gt; 15 &amp;&amp; message[ciclo + 17] &lt; 30)
        bitClear(Htemperatura, 7 - ciclo);

      if (message[ciclo + 17] &gt; 65 &amp;&amp; message[ciclo + 17] &lt; 80)
        bitSet(Htemperatura, 7 - ciclo);
    }
    //continua coni successivi 8 bit
    for (byte ciclo = 0; ciclo &lt; 8; ciclo++)
    {
      if (message[ciclo + 25] &gt; 15 &amp;&amp; message[ciclo + 25] &lt; 30)
        bitClear(Ltemperatura, 7 - ciclo);

      if (message[ciclo + 25] &gt; 65 &amp;&amp; message[ciclo + 25] &lt; 80)
        bitSet(Ltemperatura, 7 - ciclo);
    }
    //continua coni successivi 8 bit
    for (byte ciclo = 0; ciclo &lt; 8; ciclo++)
    {
      if (message[ciclo + 33] &gt; 15 &amp;&amp; message[ciclo + 33] &lt; 30)
        bitClear(checksum, 7 - ciclo);

      if (message[ciclo + 33] &gt; 65 &amp;&amp; message[ciclo + 33] &lt; 80)
        bitSet(checksum, 7 - ciclo);
    }
  }


  //visualizzo i dati grezzi
  for (byte ciclo = 0; ciclo &lt; 41; ciclo++)
  {
    Serial.print(message[ciclo]);
    Serial.print(" ");
  }

  //visualizzo i dati elaborati
  Serial.println("");
  Serial.print("Umidita ");
  Serial.print(Humidita);
  Serial.print(".");
  Serial.print(Lumidita);
  Serial.print(" temperatura ");
  Serial.print(Htemperatura);
  Serial.print(".");
  Serial.print(Ltemperatura);
  Serial.print(" CheckSUM");
  Serial.println(checksum);

}</pre>
<p>Questo semplice codice ha permesso di capire come acquisiere ed elaborare i dati inviati dal sensore dht11.</p>
<p>&nbsp;</p>
<p>The post <a href="https://logicaprogrammabile.it/arduino-dht11-lettura-grezza-dei-dati/">Arduino dht11 lettura grezza dei dati</a> appeared first on <a href="https://logicaprogrammabile.it">Esperimenti con logiche programmabili</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://logicaprogrammabile.it/arduino-dht11-lettura-grezza-dei-dati/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
