Skip to content

Commit baa9610

Browse files
committed
Add GrovePM25HM3301
1 parent c5a9730 commit baa9610

File tree

5 files changed

+177
-0
lines changed

5 files changed

+177
-0
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// BOARD Seeed Wio LTE M1/NB1(BG96)
2+
// GROVE I2C <-> Grove - Laser PM2.5 Air Quality Sensor for Arduino - HM3301 (SKU#101020613)
3+
4+
#include <GroveDriverPack.h>
5+
#include <climits>
6+
7+
#define INTERVAL (2000)
8+
9+
WioCellular Wio;
10+
11+
GroveBoard Board;
12+
GrovePM25HM3301 PM(&Board.I2C);
13+
14+
void setup() {
15+
delay(200);
16+
SerialUSB.begin(115200);
17+
18+
Wio.Init();
19+
Wio.PowerSupplyGrove(true);
20+
delay(1500);
21+
22+
Board.I2C.Enable();
23+
if (!PM.Init())
24+
{
25+
SerialUSB.println("Sensor not found.");
26+
}
27+
28+
SerialUSB.print("PM1.0_concentration(STD)");
29+
SerialUSB.print('\t');
30+
SerialUSB.print("PM2.5_concentration(STD)");
31+
SerialUSB.print('\t');
32+
SerialUSB.print("PM10_concentration(STD)");
33+
SerialUSB.print('\t');
34+
SerialUSB.print("PM1.0_concentration(ENV)");
35+
SerialUSB.print('\t');
36+
SerialUSB.print("PM2.5_concentration(ENV)");
37+
SerialUSB.print('\t');
38+
SerialUSB.print("PM10_concentration(ENV)");
39+
SerialUSB.print('\t');
40+
SerialUSB.print("Number_of_particles_0.3um");
41+
SerialUSB.print('\t');
42+
SerialUSB.print("Number_of_particles_0.5um");
43+
SerialUSB.print('\t');
44+
SerialUSB.print("Number_of_particles_1.0um");
45+
SerialUSB.print('\t');
46+
SerialUSB.print("Number_of_particles_2.5um");
47+
SerialUSB.print('\t');
48+
SerialUSB.print("Number_of_particles_5.0um");
49+
SerialUSB.print('\t');
50+
SerialUSB.print("Number_of_particles_10um");
51+
SerialUSB.println();
52+
}
53+
54+
void loop() {
55+
PM.Read();
56+
if (PM.Concentration_1_Standard != INT_MAX)
57+
{
58+
SerialUSB.print(PM.Concentration_1_Standard);
59+
SerialUSB.print('\t');
60+
SerialUSB.print(PM.Concentration_2_5_Standard);
61+
SerialUSB.print('\t');
62+
SerialUSB.print(PM.Concentration_10_Standard);
63+
SerialUSB.print('\t');
64+
SerialUSB.print(PM.Concentration_1_Atmospheric);
65+
SerialUSB.print('\t');
66+
SerialUSB.print(PM.Concentration_2_5_Atmospheric);
67+
SerialUSB.print('\t');
68+
SerialUSB.print(PM.Concentration_10_Atmospheric);
69+
SerialUSB.print('\t');
70+
SerialUSB.print(PM.ParticleNumber_0_3);
71+
SerialUSB.print('\t');
72+
SerialUSB.print(PM.ParticleNumber_0_5);
73+
SerialUSB.print('\t');
74+
SerialUSB.print(PM.ParticleNumber_1);
75+
SerialUSB.print('\t');
76+
SerialUSB.print(PM.ParticleNumber_2_5);
77+
SerialUSB.print('\t');
78+
SerialUSB.print(PM.ParticleNumber_5);
79+
SerialUSB.print('\t');
80+
SerialUSB.print(PM.ParticleNumber_10);
81+
SerialUSB.println();
82+
}
83+
84+
delay(INTERVAL);
85+
}

