Шановні друзі!
26 та 31 грудня магазин працюватиме до 16 години. 1 та 2 січня магазин працювати не буде.
Вітаємо всіх з Різдвом та Новим Роком!
Мобільна версія Форум Arduino Документація Гарантійні умови 0 0
UA RU
Графік роботи магазину:
Пн-Пт: 8.00 - 19.00
Сб: 10.00 - 17.00
Нд: вихідний
Каталог
Напиши статтю і отримай знижку!

Винтажный барометр

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 мм рт.ст. у предков отводился под неопределенную погоду – "Переменно". На будущее, для печати облачков и солнц, составил такую таблицу:

  • 700-710 – буря
  • 710-730 – ливень
  • 730-740 – пасмурно
  • 740-760 – переменно
  • 760-770 – ясно
  • 770-780 – хорошая погода
  • 780-800 – сухая погода

Введем в скетч новую переменную 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() можно добавить небольшую задержку, тогда стрелка будет немного подрагивать, сигнализируя вам о том, что прибор исправно работает.

Осталось упаковать все в винтажный корпус, тут каждый может проявить уже свою фантазию. Успехов!

Готовые скетчи скачать можно здесь

Ваша оцінка статті:

Відмінно
Добре
Задовільно
Погано
Дуже погано

Загальна оцінка:

Оцінка "Винтажный барометр"
5 з 5
зроблена на основі 2 оцінок 2 клієнтських відгуків.

Дякуємо Вам за звернення! Ваш відгук з'явиться після модерації адміністратором.
Аркадий
29.06.2019 20:29:05
Супер спасибо!!!
Костя
14.04.2018 17:41:04
Отлично!
оплата картами Visa і MasterCard