#1 2023-09-29 10:07:06

ivvi30
Учасник
Зареєстрований: 2023-09-27
Повідомлень: 14

Mh-z19b проблеми з відображенням ppm.

Хочу підключити кілька датчиків Mh-z19b(датчики купував у одного продавця, ніби одинакові) до mega2560 для керування вентиляторами в будинку. Проблема полягає в тому, що підключивши 2 датчика на пін 2 і 3 для мене показалось що покази приблизно одинакові і фізично відключивши один, показники СО2 приблизно дублюються на іншому піні. Більше того коли подую на один датчик на другому також автоматично піднімається рівень СО2(навіть коли він фізично відключений від 3 піну). Використовував pwm(цифровий вихід) канал зв'язку на датчику, також бібліотеку MHZ.h.

#include <MHZ.h>

// pin for pwm reading
#define CO2_IN 2
#define CO2_IN1 3

MHZ co2(CO2_IN, MHZ19B);
MHZ co21(CO2_IN1, MHZ19B, RANGE_2K);

void setup() {
  Serial.begin(9600);
  pinMode(CO2_IN, INPUT);
  pinMode(CO2_IN1, INPUT);
    delay(100);
}

void loop() {
  int ppm_pwm = co2.readCO2PWM();
  Serial.println(ppm_pwm);
  int ppm_pwm1 = co2.readCO2PWM();
  Serial.println(ppm_pwm1);
 
 delay(5000);
}

Питання: Як позбутися цього дублювання і чому це так стається?

Остання редакція ivvi30 (2023-09-29 10:20:52)

Неактивний

#2 2023-09-29 10:28:51

ivvi30
Учасник
Зареєстрований: 2023-09-27
Повідомлень: 14

Re: Mh-z19b проблеми з відображенням ppm.

Розібрався невірний код був.
Ось що виправив:

int ppm_pwm1 = co21.readCO2PWM();

Неактивний

#3 2023-09-29 11:40:17

ivvi30
Учасник
Зареєстрований: 2023-09-27
Повідомлень: 14

Re: Mh-z19b проблеми з відображенням ppm.

Виникла ще одна проблема. Частина датчиків були куплені в одному інтернет-магазині в Україні і інші в іншому, так як в попередньому не вистачило кілька штук. І на датчиках різниця тільки в заявленому(написаному на них) діапазоні 0-5000ppm s 400-5000ppm. Два датчика підключені по pwm, лежать один біля одного, а різниця в показниках дуже різниця 850 і 2350 ppm. В чому може бути причина?

Неактивний

#4 2023-09-29 12:51:07

г0cть
Гість

Re: Mh-z19b проблеми з відображенням ppm.

ivvi30 пише:

різниця в показниках дуже різниця 850 і 2350 ppm. В чому може бути причина?

С такими датчиками не работал, но попадалась информация что их нужно минимум сутки калибровать в одинаковых условиях

#5 2023-09-29 14:52:23

ivvi30
Учасник
Зареєстрований: 2023-09-27
Повідомлень: 14

Re: Mh-z19b проблеми з відображенням ppm.

ivvi30 пише:

Виникла ще одна проблема. Частина датчиків були куплені в одному інтернет-магазині в Україні і інші в іншому, так як в попередньому не вистачило кілька штук. І на датчиках різниця тільки в заявленому(написаному на них) діапазоні 0-5000ppm s 400-5000ppm. Два датчика підключені по pwm, лежать один біля одного, а різниця в показниках дуже різниця 850 і 2350 ppm. В чому може бути причина?

Причина була в калібровці. Хоч на датчику написано 5000, по факту 2000.

Неактивний

#6 2023-10-05 14:35:15

ivvi30
Учасник
Зареєстрований: 2023-09-27
Повідомлень: 14

Re: Mh-z19b проблеми з відображенням ppm.

#include <MHZ.h>

#define CO2_SENSOR_PIN 5

MHZ co2Sensor(CO2_SENSOR_PIN, MHZ19B, RANGE_2K);

unsigned long previousMillis = 0;
const unsigned long interval = 5000;  // Затримка 5 секунд

const int maxSavedCO2Readings = 30;
int savedCO2Readings[maxSavedCO2Readings];
int savedCO2Index = 0;
int lastValidCO2 = 0;

void setup() {
  Serial.begin(9600);
  pinMode(CO2_SENSOR_PIN, INPUT); // Налаштовуємо пін CO2 датчика на вхід
}
Чому 

void loop() {
  unsigned long currentMillis = millis();

  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;

    int co2Level = co2Sensor.readCO2PWM();  // Отримуємо рівень CO2

    if (isValidCO2Level(co2Level)) {
      lastValidCO2 = co2Level;
      saveCO2Reading(co2Level);
    }

    // Виводимо останнє дійсне значення CO2 в серійний порт
    Serial.println(lastValidCO2);
  }
}

bool isValidCO2Level(int co2Level) {
  return (co2Level >= 400 && co2Level <= 2000);
}

void saveCO2Reading(int co2Level) {
  savedCO2Readings[savedCO2Index] = co2Level;
  savedCO2Index = (savedCO2Index + 1) % maxSavedCO2Readings;
}

int getValidCO2Level() {
  return lastValidCO2;
}

Чому міняю з піна 5 на 6,7,8 і значення завжди 0?

Неактивний

#7 2023-10-06 10:26:46

ivvi30
Учасник
Зареєстрований: 2023-09-27
Повідомлень: 14

Re: Mh-z19b проблеми з відображенням ppm.

Не можу під'єднати на мегу2560 більше 1 датчика mhz19b по каналу pwm(тільки на 5 піні працює, перепробував від 2 до 15, А0-А1 пінів не працює), тому прийдеться підключати по аналоговому каналу.
Але і тут виникла проблема, під'єднав всі датчики від А1-А11. Для тесту в скетчі вписав тільки А1, А2. Але коли подую на 1 датчик на другому також зростають показники приблизно одинаково. В чому проблема? Що не так?

int analogPin1 = A1;  // Пін для першого датчика MH-Z19B
int analogPin2 = A2;  // Пін для другого датчика MH-Z19B

unsigned long previousMillis = 0;
const unsigned long interval = 5000;  // Інтервал виведення в мілісекундах

void setup() {
  pinMode(analogPin1, INPUT); // Налаштовуємо пін A1 як вхід
  pinMode(analogPin2, INPUT); // Налаштовуємо пін A2 як вхід
  Serial.begin(9600);
}

void loop() {
  unsigned long currentMillis = millis();

  // Зчитування значення PPM з першого датчика на A1
  int rawValue1 = analogRead(analogPin1);
  unsigned int ppm1 = map(rawValue1, 0, 1023, 400, 2000);  // Діапазон 400-2000 PPM

  // Зчитування значення PPM з другого датчика на A2
  int rawValue2 = analogRead(analogPin2);
  unsigned int ppm2 = map(rawValue2, 0, 1023, 400, 2000);  // Діапазон 400-2000 PPM

  // Перевірка інтервалу для виведення в серійний порт
  if (currentMillis - previousMillis >= interval) {
    // Виведення значень PPM у серійний порт
    Serial.print(ppm1);
    Serial.print(" ");
    Serial.println(ppm2);

    previousMillis = currentMillis;
  }
}

mhz19b.jpg

Остання редакція ivvi30 (2023-10-06 10:27:51)

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму