Как-то прогуливаясь по городу увидел новый открывшийся магазин радиоэлектроники. Зайдя в него обнаружил большое количество шилдов для Ардуины т.к. у меня дома была 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 вывода:
- 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. В дальнейшем планирую добавить следующее:
- датчик влажности к передатчику, переработать алгоритм передачи данных
- датчик измерения скорости и направления ветра.
- в приемное устройство добавить другой дисплей.
- приемник и передатчик перевести на отдельный микроконтроллер.
Ниже прилагаю фото того что получилось:
Список радиоэлементов
Обозначение | Тип | Номинал | Количество | Примечание | Магазин | Мой блокнот | |
---|---|---|---|---|---|---|---|
Передающая часть. | |||||||
Плата Arduino | Arduino Nano 3.0 | 1 | Поиск в магазине Отрон | ||||
Датчик температуры | DS18B20 | 1 | Поиск в магазине Отрон | ||||
Резистор | 220 Ом | 1 | Поиск в магазине Отрон | ||||
Модуль передатчика | MX-FS-03V (433 МГц) | 1 | Поиск в магазине Отрон | ||||
Радиоприемная часть. | |||||||
Плата Arduino | Arduino Uno | 1 | Поиск в магазине Отрон | ||||
Подстроечный резистор | 1 | Поиск в магазине Отрон | |||||
Резистор | 220 Ом | 1 | Поиск в магазине Отрон | ||||
Цифровой датчик атмосферного давления | ВМР085 | 1 | Поиск в магазине Отрон | ||||
Интерфейс подключения барометра | 12С | 1 | Поиск в магазине Отрон | ||||
LCD-дисплей | 1 | Поиск в магазине Отрон | |||||
Радиоприемный модуль | 433 МГц | 1 | Поиск в магазине Отрон | ||||
Скачать список элементов (PDF)
Прикрепленные файлы:
- programma.zip (2 Кб)
Комментарии (12) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
[Автор]
Связь с ПК можно осуществлять через USB(планирую подключить к WiFi роутеру с USB), так же рассматриваю установку WiFi шилд.
Запись данных планирую осуществлять в бд SQL. Что касается прогноза: согласно полученным данным можно прогнозировать на 1-2 дня, планирую скорость ветра и направление - тогда прогноз будет точнее.
На счет программы - когда полностью отлажу прогноз, напишу программу для андроида.
[Автор]
Сейчас планирую написать программу для получения данных по USB, построение графиков, прогноза погоды.
Запись данных можно осуществлять как в SQL так и в CSV файл.
А вообще хочу связать с Wi-Fi роутером, и туда передавать данные
Пробовал примерно такие приемник и передатчик, но почему-то работали на расстоянии 10-15 см, при увеличении расстояния связь теряется. Откуда такие значения длин антенн и почему они разные, ведь частота одна? Я использовал 1/4 длинны волны - 173 мм.
[Автор]
Вопрос? Как у вас обстоят дела с удаленными датчиками, они питаются от аккумулятора или от сети? Я свои питаю от аккумулятора на 12В 7А/ч хватает на неделю полторы, как сделать большую автономность?
[Автор]
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
crc = _crc16_update(crc, input[i]);
Помогите, пожалуйста, в чем проблема?