Модуль имеет два выхода для получения данных — последовательный UART-интерфейс и ШИМ-сигнал. Выходные интерфейсы имеют логические уровни TTL 3.3 В, но при этом они имеют совместимость с 5-вольтовой логикой.
В датчике имеется встроенная термокомпенсация, что позволяет использовать датчик при температурах от 0 °C до +50 °C с минимальной погрешностью.
При использовании датчика обязательно нужно учитывать, что он имеет некоторую инерционность показаний – при изменении концентрации углекислого газа датчику требуется около одной минуты для выдачи корректных значений. Также стоить обратить внимание на то, что после подачи питания датчику требуется около трех минут для подготовки к работе, в течение этого времени показания концентрации CO2 использовать нельзя, так как они будут значительно отличаться от действительности.
Контактная группа модуля:
- Hd – калибровка нуля начнется, если на Hd более 7 секунд подается LOW. Калибровку проводить не нужно.
- SR – не используется.
- Tx – уровень сигнала — 3.3V.
- Rx – тоже 3.3V (работает и с 5V, но не рекомендуется).
- Vo – выходное напряжение 3.3V, не более 10 мА.
- PWM – данные снимаются так: длина цикла 1004 мс, первые 2 мс всегда HIGH, последние — всегда LOW, а «середина» пропорциональна концентрации CO2 в пределах 0 — 5000 ppm.
Cppm = 5000 * (Thigh — 2ms)/(Thigh + Tlow — 4ms) - AOT – не используется.
- GND – общий.
- Vin – напряжение питания 3.6 — 5.5 В (сенсор работает и выдает те же значения при питании 3.3 В).
Пример 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#define pwmPin 5 #define LedPin 13 int prevVal = LOW; long th, tl, h, l, ppm; void setup() { Serial.begin(9600); pinMode(pwmPin, INPUT); pinMode(LedPin, OUTPUT); } void loop() { long tt = millis(); int myVal = digitalRead(pwmPin); //Если обнаружили изменение if (myVal == HIGH) { digitalWrite(LedPin, HIGH); if (myVal != prevVal) { h = tt; tl = h - l; prevVal = myVal; } } else { digitalWrite(LedPin, LOW); if (myVal != prevVal) { l = tt; th = l - h; prevVal = myVal; ppm = 5000 * (th - 2) / (th + tl - 4); Serial.println("PPM = " + String(ppm)); } } } |
Пример 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
#include <SoftwareSerial.h>; SoftwareSerial mySerial(A1, A0); // A1 - к TX сенсора, A0 - к RX byte cmd[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; unsigned char response[9]; void setup() { Serial.begin(9600); mySerial.begin(9600); } void loop() { mySerial.write(cmd, 9); memset(response, 0, 9); mySerial.readBytes(response, 9); int i; byte crc = 0; for (i = 1; i < 8; i++) crc+=response[i]; crc = 255 - crc; crc++; if ( !(response[0] == 0xFF && response[1] == 0x86 && response[8] == crc) ) { Serial.println("CRC error: " + String(crc) + " / "+ String(response[8])); } else { unsigned int responseHigh = (unsigned int) response[2]; unsigned int responseLow = (unsigned int) response[3]; unsigned int ppm = (256*responseHigh) + responseLow; Serial.println(ppm); } delay(10000); } |