Метеостанция на Arduino с беспроводным датчиком температуры

Как-то прогуливаясь по городу увидел новый открывшийся магазин радиоэлектроники. Зайдя в него обнаружил большое количество шилдов для Ардуины т.к. у меня дома была Arduino Uno и Arduino Nano сразу пришла мысль поиграться с передатчиками сигнала на расстоянии. Решил купить самый дешевый передатчик и приемник на 433 МГц:


Передатчик сигнала.


Приемник сигнала.

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

Передатчик имеет следующие характеристики:
1. Модель: MX -FS — 03V
2. Радиус действия (зависит от наличия преграждающих предметов): 20-200 метров
3. Рабочее напряжение: 3.5 -12В
4. Размеры модуля : 19 * 19 мм
 5. Модуляция сигнала : AM
6. Мощность передатчика: 10 мВт
7. Частота: 433 МГц
8. Необходимая длина внешней антенны : 25см
9. Простота подключения (всего три провода): DATA ; VCC ; земля.

Характеристики приемного модуля:
1. Рабочее напряжение: DC 5В
2. Ток: 4мA
3. Рабочая частота: 433,92 МГц
4. Чувствительность : — 105дБ
5. Размеры модуля : 30 * 14 * 7 мм
6. Небходима внешняя антенна: 32 см.

В просторах интернета сказано, что дальность передачи информации на 2Кб/сек может доходить до 150м. Сам не проверял, но в 2-хкомнатной квартире принимает везде.

Аппаратная часть домашней метеостанции

После нескольких экспериментов решил подключить к Arduino Nano датчик температуры, влажности и передатчик.


Подключение датчика температуры, влажности и передатчика

Датчик температуры DS18D20 подключается к ардуино следующим образом:

1) GND к минусу микроконтроллера.
2) DQ через подтягивающий резистор к земле и к выводу D2 Ардуины
3) Vdd к +5В.

Более детально почитать о работе датчика можно здесь.

Модуль передатчика MX -FS — 03V питается от 5 Вольт, вывод данных (ADATA) подключен к выводу D13.

К Ардуино Уно подключил LCD дисплей и барометр BMP085.


Схема подключение к ардуино уно

Приемник сигнала подключен к выводу D10.

Модуль BMP085 — цифровой датчик атмосферного давления. Датчик позволяет измерять температуру,давление и высоту над уровнем моря. Интерфейс подключения: I2C. Напряжение питания датчика 1.8-3.6 В

Подключается модуль к Arduino также, как и другие I2C устройства:

  • VCC — VCC (3,3 В); 
  • GND — GND; 
  • SCL — к аналоговому выводу 5;
  • SDA — к аналоговому выводу 4.

DHT11:

  • Очень низкая стоимость
  • Питание и I/O 3-5 В
  • Определение влажности 20-80% с 5% точностью
  • Определение температуры 0-50 град. с 2% точностью
  • Частота опроса не более 1 Гц (не более раза в 1 сек.)
  • Размеры 15.5мм x 12мм x 5.5мм
  • 4 вывода с расстоянием между ножками 0.1″

