Gill WindSonic M – ультразвуковой анемометр купить в Москве

Gill WindSonic M – ультразвуковой анемометр купить в Москве Анемометр

Изготовление основной части

Gill WindSonic M – ультразвуковой анемометр купить в Москве

Несущим элементом анемометра является металлический стержень от шариковой ручки. В нижнюю часть стержня (куда вставлялась пробка) я вставил диск от мышки (энкодер). В конструкции самой мышки нижняя часть энкодера упиралась в корпус мышки образуя точечный подшипник, там была смазка, поэтому энкодер легко крутился.

Но нужно было зафиксировать верхнюю часть стержня, для этого я подобрал подходящий кусок пластика с отверстием точно по диаметру стержня (такой кусок был вырезан из системы выдвигания каретки CD-ROMa). Оставалось решить проблему с тем, чтобы стержень с энкодером не выпадал из точечного подшипника, поэтому на стержне непосредственно перед удерживающим элементом я напаял несколько капель припоя. Таким образом, стержень свободно крутился в удерживающей конструкции, но не выпадал из подшипника.

Причина, по которой была выбрана схема с энкодером, следующая: все статьи о самодельных анемометрах в Интернете описывали их изготовление на базе двигателя постоянного тока от плеера, CD-ROMa или еще какого изделия. Проблема с такими устройствами во первых в их калибровке и малой точности при малой скорости ветра, а во вторых — в нелинейной характеристике скорости ветра по отношению к выходному напряжению, т.е. для передачи информации на компьютер есть определенные проблемы, нужно просчитывать закон изменения напряжения или тока от скорости ветра.

Про анемометры:  10 бар сколько метров под водой

При использовании энкодера такой проблемы нет, так как зависимость получается линейной. Точность высочайшая, так как энкодер дает около 50 импульсов на один оборот оси анемометра, но несколько усложняется схема преобразователя, в котором стоит микроконтроллер, считающий количество импульсов в секунду на одном из портов и выдающий это значение в порт USB.

Raspberry pi 3 model b – подключаем датчик атмосферного давления bmp180

Модули на основе сборки BMP180 от компании Bosсh на сегодняшний день, наверное, самые популярные датчики атмосферного давления и температуры с цифровым интерфейсом I2C. Кстати, это не обязательно может быть атмосферное давление. Можно измерить, например, давление в закрытой бутылке, накачанной воздухом, или в салоне самолета, летящего на высоте 10000 м. Поскольку атмосферное давление напрямую связано с высотой, с помощью датчика можно определить, на какой высоте над уровнем моря он находится. Давление также зависит и от температуры, так что измерения этих двух величин одним датчиком способствует максимально точному вычислению высоты.

Наличие интерфейса I2C делает весьма простой задачу подключения датчика к микроконтроллеру, который считывает данные, производит необходимые вычисления, индицирует результаты и управляет необходимыми исполнительными устройствами.

В данном материале мы рассмотрим, как подключить BMP180 к Raspberry Pi 3 Model B, получить и обработать результаты измерений. Мы попробуем выполнить управляющую программу на двух алгоритмических языках: С и Python.

BMP180 — датчик абсолютного давления (барометр), построенный по пьезорезистивной схеме. Датчик имеет низкий уровень шумов и высокую линейность, а также высокую скорость установки показаний. На кристалле находится MEMS-датчик (микромеханический датчик) в виде гибкой кремниевой мембраны, закрывающей камеру со стандартным давлением. На мембране расположены тензодатчики, которые включены по схеме моста, и изменяют своё сопротивление при изгибе мембраны. Изгиб мембраны зависит от разности между окружающим давлением и давлением в камере. Таким образом, выходной сигнал, снимаемый с тензомоста, зависит от давления окружающей среды. Так как параметры мембраны и резисторов зависят от температуры, то на кристалле расположен цифровой термометр, показания которого используются для компенсации данных барометра, но термометр может использоваться и самостоятельно. Данные о температуре, снятые с других датчиков, для компенсации использовать не рекомендуется. Термометр в датчике BMP180 расположен на самом измерительном кристалле, и он измеряет температуру чувствительного элемента — поэтому показания встроенного термометра наиболее близки к температуре барометра.  Максимальная точность измерения давления составляет 2 Пa, поэтому, если использовать датчик BMP180 как барометрический высотомер, то соответствующая погрешность измерения высоты составит 17 см.

Технические характеристики датчика BMP180:

– напряжение питания: 1,62 В — 3,6 В.

– интерфейс подключения: I2C.

– точность: до 0,02 гПа (17 см).

– диапазон: 300 – 1100 гПа (от -500 м до 9000 м высоты).

– выходные данные: 16 бит, давление и температура

– разрешение по давлению: 0,01 гПа

– разрешение по температуре: 0,1° С

– размер платы без разъема: 12 х 14 мм

Интерфейс барометра BMP180 — I2C, что делает работу с ним простой и удобной. На модуле кроме самого датчика установлен линейный стабилизатор на микросхеме XC6206P332MR в корпусе SOT-23 (падение напряжения на стабилизаторе составляет всего 250 мВ, собственное потребление — 1 мкА.)

При эксплуатации барометра следует учитывать некоторые особенности.

  1. Помните, что BMP180 необходим доступ окружающего воздуха для измерения его давления, так что не стоит его укладывать в герметичный корпус. С другой стороны, воздействие быстро движущихся воздушных потоков или ветра могут вызвать кратковременные колебания давления, которые будут влиять ваши показания. Защитите устройство от сильных воздушных потоков.
  2. Точное значение температуры необходимо для измерения давления, поэтому старайтесь не подвергать устройство резким изменениям температуры, держите его подальше от нагревающихся деталей и других источников тепла.
  3. BMP180 чувствителен к влаге и не должен контактировать с водой.
  4. BMP180 чувствителен к свету, который может войти в устройство через маленькое отверстие в металлической крышке корпуса чипа. Для достижения максимальной точности следует оградить датчик от окружающего света.

Подключается датчик BMP180 с помощью всего четырех проводов: питание 3,3 В (или 5 В – VCC), земля (GND), SDA (data)  и SCL (clock).

