Программирование nRF24L01 для Arduino
Использовать эти модули с Arduino очень просто благодаря доступной готовой библиотеке, созданной maniacbug на GitHub. Нажмите на ссылку, чтобы загрузить библиотеку в виде zip-каталога, и добавьте её в Arduino IDE с помощью Скетч (Sketch) → Подключить библиотеку (Include Library) → Добавить ZIP библиотеку (Add .ZIP library). После добавления библиотеки мы можем начать программирование для проекта. Мы должны написать две программы, одна для передающей части, а другая для приемной части. Однако, как я уже говорил ранее, каждый модуль может работать как и передатчик, и приемник. Обе программы приведены в конце страницы, в коде передатчика будет закомментирован код приемника, а в программе приемника будет закомментирован код передатчика. Вы можете использовать его, если хотите, чтобы в вашем проекте модуль работал в обоих режимах. Работа программы описана ниже.
Как и во всех программах, мы начинаем с включения заголовочных файлов. Поскольку nRF использует протокол SPI, мы включили заголовочный файл SPI, а также библиотеку, которую только что загрузили. Библиотека servo используется для управления серводвигателем.
Далее идет важная строка, в которой мы указываем выводы CE и CS. На нашей принципиальной схеме CE подключен к выводу 7, а CS – к выводу 8.
Все переменные, которые связаны с библиотекой RF, должны быть объявлены как составная структура. В данной программе переменная используется для отправки и получения данных от RF модуля.
Каждый RF модуль имеет уникальный адрес, используя который можно отправлять данные на соответствующее устройство. Поскольку у нас здесь только одна пара, мы устанавливаем адрес, равный нулю, как на передатчике, так и приемнике, но если у вас несколько модулей, вы можете установить ID на любую уникальную строку, состоящую из шести цифр.
Затем внутри функции мы инициализируем RF модуль и настраиваем его на работу в диапазоне 115, который свободен от шума, а также настраиваем модуль для работы в режиме минимального энергопотребления с минимальной скоростью 250 кбит/с.
Функция записывает переданные ей данные. Как говорилось ранее, nRF имеет 6 различных каналов, в которые мы можем записывать и считывать данные, здесь мы использовали в качестве адреса для записи данных. В приемной части для получения данных мы должны использовать тот же адрес в функции .
Функция считывает данные и помещает их в переменную. Снова из 6 различных каналов, используя которые мы может считывать и записывать данные, здесь мы использовали в качестве адреса для чтения данных. Этот означает, что передатчик другого модуля записал что-то по этому адресу, и, следовательно, мы читаем это что-то с того же адреса.
Помимо этих строк, в программе используются другие строки для считывания положения потенциометра и преобразования этого показания в значение в диапазоне от 0 до 180 с помощью функции и отправки его на приемный модуль, где мы соответствующим образом управляем сервоприводом.
RadioHead Library — универсальная библиотека для беспроводных модулей
Прежде чем мы начнем программировать, установим библиотеку RadioHead в Arduino IDE.
RadioHead — это библиотека, которая позволяет легко передавать данные между платами Arduino. Она настолько универсальна, что ее можно использовать для управления всеми видами устройств радиосвязи, включая наши модули на 433 МГц.
Библиотека RadioHead собирает наши данные, инкапсулирует их в пакет данных, который включает в себя CRC (проверку циклически избыточного кода), а затем отправляет его с необходимой преамбулой и заголовком на другую Arduino. Если данные получены правильно, принимающая плата Arduino проинформирует о наличии доступных данных и приступит к их декодированию и выполнению.
Пакет RadioHead формируется следующим образом: 36-битный поток из пар «1» и «0», называемый «обучающей преамбулой», отправляется в начале каждой передачи. Эти биты необходимы приемнику для регулировки его усиления до получения фактических данных. Затем следует 12-битный «Начальный символ», а затем фактические данные (полезная нагрузка).
Последовательность проверки или CRC добавляется в конец пакета, который пересчитывается RadioHead на стороне приемника, и если проверка CRC верна, приемное устройство получает предупреждение. Если проверка CRC не пройдена, пакет отбрасывается.
Весь пакет выглядит примерно так:
Step 8: Future Work and Applications
Things I plan to do in future include:
- Include control of IR devices e.g. TV and air-conditioning remotes.
- Switch appliances, lights etc on/off via a webpage or phone app.
- Switch lights, TV, radio etc on and off on a schedule whilst I’m holidays so it looks like I’m still at home. To improve the illusion, the schedule could be varied randomly.
- Automatically turn off appliances & lights if unintentionally left on.
- P̶l̶a̶y̶ ̶p̶r̶a̶n̶k̶s̶ ̶o̶n̶ ̶p̶e̶o̶p̶l̶e̶ ̶b̶y̶ ̶r̶a̶n̶d̶o̶m̶l̶y̶ ̶o̶p̶e̶n̶i̶n̶g̶ ̶a̶n̶d̶ ̶c̶l̶o̶s̶i̶n̶g̶ ̶t̶h̶e̶i̶r̶ ̶g̶a̶r̶a̶g̶e̶ ̶d̶o̶o̶r̶s̶.̶ (You shouldn’t do this, it’s naughty.)
- Port to Raspberry Pi (rc-switch has a rpi port).
Увеличение дальности радиочастотных модулей 433 МГц
Антенна, которую вы используете как для передатчика, так и для приемника, может реально повлиять на дальность передачи, которую вы сможете получить с помощью этих радиочастотных модулей. На самом деле без антенны вы сможете общаться на расстоянии не более метра.
При правильной конструкции антенны вы сможете общаться на расстоянии до 50 метров. Конечно, это на открытом пространстве. Ваш диапазон в помещении, особенно через стены, будет слегка ослаблен.
Антенна не должна быть сложной. Простой кусок одножильного провода может послужить отличной антеной для передатчика и приемника. Диаметр антенны вряд ли имеет какое-либо значение, если длина антенны правильная.
Самая эффективная антенна имеет ту же длину, что и длина волны, для которой она используется. Для практических целей достаточно половины или четверти этой длины.
Длина волны частоты рассчитывается как:
Длина волны = скорость распространения (v) / частота (f)
В воздухе скорость передачи равна скорости света, которая, если быть точным, составляет 299 792 458 м/с. Итак, для частоты 433 МГц длина волны равна:
Длина волны = 299 792 458 м/с / 433 000 000 Гц = 0,6924 м
Полноволновая антенна длиной 69,24 см довольно длинная, ее использование не очень удобно. Вот почему мы выберем четвертьволновую антенну, длина которой составляет 17,3 см.
На всякий случай, если вы экспериментируете с другими радиопередатчиками, которые используют разные частоты, вы можете использовать ту же формулу для расчета необходимой длины антенны. Довольно просто, верно?
Скачать библиотеку RadioHead (402,8 KiB, скачано: 965)
Блок питания 0…30В/3A
Набор для сборки регулируемого блока питания…
Подробнее
Радио приемник FS1000A/XD-FST 433Mhz
Характеристики FS1000A/XD-FST
Рабочее напряжение: DC 5VРабочий ток: 4 мАРежим модуляции: ООК (AM)Рабочая температура: -10 ° C ~ +70 ° CПолучать чувствительность:-110dBРабочая частота: 433MHzРазмер: 30 х 14 х 7 мм
Приемник работает на основе колебательного контура с усилителем. Подключается с помощью выводов PIN1 VCC, PIN2/3 DATA, PIN5 GND. Выход радио модуля логический по уровню, но сигнал принимает аналоговый. По тому задача декодирования послания лежит на плечах устройства (обычно Arduino) которое принимает сигнал.
Схема подключения радио модулей 433 Mgz к Arduino представлена ниже. Выходы выходы приемника и передатчика подключаются к Digital портам Arduino, которые способны обрабатывать модулированный сигнал.
Для существенного увеличения дальности приема можно к приемо-передающим устройствам подпаять антенну. Самый простой вариант — кусок провода длиной 17 см с сопротивлением 50 Ом. Такая длина будет резанировать на частоте 433 Mgz т.к. ее длина равна 1/4 волны.
Для кодирования.декодирования передаваемого сигнала на Arduino удобно применять библиотеку VirtualWire.hПриведу пару примеров использования библиотеки для передачи цифровых данных.
Передатчик:
#include "VirtualWire.h" const int led_pin = 13; // Пин светодиода const int transmit_pin = 12; // Пин подключения передатчика void setup() { vw_set_tx_pin(transmit_pin); vw_setup(2000); // Скорость передачи (Бит в секунду) pinMode(led_pin, OUTPUT); } void loop() { const char *msg = "Hello, Arduinomania"; // Передаваемое сообщение digitalWrite(led_pin, HIGH); // Зажигаем светодиод в начале передачи vw_send((uint8_t *)msg, strlen(msg)); // Отправка сообщения vw_wait_tx(); // Ожидаем окончания отправки сообщения digitalWrite(led_pin, LOW); // Гасим светодиод в конце передачи delay(1000); // Пауза 1 секунда }
Приемник:
#include "VirtualWire.h" byte message; // Буфер для хранения принимаемых данных byte messageLength = VW_MAX_MESSAGE_LEN; // Размер сообщения const int led_pin = 13; // Пин светодиода const int receiver_pin = 11; // Пин подключения приемника void setup() { Serial.begin(9600); // Скорость передачиданных Serial.println("Read 433mHz begin"); vw_set_rx_pin(receiver_pin); // Пин подключения приемника vw_setup(2000); // Скорость передачи данных (бит в секунду) vw_rx_start(); // Активация применика } void loop() { if (vw_get_message(message, &messageLength)) // Если есть данные.. { digitalWrite(led_pin, HIGH); // Зажигаем светодиод в начале приема пакета for (int i = 0; i < messageLength; i++) { Serial.write(message); // выводим их в одной строке } Serial.println(); digitalWrite(led_pin, LOW); // Гасим светодиод в конце } }
Скетч Arduino для радиочастотного передатчика 433 МГц
В нашем эксперименте мы отправим простое текстовое сообщение от передатчика к получателю. Будет полезно понять, как использовать модули, и это может послужить основой для более практических экспериментов и проектов.
Вот скетч, который мы будем использовать для нашего передатчика:
// Подключаем библиотеку RadioHead Amplitude Shift Keying #include <RH_ASK.h> // Подключаем библиотеку SPI Library #include <SPI.h> // Создаем объект управления смещением амплитуды RH_ASK rf_driver; void setup() { // Инициализируем объект ASK rf_driver.init(); } void loop() { const char *msg = "Hello World"; rf_driver.send((uint8_t *)msg, strlen(msg)); rf_driver.waitPacketSent(); delay(1000); }
Это довольно короткий набросок, но это все, что вам нужно для передачи сигнала.
Код начинается с подключения библиотеки RadioHead ASK. Мы также должны подключить библиотеку SPI Arduino, так как от нее зависит библиотека RadioHead.
#include <RH_ASK.h> #include <SPI.h>
Далее нам нужно создать объект ASK, чтобы получить доступ к специальным функциям, связанным с библиотекой RadioHead ASK.
// Создаем объект управления смещением амплитуды RH_ASK rf_driver;
В функции setup() нам нужно инициализировать объект ASK.
// Инициализируем объект ASK rf_driver.init();
В функции loop() мы начинаем с подготовки сообщения. Это простая текстовая строка, которая хранится в char с именем msg. Знайте, что ваше сообщение может быть любым, но не должно превышать 27 символов для лучшей производительности. И обязательно посчитайте количество символов в нем, так как вам понадобится это количество в коде получателя. В нашем случае у нас 11 символов.
// Готовим сообщение const char *msg = "Hello World";
Затем сообщение передается с использованием функции send(). Он имеет два параметра: первый — это массив данных, а второй — количество байтов (длина данных), подлежащих отправке. За send() функцией обычно следует waitPacketSent() функция, которая ожидает завершения передачи любого предыдущего передаваемого пакета. После этого код ждет секунду, чтобы дать нашему приемнику время разобраться во всем.
rf_driver.send((uint8_t *)msg, strlen(msg)); rf_driver.waitPacketSent(); delay(1000);
Баги и обратная связь
При нахождении багов создавайте Issue, а лучше сразу пишите на почту alex@alexgyver.ru
Библиотека открыта для доработки и ваших Pull Request’ов!
При сообщении о багах или некорректной работе библиотеки нужно обязательно указывать:
- Версия библиотеки
- Какой используется МК
- Версия SDK (для ESP)
- Версия Arduino IDE
- Корректно ли работают ли встроенные примеры, в которых используются функции и конструкции, приводящие к багу в вашем коде
- Какой код загружался, какая работа от него ожидалась и как он работает в реальности
- В идеале приложить минимальный код, в котором наблюдается баг. Не полотно из тысячи строк, а минимальный код
Программа для передатчика
Для работы с радиомодулями воспользуемся библиотекой RCSwitch. Напишем программу, которая будет каждую секунду по-очереди отправлять два разных сообщения.
Разберем программу. Первое что мы сделали — объявили объект для работы с передатчиком и назвали его mySwitch.
RCSwitch mySwitch = RCSwitch();
Затем, внутри стандартной функции setup включили передатчик и указали вывод, к которому он подключен:
mySwitch.enableTransmit(2);
Наконец, в основном цикле программы loop отправляем сначала одно сообщение, а затем и второе с помощью функции send:
mySwitch.send(B1000, 4);
Функция send имеет два аргумента. Первый — это отправляемое сообщение, которое будет отправляться в эфир в виде пачки импульсов. Второй аргумент — это размер отправляемой пачки.
В нашей программе мы указали сообщения в формате двоичного числа. На это указывает английская буква «B» в начале кода B1000. В десятеричном представлении это число превратится в восьмерку. Так что мы могли вызвать функцию send так:
mySwitch.send(8, 4);
Также send умеет принимать двоичные строки:
mySwitch.send("1000", 4);
Step 3: Soldering It All Together
This step is really straight forward, most of the heavy lifting was done is the previous step. I built it all on a breadboard so all I did was transfer all of it over to a PCB. A tip that I can offer for soldering your own circuits is this. You often need some every small wire for making point to point connections. You could buy some thin gage wire online but I have found it to be cheaper to buy Ethernet cable and cut the lengths that you need. Each cable has 8 different color wire which are stranded in pairs which is often helpful and you could buy it in either stranded or solid core. Most of the components are connected on one PCB. But since we need to see the LEDs and use the rotary encoder they will need to be mounted to the front of the case and attached latter using header pins. I used a small power plug and socket that I got off amazon to deliver the 5V of power. The socket will be later attached to the back of the case.
Details
A few days ago I was cleaning out a small storage room in my house. I found an alarm clock that I had put in there a few years ago because its display was much too bright. My initial intention with it was to dim the display and put it back into use, but that never happened, it got replaced by a simple cheap alarm clock and it ended up in a closet. So I decided to tear it apart to see if there was anything interesting in there and to maybe harvest some components.
Apart from some components I could harvest I noticed a small PCB dangling off the main board marked ‘Radio’. It had a single RDA5807FP chip on it and a few additional components. I googled the part number and found a datasheet for the device. Turns out it’s an FM radio in a chip! And it’s a quite capable one, controllable over I2C!
It turned into a little surprise project! I got one of my Arduinos out and connected the board and some cheap external speakers with a built-in amp. The datasheet of the 5807 nicely describes the functions of the chip’s registers. It still took me quite a while to figure out how to get some sound out of the thing. I wanted it to be a learning experience so I didn’t look into any code that may already be available to control the 5807. After lots of trial and error and just random pops from the speaker I finally got it to produce some sweet whit noise!
In the process I blew up the 3.3v regulator on the little board by hooking up the ground to the 5V supply on the Arduino, but luckily the 5807 was unharmed. Hence the jumper that I soldered onto the board
Switching on the radio and tuning
The sequence to switch the radio on turned out to be:
- R2: Enable the radio, Enable soft reset
- R3: Set up the correct band and channel spacing (EU FM band and 100KHz spacing in this case)
- R5: Setting the correct antenna port, Signal to noise ratio and a volume
- The other registers are cleared
Now the radio can be switched on by
- R2: Disabling soft reset, disabling mute and enabling audio output
- R3: Enable tuning
Once this is done the rest is quite straight forward. Tuning the radio to a frequency is easy by taking into account the current band and channel spacing setting. In my case frequency to tune to = (frequency — 87) / 0.1. I can reverse this formula to get the frequency display on screen when I read the current frequency form the 5807.
The Arduino is constantly communicating with the 5807 by reading its 6 status registers. With this I can update the current frequency, signal strength, RDS etc.
Decoding the channel name
The 5807 also supports RDS which turned out to be a whole new experience to get working. I had no prior knowledge of RDS so finding out how it works was interesting. I found some good documentation about the different RDS messages here: http://www.g.laroche.free.fr/english/rds/groupes/listeGroupesRDS.htm. The 5807 will set a flag when new RDS data is available. Through some more trial and error I found out that when handling an RDS message you best toggle the RDS enable of the 5807 to reset this data flag, otherwise you may be dealing with an old message which can be problematic…
the four RDS blocks are each stored in a separate register C through F. The 5807 only detects errors on block A and B, not on blocks C and D, which contain the actual data! So to read the channel name I first look if there is any new RDS data and if there is that the error bits of block A and B are all 0. Now I can look for the so called group number in block B. If I detect a group A0 or B0 we’re receiving channel tuning data that also contains part of the channel name.
The channel name is 8 characters long and transmitted 2 characters at a time in block D. The last two bits of block B tell the offset of the characters in the channel name. Now since the 5807 doesn’t tell me anything about the quality of the data I only accept a part of the channel name if I receive the same characters at the same position twice in a row.
Исходный код
Сама программа включает более 1200 строк. В первую очередь я постарался сохранить читабельность и снизить потребление оперативной памяти.
На практике, если я использую радио в своем городе, я ставлю свои любимые частоты и выбираю уже из них. Реализованный поиск каналов (все, предыдущий, следующий) для меня избыточен, тем более что его эффективность не впечатляет. Найденные каналы также не запоминаются / не сохраняются.
Код также включает поддержку последовательного порта, который я использовал для программирования системы и отправки информации на терминал ПК (в виде отладчика).
Из-за проблем с объемом памяти, описанных выше, код также включает поддержку проверки использования ОЗУ на основе библиотеки MemoryFree.
Скачать файл проекта
Портативный паяльник TS80P
TS80P- это обновленная версия паяльника TS80 Smart, работающий от USB…
Подробнее
Arduino with RF 433MHz Transmitter/Receiver Modules
In this section, we’ll build a simple example that sends a message from an Arduino to another Arduino board using 433 MHz. An Arduino board will be connected to a 433 MHz transmitter and will send the “Hello World!” message. The other Arduino board will be connected to a 433 MHz receiver to receive the messages.
Parts Required
You need the following components for this example:
- 2x Arduino – read Best Arduino Starter Kits
- RF 433MHz Receiver/Transmitter
- Breadboard
- Jumper wires
You can use the preceding links or go directly to MakerAdvisor.com/tools to find all the parts for your projects at the best price!
Installing the RadioHead Library
The RadioHead library provides an easy way to work with the 433 MHz transmitter/receiver with the Arduino. Follow the next steps to install that library in the Arduino IDE:
- Click here to download the RadioHead library. You should have a .zip folder in your Downloads folder.
- Unzip the RadioHead library.
- Move the RadioHead library folder to the Arduino IDE installation libraries folder.
- Restart your Arduino IDE
The RadioHead library is great and it works with almost all RF modules in the market. You can read more about the RadioHead library here.
Transmitter Circuit
Wire the transmitter module to the Arduino by following the next schematic diagram.
Important: always check the pinout for the transmitter module you’re using. Usually, there are labels next to the pins. Alternatively, you can also take a look at your module’s datasheet.
Transmitter Sketch
Upload the following code to the Arduino board that will act as a transmitter.
How the transmitter sketch works
First, include the RadioHead ASK library.
This library needs the SPI library to work. So, you also need to include the SPI library.
After that, create a RH_ASK object called driver.
In the setup(), initialize the RH_ASK object by using the init() method.
In the loop(), we write and send our message. The message is saved on the msg variable. Please note that the message needs to be of type char.
This message contains the “Hello World!” message, but you can send anything you want as long as it is in char format.
Finally, we send our message as follows:
The message is being sent every second, but you can adjust this delay time.
Receiver Circuit
Wire the receiver module to another Arduino by following the next schematic diagram.
Important: always check the pinout for the transmitter module you’re using. Usually, there are labels next to the pins. Alternatively, you can also take a look at your module’s datasheet.
Receiver Sketch
Upload the code below to the Arduino connected to the receiver.
How the receiver sketch works
Similarly to the previous sketch, you start by including the necessary libraries:
You create a RH_ASK object called driver:
In the setup(), initialize the RH_ASKobject.
In the loop(), we need to set a buffer that matches the size of the message we’ll receive. “Hello World!” has 12 characters. You should adjust the buffer size accordingly to the message you’ll receive (spaces and punctuation also count).
Then, check if you’ve received a valid message. If you receive a valid message, print it in the serial monitor.
Demonstration
In this project the transmitter is sending a message “Hello World!” to the receiver via RF. Those messages are being displayed in receiver’s serial monitor. The following figure shows what you should see in your Arduino IDE serial monitor.
Wrapping Up
You need to have some realistic expectations when using this module. They work very well when the receiver and transmitter are close to each other. If you separate them too far apart you’ll lose the communication. The communication range will vary. It depends on how much voltage you’re supplying to your transmitter module, RF noise in your environment, and if you’re using an external antenna.
If you want to use 433 MHz remote controls to communicate with your Arduino, follow this tutorial: Decode and Send 433 MHz RF Signals with Arduino.
If you are an Arduino beginner, we recommend following our Arduino Mini Course. It will help you quickly getting started with this amazing board (and it is free!).
You may also like the following resources:
- Arduino Step-by-step Projects course
- Guide to SD card module with Arduino
- Guide to DHT11/DHT22 Humidity and Temperature Sensor with Arduino
- Guide to Ultrasonic Sensor with Arduino
You can find all our Arduino projects and tutorials here.
Share this post with a friend that also likes electronics!
If you like this post probably you might like my next ones, so please support me by subscribing our blog.
Thanks for reading.
January 19, 2019
Присоединяйтесь к команде Arduino против Raspberry Pi
Поскольку Arduino и Raspberry Pi появились примерно в одно время, люди могут подумать, что это одно и то же. По правде говоря, хоть и есть кроссовер, но эти две платы разные.
Arduino — это плата микроконтроллера, а Raspberry Pi — одноплатный компьютер. Arduino должен быть запрограммирован с другого устройства, тогда как Raspberry Pi может запускать операционную систему. Вы можете запрограммировать Arduino с Raspberry Pi, но не наоборот.
Эти различия привели к некоторому разделению сообществ. Что лучше: Arduino или Raspberry Pi?
Чтобы узнать это, вам нужно попробовать их оба. Но вы, вероятно, обнаружите, что если у вас врожденный интерес к электронике и созданию проектов, Arduino решает эту проблему.
Описание
Радио модули с частотой 433 MHz – самый простой способ связать две Ардуины по беспроводному каналу. Чем они лучше радио 2.4 GHz, например nRF24?
- Неприхотливы к питанию
- Потребляют небольшой ток
- Занимают один пин МК
- В два раза дешевле
- Выше дальность связи при той же мощности
- Более высокая проникающая способность
Также на этой частоте работают пульты управления (брелоки) радио-реле и шлагбаумов, что позволяет перехватывать их команды и подменять при желании.
Модулей данного типа на китайских площадках существует несколько, продаются они парой (передатчик TX и приёмник RX), либо по отдельности.
Наборы GyverKIT до 2 партии комплектовались парой модулей как по центру на картинке выше (модель SYNxxx), со второй партии в наборах идут модули FS1000A и MX-RM-5V (слева на картинке) как более удобные для подключения и более стабильные в работе. Правые модули, несмотря на самый высокий ценник, работают хуже всех и к покупке не рекомендуются.
Ток потребления модулей:
- FS1000A : передача 12 мА, холостой 10 мкА
- MX-RM-5V : 3.7 мА
- SYN115 : передача 14 мА, холостой 0.5 мкА
- SYN480R : 4.5 мА
Для лучшего качества связи к модулям в пин ANT нужно припаять антенну длиной 17.3 см (четверть волны) в виде одножильного провода, при желании можно свернуть в спираль:
Multiple Sensors Arduino Transmitter Side Arduino Programming:
// Transmitter programming
#include <VirtualWire.h>
const int transmit_pin = 12;
int flexs1 = A0; // flex sensor is connected with pin A0 of the arduino
int flexdata1 = 0;
int flexs2 = A1;
int flexdata2 = 0;
int flexs3 = A2;
int flexdata3 = 0;
int flexs4 = A3;
int flexdata4 = 0;
int flexs5 = A4;
int flexdata5 = 0;
int flexs6 = A5;
int flexdata6 = 0;
String str;
char cstr;
String message = «»;
unsigned int mlength; // message length
void setup()
{
// Initialise the IO and ISR
vw_set_tx_pin(transmit_pin);
vw_setup(2000); // Bits per sec
Serial.begin(9600);
pinMode(flexs1, INPUT);
pinMode(flexs2, INPUT);
pinMode(flexs3, INPUT);
pinMode(flexs4, INPUT);
pinMode(flexs5, INPUT);
pinMode(flexs6, INPUT);
}
void loop()
{
flexdata1 = analogRead(flexs1);
flexdata2 = analogRead(flexs2);
flexdata3 = analogRead(flexs3);
flexdata4 = analogRead(flexs4);
flexdata5 = analogRead(flexs5);
flexdata6 = analogRead(flexs6);
// each group can have maximum of 4 sensors and a group number
SendData(flexdata1,flexdata2,flexdata3,flexdata4,1); // in group 1 we have 4 sensors
delay(500);
SendData(flexdata5,flexdata6,0,0,2); // in group 2 we have 2 sensors
delay(500);
}
// this function takes 5 arguments as the input
// the sensors and the sensors group number.
// let’s say we are using multiple sensors, the sensors
//can be divided into groups.
void SendData( int sensor1,int sensor2,int sensor3,int sensor4, int sgroup)
{
message = message + sensor1 +»,» + sensor2 + «,» + sensor3 +»,» + sensor4 + «,» + sgroup;
mlength = message.length(); // find the number of characters in a message.
str = message;
str.toCharArray(cstr,100);
vw_send((uint8_t *)cstr, mlength); //
vw_wait_tx(); // Wait until the whole message is gone
str = «»;
message = «»;
}
1 |
// Transmitter programming constinttransmit_pin=12; intflexs1=A0;// flex sensor is connected with pin A0 of the arduino intflexdata1=; intflexs2=A1; intflexdata2=; intflexs3=A2; intflexdata3=; intflexs4=A3; intflexdata4=; intflexs5=A4; intflexdata5=; intflexs6=A5; intflexdata6=; Stringstr; charcstr100; Stringmessage=»»; unsignedintmlength;// message length voidsetup() { // Initialise the IO and ISR vw_set_tx_pin(transmit_pin); vw_setup(2000);// Bits per sec Serial.begin(9600); pinMode(flexs1,INPUT); pinMode(flexs2,INPUT); pinMode(flexs3,INPUT); pinMode(flexs4,INPUT); pinMode(flexs5,INPUT); pinMode(flexs6,INPUT); } voidloop() { flexdata1=analogRead(flexs1); flexdata2=analogRead(flexs2); flexdata3=analogRead(flexs3); flexdata4=analogRead(flexs4); flexdata5=analogRead(flexs5); flexdata6=analogRead(flexs6); SendData(flexdata1,flexdata2,flexdata3,flexdata4,1);// in group 1 we have 4 sensors delay(500); SendData(flexdata5,flexdata6,,,2);// in group 2 we have 2 sensors delay(500); } voidSendData(intsensor1,intsensor2,intsensor3,intsensor4,intsgroup) { message=message+sensor1+»,»+sensor2+»,»+sensor3+»,»+sensor4+»,»+sgroup; mlength=message.length();// find the number of characters in a message. str=message; str.toCharArray(cstr,100); vw_send((uint8_t *)cstr,mlength);// vw_wait_tx();// Wait until the whole message is gone str=»»; message=»»; |
Итоговый результат
Нам очень повезло, что мы живем в эпоху, когда мы сами можем сделать все, что захотим. У нас есть инструменты и ресурсы для создания всего, что мы хотим, в течение нескольких недель и при низких затратах. Конечный результат стоит времени и усилий, которые вы вложили в него. Вы потратите много часов на этот проект, но узнаете много нового, получите драгоценный опыт и наработаете навыки и уверенность для создания еще более классных проектов.
Конечно, этот проект не идеален. Прием не очень хороший с той антенной, которая была использована. Если вы подключаете USB-кабель к порту зарядки, он действует как антенна и значительно улучшает прием. Кроме того, даже несмотря на то, что код проекта поддерживает кнопку поворотного регулятора для включения или выключения подсветки дисплея, мы не использовали эту функцию, потому что случайно приклеили поворотный регулятор так, чтобы кнопка не могла быть нажата. Конечно, есть много вещей, которые можно улучшить, но в целом проект получился очень познавательным.