Реклама ⓘ
Главная » Arduino
Призовой фонд
на апрель 2024 г.
1. 100 руб.
От пользователей

Похожие статьи:


Реклама ⓘ

Метеостанция на 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м. Сам не проверял, но в двухкомнатной квартире принимает везде.

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

После нескольких экспериментов решил подключить к 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 вывода:

  1. Vcc (3-5V питание)
  2. Data out — Вывод данных
  3. Не используется
  4. Общий

Подключается к D8 Ардуины.

DHT

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

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

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

Список радиоэлементов

Обозначение Тип Номинал Количество ПримечаниеМагазинМой блокнот
Передающая часть.
Плата Arduino
Arduino Nano 3.0
1 Поиск в магазине ОтронВ блокнот
Датчик температуры
DS18B20
1 Поиск в магазине ОтронВ блокнот
Резистор
220 Ом
1 Поиск в магазине ОтронВ блокнот
Модуль передатчикаMX-FS-03V (433 МГц)1 Поиск в магазине ОтронВ блокнот
Радиоприемная часть.
Плата Arduino
Arduino Uno
1 Поиск в магазине ОтронВ блокнот
Подстроечный резистор1 Поиск в магазине ОтронВ блокнот
Резистор
220 Ом
1 Поиск в магазине ОтронВ блокнот
Цифровой датчик атмосферного давленияВМР0851 Поиск в магазине ОтронВ блокнот
Интерфейс подключения барометра12С1 Поиск в магазине ОтронВ блокнот
LCD-дисплей1 Поиск в магазине ОтронВ блокнот
Радиоприемный модуль433 МГц1 Поиск в магазине ОтронВ блокнот
Добавить все

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

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

Теги:

Опубликована: 0 1
Я собрал 0 3
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 2.6 Проголосовало: 3 чел.

Комментарии (12) | Я собрал (0) | Подписаться

0
Александр #
Возможна ли доработка данного средства до приложения на компьютер. Естественно для юзера, который бы просто открыл приложение и увидел прогноз на 3-5 дней, график температур за последнюю неделю, график давления и т.п.? Я предполагаю, что данное приложение могло бы быть написано на С#. Возможно ли связать ваше устройство, написанное на С, с приложением на С#? Ведь данные передаются в компьютер. Как они отображаются?
Ответить
0
Proteus #
У меня доставляет. Специально делал ради того что на компе утром погоду смотреть. Правда не на шарпе писал, а на жаве..
Ответить
0

[Автор]
freearduino #
Сейчас работаю над связью метеостанции с "внешним миром".
Связь с ПК можно осуществлять через USB(планирую подключить к WiFi роутеру с USB), так же рассматриваю установку WiFi шилд.
Запись данных планирую осуществлять в бд SQL. Что касается прогноза: согласно полученным данным можно прогнозировать на 1-2 дня, планирую скорость ветра и направление - тогда прогноз будет точнее.
На счет программы - когда полностью отлажу прогноз, напишу программу для андроида.
Ответить
0
Александр #
А как выглядит вывод данных, без подключения дисплея., т.е. на компьютере? Есть какое-то специальное приложение или его надо связывать с входными данными? Как будет бд SQL связываться с получением данных?
Ответить
0

[Автор]
freearduino #
Данные будут выводится на дисплей и по USB подключатся к ПК.
Сейчас планирую написать программу для получения данных по USB, построение графиков, прогноза погоды.
Запись данных можно осуществлять как в SQL так и в CSV файл.
А вообще хочу связать с Wi-Fi роутером, и туда передавать данные
Ответить
0
Fonoton #
Какого расстояния передачи Вам удалось добиться?
Пробовал примерно такие приемник и передатчик, но почему-то работали на расстоянии 10-15 см, при увеличении расстояния связь теряется. Откуда такие значения длин антенн и почему они разные, ведь частота одна? Я использовал 1/4 длинны волны - 173 мм.
Ответить
0

[Автор]
freearduino #
Принимал\передавал сигнал спокойно по всей 2-х комнатной квартире. Использовал передатчик на улице, расстояние порядка 5-8 метров. Все работало нормально.
Ответить
0
Tim #
Для себя уже давно сделал подобное устройство, показывает температуру и влажность как на улице так и в комнате, а также давление. Датчики удалены от главного блока у которого дисплей 20х4 где все и отображается.
Вопрос? Как у вас обстоят дела с удаленными датчиками, они питаются от аккумулятора или от сети? Я свои питаю от аккумулятора на 12В 7А/ч хватает на неделю полторы, как сделать большую автономность?
Ответить
0

[Автор]
freearduino #
Питаю от пальчиковых батареек и использую солнечную панельку.Продлить срок работы мне помогает режим сна, контроллер засыпает на 30 минут, просыпается измеряет, передает и снова спать.
Ответить
0
Tim #
А можно пример кода, как вы его в спячку уводите и просыпаете, я пробовал так делать, но у меня из спячки не выходит.
Ответить
0
afonkin08 #
При попытке залить скетч выдает ошибку
priem:6: error: 'dht11' does not name a type
priem.ino: In function 'void loop()':
priem:71: error: 'sensor' was not declared in this scope
priem:78: error: 'DHTLIB_OK' was not declared in this scope
priem:81: error: 'DHTLIB_ERROR_CHECKSUM' was not declared in this scope
priem:84: error: 'DHTLIB_ERROR_TIMEOUT' was not declared in this scope
'dht11' does not name a type
версия загрузчика 1.6.4
Ответить
0
Alex #
Здравствуйте! Выдает эту ошибку

crc = _crc16_update(crc, input[i]);

Помогите, пожалуйста, в чем проблема?
Прикрепленный файл: Створити точковий рисунок.jpg
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется электрическая мощность?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

Arduino UNO
Arduino UNO
Паяльная станция Hakko 936 Конструктор - Гитарная педаль Remote Delay 2.5
вверх