Понимание таблицы данных датчика газа HCHO

У меня есть газовый датчик, спецификация которого прилагается:
DS-HCHO

Теперь он говорит, что требуется связь UART (P2P), где он (модуль) ожидает фрейма данных перед отправкой фрейма данных на хост, который мне нужен.

Все, что я знаю, это то, что я могу отправить стартовый бит в I2C, но что мне делать дальше? Кроме того, если у меня есть несколько датчиков, как мне подключить их к ESP-32?

, 👍0

Обсуждение

UART используется для связи типа rs232... это не I2C, @jsotola

В техническом описании сказано, что датчик ожидает байтов перед отправкой, покажите, должен ли я продолжить кодирование. Я не мог получить значения данных., @Raj

Шаг 1: Отправьте правильные байты данных. Шаг 2: Получите данные от модуля. Шаг 3: Прибыль., @Majenko

https://www.arduino.cc/reference/en/language/functions/communication/serial/, @Majenko


1 ответ


Лучший ответ:

0

Во-первых, вам необходимо обмениваться данными по UART, не I2C. Это означает использование Serial или какого-либо подобного объекта (в ESP32 вы можете определить свой собственный на любых контактах, которые хотите). Однако в техническом описании отсутствует одна важная часть информации: скорость передачи данных, поэтому вам придется угадать это и попробовать различные стандартные скорости передачи данных, пока не найдете ту, которая работает.

Тогда вы должны отправить инструкцию "Дайте мне данные". Затем модуль отвечает данными.

Например (не проверено):

HardwareSerial mySerial(1);

#define PIN_RX 21
#define PIN_TX 22

void setup() {
    Serial.begin(115200);
    mySerial.begin(9600, SERIAL_8N1, PIN_RX, PIN_TX); // Это тот, который вам нужно угадать, так как DS опускает его...
}

void setup() {

    // Раз в секунду отправляем запрос на получение данных

    static uint32_t ts = millis();
    if (millis() - ts > 1000) { // Раз в секунду
        ts = millis();
        // "Дайте мне данные"
        mySerial.print("\x42\x4d\x01\x00\x00\x00\x90");
    }

    // Когда поступило 10 или более байтов, предположим, что они введены правильно
    // обрамляем и печатаем их. На самом деле он должен читать по одному байту за раз и
    // ищем правильную последовательность запуска 0x42 0x4d 0x08 и только чтение
    // оттуда, но это будет сервер для демонстрационных целей.

    if (mySerial.available() >= 10) { // Ожидается, что будет возвращено 10 байт
        uint8_t packet[10];
        mySerial.readBytes(packet, 10);
        Serial.print("ID:   ");
        Serial.println(packet[3]);
        Serial.print("UNIT: ");
        Serial.println(packet[4]);
        Serial.print("VH:   ");
        Serial.println(packet[5]);
        Serial.print("DHH:  ");
        Serial.println(packet[6]);
        Serial.print("DLL:  ");
        Serial.println(packet[7]);
        Serial.print("LRCH: ");
        Serial.println(packet[8]);
        Serial.print("LRCL:   ");
        Serial.println(packet[9]);
    }
}
,

Спасибо. Ну очень помогло., @Raj