Код: Выделить всё
// ############################################## SHARP GP2Y1010AU0F ##################################################### //
// //
// @filename : DustSensor_V3.ino //
// @brief en : Measurement of the level of dust and suspended particles in the air. //
// Approximate measurement of PPM 2.5 //
// @brief ru : Измерение уровня пыли, взвешенных частиц в воздухе. Приближенное измерение PPM 2.5 //
// @author : Andrew Lamchenko aka Berk //
// //
// Copyright (C) EFEKTALAB 2018 //
// //
// ######################################################################################################################## //
#define MY_DEBUG
#define SEND_HEARTBEAT
#define MY_RADIO_RF24
#include <MySensors.h>
#define CHILD_ID_DUST 0
static const uint8_t ledPower = 8; // Пин включение IR LED сенсора воздуха
static const uint8_t sensApin = 5; // Пин чтения данных сенсора воздуха
bool firstLoop;
unsigned int samplingTime = 290;
unsigned int deltaTime = 30;
unsigned int sleepTime = 9680;
float ready_dustDensity;
float old_ready_dustDensity = -999.0;
float t_dustDensity = 1.0;
float filterCoof = 0.9;
//float coof; // для старых датчиков
static uint8_t CALC_N_READS = 20; // рекомендуется 50 чтений, (миним.10, но можно и одно :)), больше чтений, выше точность .....готовые данные 10мс-500мс
uint32_t previousMillis = 0; // здесь будет храниться время последнего запуска функции работы сенсора
uint32_t interval1 = 10; // интервал в секундах
#ifdef SEND_HEARTBEAT
uint32_t previousMillis2 = 0; // здесь будет храниться время последней отправки пульса
uint32_t interval2 = 600; // интервал в секундах
#endif
MyMessage dustMsg(CHILD_ID_DUST, V_LEVEL);
void before() {
pinMode(ledPower, OUTPUT);
digitalWrite(ledPower, HIGH);
wait(50);
if (CALC_N_READS < 1) {
CALC_N_READS = 1;
}
/*
// для старых датчиков, которые использовали больше года, приведено для примера, со временем падвет чувствительность нижнего уровня
if (CALC_N_READS < 10) {
CALC_N_READS = 10;
}
if (CALC_N_READS >= 50) {
coof = 0.005;
} else if (CALC_N_READS >= 40) {
coof = 0.00625;
} else if (CALC_N_READS >= 30) {
coof = 0.0075;
} else if (CALC_N_READS >= 20) {
coof = 0.01;
} else if (CALC_N_READS >= 10) {
coof = 0.015;
} else if (CALC_N_READS > 0) {
coof = 0.0175;
}
*/
}
void presentation()
{
sendSketchInfo("Dust Sensor GP2Y10", "3.0");
present(CHILD_ID_DUST, S_DUST);
}
void setup() {
dustwork();
sendHeartbeat();
}
void loop() {
if (millis() - previousMillis > interval1 * 1000) {
previousMillis = millis(); // запоминаем текущее время
dustwork();
}
#ifdef SEND_HEARTBEAT
if (millis() - previousMillis2 > interval2 * 1000) {
previousMillis2 = millis(); // запоминаем текущее время
sendHeartbeat();
}
#endif
}
void dustwork() {
float voMeasured = 0;
float voMeasuredTemp = 0;
float calcVoltage = 0;
float dustDensity = 0;
//float filtered_dustDensity = 0;
for (uint8_t i = 0; i < CALC_N_READS; i++) {
digitalWrite(ledPower, LOW);
delayMicroseconds(samplingTime);
voMeasuredTemp = analogRead(sensApin);//
delayMicroseconds(deltaTime);
digitalWrite(ledPower, HIGH);
if (CALC_N_READS > 1) {
delayMicroseconds(sleepTime);
}
voMeasured = voMeasured + voMeasuredTemp;
}
voMeasured = voMeasured / CALC_N_READS;
calcVoltage = voMeasured * (5.0 / 1024.0);
dustDensity = (0.17 * calcVoltage - (0.1)) * 1000;
//dustDensity = (0.17 * calcVoltage - (0.1 + coof)) * 1000; // для старых датчиков
if (firstLoop == false) { // Присвоение переменной значения для фильтрации начальныхданных
firstLoop = true;
ready_dustDensity = dustDensity;
}
ready_dustDensity += (dustDensity - ready_dustDensity) * filterCoof;
if (ready_dustDensity < 0)
{
ready_dustDensity = 0.00;
}
#ifdef MY_DEBUG
Serial.print("Data: ");
Serial.print(dustDensity, 2);
Serial.print(" µg/m^3");
Serial.print(" | filtration: ");
Serial.println(filterCoof);
Serial.print("Filtered data: ");
Serial.print(ready_dustDensity, 2);
Serial.print(" µg/m^3");
Serial.print(" | filtration: ");
Serial.println(filterCoof);
#endif
if (abs(ready_dustDensity - old_ready_dustDensity) >= t_dustDensity) {
send(dustMsg.set(ready_dustDensity, 1));
old_ready_dustDensity = ready_dustDensity;
}
}
[attachment=0]photo_2020-06-28_13-15-03.jpg[/attachment]