readme.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ Grove
5656
|<img src="https://statics3.seeedstudio.com/images/product/High%20Temperature%20Sensor.jpg" width="100">|GroveHighTemp|111020002|[Grove - High Temperature Sensor](http://wiki.seeedstudio.com/Grove-High_Temperature_Sensor/)||
5757
|<img src="https://statics3.seeedstudio.com/seeed/img/2016-11/txvkIZ9IGno10T8UYi8KTvPS.jpg" width="100">|GroveGPS|113020003|[Grove - GPS](http://wiki.seeedstudio.com/Grove-GPS/)||
5858
|<img src="https://files.seeedstudio.com/wiki/Grove-MP3-V3/img/Grove-MP3-V3-preview.jpg" width="100">|GroveMP3V3|107020069|[Grove - MP3 V3 -Music Player](http://wiki.seeedstudio.com/Grove-MP3-v3/)||
59+
|<img src="https://github.com/SeeedDocument/Grove-Laser_PM2.5_Sensor-HM3301/raw/master/img/main.jpg" width="100">|GrovePM25HM3301|101020613|[Grove - Laser PM2.5 Air Quality Sensor for Arduino - HM3301](http://wiki.seeedstudio.com/Grove-Laser_PM2.5_Sensor-HM3301/)||
5960

6061
### 拡張基板
6162

src/GroveDriverPack.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include "Module/GroveTempHumiSHT35.h"
4343
#include "Module/Grove6AxisAccelGyroLSM6DS3.h"
4444
#include "Module/GroveMP3V3.h"
45+
#include "Module/GrovePM25HM3301.h"
4546

4647
#if defined ARDUINO_ARCH_STM32F4 || defined ARDUINO_ARCH_STM32
4748

src/Module/GrovePM25HM3301.cpp

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
#include "GrovePM25HM3301.h"
2+
#include <climits>
3+
4+
bool GrovePM25HM3301::Init()
5+
{
6+
if (!_Device->IsExist()) return false;
7+
8+
_IsExist = true;
9+
return true;
10+
}
11+
12+
void GrovePM25HM3301::Read()
13+
{
14+
const uint8_t writeData[]{ 0x88, };
15+
_Device->Write(writeData, sizeof(writeData));
16+
17+
uint8_t readData[29];
18+
auto readSize = _Device->Read(readData, sizeof(readData));
19+
20+
uint8_t sum = 0;
21+
for (int i = 0; i < sizeof(readData) - 1; ++i) sum += readData[i];
22+
23+
if (readSize != sizeof(readData) || sum != readData[28])
24+
{
25+
Concentration_1_Standard = INT_MAX;
26+
Concentration_2_5_Standard = INT_MAX;
27+
Concentration_10_Standard = INT_MAX;
28+
Concentration_1_Atmospheric = INT_MAX;
29+
Concentration_2_5_Atmospheric = INT_MAX;
30+
Concentration_10_Atmospheric = INT_MAX;
31+
ParticleNumber_0_3 = INT_MAX;
32+
ParticleNumber_0_5 = INT_MAX;
33+
ParticleNumber_1 = INT_MAX;
34+
ParticleNumber_2_5 = INT_MAX;
35+
ParticleNumber_5 = INT_MAX;
36+
ParticleNumber_10 = INT_MAX;
37+
return;
38+
}
39+
40+
Concentration_1_Standard = readData[4] * 256 + readData[5] ;
41+
Concentration_2_5_Standard = readData[6] * 256 + readData[7] ;
42+
Concentration_10_Standard = readData[8] * 256 + readData[9] ;
43+
Concentration_1_Atmospheric = readData[10] * 256 + readData[11];
44+
Concentration_2_5_Atmospheric = readData[12] * 256 + readData[13];
45+
Concentration_10_Atmospheric = readData[14] * 256 + readData[15];
46+
ParticleNumber_0_3 = readData[16] * 256 + readData[17];
47+
ParticleNumber_0_5 = readData[18] * 256 + readData[19];
48+
ParticleNumber_1 = readData[20] * 256 + readData[21];
49+
ParticleNumber_2_5 = readData[22] * 256 + readData[23];
50+
ParticleNumber_5 = readData[24] * 256 + readData[25];
51+
ParticleNumber_10 = readData[26] * 256 + readData[27];
52+
}

src/Module/GrovePM25HM3301.h

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
//GROVE_NAME "Grove - Laser PM2.5 Air Quality Sensor for Arduino - HM3301"
2+
//SKU 101020613
3+
//WIKI_URL http://wiki.seeedstudio.com/Grove-Laser_PM2.5_Sensor-HM3301/
4+
5+
#pragma once
6+
7+
#include "Abstract/GroveModule2.h"
8+
#include "../Connector/GroveConnectorI2C.h"
9+
10+
class GrovePM25HM3301 : public GroveModule2
11+
{
12+
private:
13+
HalI2CDevice* _Device;
14+
15+
public:
16+
int Concentration_1_Standard; // [ug/m3]
17+
int Concentration_2_5_Standard; // [ug/m3]
18+
int Concentration_10_Standard; // [ug/m3]
19+
int Concentration_1_Atmospheric; // [ug/m3]
20+
int Concentration_2_5_Atmospheric; // [ug/m3]
21+
int Concentration_10_Atmospheric; // [ug/m3]
22+
int ParticleNumber_0_3; // [#/l]
23+
int ParticleNumber_0_5; // [#/l]
24+
int ParticleNumber_1; // [#/l]
25+
int ParticleNumber_2_5; // [#/l]
26+
int ParticleNumber_5; // [#/l]
27+
int ParticleNumber_10; // [#/l]
28+
29+
public:
30+
GrovePM25HM3301(GroveConnectorI2C* connector)
31+
{
32+
_Device = connector->NewDevice(0x40); // I2C_ADDRESS
33+
}
34+
35+
bool Init();
36+
void Read();
37+
38+
};

0 commit comments

Comments
 (0)