Соответственно, подключение к разъему GPIO Raspberry будет выглядеть следующим образом:

 

Теперь нужно убедиться, разрешен ли в Raspberry обмен по шине I2С (по умолчанию он запрещен), и, если нет, то разрешить. Предполагается, что в системе Raspbian установлены пакеты i2c-tools. Кстати, проверить, установлен ли конкретный пакет, можно набрав команду: aptitude show имя_пакета.

Если пакет не установлен (в третьей строке Рис.3 – State: not installed), установите его командой: sudo apt-get install i2c-tools.

Наберите в терминале команду: i2cdetect –y 1. Если в результате выполнения команды при подключенном датчике будет найдено подключение с адресом 77, значит, обмен разрешен, и датчик давления BMP180 подключен правильно.

 

Если ни одного адреса не отображается, то, скорее всего датчик не подключен, или подключен неправильно, или запрещен обмен по шине I2C.

Для того чтобы разрешить обмен выполните в терминале команды:

sudo nano /etc/modprobe.d/raspi-blacklist.conf

В данном файле (raspi-blacklist.conf) закомментируйте строчку (если она есть) blacklist i2c-bcm2708, добавив знак решетки # в начале строки. Сохраните изменения.

Добавьте модуль I2C в автозапуск системы. Команда редактирования:

sudo nano /etc/modules

В самый конец этого файла добавьте строчки i2c-dev и i2c-bcm2708. Сохраните файл.

Перезагрузите систему:

sudo reboot

Для проверки работоспособности выполните команду:

i2cdetect -y 1

Загрузка, компиляция и запуск программы на языке C.

После проверки подключения загрузите с сайта anemometers.ru и разархивируйте в корневой каталог программу на языке C:

cd ~

wget  https://anemometers.ru/zip/bmp180-c.tar.gz

sudo  tar  zxvf   bmp180-c.tar.gz

В результате в корневом каталоге появится папка bmp180-c с двумя файлами: bmp180.h и bmp180test.c. Теперь изменим рабочий каталог на bmp180-c и воспользуемся встроенным в OC Raspbian компилятором gcc для получения исполняемого файла:

cd   bmp180-c

sudo gcc -Wall -o bmp180 bmp180test.c -lwiringPi -lm

В папке bmp180-c появится исполняемый файл bmp180. Запустим его на выполнение:

sudo  ./bmp180

Символы ./  указывают на то, что файл должен быть запущен именно из текущего каталога.

Запустить файл можно также из Файлового Менеджера (File Manager) операционной системы. Файл запускается на выполнение двойным кликом мыши по его иконке, при появлении диалогового окна следует выбрать Execute in Terminal.

В окно терминала каждую секунду выводятся температура, давление и высота.

Принципы расчета высоты и текущего давления на уровне моря основаны на следующих формулах:

– при измеренном давлении p и давлении на уровне моря p0, например, 1013.25hPa, высота в метрах может быть рассчитана при помощи так называемой международной барометрической формулы:

Согласно этой формуле, изменение давления Δp = 1hPa соответствует 8,43 м на уровне моря.

– при измеренном давлении p и абсолютной высоте можно рассчитать давление на уровне моря:

Разница в высоте Δaltitude = 10m соответствует изменению давления 1,2hPa на уровне моря.

Ниже приведены листинги заголовочного файла bmp180.h и файла программы bmp180test.c:

Файл bmp180.h

#ifndef _BMP180_

#define _BMP180_

//i2c address

#define BMP180_Address 0x77

//Operating Modes

#define BMP180_ULTRALOWPOWER    0

#define BMP180_STANDARD         1

#define BMP180_HIGHRES          2

#define BMP180_ULTRAHIGHRES     3

//BMP185 Registers

#define BMP180_CAL_AC1          0xAA  //Calibration data (16 bits)

#define BMP180_CAL_AC2          0xAC  //Calibration data (16 bits)

#define BMP180_CAL_AC3          0xAE  //Calibration data (16 bits)

#define BMP180_CAL_AC4          0xB0  //Calibration data (16 bits)

#define BMP180_CAL_AC5          0xB2  //Calibration data (16 bits)

#define BMP180_CAL_AC6          0xB4  //Calibration data (16 bits)

#define BMP180_CAL_B1           0xB6  //Calibration data (16 bits)

#define BMP180_CAL_B2           0xB8  //Calibration data (16 bits)

#define BMP180_CAL_MB           0xBA  //Calibration data (16 bits)

#define BMP180_CAL_MC           0xBC  //Calibration data (16 bits)

#define BMP180_CAL_MD           0xBE  //Calibration data (16 bits)

#define BMP180_CONTROL          0xF4

#define BMP180_TEMPDATA         0xF6

#define BMP180_PRESSUREDATA     0xF6

//Commands

#define BMP180_READTEMPCMD      0x2E

#define BMP180_READPRESSURECMD  0x34

#endif

Файл bmp180test.c

#include < wiringPi.h>

#include < wiringPiI2C.h>

#include < stdio.h>

#include < math.h>

#include “bmp180.h”

#define OSS BMP180_STANDARD

short AC1,AC2,AC3,B1,B2,MB,MC,MD;

unsigned short AC4,AC5,AC6;

int fd;

char I2C_readByte(int reg)

{

    return (char)wiringPiI2CReadReg8(fd,reg);

}

unsigned short I2C_readU16(int reg)

{

    int MSB,LSB;

    MSB = I2C_readByte(reg);

    LSB = I2C_readByte(reg 1);

    int value = (MSB  32767)result -= 65536;

    return (short)result;

}

void I2C_writeByte(int reg,int val)

{

    wiringPiI2CWriteReg8(fd,reg,val);

}

void load_calibration()

{

    AC1 = I2C_readS16(BMP180_CAL_AC1);

    AC2 = I2C_readS16(BMP180_CAL_AC2);

    AC3 = I2C_readS16(BMP180_CAL_AC3);

    AC4 = I2C_readU16(BMP180_CAL_AC4);

    AC5 = I2C_readU16(BMP180_CAL_AC5);

    AC6 = I2C_readU16(BMP180_CAL_AC6);

    B1  = I2C_readS16(BMP180_CAL_B1);

    B2  = I2C_readS16(BMP180_CAL_B2);

    MB  = I2C_readS16(BMP180_CAL_MB);

    MC  = I2C_readS16(BMP180_CAL_MC);

    MD  = I2C_readS16(BMP180_CAL_MD);

}

