Discussione [GUIDA] Come usare il sensore SDS011

insidehackers

Utente Gold
28 Giugno 2013
641
30
222
318
Ultima modifica:
Il sensore SDS011 acquistabile online a circa 30 euro permette di misurare le microparticelle che sono presenti nell'aria e quindi la qualità della stessa, in particolare particelle tra i 0.3 e i 10 micrometri, polveri sottili, fumo, polvere ecc...

Nova-PM-sensor-SDS011-High-precision-laser-pm2-5-air-quality-detection-sensor-module-Super-dus...jpg

Il sensore ci viene fornito direttamente con l'adattatore UART a USB, per consentire la comunicazione seriale dobbiamo installare i driver del convertitore UART-USB di solito è un chip CH340 installa questi driver: https://sparks.gogo.co.nz/ch340.html
Il datasheet è consultabile qui

La porta seriale ha questa configurazione:
Bitrate 9600
Databit 8
Paritybit NO
Stopbit 1
Frequenza dati 1Hz

Ogni secondo il sensore invia un pacchetto di 9 bytes strutturato in questo modo:
Byte 0 --> Messageheader --> AA
Byte 1 --> CommanderNo. C0
Byte 2 --> DATA1 PM2.5 Lowbyte
Byte 3 --> DATA2 PM2.5 Highbyte
Byte 4 --> DATA3 PM10 Lowbyte
Byte 5 --> DATA4 PM10 Highbyte
Byte 6 --> DATA5 ID byte1
Byte 7 --> DATA6 ID byte2
Byte 8 --> Check-sum
Byte 9 --> Messagetail AB

Per convertire questo pacchetto in informazioni leggibili agli essere umani facciamo riferimento al datasheet che ci da due formule per calcolare i valori in microgrammi su metro cubo di pm2.5 e pm10
Codice:
PM2.5(μg /m3) = ((PM2.5 High byte * 256) + PM2.5 lowbyte) / 10
Codice:
PM10(μg /m3) = ((PM10 high byte * 256) + PM10 low byte) / 10

Per calcolare il checksum dobbiamo sommare i bytes da 2 a 7, cioè i DATA Byte e verificare il risultato con il byte 8
Codice:
Check-sum = DATA1+DATA2+...+DATA6

Adesso che sappiamo che funziona possiamo passare alla scrittura del codice, apri visual studio e seleziona File>Nuovo>Progetto poi seleziona Visual C# App Console in program.cs copia:
C#:
using System;
using System.IO.Ports;
using System.IO;

namespace sds011
{
    class Program
    {
        static SerialPort sds011;
        static string log;
        static void Main(string[] args)
        {
            //Cerca porta com
            int porta;
            bool flagok = false;
            for (porta = 0; porta < 21; porta++)
            {
                try
                {
                    SerialPort find = new SerialPort("COM" + porta.ToString(), 9600, Parity.None, 8, StopBits.One);
                    find.ReadTimeout = 1200;
                    find.Open();
                    if(find.ReadByte() == 170)
                    {
                        find.Close();
                        find.Dispose();
                        Console.WriteLine("Sensore trovato sulla porta COM" + porta.ToString());
                        flagok = true;
                        break;
                    }
                }
                catch (Exception) { }
            }
            if(flagok == true)
            {
                sds011 = new SerialPort("COM" + porta.ToString(), 9600, Parity.None, 8, StopBits.One);
                sds011.DataReceived += new SerialDataReceivedEventHandler(SerialDataReceived);
                sds011.Open();
                log = Environment.CurrentDirectory + "\\" + "COM" + porta.ToString() + "-" + DateTime.Now.ToString("dd-MM-yyyy") + ".txt";
                Console.ReadLine();
            }
            else
            {
                Console.WriteLine("Sensore non trovato.");
                Console.ReadLine();
            }
        }
        static void SerialDataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            byte[] bufferLettura = new byte[9];
            int result = sds011.Read(bufferLettura, 0, 9);

            int checksum = (bufferLettura[2] + bufferLettura[3] + bufferLettura[4] + bufferLettura[5] + bufferLettura[6] + bufferLettura[7]) % 256;
            //Header OK
            if (bufferLettura[0] == 170 && checksum == bufferLettura[8])
            {
                //Console.Write("Commander No. " + bufferLettura[1].ToString("X") + "\n");
                int pm25 = ((bufferLettura[3] * 256) + bufferLettura[2]) / 10;
                int pm10 = ((bufferLettura[5] * 256) + bufferLettura[4]) / 10;
                Console.Write("\rPM-2.5: {0} μg/m3     PM-10: {1} μg/m3 ", pm25, pm10);
                if (DateTime.Now.Second % 5 == 0 && pm25 != 0 && pm10 != 0)
                {
                    try
                    {
                        File.AppendAllText(log, DateTime.Now.ToString("dd/MM/yyyy;HH:mm:ss") + ";" + pm25 + ";" + pm10 + "\n");
                    }
                    catch (Exception) { }
                }
            } 
        }
    }
}

L'applicazione crea anche un file di log utile per creare grafici e analizzare i dati raccolti, questo l'ho creato dopo 1 ora di misurazioni, i picchi sono io che fumo una sigaretta.

graph.png


sds011_3.jpg

Spero che questa guida sia di aiuto a qualcuno... alla prossima.
 
  • Mi piace
Reazioni: FerroHD