Каталог
|
Винтажный барометр2015-12-04 Все статьи →Александр Чечин Давным-давно, когда люди только-только начинали покорять космос и учились перепрыгивать через звуковой барьер, все приборы у них были стрелочные. Острый конец пляшущей стрелки исправно указывал человечеству на время, скорость, высоту, вес … Да практически на все. Цифра только-только начинала медленно выползать из секретных лабораторий в нашу обычную жизнь. А теперь? Стрелку почти не видно, она - редкость, почти музейная. Одним словом – винтаж. Посетила меня мысль, собрать себе барометр, а какой барометр без стрелки? J – никакой. Кто будет на солнце показывать, а на облака? Корявая цифра что ли? Без стрелки барометра явно не получится. В старом хламе всегда найдется старенький стрелочный электромеханизм. Это может быть вольтметр или амперметр, а может указатель уровня звука от старого магнитофона. У меня вот обнаружился такой указатель типа М-4761.
Шкала двух цветов – красный и черный, вполне подходяще. Пусть стрелка показывает на красный, когда погода будет лучше, а на черный, когда грядут дожди и бури. Теоретически, в будущем, можно будет аккуратно вскрыть его пластиковый корпус и сделать новую шкалу с солнцем и облаками. Тут современный принтер поможет реализовать любую фантазию. Начнем. Но прежде, нужно изучить поведение винтажного индикатора и его характеристики. В Интернете легко найти, что номинальный ток у таких приборов пара сотен микроампер. Цифровой pin Arduino такую нагрузку легко выдерживает. (ВНИМАНИЕ - максимальное значение тока 40 мА). Ток ограничим включением последовательно с индикатором обычного резистора на 10 кОм. Теперь можно собирать схему. Двигать стрелкой будем при помощи ручки потенциометра, меняя напряжение на входе АЦП (analog pin 0). Индикатор подключим к цифровому выходу с ШИМ (digital pin 3).
Единственная сложность скрывается в том, что АЦП будет выдавать число, которое меняется от 0 до 1023, а для ШИМ нужно число от 0 до 255. В этом случае удобно использовать функцию map, которая предназначена для пересчета значений из одного диапазона в другой. Формат вызова функции map(x, fromLow, fromHigh, toLow, toHigh), где: x – переменная хранящее значение, fromLow – нижняя граница старого диапазона, fromHigh – верхняя граница старого диапазона, toLow – нижняя граница нового диапазона, toHigh – верхняя граница нового диапазона. Для нашего случая вызов функции будет такой - map(val, 0, 1024, 0, 255). Скетч: byte rez = 0; //аналоговый pin byte indicator = 3; //цифровой pin з ШИМ void setup() { //включаем цифровой pin как выход pinMode(indicator, OUTPUT); } int val; //для хранения данных из аналогового порта void loop() { val= analogRead(rez); //читаем значенние напряжения val=map(val, 0, 1024, 0, 255); //пересчитываем диапазон analogWrite(indicator, val); //выводим на индикатор } Включаем и крутим ручку потенциометра. Стрелка будет послушно отклоняться из одного крайнего положения в другое.
Теперь нужно проверить, как будет вести себя индикатор, если на него подавать сигнал от датчика давления – барометра. Изучение фотографий старинных стрелочных барометров показывает, что давление может меняться в пределах от 700 мм рт.ст. – "Буря", до 800 мм рт.ст. – "Очень сухо". Диапазон 740-760 мм рт.ст. у предков отводился под неопределенную погоду – "Переменно". На будущее, для печати облачков и солнц, составил такую таблицу:
Введем в скетч новую переменную Pmm, которая будет имитировать показания барометра. Числовые значения "давления" будем контролировать по последовательному порту. Пишем новый скетч: byte rez = 0; //аналоговый pin byte indicator = 3; //цифровой pin з ШИМ void setup() { //включаем последовательный порт Serial.begin(9600); //включаем цифровой pin как выход pinMode(indicator, OUTPUT); } int val; //для хранения данных из аналогового порта int Pmm; //для хранения данных c датчика давления void loop() { val = analogRead(rez); //читаем значенние напряжения Pmm = map(val, 0, 1024, 700, 800); //пересчитываем диапазон Serial.print("P= "); Serial.println(Pmm); //выводим "давление" в последовательный порт val = map(Pmm, 700, 800, 0, 255); //снова пересчитываем диапазон analogWrite(indicator, val); //выводим на индикатор } Включаем, открываем "Монитор порта" (Ctrl-Shift-M) и крутим ручку потенциометра. Смотрим на стрелку и значения "давления" в порту.
700 мм рт.ст. это 0 на индикаторе
800 мм рт.ст. – максимум
760 мм рт. ст. (это переход к ясной погоде) – попадает аккурат в 0 индикатора. Просто чудо! Нам явно сопутствует удача. Теперь к индикатору будем "прикручивать" барометр.
В моей коллекции датчиков для Arduino имелся барометр BMP085, но вы можете взять и BMP180. Они отличаются только размерами, а платы, на которых они распаяны, отличаются напряжением питания. 180-й запитывается от 5В, а 085-й нужно питать (ВНИМАНИЕ!) от 3,3 В. Оба датчика подключаются к Arduino по шине I2C, их показания можно снимать при помощи библиотеки Adafruit_BMP085, где описан соответствующий класс.
В скетче нужно подключить заголовочный файл библиотеки и объявить переменную (у меня это - press_data), через которую вы можете читать показания давления и температуры. Датчик выдает давление в Паскалях, поэтому для перевода Паскалей в привычные миллиметры ртутного столба показания нужно делить на 133,322. Напишем небольшой скетч и отправим на данные с датчика в последовательный порт. #include <Wire.h> //Библиотека для работы с I2C #include <Adafruit_BMP085.h> //Библиотека для датчика давления Adafruit_BMP085 press_data; //переменная для работы с датчиком float Pmm; //для хранения показаний давления float Tc; //для хранения температуры void setup() { Serial.begin(9600); //инициализируем последовательный порт press_data.begin(); //подключаемся к датчику } void loop() { Tc=press_data.readTemperature(); //читаем температуру Pmm=press_data.readPressure()/133.322; //читаем и пересчитываем давление //выводим в порт Serial.print("C= "); Serial.print(Tc); Serial.print(" P= "); Serial.println(Pmm); delay(1000); //ждем 1 секунду }
Результат работы Теперь смело подключаем индикатор.
Возможные "забросы" давления ниже 700 и выше 800 отсечем при помощи функции constrain(), которая все числа, выходящие за указанный диапазон, заменяет на его границы. Формат вызова функции прост: Pmm=constrain(Pmm, 700, 800); Если Pmm станет меньше 700, например - 530, то это значение будет заменено на 700. Аналогично будет сделано и в случае если показания давления превысят 800 мм рт.ст. #include <Wire.h> #include <Adafruit_BMP085.h> byte mA = 3; int tmp; Adafruit_BMP085 press_data; float Pmm; void setup() { press_data.begin(); pinMode(mA, OUTPUT); } void loop() { Pmm=press_data.readPressure()/133.322; Pmm=constrain(Pmm, 700, 800); Pmm=map(Pmm, 700, 800, 0, 255); analogWrite(mA, Pmm); }
В функцию Loop() можно добавить небольшую задержку, тогда стрелка будет немного подрагивать, сигнализируя вам о том, что прибор исправно работает. Осталось упаковать все в винтажный корпус, тут каждый может проявить уже свою фантазию. Успехов! Готовые скетчи скачать можно здесь
Благодарим Вас за обращение! Ваш отзыв появится после модерации администратором.
Аркадий
29.06.2019 20:29:05
Супер спасибо!!!
Костя
14.04.2018 17:41:04
Отлично!
|