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...
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
Per calcolare il checksum dobbiamo sommare i bytes da 2 a 7, cioè i DATA Byte e verificare il risultato con il byte 8
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:
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.
Spero che questa guida sia di aiuto a qualcuno... alla prossima.
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.
Spero che questa guida sia di aiuto a qualcuno... alla prossima.