int read_raw_temp()

{

    int raw;

    I2C_writeByte(BMP180_CONTROL,BMP180_READTEMPCMD);

    delay(5);  //5ms;

    raw = I2C_readByte(BMP180_TEMPDATA)

    raw = I2C_readByte(BMP180_TEMPDATA 1);

    return raw;

}

int read_raw_pressure()

{

    int MSB,LSB,XLSB,raw;

    I2C_writeByte(BMP180_CONTROL,BMP180_READPRESSURECMD (OSS

    switch(OSS)

    {

        case BMP180_ULTRALOWPOWER:

            delay(5);break;

        case BMP180_HIGHRES:

            delay(14);break;

        case BMP180_ULTRAHIGHRES:

            delay(26);break;

        default :

            delay(8);

    }

    MSB  = I2C_readByte(BMP180_PRESSUREDATA);

    LSB  = I2C_readByte(BMP180_PRESSUREDATA 1);

    XLSB = I2C_readByte(BMP180_PRESSUREDATA 2);

    raw = ((MSB  (8 – OSS);

    return raw;

}

float read_temperature()

{

    float T;

    int UT,X1,X2,B5;

    UT = read_raw_temp();

    X1 = ((UT – AC6)*AC5) >> 15;

    X2 = (MC > 4) /10.0;

    return T;

}

int read_pressure()

{

    int P;

    int UT,UP,X1,X2,X3,B3,B5,B6;

    unsigned int B4;

    int B7;

    UT = read_raw_temp();

    UP = read_raw_pressure();

    X1 = ((UT – AC6)*AC5) >> 15;

    X2 = (MC > 12) >> 11;

    X2 = (AC2 * B6) >> 11;

    X3 = X1 X2;

    B3 = (((AC1 * 4 X3) > 13;

    X2 = (B1 * ((B6 * B6) >> 12)) >> 16;

    X3 = ((X1 X2) 2) >> 2;

    B4 = (AC4 * (X3 32768)) >> 15;

    B7 = (UP – B3) * (50000 >> OSS);

    if (B7 < 0x80000000){P = (B7 * 2) / B4;} else {P = (B7 / B4) * 2;} X1 = (P >> 8) * (P >> 8);

    X1 = (X1 * 3038) >> 16;

    X2 = (-7357 * P) >> 16;

    P = P ((X1 X2 3791) >> 4);

    return P;

}

float read_altitude()

{

    float pressure,altitude;

    float sealevel_pa = 101325.0;

    pressure = (float)read_pressure();

    altitude = 44330.0 * (1.0 – pow(pressure / sealevel_pa,(1.0/5.255)));

    return altitude;

}

float read_sealevel_pressure()

{

    float altitude_m = 0.0;

    float pressure,p0;

    pressure =(float)read_pressure();

    p0 = pressure / pow(1.0 – altitude_m/44330.0,5.255);

    return p0;

}

int main(int argc,char **argv)

{

    printf(“BMP180 Test Program …n”);

    if(wiringPiSetup() < 0) return 1;

    fd = wiringPiI2CSetup(BMP180_Address);

    load_calibration();

    while(1)

    {

        printf(“nTemperature : %.2f Cn”,read_temperature());

        printf(“Pressure :    %.2f hPan”,read_pressure()/100.0);

        printf(“Altitude :    %.2f hn”,read_altitude());

        delay(1000);

    }

    return 0;

Загрузка и запуск программы на языке Python.

Для тех, кто предпочитает Python, рассмотрим, как аналогичный результат можно получить с помощью этого языка программирования.

В первую очередь, убедитесь, что библиотека Python RPi.GPIO, обеспечивающая взаимодействие программ на Python с контактами GPIO Raspberry установлена. Запустите в терминале интерпретатор python и в ответ на приглашение >>>  выполните одну за другой следующие команды:

import RPi.GPIO

RPi.GPIO.VERSION

Выход из интерпретатора – Ctrl-D.

Если ошибок не возникло и выведен номер версии библиотеки, то можно продолжать.

Выполните в терминале команду sudo apt-get install python-smbus для установки пакета для связи по шине I2C из программ на Python, если он еще не установлен.

После проверки подключения загрузите с сайта anemometers.ru и разархивируйте в корневой каталог программу на языке Python:

cd ~

wget  https://anemometers.ru/zip/bmp180-python.tar.gz

sudo  tar  zxvf   bmp180-python.tar.gz

В корневом каталоге появится папка bmp180-python с тремя файлами: bmp180.py, bmp180.pyc и bmp180test.py. Файл bmp180.pyc является скомпилированным вариантом исходного файла bmp180.py  и будет использован при работе основного файла программы bmp180test.py.

Перейдите в каталог bmp180-python и запустите программу:

cd bmp180-python

sudo python ./BMP180test.py

 

Подсоединенный к Raspberry Pi датчик давления

Результат работы программы на экране планшета. Raspberry и планшет находятся в локальной сети посредством подключения по WiFi, на Raspberry работает VNC-server, на планшете – VNC-viewer.

Ниже приведены листинги программ BMP180.py и BMP180test.py:

Файл BMP180.py

import time

import smbus

# BMP085 default address.

BMP180_I2CADDR           = 0x77

# Operating Modes

BMP180_ULTRALOWPOWER     = 0

BMP180_STANDARD          = 1

BMP180_HIGHRES           = 2

BMP180_ULTRAHIGHRES      = 3

# BMP085 Registers

BMP180_CAL_AC1           = 0xAA  # R   Calibration data (16 bits)

BMP180_CAL_AC2           = 0xAC  # R   Calibration data (16 bits)

BMP180_CAL_AC3           = 0xAE  # R   Calibration data (16 bits)

BMP180_CAL_AC4           = 0xB0  # R   Calibration data (16 bits)

BMP180_CAL_AC5           = 0xB2  # R   Calibration data (16 bits)

BMP180_CAL_AC6           = 0xB4  # R   Calibration data (16 bits)

BMP180_CAL_B1            = 0xB6  # R   Calibration data (16 bits)

BMP180_CAL_B2            = 0xB8  # R   Calibration data (16 bits)

BMP180_CAL_MB            = 0xBA  # R   Calibration data (16 bits)

BMP180_CAL_MC            = 0xBC  # R   Calibration data (16 bits)

BMP180_CAL_MD            = 0xBE  # R   Calibration data (16 bits)

BMP180_CONTROL           = 0xF4

BMP180_TEMPDATA          = 0xF6

BMP180_PRESSUREDATA      = 0xF6

# Commands

BMP180_READTEMPCMD       = 0x2E

BMP180_READPRESSURECMD   = 0x34

class BMP180(object):

    def __init__(self, address=BMP180_I2CADDR, mode=BMP180_STANDARD):

        self._mode = mode

        self._address = address

        self._bus = smbus.SMBus(1)

        # Load calibration values.

        self._load_calibration()

    def _read_byte(self,cmd):

        return self._bus.read_byte_data(self._address,cmd)

    def _read_u16(self,cmd):

        MSB = self._bus.read_byte_data(self._address,cmd)

        LSB = self._bus.read_byte_data(self._address,cmd 1)

        return (MSB  32767:result -= 65536

        return result

    def _write_byte(self,cmd,val):

        self._bus.write_byte_data(self._address,cmd,val)

    def _load_calibration(self):

        “load calibration”

        self.cal_AC1 = self._read_s16(BMP180_CAL_AC1)   # INT16

        self.cal_AC2 = self._read_s16(BMP180_CAL_AC2)   # INT16

        self.cal_AC3 = self._read_s16(BMP180_CAL_AC3)   # INT16

        self.cal_AC4 = self._read_u16(BMP180_CAL_AC4)   # UINT16

        self.cal_AC5 = self._read_u16(BMP180_CAL_AC5)   # UINT16

        self.cal_AC6 = self._read_u16(BMP180_CAL_AC6)   # UINT16

        self.cal_B1  = self._read_s16(BMP180_CAL_B1)     # INT16

        self.cal_B2  = self._read_s16(BMP180_CAL_B2)     # INT16

        self.cal_MB  = self._read_s16(BMP180_CAL_MB)     # INT16

        self.cal_MC  = self._read_s16(BMP180_CAL_MC)     # INT16

        self.cal_MD  = self._read_s16(BMP180_CAL_MD)     # INT16

    def read_raw_temp(self):

        “””Reads the raw (uncompensated) temperature from the sensor.”””

        self._write_byte(BMP180_CONTROL, BMP180_READTEMPCMD)

        time.sleep(0.005)  # Wait 5ms

        MSB = self._read_byte(BMP180_TEMPDATA)

        LSB = self._read_byte(BMP180_TEMPDATA 1)

        raw = (MSB

        return raw

    def read_raw_pressure(self):

        “””Reads the raw (uncompensated) pressure level from the sensor.”””

        self._write_byte(BMP180_CONTROL, BMP180_READPRESSURECMD (self._mode

        if self._mode == BMP180_ULTRALOWPOWER:

            time.sleep(0.005)

        elif self._mode == BMP180_HIGHRES:

            time.sleep(0.014)

        elif self._mode == BMP180_ULTRAHIGHRES:

            time.sleep(0.026)

        else:

            time.sleep(0.008)

        MSB = self._read_byte(BMP180_PRESSUREDATA)

        LSB = self._read_byte(BMP180_PRESSUREDATA 1)

        XLSB = self._read_byte(BMP180_PRESSUREDATA 2)

        raw = ((MSB  (8 – self._mode)

        return raw

    def read_temperature(self):

        “””Gets the compensated temperature in degrees celsius.”””

        UT = self.read_raw_temp()

        X1 = ((UT – self.cal_AC6) * self.cal_AC5) >> 15

        X2 = (self.cal_MC > 4) / 10.0

        return temp

    def read_pressure(self):

        “””Gets the compensated pressure in Pascals.”””

        UT = self.read_raw_temp()

        UP = self.read_raw_pressure()

        X1 = ((UT – self.cal_AC6) * self.cal_AC5) >> 15

        X2 = (self.cal_MC > 12) >> 11

        X2 = (self.cal_AC2 * B6) >> 11

        X3 = X1 X2

        B3 = (((self.cal_AC1 * 4 X3) > 13

        X2 = (self.cal_B1 * ((B6 * B6) >> 12)) >> 16

        X3 = ((X1 X2) 2) >> 2

        B4 = (self.cal_AC4 * (X3 32768)) >> 15

        B7 = (UP – B3) * (50000 >> self._mode)

        if B7 < 0x80000000: p = (B7 * 2) / B4 else: p = (B7 / B4) * 2 X1 = (p >> 8) * (p >> 8)

        X1 = (X1 * 3038) >> 16

        X2 = (-7357 * p) >> 16

        p = p ((X1 X2 3791) >> 4)

        return p

    def read_altitude(self, sealevel_pa=101325.0):

        “””Calculates the altitude in meters.”””

        # Calculation taken straight from section 3.6 of the datasheet.

        pressure = float(self.read_pressure())

        altitude = 44330.0 * (1.0 – pow(pressure / sealevel_pa, (1.0/5.255)))

        return altitude

    def read_sealevel_pressure(self, altitude_m=0.0):

        “””Calculates the pressure at sealevel when given a known altitude in

        meters. Returns a value in Pascals.”””

        pressure = float(self.read_pressure())

        p0 = pressure / pow(1.0 – altitude_m/44330.0, 5.255)

        return p0

Файл BMP180test.py

import time

from BMP180 import BMP180

# Initialise the BMP085 and use STANDARD mode (default value)

# bmp = BMP085(0x77, debug=True)

bmp = BMP180()

# To specify a different operating mode, uncomment one of the following:

# bmp = BMP085(0x77, 0)  # ULTRALOWPOWER Mode

# bmp = BMP085(0x77, 1)  # STANDARD Mode

# bmp = BMP085(0x77, 2)  # HIRES Mode

# bmp = BMP085(0x77, 3)  # ULTRAHIRES Mode

while True:

    temp = bmp.read_temperature()

# Read the current barometric pressure level

    pressure = bmp.read_pressure()

# To calculate altitude based on an estimated mean sea level pressure

# (1013.25 hPa) call the function as follows, but this won’t be very accurate

    altitude = bmp.read_altitude()

# To specify a more accurate altitude, enter the correct mean sea level

# pressure level.  For example, if the current pressure level is 1023.50 hPa

# enter 102350 since we include two decimal places in the integer value

# altitude = bmp.readAltitude(102350)

    print “Temperature: %.2f C” % temp

    print “Pressure:    %.2f hPa” % (pressure / 100.0)

    print “Altitude:     %.2fn” % altitude

time.sleep(2)

Raspberry pi метеостанция

@Старик Похабыч

Да всё правильно.

Пробую из этого проекта

https://blog.avislab.com/raspberry-pi-meteo_ru/

Но там не получается Базу данных запустить. Датчик работает.

sudo python /home/pi/weather/weather.py

Temperature: 29.97 °C Pressure: 750.5 mm Hg Humidity: 31.0 %

Traceback (most recent call last):

File “/home/pi/weather/weather.py”, line 124, in

response = urllib2.urlopen(“

http://avispro.com.ua/getdata.php?data=

” s)

File “/usr/lib/python2.7/urllib2.py”, line 154, in urlopen

return opener.open(url, data, timeout)

File “/usr/lib/python2.7/urllib2.py”, line 435, in open

response = meth(req, response)

File “/usr/lib/python2.7/urllib2.py”, line 548, in http_response

‘http’, request, response, code, msg, hdrs)

File “/usr/lib/python2.7/urllib2.py”, line 473, in error

return self._call_chain(*args)

File “/usr/lib/python2.7/urllib2.py”, line 407, in _call_chain

result = func(*args)

File “/usr/lib/python2.7/urllib2.py”, line 556, in http_error_default

raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)

urllib2.HTTPError: HTTP Error 500: Internal Server Error

Всё по пунктам делал, апач ставил, базу создавал.

§

@Старик Похабыч

Да всё правильно.

Пробую из этого проекта

https://blog.avislab.com/raspberry-pi-meteo_ru/

Но там не получается Базу данных запустить. Датчик работает.

sudo python /home/pi/weather/weather.py

Temperature: 29.97 °C Pressure: 750.5 mm Hg Humidity: 31.0 %

Traceback (most recent call last):

File “/home/pi/weather/weather.py”, line 124, in

response = urllib2.urlopen(“

http://avispro.com.ua/getdata.php?data=

” s)

File “/usr/lib/python2.7/urllib2.py”, line 154, in urlopen

return opener.open(url, data, timeout)

File “/usr/lib/python2.7/urllib2.py”, line 435, in open

response = meth(req, response)

File “/usr/lib/python2.7/urllib2.py”, line 548, in http_response

‘http’, request, response, code, msg, hdrs)

File “/usr/lib/python2.7/urllib2.py”, line 473, in error

return self._call_chain(*args)

File “/usr/lib/python2.7/urllib2.py”, line 407, in _call_chain

result = func(*args)

File “/usr/lib/python2.7/urllib2.py”, line 556, in http_error_default

raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)

urllib2.HTTPError: HTTP Error 500: Internal Server Error

Всё по пунктам делал, апач ставил, базу создавал.

Анемометры

скор …’>Компактный анемометр Testo 417 с выносной крыльчаткой (длина кабеля 1,5 м) для измерения скорости воздуха и температуры диаметром 100 мм, для измерения скорости потока, объемного расхода и температуры. Объемный расход отображается напрямую на дисплее. Точный расчет объемного расхода благодаря тому, что зонд легко совмещается с воздуховодом. В дополнение, легко переключиться на отображение показаний текущей температуры. Направление потока, например, вытяжка или приток, отображается на дисплее. Функция усреднения по времени и количеству замеров, позволяет получить усредненные значения объемного расхода, скорости потока и температуры. Дополнительный комплект с воронкой обеспечивает эффективные

§

00000006475 …’>Макс. температура: 60, Мин. температура: -20, Коды товара производителя: 00000006475, Профессиональный: да, Диапазон измерения скорости воздуха: 0.7-30, Габариты: 48х21.2х122, Элемент питания: 2х3B CR2032, Погрешность измерений: 5, Время отклика при измерении скорости ветра: 1, Количество измерительных каналов: многоканальный, Точность измерений температуры: 1, Bluetooth: нет, Вес (г): 76, Тип измерительного датчика: зонд-крыльчатка, Max скорость измерения воздуха: 30, Внесен в госреестр: нет, Поверка: нет, Время работы на одном заряде: 10, Регистрация Max/Min: да, Тип подключения зонда: встроенный, Измерение температуры воздуха: есть

§



§



§

температ …’>Быстрая доставка. Простой возврат до 60 дней. Измеряет скорость ветра и температуру.Большой легко читаемый ЖК-дисплей с подсветкой.Шкала скорости ветра по шкале Бофорта.Функция сохранения данных.Датчик высокой точности.Быстрый отклик, термистор для наружной установки.Автоматическое / ручное отключение.Диапазон скорости ветра: 0-30 м / с.Диапазон температуры ветра: -10-45 ℃ (14-113F).Текущая / максимальная / средняя скорость ветра.Единицы измерения ветра: м / с, км / ч, фут / мин, узлы, миль / ч.Характеристики:Скорость движения воздуха:Диапазон: 0 – 30 м / 0, с – 90 км / час, 0 – 5860 футов / мин, 0 – 65 миль / ч, 0 – 55 узлов.Разрешение: 0,1 м / с, 0,3 км / час, 19 футов / мин, 0,2 мили в ча

§

ми …’>Быстрая доставка. Простой возврат до 60 дней. Функции:° C / ° F, м / с, фут / мин, м³ / мин (CMM), км / ч, миль / ч, узловОтображение минимального и максимального значенияФункция удержанияДисплей с подсветкойАвтоматическое отключениеТехнические характеристикиДиапазон измерения: 1,00 – 30,00 м / с; 196-5900 фут / мин; 3,6 – 108,0 км / чРазрешение: 0,01 м / с, 1 фут / мин, 0,1 км / чТочность: ± 3% ± 0,2 м / с, ± 3% ± 40 фут / мин, ± 3% ± 0,8 км / чОбъемный расходДиапазон измерения: 0 – 999,9 м³ / мин (CMM)Разрешение: 0,1 смТемператураДиапазон измерения: от -10,0 до 60,0 ° C (от 14,0 до 140,0 ° F)Разрешение: 0,1 ° C (0,1 ° F)Точность: ± 1,5 ° C (± 3,0 ° F)

§

131, …’>Необходима предоплата. Диапазон измерений скорости ветра:0,8 ~ 40 мс; 1,4 ~ 144 км/ч; 1,3 ~ 131,2 фт/с; 0,8 ~ 77,7 узла; 0,9 ~ 90 миль/ч; 78 ~ 7874 фт/мОценка потока через единицу площади, диапазон:0 ~ 99990, Куб метров в минутуДиапазон, измерения температуры, точки росы:-10°C~60°C; 14°F~+140°FДиапазон, измерения относительной влажности:(20~80)%ОВ( 3%ОВ@25°C), (<20 или >80)%ОВ ( 5%ОВ…25°C)Рабочая температура при измерениях:- 0 С – 40 С Температура хранения : 10 °С- 50 °С USB-интерфейс для подключения к ПКМакс разрядность дисплея : 9999 отсчетов Быстродействие дисплея: 0,4 сек на одно показание Источник питания : 1 батарея 9V NEDA1604 ( Крона ) Габариты: 165х85х38 мм Вес: 200г ( в

§

по …’>Оплата: нал, безнал, электронные платежи. Анемометр-термометр Testo 417 Предназначен для измерения скорости потока и температуры воздуха Особенности: Объемный расход отображается напрямую на дисплее Точный расчет объемного расхода благодаря тому, что зонд легко совмещается с воздуховодом Легко переключиться на отображение показаний текущей температуры Направление потока, например, вытяжка или приток, отображается на дисплее. Функция усреднения по времени и количеству замеров, позволяет получить усредненные значения объемного расхода, скорости потока и температуры Дополнительный комплект с воронкой обеспечивает эффективные измерения на вентиляционных решетках, круглых потолочных

Анемометры и термоанемометры купить по выгодной цене | гео-ндт

АНЕМОМЕТРЫ. ИЗМЕРИТЕЛИ СКОРОСТИ ПОТОКА ВОЗДУХА. ТЕРМОАНЕМОМЕТРЫ.

Анемометр – это механический или цифровой прибор для измерения скорости ветра или потока воздуха.

Название «анемометр» произошло от греческого – “анемос”=ветер.

Впоследствии, термин “анемометр” утвердился как название всех приборов, измеряющих скорость воздушного потока, газов или жидкостей.

Термоанемометр – прибор, совмещающий в себе функции анемометра и термометра.

Широкое применение на сегодняшний день получили анемометры и термоанемометры, таких производителей, как Testo, Kimo, PCE, CEM, MLG, ТКА, Профкип, Стройприбор (ИСП-МГ4) и др.

Термоанемометры обеспечивают измерение объемного расхода, скорости потока воздуха, и температуры.

Приборы измерения скорости потока оснащены специальными зондами (трубки Пито, обогреваемые зонды, зонды-крыльчатки) позволяют измерять скорость воздуха в трех диапазонах скоростей: низком диапазоне от 0 до 5 м/с: обогреваемые зонды, средний диапазон от 5 до 40 м/с: зонды крыльчатки, высокий диапазон 40-100 м/с: трубки Пито.

Такие анемометры, каканемометр testo 405(термоанемометр), например, подходят для измерений объемного расхода и определения температуры в дополнение к измерению скорости воздуха.

Анемометры и термоанемотры бывают следующих типов:

– Крылчатые анемометры (анемометры с крыльчаткой);

– Чашечные анемометры;

– Анемометры с зондом обогреваемая струна;

– Сигнальные анемометры;

– Ультразвуковые анемометры.

Применение анемометров и термоанемометров:

– Специальная оценка условий труда (СОУТ);

– Проверка качества систем вентиляции и кондиционирования;

– Контроль соответствия помещений санитарным нормам;

– Метеорология;

– Различные виды спорта, в которых важно учитывать скорость ветра.

Всего 115 товаров

§

±0,4 °C (-40 … -25,1 °C)

±0,3 °C (-25 … 74,9 °C)

±0,4 °C ( 75 … 99,9 °C)

±0,5 % от изм. знач. (в ост. диапазоне)

Программное обеспечение

Анемометр М-95-ЦМ имеет встроенное программное обеспечение (ПО).

Встроенное ПО разработано изготовителем специально для решения задач измерения скорости воздушного потока.

Встроенное ПО обеспечивает следующие основные функции:

–    обработку измерительной информации от датчика скорости воздушного потока;

–    отображение измеренных результатов на встроенном в корпус пульта измерительного М-95-ЦМ дисплее;

–    формирование цифровых сигналов;

–    диагностику аппаратной части М-95-ЦМ.

Идентификационные данные ПО приведены в таблице 1.

Таблица 1

Влияние ПО учтено при нормировании метрологических характеристик.

Уровень защиты программного обеспечения от непреднамеренных и преднамеренных изменений соответствует уровню «высокий» согласно Р 50.2.077-2021.

Диапазон измерений скорости воздушного потока, м/с

От 1,8 до 55

Пределы допускаемой основной абсолютной погрешности при измерении скорости воздушного потока при температуре (20 ± 5)°С, м/

±(0,5 0,05 V), где V -измеряемая скорость воздушного потока, м/с

Диапазон установки порогов срабатывания сигнализации:

–    скорости воздушного потока, м/с

–    времени воздействия порывов ветра, с

от 12 до 40 от 2 до 5

Пределы допускаемой основной абсолютной погрешности срабатывания сигнализации по скорости воздушного потока при температуре (20 ± 5)°С, м/с

±0,4

Пределы допускаемой дополнительной погрешности при изменении температуры окружающего воздуха от (20 ± 5)°С в пределах диапазона рабочих температур, в долях от основной погрешности:

–    при измерении скорости воздушного потока

–    при срабатывании сигнализации по скорости воздушного потока

±0,5

±0,5

Порог срабатывания предварительной сигнализации скорости воздушного потока от установленного значения порога скорости воздушного потока, %

75±5

Дискретность установки порогов срабатывания по скорости возду ного потока, м/с

Дискретность установки времени срабатывания по скорости воздушного потока, с

0,1

0,1

Источники питания:

–    сеть переменного тока с частотой (50±1) Гц напряжением, В

–    источник постоянного тока напряжением, В (внешний аккумулятор)

220 23

12 3,6 12 – 2,4

Потребляемая мощность, В А, не более

10

Масса, кг, не более

4,3

Габаритные размеры, мм, не более

–    пульт измерительный (высота, ширина, длина)

–    датчик (высота, диаметр)

215x170x85; 160; 200

Сборка оборудования

На аппаратном фронте этого проекта мало работы. Наша цель состоит в том, чтобы подключить плату датчика к контакту GPIO на Raspberry Pi.

Датчик BME680 взаимодействует с Raspberry Pi по шине под названием I2C (eye-squared-see), которая является последовательной шиной с двумя проводами. Эти два провода называются линия синхронизации (SCK) и линия передачи данных (SDA). В дополнение к двум проводам необходимо подать на датчик питание (3.3V или 3V3) и заземлить.

Если вы выбрали вариант без пайки от Pimoroni или Sparkfun или используете Sense HAT, достаточно просто подключить блестящие новые компоненты к Raspberry Pi, и все соединения будут сделаны для вас: переходите к следующему шагу!

Если вы решили подключить датчик напрямую к Raspberry Pi с помощью Pimoroni или другой переходной платы, то главное обеспечить правильное подключение описанных выше контактов (SDA, SCK, 3V3 и GND).

Полезный сайт для работы с GPIO на Raspberry Pi — pinout.xyz; он ясно показывает, что нам нужны контакты 1 (3V3 питание), 3 (SDA), 5 (SCL) и 9 (земля). 40-контактный GPIO является стандартным для Pi 2 и более поздних версий. Если используете плату Pimoroni, то контакты находятся в правильном порядке для соединения плат. Обратите внимание, как надпись на плате соответствует диаграмме распиновки выше.

Но если подключить датчик таким образом, то на показания будет влиять тепло от процессора Raspberry Pi. Чтобы собирать более точные показания, нужно вынести датчик с платы: делаем это кабелями DuPont папа-мама (или Jumper Jerky), как показано ниже:

Аналогично, если вы используете другой датчик, где диаграммы распиновки не совпадают точно, то можете подключить эти платы к Pi тем же методом. Главное — обеспечить соответствие 3V3, SDA, SCL и GND. Если на плате есть контакты для SDI, SDO, CS — можете их игнорировать, поскольку они используются для альтернативного интерфейса SPI, который мы в этом проекте не используем.

На приведённых выше фотографиях у нас Raspberry Pi 3A , но подходит и Pi Zero в качестве более дешёвого решения.

Тепловой анемометр

Принцип работы таких анемометров, часто называемых термоанемометрами, основан на увеличении теплопотерь нагретого тела при увеличении скорости обдувающего более холодного газа — изменение числа Нуссельта.

Это явление всем знакомо, известно, что при неизменной температуре в ветреную погоду ощущение холода сильнее при большей скорости ветра.

Конструктивно представляет собой открытую тонкую металлическую проволоку (нить накаливания), нагреваемую выше температуры среды электрическим током. Проволока изготавливается из металла с положительным температурным коэффициентом сопротивления — из вольфрама, нихрома, платины, серебра и т. п.)

Сопротивление нити изменяется от изменений температуры, таким образом по сопротивлению можно измерить температуру. Температура определённым образом зависит от скорости ветра, плотности воздуха, его влажности.

Проволока термодатчика включается в электронную схему. В зависимости от метода включения датчика различают приборы с стабилизацией тока проволоки, стабилизацией напряжения и с термостатированием проволоки. В первых двух методах характеристикой скорости является температура проволоки, в последнем — мощность, необходимая для термостабилизации.

Термоанемометры широко используется практически во всех современных автомобилях в качестве датчика массового расхода воздуха (ДМРВ).

Недостатки термоанемометров — низкая механическая прочность, так как применяемая проволока очень тонкая, другой недостаток — нарушение калибровки из-за загрязнения и окисления горячей проволоки, но, так как они практически безынерционны, широко применяются в аэродинамических экспериментах для измерения локальной турбулентности и пульсаций потока.

Чашечный анемометр

Наиболее распространённый тип анемометра — это чашечный анемометр. Изобретён доктором Джоном Томасом Ромни Робинсоном, работавшим в Арманской обсерватории, в 1846 году. Состоит из четырёх полусферических чашек, симметрично насаженных на крестообразные спицы ротора, вращающегося на вертикальной оси.

Ветер любого направления вращает ротор со скоростью, пропорциональной скорости ветра.

Робинсон предполагал, что для такого анемометра линейная скорость кругового вращения чашек составляет одну треть от скорости ветра, и не зависит от размера чашек и длины спиц. Проделанные в то время эксперименты это подтверждали. Более поздние измерения показали, что это неверно, т. н. «коэффициент анемометра» (величина, обратная отношению линейной скорости к скорости ветра) для простейшей конструкции Робинсона зависит от размеров чашек и длины спиц и лежит в пределах от двух до чуть более трёх.

Трёхчашечный ротор, предложенный канадцем Джоном Паттерсоном в 1926 году, и последующие усовершенствования формы чашек Бревортом и Джойнером в 1935-м году сделали чашечный анемометр линейным в диапазоне до 100 км/ч (27 м/с) с погрешностью около 3 %.

Оригинальное усовершенствование чашечной конструкции, предложенное австралийцем Дереком Вестоном (в 1991 г.), позволяет с помощью того же ротора определять не только скорость, но и направление ветра. Оно заключается в установке на одну из чашек флажка, из-за которого скорость ротора неравномерна в течение одного оборота (половину оборота флажок движется по ветру, половину оборота — против).

Вращение ротора в простейших анемометрах передаётся на механический счётчик числа оборотов. Скорость подсчитывается по числу оборотов за заданное время, например, минуту, таковы ручные анемометры[5].

В более совершенных анемометрах ротор связан с тахогенератором, выходной сигнал которого (напряжение) подаётся на вторичный измерительный прибор (вольтметр), или используются тахометры, основанные на иных принципах.

Помимо метеорологических измерений, чашечные анемометры применяются и на башенных подъёмных кранах, для сигнализации об опасном превышении скорости ветра.

Шаг 1. подготовка к работе с api climacell и подключение дисплея к плате


Первый шаг нашей работы заключается в получении ключа для доступа к API ClimaCell и в подключении дисплея к плате.

Здесь мы будем, в качестве источника данных о погоде, использовать API ClimaCell Weather. Этот API даёт доступ к множеству показателей, в число которых входят и показатели качества воздуха.

Для работы с API ClimaCell нужно создать на сайте проекта учётную запись и получить ключ API, который будет использоваться для подписывания запросов к системе.

Лимиты API ClimaCell

Регистрация в системе бесплатна, в час можно выполнять до 100 запросов, количество запросов, которые можно выполнять ежедневно, ограничено 1000. Для нашего проекта этого более чем достаточно.

Когда в нашем распоряжении окажется ключ API, мы можем переходить к работе с аппаратными компонентами и заняться подключением LCD-дисплея к Raspberry Pi. Перед подключением дисплея к плате выключите её питание.

Схема расположения GPIO-портов Raspberry Pi 3 показана на следующем рисунке.

Схема GPIO-портов Raspberry Pi 3

Вот схема подключения дисплея к плате.

Схема подключения дисплея к плате

При таком подключении дисплей будет работать на полной яркости и на полном контрасте. Уровень яркости — это не проблема, но контрастность нуждается в дополнительной настройке, иначе на экране нельзя будет ничего разобрать.

Именно поэтому нам понадобится по меньшей мере один переменный резистор, с помощью которого мы будем настраивать уровень контраста дисплея.

Схема подключения переменного резистора

После того, как дисплей будет подключён к плате, мы можем включить Raspberry Pi. Если всё подключено правильно — дисплей включится. А с помощью переменного резистора мы сможем настроить уровень его контраста.

Шаг 3. работа с lcd-дисплеем


Вывод данных на LCD-дисплей с использованием пакета

lcd

— элементарная задача. Пакет представляет собой слой абстракции, расположенный над низкоуровневыми механизмами, предназначенными для работы с дисплеем. Применение подобного пакета избавляет нас от необходимости решать массу мелких задач при выводе данных на дисплей.

Вот код, который отвечает за работу с дисплеем.

const lcd = new Lcd({ rs: 26, e: 19, data: [13, 6, 5, 11], cols: 16, rows: 2 });

function writeToLcd(col, row, data) {
  return new Promise((resolve, reject) => {
    lcd.setCursor(col, row);
    lcd.print(data, (err) => {
      if (err) {
        reject();
      }
      resolve();
    });
  });
}

Сначала мы создаём объект

lcd

, передавая соответствующему конструктору объект с параметрами, содержащий, кроме прочего, сведения о пинах, используемых для подключения дисплея к плате.

Свойства объекта с параметрами cols и rows задают количество столбцов и строк дисплея. Здесь используется дисплей 16×2. Если вы используете другой дисплей, например, имеющий 8 столбцов и 1 строку, замените числа 16 и 2, соответственно, на 8 и 1.

Для того чтобы вывести что-то на дисплей, нужно последовательно использовать следующие методы объекта lcd:

Мы поместили вызовы этих функций в промис для того чтобы у нас была бы возможность вызова соответствующих операций в асинхронном режиме с использованием конструкции async/await.

Сейчас у вас уже должно получиться вывести что-то на дисплей. Например, выполнение команды writeToLcd(0,0,’Hello World’) должно привести к выводу на дисплее, в первой строке, начиная с первого столбца, текста Hello World.

Шаг 5. завершение работы над проектом

Нам осталось лишь доработать код и, при поступлении новых данных, обновить сведения, выводимые на экране.

async function main() {
  await printWeatherData();

  setInterval(() => {
    printWeatherData();
  }, 5 * 60 * 1000);

  setInterval(async () => {
    await writeToLcd(8, 0, new Date().toISOString().substring(11, 19));
  }, 1000);
}

lcd.on("ready", main);

// * Если нажата комбинация клавиш ctrl c, освободим ресурсы и завершим работу.
process.on("SIGINT", (_) => {
  lcd.close();
  process.exit();
});

Данные о погоде обновляются каждые 5 минут. Но, так как ClimaCell ограничивает количество запросов, выполняемых к сервису, 100 запросами в минуту, мы можем пойти ещё дальше и обновлять данные каждую минуту.

Выводить время мы можем, воспользовавшись одним из двух подходов:


Я выбрал второй вариант, но вы вполне можете поступить иначе.

Для вывода времени в правой верхней части дисплея сначала надо найти столбец, с которого должен начинаться вывод. Это позволит данным аккуратно разместиться в доступном им пространстве экрана. Для нахождения номера столбца воспользуемся следующей формулой:

общее количество столбцов - длина текста, который планируется вывести

Длина сведений о времени составляет 8 символов, а так как длина строки дисплея составляет 16 символов, начинать выводить эти сведения нужно со столбца №8.

Работа с дисплеем организована асинхронно. Поэтому, чтобы узнать о том, когда дисплей будет инициализирован и готов к работе, мы должны использовать библиотечный метод lcd.on().

Ещё одним рекомендованным методом работы со встраиваемыми системами является освобождение ресурсов при завершении работы программы. Именно поэтому мы используем обработчик события SIGINT для освобождения ресурсов, занятых дисплеем, при выходе из программы.

Существуют и другие подобные события:

Оцените статью
Анемометры
Добавить комментарий