// библиотека для работы I²C #include // библиотека для работы с метеосенсором #include // Подключаем библиотеку для работы с дисплеем #include // библиотека для работы с модулями IMU #include // создаём объект для работы с метеосенсором TroykaMeteoSensor meteoSensor; // создаём объект класса QuadDisplay и передаём номер пина CS QuadDisplay qd(10); // создаём объект для работы с барометром Barometer barometer; // перечисляем имена операций, которые мы будем выводить на дисплей enum { TEMP_IN, // имя для операции, которая выводит на дисплей температуру с метеосенсора CEL, // имя для операции, которая выводит на дисплей символ °C HUM_IN, // имя для операции, которая выводит на дисплей влажность с метеосенсора PPM, // имя для операции, которая выводит на дисплей символ % BAR_IN, // имя для операции, которая выводит на дисплей давление с барометра в миллиметрах ртутного столба MER, // имя для операции, которая выводит на дисплей надпись "Hg" EMPTY // имя для операции, которая очищает дисплей }; // создаем массив, в котором будем хранить последовательность операций int chain[] = { TEMP_IN, CEL, HUM_IN, PPM, BAR_IN, MER, EMPTY }; // создаем объект класса long для хранения счетчика unsigned long respite_Time = 0; // создаем объект для регулировки времени показа значений на экране int slowdown_qd = 1000; // создаем объект для хранения номера выполняемой операции int number_qd = 0; void setup() { // инициализация дисплея qd.begin(); // инициализируем метеосенсора meteoSensor.begin(); // инициализация барометра barometer.begin(); } void loop() { // запускаем бесконечный счетчик. Его содержимое будет обрабатываться с периодом равным slowdown_qd if (millis() - respite_Time > slowdown_qd) { // запускаем процесс, который будет выполнять операции согласно последовательности в chain switch (chain[number_qd]) { case TEMP_IN: showData(meteoSensor.getTemperatureC()); break; case CEL: qd.displayDigits(QD_NONE, QD_NONE, QD_DEGREE, QD_C); break; case HUM_IN: showData(meteoSensor.getHumidity()); break; case PPM: qd.displayDigits(QD_NONE, QD_NONE, QD_DEGREE, QD_UNDER_DEGREE); break; case BAR_IN: qd.displayInt(barometer.readPressureMillimetersHg()); break; case MER: qd.displayDigits(QD_NONE, QD_NONE, QD_H, QD_9); break; case EMPTY: qd.displayClear(); break; } number_qd++; // проверяем не превысил ли номер операции количество операций if (number_qd > sizeof(chain) / sizeof(int) - 1) number_qd = 0; respite_Time = millis(); } } // функция работы датчика температуры и влажности void showData(float data) { // считываем данные с датчика int stateSensor = meteoSensor.read(); switch (stateSensor) { // выводим показания на дисплей case SHT_OK: qd.displayFloat(data, 1); break; // выводим сообщение "Errd", если ошибка данных или сенсор не подключён case SHT_ERROR_DATA: qd.displayDigits(QD_E, QD_r, QD_r, QD_d); // выводим сообщение "ErrC", если ошибка контрольной суммы case SHT_ERROR_CHECKSUM: qd.displayDigits(QD_E, QD_r, QD_r, QD_C); break; } }