DHT имеет 4 вывода:

  • Vcc (3-5V питание)
  • Data out — Вывод данных
  • Не используется
  • Общий
  • Подключается к D8 Ардуины.

    Программная часть домашней метеостанции

    Передающий модуль измеряет и передает температуру раз в 10 минут.

    Ниже привожу программу:

    /*
    Версия скетча 1.0
    Отсылаем температуру каждые 10мин.

    */
    #include
    #include
    #include

    #define ONE_WIRE_BUS 2 //Пин подключения датчика Даллас

    OneWire oneWire(ONE_WIRE_BUS);
    DallasTemperature sensors(&oneWire);
    DeviceAddress insideThermometer;

    void setup(void)
    {

    //Serial.begin(9600);
    vw_set_ptt_inverted(true); // Необходимо для DR3100
    vw_setup(2000); // Устанавливаем скорость передачи (бит/с)

    sensors.begin();

    if (!sensors.getAddress(insideThermometer, 0));

    printAddress(insideThermometer);
    sensors.setResolution(insideThermometer, 9);

    }

    void printTemperature(DeviceAddress deviceAddress)
    {

    float tempC = sensors.getTempC(deviceAddress);
    //Serial.print(«Temp C: «);

    //Serial.println(tempC);
    //Формирование данных для для отправки
    int number = tempC;

    char symbol = ‘c’; //Служебный символ определения что это датчик

    String strMsg = «z «;
    strMsg += symbol;
    strMsg += » «;
    strMsg += number;
    strMsg += » «;
    char msg[255];
    strMsg.toCharArray(msg, 255);
    vw_send((uint8_t *)msg, strlen(msg));
    vw_wait_tx(); // Ждем пока передача будет окончена
    delay(200);

    }

    void loop(void)
    {

    for (int j=0; j <= 6; j++) {
    sensors.requestTemperatures();
    printTemperature(insideThermometer);
    delay(600000);
    }

    }

    //Определение адреса
    void printAddress(DeviceAddress deviceAddress)
    {
    for (uint8_t i = 0; i < 8; i++)
    {
    if (deviceAddress[i] < 16); //Serial.print(«0»);
    //Serial.print(deviceAddress[i], HEX);
    }
    }

    Приемное устройство принимает данные, измеряет давление и температуру в помещении и передает на дисплей.

    #include
    #include
    LiquidCrystal lcd(12, 10, 5, 4, 3, 2);
    #include
    dht11 sensor;
    #define DHT11PIN 8
    #include
    #include
    BMP085 dps = BMP085();
    long Temperature = 0, Pressure = 0, Altitude = 0;
    void setup()
    {
    Serial.begin(9600);
    vw_set_ptt_inverted(true); // Необходимо для DR3100
    vw_setup(2000); // Задаем скорость приема
    vw_rx_start(); // Начинаем мониторинг эфира
    lcd.begin(16, 2);

    Wire.begin();
    delay(1000);
    dps.init();
    //lcd.setCursor(14,0);
    //lcd.write(byte(0));
    //lcd.home();
    }

    void loop()
    {
    uint8_t buf[VW_MAX_MESSAGE_LEN]; // Буфер для сообщения
    uint8_t buflen = VW_MAX_MESSAGE_LEN; // Длина буфера

    if (vw_get_message(buf, &buflen)) // Если принято сообщение
    {
    // Начинаем разбор
    int i;
    // Если сообщение адресовано не нам, выходим
    if (buf[0] != ‘z’)
    {
    return;
    }
    char command = buf[2]; // Команда находится на индексе 2

    // Числовой параметр начинается с индекса 4
    i = 4;
    int number = 0;
    // Поскольку передача идет посимвольно, то нужно преобразовать набор символов в число
    while (buf[i] != ‘ ‘)
    {
    number *= 10;
    number += buf[i] — ‘0’;
    i++;
    }
    dps.getPressure(&Pressure);
    dps.getAltitude(&Altitude);
    dps.getTemperature(&Temperature);
    //Serial.print(command);
    Serial.print(» «);
    Serial.println(number);
    lcd.print(«T=»);
    lcd.setCursor(2,0);
    lcd.print(number);
    lcd.setCursor(5,0);
    lcd.print(«P=»);
    lcd.print(Pressure/133.3);
    lcd.print(«mmH»);
    lcd.setCursor(0,1);
    lcd.print(«T=»);
    lcd.print(Temperature*0.1);
    lcd.print(» H=»);
    lcd.print(sensor.humidity);
    lcd.home();
    //delay(2000);

    int chk = sensor.read(DHT11PIN);
    switch (chk)
    {
    case DHTLIB_OK:
    //Serial.println(«OK»);
    break;
    case DHTLIB_ERROR_CHECKSUM:
    //Serial.println(«Checksum error»);
    break;
    case DHTLIB_ERROR_TIMEOUT:
    //Serial.println(«Time out error»);
    break;
    default:
    //Serial.println(«Unknown error»);
    break;
    }
    }
    }

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

    Ниже прилагаю фото того что получилось:

    Список радиоэлементовОбозначение
    Тип
    Номинал
    Количество
    ПримечаниеМагазинМой блокнот

    Передающая часть.
    Плата ArduinoArduino Nano 3.01

    Датчик температурыDS18B201

    Резистор220 Ом1

    Модуль передатчикаMX-FS-03V (433 МГц)1
    Радиоприемная часть.
    Плата ArduinoArduino Uno1

    Подстроечный резистор1

    Резистор220 Ом1

    Цифровой датчик атмосферного давленияВМР0851

    Интерфейс подключения барометра12С1

    LCD-дисплей1

    Радиоприемный модуль433 МГц1
    Добавить все

    Скачать список элементов (PDF)

    Прикрепленные файлы:

    Добавить комментарий

    Ваш адрес email не будет опубликован.