// ПРИМЕР ЧТЕНИЯ ДАННЫХ СО ВСЕХ МОДУЛЕЙ УГЛЕКИСЛОГО ГАЗА НА ШИНЕ:                  //
// без указания их адресов в скетче.                                               //
                                                                                   //
#include <SoftwareSerial.h>                                                        //   Подключаем библиотеку для работы с программной шиной UART.
#include <iarduino_Modbus.h>                                                       //   Подключаем библиотеку для работы по протоколу Modbus.
#include <iarduino_MB_eCO2.h>                                                      //   Подключаем библиотеку для работы с модулем углекислого газа.
                                                                                   //
SoftwareSerial    rs485(8,9);                                                      //   Создаём объект для работы с программной шиной UART-RS485 указывая выводы RX, TX.
ModbusClient      modbus(rs485, 2);                                                //   Создаём объект для работы по протоколу Modbus указывая объект программной шины UART-RS485 и вывод DE конвертера UART-RS485.
iarduino_MB_eCO2* sensor;                                                          //   Создаём указатель который будет переопределён в массив объектов работы с модулями углекислого газа.
                                                                                   //
uint8_t sum=0;                                                                     //   Определяем переменную для хранения количества найденных модулей углекислого газа.
uint8_t i=0;                                                                       //
                                                                                   //
void setup(){                                                                      //
     Serial.begin(9600);   while(!Serial);                                         //   Инициируем передачу данных в монитор последовательного порта, указав его скорость.
     rs485.begin(9600); // while(!rs485 );                                         //   Инициируем работу с программной шиной UART-RS485 указав её скорость.
     modbus.begin();                                                               //   Инициируем работу по протоколу Modbus.
//   modbus.setTimeout(10);                                                        //   Указываем максимальное время ожидания ответа по протоколу Modbus.
//   modbus.setDelay(4);                                                           //   Указываем минимальный интервал между отправляемыми сообщениями по протоколу Modbus.
//   modbus.setTypeMB( MODBUS_RTU );                                               //   Указываем тип протокола Modbus: MODBUS_RTU (по умолчанию), или MODBUS_ASCII.
                                                                                   //
//   Выполняем поиск всех модулей углекислого газа шине (занимает несколько сек):  //
     Serial.print("Поиск модулей углекислого газа ... " );                         //
     sum = modbus.findID( DEF_MODEL_eCO2 );                                        //   Ищем адреса всех устройств с идентификатором DEF_MODEL_eCO2.
     uint8_t arrID[sum];                                                           //   Объявляем массив arrID для хранения найденных адресов.
     while( modbus.available() ){ arrID[i++]=modbus.read(); }                      //   Заполняем массив arrID найденными адресами.
     Serial.print("найдено "); Serial.print(sum); Serial.println(" модулей.");     //
                                                                                   //
//   Если модули не найдены, то переходим в loop() где ничего не произойдёт.       //
     if( sum==0 ){ return; }                                                       //
                                                                                   //
//   Переопределяем указатель sensor в массив объектов:                            //
     sensor=(iarduino_MB_eCO2*)malloc(sizeof(iarduino_MB_eCO2)*sum);               //   Выделяем под массив sensor требуемый объем памяти.
     for(i=0; i<sum; i++){ sensor[i]=modbus; sensor[i].begin(arrID[i]); }          //   Инициируем работу с найденными модулями.
                                                                                   //
//   Выводим адреса найденных модулей углекислого газа:                            //
     Serial.print("Адреса найденных модулей углекислого газа: ");                  //
     for(i=0; i<sum; i++){ Serial.print( sensor[i].getID() ); Serial.print(", ");} //
     Serial.println();                                                             //
}                                                                                  //
                                                                                   //
void loop(){                                                                       //
     for(i=0; i<sum; i++){                                                         //   Проходим по всем модулям углекислого газа.
         Serial.print( (String) "ID="   + sensor[i].getID()   + ", "       );      //   Выводим ID текущего модуля углекислого газа.
         Serial.print( (String) "CO2="  + sensor[i].getCO2()  + "ppm, "    );      //   Выводим количество эквивалента СО2 (углекислого газа).
         Serial.print( (String) "TVOC=" + sensor[i].getTVOC() + "ppb.\r\n" );      //   Выводим общее количество летучих органических соединений.
         delay(1000);                                                              //
     }                                                                             //
}                                                                                  //
