====== Метеостанция c двумя термометрами, гигрометром и барометром ====== **[[arduino-projects:start|Проекты на Arduino Uno и Slot Shield]]** Погода в доме это важно, но хочется знать и температуру за окном. Соберём метеостанцию с выносным датчиком температуры. Температуру на улице определим с помощью [[amp>product/sealed-temperature-sensor-ds18b20?utm_source=proj&utm_campaign=arduino-slot-proj-10&utm_medium=wiki|герметичного термометра DS18B20]]. Это просто, недорого и голова не будет болеть о батарейках. {{ :arduino-projects:weather-station:weatherstation_fin4.png |}} В остальном — это обычная метеостанция на Ардуино. Управляющая плата — оригинальная [[amp>product/arduino-uno?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|Arduino Uno]]. За температуру и влажность отвечает [[amp>product/troyka-meteo-sensor?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|цифровой метеосенсор]]. Атмосферное давление показывает [[amp>product/troyka-barometer?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|барометр]]. * Платформы: [[amp>product/arduino-uno?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|Arduino Uno]], [[amp>product/arduino-leonardo?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|Arduino Leonardo]], [[amp>product/iskra-neo?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|Iskra Neo]] * Язык программирования: Arduino (C++) ===== Что потребуется ===== [[amp>collection/weather-station?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki | Полный сет]] компонентов проекта. В сет входят: * [[amp>product/arduino-uno?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|Arduino Uno]] * [[amp>product/arduino-troyka-slot-shield?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|Troyka Slot Shield]] * цифровой [[amp>product/troyka-meteo-sensor?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|метеодатчик]] * четырёхразряный индикатор [[amp>product/troyka-quad-display?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|Quad Display]] * [[amp>product/troyka-barometer?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|барометр]] * [[amp>product/sealed-temperature-sensor-ds18b20?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|датчик температуры DS18B20]] и [[amp>product/troyka-pull-up?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|модуль подтяжки]] ===== Видеоинструкция ===== {{youtube>MTm5PyIJJEY?large}} ===== Как собрать ===== Установите [[amp>product/arduino-troyka-slot-shield?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|Troyka Slot Shield]] на [[amp>product/arduino-uno?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|Arduino Uno]] {{ :arduino-projects:weather-station:weatherstation0.png |}} Подключите [[amp>product/troyka-quad-display?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|метеодатчик]] к пинам I²C разъёма ''A''. {{ :arduino-projects:weather-station:weatherstation1.png |}} Вставьте [[amp>product/troyka-quad-display?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|Quad Display]] в разъёмы ''E'' и ''F''. Пин ''CS'' подключите к ''10'' пину Arduino. {{ :arduino-projects:weather-station:weatherstation2.png |}} [[amp>product/troyka-barometer?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|Барометр]] вставьте в пины ''I²C'' разъёма ''B''. {{ :arduino-projects:weather-station:weatherstation3.png |}} Подключите [[amp>product/sealed-temperature-sensor-ds18b20?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|термометр DS18B20]] к пину ''4'' слота ''C''. Для этого используйте [[amp>product/troyka-pull-up?utm_source=proj&utm_campaign=arduino-slot-proj-9&utm_medium=wiki|модуль подтяжки]]. {{ :arduino-projects:weather-station:weatherstation4.png |}} ===== Скетч ===== Прошейте контроллер скетчем через [[articles:arduino-ide-install|Arduino IDE]]. // библиотека для работы I²C #include // библиотека для работы с метеосенсором #include // Подключаем библиотеку для работы с дисплеем #include // библиотека для работы с модулями IMU #include // библиотека для работы с протоколом 1-Wire #include // библиотека для работы с датчиком DS18B20 #include // сигнальный пин датчика DS18B20 #define ONE_WIRE_BUS 5 // создаём объект для работы с метеосенсором TroykaMeteoSensor meteoSensor; // создаём объект класса QuadDisplay и передаём номер пина CS QuadDisplay qd(10); // создаём объект для работы с барометром Barometer barometer; // создаём объект для работы с библиотекой OneWire OneWire oneWire(ONE_WIRE_BUS); // создадим объект для работы с библиотекой DallasTemperature DallasTemperature sensor(&oneWire); // перечисляем имена операций, которые мы будем выводить на дисплей enum { IN, // имя для операции, которая выводит на дисплей надпись "In" TEMP_IN, // имя для операции, которая выводит на дисплей температуру с метеосенсора CEL, // имя для операции, которая выводит на дисплей символ °C HUM_IN, // имя для операции, которая выводит на дисплей влажность с метеосенсора PPM, // имя для операции, которая выводит на дисплей символ % BAR_IN, // имя для операции, которая выводит на дисплей давление с барометра в миллиметрах ртутного столба MER, // имя для операции, которая выводит на дисплей надпись "Hg" EMPTY, // имя для операции, которая очищает дисплей OUT, // имя для операции, которая выводит на дисплей надпись "Out" TEMP_OUT // имя для операции, которая выводит на дисплей температуру с датчика DS18B20 }; // создаем массив, в котором будем хранить последовательность операций int chain[] = { IN, TEMP_IN, CEL, HUM_IN, PPM, BAR_IN, MER, EMPTY, OUT, TEMP_OUT, CEL, EMPTY }; // создаем объект класса long для хранения счетчика unsigned long respite_Time = 0; // создаем объект для регулировки времени показа значений на экране int slowdown_qd = 1000; // создаем объект для хранения номера выполняемой операции int number_qd = 0; void setup() { // инициализация дисплея qd.begin(); // инициализируем метеосенсора meteoSensor.begin(); // инициализация барометра barometer.begin(); // инициализируем работу с датчиком DS18B20 sensor.begin(); // устанавливаем разрешение датчика от 9 до 12 бит sensor.setResolution(12); } void loop() { // запускаем бесконечный счетчик. Его содержимое будет обрабатываться с периодом равным slowdown_qd if (millis() - respite_Time > slowdown_qd) { // запускаем процесс, который будет выполнять операции согласно последовательности в chain switch (chain[number_qd]) { case IN: qd.displayDigits(QD_I, QD_n, QD_NONE, QD_NONE); break; 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; case OUT: qd.displayDigits(QD_O, QD_u, QD_t, QD_NONE); break; case TEMP_OUT: // переменная для хранения температуры float temperature; // отправляем запрос на измерение температуры sensor.requestTemperatures(); // выводим значение с датчика DS18B20 на экран qd.displayFloat(sensor.getTempCByIndex(0), 1); 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; } } ====== Часто задаваемые вопросы ====== > Где скачать необходимые библиотеки и как их установить? * [[https://github.com/amperka/TroykaMeteoSensor|Библиотека для работы с метеосенсором]] * [[https://github.com/amperka/QuadDisplay2|Библиотека для работы с дисплеем]] * [[https://github.com/amperka/Troyka-IMU|Библиотека для работы с IMU]] * [[http://wiki.amperka.ru/_media/%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B:ds18b20:arduino-temperature-control-library-master.zip|Библиотека для термометра DS18B20]] * [[http://wiki.amperka.ru/_media/%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%8B:ds18b20:onewire-master.zip|Библиотека OneWire]] * [[программирование:библиотеки|Как установить библиотеку]] > У моего модуля QuadDisplay всего три ноги и расположены они слева. Можно ли использовать его в этом проекте? У вас предыдущая версия модуля. Она снята с производства пару лет назад. С этим скетчем, библиотекой и схемой сборки модуль работать не будет.