Подключение модуля nRF24L01+ к Arduino — соединяем две arduino по радиоканалу

nRF24L01 один из самых популярных беспроводных модулей для интернета вещей (IoT). Подключение модуля nRF24L01+ к Arduino позволит организовать многоканальную защищенную связь между Arduino и устройствами на расстоянии. Рассмотрим, как наладить связь между двумя или несколько плат Ардуино по радиоканалу.

Содержание

Установка библиотеки RF24

Работать с nRF24L01+ можно с помощью библиотеки RF24 — довольно популярная и удобная библиотека. Скачиваем, распаковываем и закидываем библиотеку RF24 в папку Arduino/libraries. В случае, если на момент добавления библиотеки, Arduino IDE была открытой, перезагружаем среду.

Библиотеку можно установить из самой среды следующим образом:

  1. В Arduino IDE открываем менеджер библиотек: Скетч->Подключить библиотеку->Управлять библиотеками…Подключение модуля nRF24L01+ к Arduino - Управлять библиотеками...
  2. В строке поиска вводим «RF24», находим библиотеку автора TMRh20, выбираем последнюю версию и кликаем Установить.Подключение модуля nRF24L01+ к Arduino - RF24 Установка
  3. Библиотека установлена (INSTALLED).Подключение модуля nRF24L01+ к Arduino - RF24 INSTALLED

Описание методов библиотеки RF24

begin()

Инициализация работы модуля.

bool RF24::begin(void);

Возвращает
bool — результат инициализации (true / false).

startListening()

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

void RF24::startListening(void);

stopListening()

Прекратить прослушивание труб и переключиться в режим передатчика.

void RF24::stopListening(void);

available()

Проверить наличие принятых данных доступных для чтения.

bool RF24::available(void);
bool RF24::available(uint8_t * pipe_num);

Параметры
pipe_num — адрес переменной типа uint8_t в которую требуется поместить номер трубы по которой были приняты данные.
Возвращает
bool — флаг наличия принятых данных (true / false).

isAckPayloadAvailable()

Проверить передатчиком наличие данных в ответе приёмника.

bool RF24::isAckPayloadAvailable(void);

Возвращает
bool — флаг наличия принятых данных от приёмника (true / false).

read()

Прочитать принятые данные.

void RF24::read(void * buf, uint8_t len);

Параметры
buf — адрес массива, строки или переменной в которую требуется поместить принятые данные.
len — количество байт занимаемое массивом, строкой или переменной в которую требуется поместить принятые данные.

write()

Отправить данные по радиоканалу.

bool RF24::write(const void * buf, uint8_t len, const bool multicast);

Параметры
buf — Данные, адрес массива, строки или переменной, данные которой требуется отправить.
len — Размер отправляемых данных в байтах.
multicast — Флаг групповой передачи, установите в true если требуется отправить данные нескольким приёмникам.
Возвращает
bool — результат доставки данных приёмнику (true / false).

writeAckPayload()

Подготовить данные для ответа передатчику.

void RF24::writeAckPayload(uint8_t pipe, const void * buf, uint8_t len);

Параметры
pipe — Номер трубы передатчика которому требуется ответить данными.
buf — Данные, адрес массива, строки или переменной, данные которой требуется отправить вместе с ответом передатчику.
len — Размер отправляемых данных в байтах.

openWritingPipe()

Открыть трубу для передачи данных.

void RF24::openWritingPipe(uint64_t address);

Параметры
address — Адрес трубы, состоит из 5 байт (по умолчанию) и может быть представлен числом типа uint64_t или массивом из 5 однобайтных элементов. Адрес трубы передатчика должен совпадать с одним из адресов труб приёмника.

openReadingPipe()

Открыть трубу для приёма данных.

void RF24::openReadingPipe(uint8_t number, const uint8_t * address);
void RF24::openReadingPipe(uint8_t number, uint64_t address);

Параметры
number — Номер трубы (число от 0 до 5).
address — Адрес трубы, состоит из 5 байт (по умолчанию) и может быть представлен числом типа uint64_t или массивом из 5 однобайтных элементов. Адрес трубы приёмника должен совпадать с адресом трубы передатчика.

closeReadingPipe()

Закрыть трубу открытую ранее для прослушивания (приёма данных).

void RF24::closeReadingPipe(uint8_t pipe):

Параметры
number — Номер трубы (число от 0 до 5), которую более не требуется прослушивать.

setChannel()

Установить радиочастотный канал связи. Номер канала определяет частоту на которой работает модуль. Каждый канал имеет шаг в 1 МГц, а каналу 0 соответствует частота 2,4 ГГц = 2400 МГц, следовательно, каналу 1 соответствует частота 2401 МГц, каналу 2 — частота 2402 МГц и т.д. до канала 125 с частотой 2525 МГц.

void RF24::setChannel(uint8_t channel);

Параметры
channel — Номер канала, указывается числом от 0 до 125.

getChannel()

Получить номер текущего радиочастотного канала связи.

uint8_t RF24::getChannel(void);

Возвращает
Номер канала, число от 0 до 125.

setDataRate()

Установить скорость передачи данных по радиоканалу.

bool RF24::setDataRate(rf24_datarate_e speed);

Параметры
speed — Скорость, задаётся одной из констант: RF24_1MBPS — 1 Мбит/сек, RF24_2MBPS — 2 Мбит/сек и RF24_250KBPS — 250 Кбит/сек (только для модуля NRF24L01+PA+LNA).
Возвращает
Флаг успешной установки новой скорости (true / false).

getDataRate()

Получить текущую скорость передачи данных по радиоканалу.

rf24_datarate_e RF24::getDataRate(void);

Возвращает
значение одной из констант сопоставленной скорости:RF24_1MBPS — 1 Мбит/сек, RF24_2MBPS — 2 Мбит/сек и RF24_250KBPS — 250 Кбит/сек (только для модуля NRF24L01+PA+LNA).

setPALevel()

Установить уровень усиления мощности передатчика.

void RF24::setPALevel(uint8_t level);

Параметры
level — Уровень, задаётся одной из констант:

  • RF24_PA_MIN — минимальный уровень усиления = -18 дБм.
  • RF24_PA_LOW — низкий уровень усиления = -12 дБм.
  • RF24_PA_HIGH — высокий уровень усиления = -6 дБм.
  • RF24_PA_MAX — максимальный уровень усиления = 0 дБм.

getPALevel()

Получить текущий уровень усиления мощности передатчика.

uint8_t RF24::getPALevel(void);

Возвращает
значение одной из констант сопоставленной мощности:RF24_PA_MIN — минимальный уровень усиления = -18 дБм.

  • RF24_PA_LOW — низкий уровень усиления = -12 дБм.
  • RF24_PA_HIGH — высокий уровень усиления = -6 дБм.
  • RF24_PA_MAX — максимальный уровень усиления = 0 дБм.
  • RF24_PA_ERROR — уровень усиления не определён.

setCRCLength()

Установить размер CRC (циклически избыточный код).

void RF24::setCRCLength(rf24_crclength_e length);

Параметры
length — Размер, задаётся одной из констант: RF24_CRC_8 — под CRC отводится 8 бит (CRC-8) или RF24_CRC_16 — под CRC отводится 16 бит (CRC-16).

getCRCLength()

Получить текущий размер CRC (циклически избыточный код).

rf24_crclength_e RF24::getCRCLength(void);

Возвращает
значение одной из констант сопоставленной размеру CRC: RF24_CRC_8 — под CRC отводится 8 бит (CRC-8), RF24_CRC_16 — под CRC отводится 16 бит (CRC-16) или RF24_CRC_DISABLED — передача и проверка CRC отключены.

disableCRC()

Отключить передачу CRC передатчиком и проверку данных приёмником.

void RF24::disableCRC(void);

setPayloadSize()

Установить статичный размер блока данных пользователя в байтах.

void RF24::setPayloadSize(uint8_t size);

Параметры
size — Размер блока данных пользователя в байтах.

getPayloadSize()

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

uint8_t RF24::getPayloadSize(void);

Возвращает
текущий статичный размер блока данных от 0 до 32 байт.

getDynamicPayloadSize()

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

uint8_t RF24::getDynamicPayloadSize(void);

Возвращает
размер данных последнего принятого пакета в байтах.

enableDynamicPayloads()

Разрешить динамически изменяемый размер блока данных для всех труб.

void RF24::enableDynamicPayloads(void);

enableDynamicAck()

Разрешить отказываться от запроса пакетов подтверждения приёма.

void RF24::enableDynamicAck(void);

enableAckPayload()

Разрешить размещать данные пользователя в пакете подтверждения приёма.

void RF24::enableAckPayload(void);

setAutoAck()

Управление автоматической отправкой пакетов подтверждения приёма данных.

void RF24::setAutoAck(bool enable);
void RF24::setAutoAck(uint8_t pipe, bool enable);

Параметры
pipe — номер трубы, для которой разрешается / запрещается автоматическая отправка пакетов подтверждения приема. Указывается только на стороне приёмника. Если номер трубы на стороне приёмника не указан, то действие функции распространяется на все трубы.
enable — Флаг разрешающий автоматическую отправку пакетов подтверждения приёма данных. true — разрешить / false — запретить.

setAddressWidth()

Указать длину адресов труб в байтах.

void RF24::setAddressWidth(uint8_t a_width);

Параметры
a_width — Размер адреса трубы в байтах, представлен числом 3, 4 или 5.

setRetries()

Указать максимальное количество попыток отправки данных и время ожидания.

void RF24::setRetries(uint8_t delay, uint8_t count);

Параметры
delay — целое число от 0 до 15 определяющее время ожидания подтверждения приема.
count — целое число от 1 до 15 определяющее максимальное количество попыток доставить данные передатчику.

powerDown()

Перейти в режим пониженного энергопотребления.

void RF24::powerDown(void);

powerUp()

Выйти из режима пониженного энергопотребления.

void RF24::powerUp(void);

isPVariant()

Проверить аппаратную совместимость модуля с функциями nRF24L01.

bool RF24::isPVariant(void);

Возвращает
(true / false) флаг указывающий на совместимость аппаратного обеспечения модуля с функциями чипа nRF24L01+.

writeFast()

Быстро отправить данные по радиоканалу.

bool RF24::writeFast(const void * buf, uint8_t len);
bool RF24::writeFast(const void * buf, uint8_t len, const bool multicast);

Параметры
buf — Данные, адрес массива, строки или переменной, данные которой требуется отправить.
len — Размер отправляемых данных в байтах.
multicast — Флаг групповой передачи, установите в true если требуется отправить данные нескольким приёмникам.
Возвращает
результат записи данных в буфер для передачи (true / false).

writeBlocking()

Быстро отправить данные по радиоканалу с указанием таймаута.

bool RF24::writeBlocking(const void * buf, uint8_t len, uint32_t timeout);

Параметры
buf — Данные, адрес массива, строки или переменной, данные которой требуется отправить.
len — Размер отправляемых данных в байтах.
timeout — Максимальное время ожидания освобождения буфера FIFO в миллисекундах.
Возвращает
результат записи данных в буфер для передачи (true / false).

startFastWrite()

Начать быструю отправку данных.

void RF24::startFastWrite(const void * buf, uint8_t len, const bool multicast, bool startTx = 1);

Параметры
buf — Данные, адрес массива, строки или переменной, данные которой требуется отправить.
len — Размер отправляемых данных в байтах.
multicast — Флаг групповой передачи, установите в true если требуется отправить данные нескольким приёмникам.
startTx — флаг перехода в режим TX или STANDBY-II. Если не указан, значит установлен.

startWrite()

Начать отправку данных.

void RF24::startWrite(const void * buf, uint8_t len, const bool multicast);

Параметры
buf — Данные, адрес массива, строки или переменной, данные которой требуется отправить.
len — Размер отправляемых данных в байтах.
multicast — Флаг групповой передачи, установите в true если требуется отправить данные нескольким приёмникам.

txStandBy()

Подождать пока передаются данные и вернуть результат.

bool RF24::txStandBy(void);
bool RF24::txStandBy(uint32_t timeout, bool startTx = 0);

Параметры
timeout — максимальное время ожидания указывается в миллисекундах.
Возвращает
результат передачи данных из буферов FIFO в радиоканал (true / false).

rxFifoFull()

Проверить не заполнены ли все три буфера FIFO.

bool RF24::rxFifoFull(void);

Возвращает
флаг указывающий на то что все буферы FIFO заполнены.

flush_tx()

Очистка буферов FIFO.

uint8_t RF24::flush_tx(void);

reUseTX()

Повторная отправка данных из буфера FIFO, если они там есть.

void RF24::reUseTX(void);

testCarrier()

Проверка наличия несущей частоты на выбранном канале (частоте).

bool RF24::testCarrier(void);

Возвращает
наличие несущей на выбранном канале за все время его прослушивания.

testRPD()

Проверка наличия любого сигнала выше -64 дБм на выбранном канале (частоте).

bool RF24::testRPD(void);

Возвращает
наличие сигнала мощностью выше -64 дБм на выбранном канале за все время его прослушивания.

isValid()

Проверить используется ли модуль или выполняется отладка кода.

bool RF24::isValid(void);

Возвращает
назначение редактируется (true / false).

Схема подключения nRF24L01+ к Arduino

Подключается nRF24L01+ к Arduino по шине SPI (можно использовать как аппаратную так и программную шину). Выводы модуля Vcc и GND подключаются к шине питания 3.3 В постоянного тока. Выводы модуля MISO, MOSI и SCK подключаются к одноименным выводам шины SPI на плате Arduino. Выводы SS (Slave Select) и CE (Chip Enable) назначаются при объявлении объекта библиотеки RF24 и подключаются к любым назначенным выводам Arduino.

Подключить nRF24L01+ к Arduino можно как напрямую, так и через специальный адаптер.

Подключение nRF24L01+ к Arduino напрямую

Подключение nRF24L01+ к Arduino UNO напрямую

Внимание!

  • Необходимо помнить, что модуль работает от 3.3 В и в нем нет защиты от переполюсовки, если не соблюдать два этих правила, можно сжечь модуль!
  • Для стабильной работы модуля NRF24L01+ необходимо припаять конденсатор на 10 мкФ между VCC и GND.

nRF24L01+ - электролитический конденсатор емкостью 100 мкФ

nRF24L01+ Arduino UNO/Pro Mini Arduino MEGA2560
GND GND GND
VCC 3.3V 3.3V
CE 9 9
CSN 10 53
SCK 13 52
MOSI 11 51
MISO 12 50
IRQ

Подключение nRF24L01+ к Arduino через адаптер

Адаптер nRF24L01+ Arduino UNO/Pro Mini Arduino MEGA2560
GND GND GND
VCC 5.0V 5.0V
CE 9 9
CSN 10 53
SCK 13 52
MO/MOSI 11 51
MI/MISO 12 50
IRQ

Примеры

Обмен данными между двумя платами Arduino UNO и Pro Mini через nRF24L01+

Пример 1: Проверочный скетч

/*
  Подключаем файл настроек из библиотеки RF24.
*/
#include <nRF24L01.h>
/*
  Подключаем библиотеку для работы с nRF24L01+.
*/
#include <RF24.h>
#include <printf.h>

/*
  Создаём объект radio для работы с библиотекой RF24,
  указывая номера выводов модуля (CE, SS).
*/
RF24 radio(7, 10);

void setup() {
  /*
    Инициируем передачу данных по шине UART в монитор
    последовательного порта на скорости 115200 бит/сек.
  */
  Serial.begin(115200);
  printf_begin();
  /*
    Инициируем работу модуля nRF24L01+.
  */
  radio.begin();
  if (radio.isPVariant()) {
    /*
      Если модуль поддерживается библиотекой RF24,
      то выводим текст «Модуль nRF24L01 подключен».
    */
    Serial.println("Модуль nRF24L01 подключен");
    /*
      Дамп конфигурации RF для отладки
    */
    radio.printDetails();
  } else {
    /*
      Иначе, если модуль не поддерживается,
      то выводи текст «Неизвестный модуль».
    */
    Serial.println("Неизвестный модуль");
  }
}

void loop() {
}

Результат

Подключение модуля nRF24L01+ к Arduino - Проверочный скетч, Результат

Если после загрузки проверочного скетча увидели, в окне монитора последовательного порта, надпись «Модуль nRF24L01 подключен», значит Ваш модуль поддерживается библиотекой RF24. Если Вы увидели надпись «Неизвестный модуль», проверьте подключение модуля к Arduino. В скетче указано что вывод «CE» (Chip Enable) модуля подключается к выводу 7 Arduino, а вывод SS (Slave Select) модуля подключается к выводу 10 Arduino. При необходимости измените выводы на другие. Если модуль подключён правильно, значит он собран на чипе отличном от nRF24L01.

Пример 2: Передача данных

В функции setup() данного примера модулю задаются основные настройки:

  • по умолчанию модуль работает в качестве передатчика;
  • 0x30 канал;
  • скорость 1 Мбит/сек (RF24_1MBPS);
  • максимальная мощности (RF24_PA_MAX);
  • адрес трубы 0x0123456789LL.

На стороне приёмника нужно указать тот же номер канала, скорость передачи, мощность и адрес трубы.

/*
  Подключаем файл настроек из библиотеки RF24
*/
#include <nRF24L01.h>
/*
  Подключаем библиотеку  для работы с nRF24L01+
*/
#include <RF24.h>

/*
  Создаём объект radio для работы с библиотекой RF24,
  указывая номера выводов модуля (CE, SS).
*/
RF24 radio(7, 10);

/*
   Объявляем массив для хранения и передачи данных
   (до 32 байт включительно).
*/
int dataToBeTransmitted[5] = {'0', '1', '2', '3', '4'};

void setup() {
  /*
    Инициируем работу nRF24L01+
  */
  radio.begin();
  /*
    Указываем канал передачи данных (от 0 до 127)
    (на одном канале может быть только 1 приёмник и до 6 передатчиков).
    Выбираем канал в котором нет шумов!
  */
  radio.setChannel(0x30);
  /*
    Указываем скорость передачи данных
    RF24_250KBPS = 250Кбит/сек
    RF24_1MBPS = 1Мбит/сек
    RF24_2MBPS = 2Мбит/сек
    Скорость должна быть одинакова на приёмнике и передатчике.
    При самой низкой скорости имеем самую высокую чувствительность и дальность.
  */
  radio.setDataRate(RF24_1MBPS);
  /*
    Указываем мощность передатчика
    RF24_PA_MIN=-18dBm
    RF24_PA_LOW=-12dBm
    RF24_PA_HIGH=-6dBm
    RF24_PA_MAX=0dBm
  */
  radio.setPALevel(RF24_PA_MAX);

  /*
     Открываем трубу с адресом 0x0123456789LL для передачи данных
     (передатчик может одновременно вещать только по одной трубе).
  */
  radio.openWritingPipe(0x0123456789LL);
}

void loop() {
  /*
     Отправляем данные из массива dataToBeTransmitted
     указывая весь размер массива в байтах.
  */
  radio.write(&dataToBeTransmitted, sizeof(dataToBeTransmitted));
  /*
     Устанавливаем задержку на 1000 мс.
  */
  delay(1000);
}

Пример 3: Получение данных от одного передатчика

В коде setup() приёмника задаются такие же настройки как и передатчику (канал, скорость, мощность передатчика).

  • 0x30 канал;
  • скорость 1 Мбит/сек (RF24_1MBPS);
  • максимальная мощности (RF24_PA_MAX);
  • адрес трубы 0x0123456789LL, для приёма данных.

Чтобы включить прослушивание труб, нужно вызвать startListening(), метод переводит модуль в режим работы приёмника. Если далее вызвать stopListening(), то модуль перейдёт в режим работы передатчика.

/*
  Подключаем файл настроек из библиотеки RF24
*/
#include <nRF24L01.h>
/*
  Подключаем библиотеку  для работы с nRF24L01+
*/
#include <RF24.h>

/*
  Создаём объект radio для работы с библиотекой RF24,
  указывая номера выводов модуля (CE, SS).
*/
RF24 radio(7, 10);

/*
  Объявляем массив для хранения и передачи данных
  (до 32 байт включительно).
*/
int receivedData[5];

/*
  Объявляем переменную в которую будет сохраняться
  номер трубы по которой приняты данные.
*/
uint8_t pipe;

uint8_t i;

void setup() {
  /*
    Инициируем передачу данных по шине UART в монитор
    последовательного порта на скорости 115200 бит/сек.
  */
  Serial.begin(115200);
  /*
    Инициируем работу nRF24L01+
  */
  radio.begin();
  /*
    Указываем канал передачи данных (от 0 до 127)
    (на одном канале может быть только 1 приёмник и до 6 передатчиков).
    Выбираем канал в котором нет шумов!
  */
  radio.setChannel(0x30);
  /*
    Указываем скорость передачи данных
    RF24_250KBPS = 250Кбит/сек
    RF24_1MBPS = 1Мбит/сек
    RF24_2MBPS = 2Мбит/сек
    Скорость должна быть одинакова на приёмнике и передатчике.
    При самой низкой скорости имеем самую высокую чувствительность и дальность.
  */
  radio.setDataRate(RF24_1MBPS);
  /*
    Указываем мощность передатчика
    RF24_PA_MIN=-18dBm
    RF24_PA_LOW=-12dBm
    RF24_PA_HIGH=-6dBm
    RF24_PA_MAX=0dBm
  */
  radio.setPALevel(RF24_PA_MAX);
  /*
    Открываем 1 трубу с адресом 1 передатчика 0x0123456789LL, для приема данных.
  */
  radio.openReadingPipe(1, 0x0123456789LL);
  /*
    Включаем приемник, начинаем прослушивать открытые трубы.
  */
  radio.startListening();
}

void loop() {
  /*
    Если в буфере имеются принятые данные, то получаем номер трубы
    по которой эти данные пришли в переменную pipe.
  */
  if (radio.available(&pipe)) {
    /*
      Читаем данные из буфера в массив receivedData указывая
      сколько всего байт может поместиться в массив.
    */
    radio.read(&receivedData, sizeof(receivedData));
    /*
      Если данные пришли от 1 передатчика (по 1 трубе),
      то можно выполнить соответствующее действие ...
    */
    Serial.print("Данные [ ");
    for (i = 0; i < 5; i++) {
      Serial.print((char) receivedData[i]);
      Serial.print(' ');
    }
    Serial.print("] пришли по трубе ");
    Serial.println(pipe);
  }
}

Результат

Подключение модуля nRF24L01+ к Arduino - Приём данных, Результат

Пример 4: Передача данных с проверкой их доставки

/*
  Подключаем файл настроек из библиотеки RF24
*/
#include <nRF24L01.h>
/*
  Подключаем библиотеку  для работы с nRF24L01+
*/
#include <RF24.h>

/*
  Создаём объект radio для работы с библиотекой RF24,
  указывая номера выводов модуля (CE, SS).
*/
RF24 radio(7, 10);

/*
   Объявляем массив для хранения и передачи данных
   (до 32 байт включительно).
*/
uint8_t dataToBeTransmitted[5] = {'0', '1', '2', '3', '4'};

void setup() {
  /*
    Инициируем передачу данных по шине UART в монитор
    последовательного порта на скорости 115200 бит/сек.
  */
  Serial.begin(115200);
  /*
    Инициируем работу nRF24L01+
  */
  radio.begin();
  /*
    Указываем канал передачи данных (от 0 до 127)
    (на одном канале может быть только 1 приёмник и до 6 передатчиков).
    Выбираем канал в котором нет шумов!
  */
  radio.setChannel(0x30);
  /*
    Указываем скорость передачи данных
    RF24_250KBPS = 250Кбит/сек
    RF24_1MBPS = 1Мбит/сек
    RF24_2MBPS = 2Мбит/сек
    Скорость должна быть одинакова на приёмнике и передатчике.
    При самой низкой скорости имеем самую высокую чувствительность и дальность.
  */
  radio.setDataRate(RF24_1MBPS);
  /*
    Указываем мощность передатчика
    RF24_PA_MIN=-18dBm
    RF24_PA_LOW=-12dBm
    RF24_PA_HIGH=-6dBm
    RF24_PA_MAX=0dBm
  */
  radio.setPALevel(RF24_PA_MAX);

  /*
     Открываем трубу с адресом 0x0123456789LL для передачи данных
     (передатчик может одновременно вещать только по одной трубе).
  */
  radio.openWritingPipe(0x0123456789LL);
}

void loop() {
  /*
     Отправляем данные из массива dataToBeTransmitted
     указывая весь размер массива в байтах.
  */
  if (radio.write(&dataToBeTransmitted, sizeof(dataToBeTransmitted))) {
    /*
       Данные передатчика были корректно приняты приёмником
    */
    Serial.println("Данные были корректно приняты приёмником");
  } else {
    /*
       Данные передатчика не приняты или дошли с ошибкой CRC
    */
    Serial.println("Данные не приняты или дошли с ошибкой CRC");
  }
  /*
     Устанавливаем задержку на 1000 мс.
  */
  delay(1000);
}

Результат

Подключение модуля nRF24L01+ к Arduino - Передача данных с проверкой, РезультатСкетч данного примера отличается от предыдущего только кодом loop() где функция write() вызывается в условии оператора if(). Дело в том, что функция write() не только отправляет данные, но и возвращает true (если данные были доставлены) или false (если данные не доставлены). По умолчанию передача данных реализована так, что передатчик не только отправляет данные, но и запрашивает у приёмника подтверждение их получения, а приёмник получив данные и проверив CRC, возвращает передатчику пакет подтверждения приема данных. Таким образом на стороне передатчика можно контролировать факт доставки данных приёмнику.

Если не нужно определить факт доставки данных приёмнику, можете заменить write() на writeFast().

/*
   Отправляем данные из массива dataToBeTransmitted 
   указывая сколько байт массива мы хотим отправить.
 */
radio.writeFast(&dataToBeTransmitted, sizeof(dataToBeTransmitted));

writeFast() принимает те же параметры что и write(), но возвращает не флаг доставки данных приёмнику, а флаг записи данных в буфер FIFO. Значит в большинстве случаев функция вернёт true даже до того как приёмник получит данные. Если же все три буфера FIFO заполнены, то функция writeFast() ждёт пока один из них не освободится или пока не истечёт время таймаута но и это ожидание на порядок меньше чем у функции write().

Запретить отправку пакетов подтверждения приёма можно и на стороне приёмников, вызвав у них функцию setAutoAck(false) или setAutoAck(номер_трубы, false). Но в таком случае и на стороне передатчика нужно вызвать функцию setAutoAck(false) иначе приёмник не будет понимать что ему прислал передатчик.

Пример 5: Получение данных от одного или нескольких передатчиков

Приёмнику можно задать до 6 труб функцией openReadingPipe(номер, адрес) с номерами труб от 0 до 5 и адресами труб совпадающими с адресами труб передатчиков.

/*...*/
radio.openReadingPipe(0, 0x0123456789LL);
radio.openReadingPipe(1, 0x0123456799LL);
radio.openReadingPipe(2, 0x012345679ALL);
radio.openReadingPipe(3, 0x01234567AALL);
radio.openReadingPipe(4, 0x01234567ABLL);
radio.openReadingPipe(5, 0x01234567BBLL);
/*...*/

Сколько труб Вы укажете, столько передатчиков будет слушать приёмник.

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

if(radio.available(&pipe)) {
  /*...*/
}

Если приемник будет принимать данные только от одного передатчика, то переменную pipe можно не использовать, а метод available() можно вызвать без параметра, так как в этом случае не требуется узнавать от какого передатчика приняты данные.

/*
  Подключаем файл настроек из библиотеки RF24
*/
#include <nRF24L01.h>
/*
  Подключаем библиотеку  для работы с nRF24L01+
*/
#include <RF24.h>

/*
  Создаём объект radio для работы с библиотекой RF24,
  указывая номера выводов модуля (CE, SS).
*/
RF24 radio(7, 10);

/*
  Объявляем массив для хранения и передачи данных
  (до 32 байт включительно).
*/
uint8_t receivedData[5];

/*
  Объявляем переменную в которую будет сохраняться
  номер трубы по которой приняты данные.
*/
uint8_t pipe;

uint8_t i;

void setup() {
  /*
    Инициируем передачу данных по шине UART в монитор
    последовательного порта на скорости 115200 бит/сек.
  */
  Serial.begin(115200);
  /*
    Инициируем работу nRF24L01+
  */
  radio.begin();
  /*
    Указываем канал передачи данных (от 0 до 127)
    (на одном канале может быть только 1 приёмник и до 6 передатчиков).
    Выбираем канал в котором нет шумов!
  */
  radio.setChannel(0x30);
  /*
    Указываем скорость передачи данных
    RF24_250KBPS = 250Кбит/сек
    RF24_1MBPS = 1Мбит/сек
    RF24_2MBPS = 2Мбит/сек
    Скорость должна быть одинакова на приёмнике и передатчике.
    При самой низкой скорости имеем самую высокую чувствительность и дальность.
  */
  radio.setDataRate(RF24_1MBPS);
  /*
    Указываем мощность передатчика
    RF24_PA_MIN=-18dBm
    RF24_PA_LOW=-12dBm
    RF24_PA_HIGH=-6dBm
    RF24_PA_MAX=0dBm
  */
  radio.setPALevel(RF24_PA_MAX);
  /*
    Открываем 1 трубу с адресом 1 передатчика 0x0123456789LL, для приема данных.
  */
  radio.openReadingPipe(1, 0x0123456789LL);
  /*
    Открываем 2 трубу с адресом 2 передатчика 0x0123456799LL, для приема данных.
  */
  radio.openReadingPipe(2, 0x0123456799LL);
  /*
    Включаем приемник, начинаем прослушивать открытые трубы.
  */
  radio.startListening();
}

void loop() {
  /*
    Если в буфере имеются принятые данные, то получаем номер трубы
    по которой эти данные пришли в переменную pipe.
  */
  if (radio.available(&pipe)) {
    /*
      Читаем данные из буфера в массив receivedData указывая
      сколько всего байт может поместиться в массив.
    */
    radio.read(&receivedData, sizeof(receivedData));
    /*
      Если данные пришли от 1 передатчика (по 1 трубе),
      то можно выполнить соответствующее действие ...
    */
    Serial.print("Данные [ ");
    for (i = 0; i < 5; i++) {
      Serial.print((char) receivedData[i]);
      Serial.print(' ');
    }
    Serial.print("] пришли по трубе ");
    Serial.println(pipe);
  }
}

Результат

Подключение модуля nRF24L01+ к Arduino - Получение данных от одного или нескольких передатчиков, Результат

Материалы

Радио модуль NRF24L01+ / PA+LNA 2.4G (Trema-модуль V2.0)
Урок 26.4 Соединяем две arduino по радиоканалу через nRF24L01+
Optimized High Speed NRF24L01+ Driver Class Documenation

Похожие записи

Комментарии 69

  • Спасибо за описание методов. Только здесь нашел.

  • В примере 4 тип данных для отправки uint8_t, а в примере 3 тип данных для приема int. Несколько неожиданно, когда принимается не совсем то что отправляется. ))

    • Да, нужно отправить/получать используя один тип данных, лучше всего использовать uint8_t, но можно использовать любой тип данных, к примеру вам нужно отправить int или double и не хотите вручную преобразовать из 4-х uint8_t в int.

  • вместо RF24 radio(7, 10); должно быть RF24 radio(9, 10);

  • Вовсе не обязательно. Это зависит от того, к каким выводам Ардуино подведены сигналы ce и csn радиомодуля.

  • Спасибо большое! Реально только здесь нашел информацию. Хотелось бы еще увидеть пример с переключением с приема на передачу и обратно.

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

  • Because the admin of this website is working, no uncertainty very rapidly it will be well-known,
    due to its feature contents.

  • เกมส์ ชนิด ยี่กีเป็น แบบ การ เล่นพนัน หวย อันใด ได้รับความ ความรู้สึกชื่นชอบ อย่างมากใน ดินแดน
    ไทย ซึ่งมี ลักษณะคล้ายคลึง กับ ส่วย ลอตเตอรี่ทั่วไป
    แต่มี ข้อแตกต่าง ในด้าน การเลือกสรร
    ตัวเลขที่ และ วิธีการ ในการ มาซื้อ ขาย

    การ ลองเล่น หวยยี่กีนั้น ผู้ พนัน จะ เลือกออก เลขชุด จำนวน 2-3
    ตัวเลขมงคล ซึ่งอาจ เป็น เลขมงคล ที่มีความหมาย หรือ เลขเด็ด
    ที่ ปรากฏ ใน ความเชื่อ ของ บุคคล จากนั้นนำ
    เลขมงคล เหล่านั้น ไปจองซื้อ ที่ ช่องทาง จำหน่าย
    การเดิมพัน ยี่กี
    ซึ่ง โดยทั่วไป จะ คือ ร้านค้า
    ปลีก ทุกแห่ง ในชุมชน

    สิ่งที่ ทำให้ ตั๋ว ยี่กี ได้รับความนิยม มาก ก็คือ
    อัตรา การจ่าย รางวัลที่ ซึ่งมัก จะ สูงกว่า การพนัน รัฐบาล โดย ซึ่งเฉพาะ ในกรณีที่
    ตัวเลข ถูกมา เป็น หมายเลขที่ ที่ ไม่ค่อยจะ ในหวย รัฐบาล ซึ่งก็ ก็ทำให้ ผู้ ซื้อ
    มี ผล รางวัลตอบแทน ที่ มากยิ่งขึ้น หาก หมายเลข ที่ เลือกได้ ถูกรางวัล

    อย่างไร ทีเดียว การเล่น
    ตั๋ว ยี่กีนั้นก็มี ความเสี่ยง มากเกินไป เนื่องจาก เป็นลักษณะ การ ลงเดิมพัน ที่ อาศัย บุญกรรม ด้วยเป็นหลัก ซึ่ง อาจจะ ทำให้ผู้ ซื้อ สูญเงินจำนวนมาก เงินจำนวนมาก ในกรณี ไม่ถูกรางวัล รางวัล ดังนั้น
    จึงควร ใช้ โดย ความ ระวังระมัด

    ในภาพรวม ลอตเตอรี่
    ยี่กีถือเป็น การเล่นพนัน ที่ ได้รับการนิยม อย่าง เป็นจำนวนมาก ใน บ้านเมือง
    ไทย แม้ว่าจะ ประกอบไปด้วย ความเสี่ยง มากมาย แต่ก็
    ยังคงมี ที่ แสดง ความ
    ความสนใจอย่างยิ่ง และ
    ใช้ การเดิมพัน ยี่กีอย่าง อย่างสม่ำเสมอ ทั้ง เพื่อที่จะ ต้องการให้ ผล รางวัล ซึ่ง
    สูง และ เพื่าจะ ต้องการแสวงหา ความ ความรู้สึกตื่นเต้น จาก การใช้

    Take a look at my web page: ยี่กี เล่นยังไง

  • Nice blog! Is your theme custom made or did you download it from somewhere?
    A theme like yours with a few simple adjustements would really make my blog stand out.

    Please let me know where you got your theme. Thanks a
    lot

  • Finished Reading a Blog Post: A Formal Contribution to the Comment Section and an Invitation to Join «KING855»

    ‘After meticulously examining the blog post, I would like to submit the following reply to the thread .

    Your insights concerning the topic were quite fascinating.
    I found myself in consensus with many of
    the ideas you mentioned .

    It is gratifying to witness such an stimulating dialogue unfolding.

    If you are inclined in deeper exploring this
    theme, I would sincerely urge you to become a member of the «KING855»
    community . There , you will have the opportunity to interact with
    kindred spirit members and delve deeper into these intriguing subjects.

    I am confident your involvement would be a valuable
    enhancement to the discussion .

    Thank you input , and I look forward to the prospect of
    continuing this stimulating exchange .

    Feel free to surf to my website :: online casino welcome offers — rentry.co,

  • I have read so many posts on the topic of the blogger lovers except this post is actually a good paragraph, keep it up.

  • Touche. Great arguments. Keep up the good spirit.

  • สวัสดีค่ะ! การเล่น ebet เป็นผู้ให้บริการเกมออนไลน์ที่ได้รับความนิยมอย่างแพร่หลายในวงการพนันคาสิโนออนไลน์
    สล็อต ebet เป็นหนึ่งในตัวเกมที่มีเนื้อหาที่น่าสนใจจาก ebet ที่คนเล่นสามารถเพลิดเพลินไปกับสล็อตที่มีกราฟิกที่สวยงามและเสียงที่สมจริง อีกทั้งยังมีบาคาร่าออนไลน์จาก ebet ที่น่าสนใจมากเช่นกัน หากคุณต้องการพบกับประสบการณ์เล่นคาสิโนที่ไม่ธรรมดา คุณสามารถเข้าสู่ ebet casino และเล่นเกมต่างๆได้อย่างสบายใจและปลอดภัย
    ด้วยความสำคัญที่
    ebet ให้กับความพึงพอใจของผู้เล่น จึงมีบาคาร่าจาก ebet
    ที่มีคุณภาพและรูปแบบการเล่นที่ให้ความบันเทิงแบบแท้จริง อย่างที่คุณถามว่า ebet
    คืออะไร ก็คือผู้ให้บริการเกมคาสิโนที่ได้รับความนิยมและเชื่อถือจากผู้เล่นหลายๆ คนค่ะ

    my blog post โบนัสคาสิโนออนไลน์ (http://www.cheaperseeker.com)

  • เชื่อมต่อ โลกแห่งการ ‘SlotXO’

    ‘SlotXO’ เป็นการสำรวจ โลกออนไลน์ที่เปิดกว้างให้กับผู้เล่นจำนวนมาก ด้วยความสะดวกและความปลอดภัยที่เหนือระดับ ผู้เล่นสามารถเข้าเล่น เกมสล็อตออนไลน์ได้ทุกที่ทุกเวลา โดยเพียงแค่มีอุปกรณ์ที่เชื่อมต่ออินเทอร์เน็ต ไม่ว่าจะเป็นสมาร์ทโฟน แท็บเล็ต หรือคอมพิวเตอร์ก็ตาม

    ‘SlotXO’ จัดหา เกมสล็อตที่หลากหลายและน่าตื่นเต้น ด้วยกราฟิกและเอฟเฟกต์เสียงที่สมจริง ผู้เล่นจะได้เพลิดเพลิน กับประสบการณ์การเล่นเกมที่เหมือนจริงเสมือนอยู่ในบ่อนคาสิโนจริง ๆ นอกจากนี้ยังมีโบนัสและรางวัลมากมายให้ผู้เล่นได้เข้าถึง
    ซึ่งจะทำให้การเล่นเกิดความตื่นเต้นและสนุกสนานยิ่งขึ้น

    ด้วยการดูแล ความปลอดภัยที่เข้มงวด ‘SlotXO’ ยังมีระบบการทำการซื้อขาย ที่ปลอดภัยและเชื่อถือได้ ผู้เล่นสามารถโอน เงินได้อย่างสะดวก รวดเร็ว และปลอดภัย นับเป็นการเปิดโอกาส ให้ผู้เล่นได้ทดลอง กับประสบการณ์การเล่นเกมสล็อตออนไลน์ที่ดีที่สุด

    ในภาพรวม ‘SlotXO’ เป็นศูนย์กลาง
    ที่น่าสนใจสำหรับผู้ที่หลงใหล การเล่นเกมสล็อตออนไลน์ ด้วยความหลากหลาย ของเกม ความเชื่อถือได้ และตอบแทน ในการได้รับรางวัล ซึ่งจะทำให้ผู้เล่นได้รับความประติมากรรม ในการเล่นเกมอย่างแน่นอน

    my blog post โบนัสคาสิโน

  • เรียกเช็ค ข้อมูลสถิติ การเล่น คาสิโนออนไลน์
    CMD-368 และพบกับ ประสบการณ์ที่ยอดเยี่ยม ที่ได้จากคาสิโนชั้นนำของเว็บไซต์ cmd 368 เพื่อให้คุณได้เพลิดเพลินกับการเล่นคาสิโนที่มีผู้เข้าชมมากที่สุดและรับรองความปลอดภัย ร่วมท้าทายโชคชะตารุ่งเรืองและได้กลมกลืนกับประสบการณ์คาสิโนที่ไม่ว่าจะเป็นผู้เล่นใหม่หรือผู้เล่นมืออาชีพ.

    Feel free to visit my webpage เว็บคาสิโนออนไลน์ที่มีเกมให้เลือกเล่นมากที่สุด (lhcathome.cern.ch)

  • The Dog House Dice Show — это эффектный и красочный игровой
    автомат с тематикой псов, кой погрузит вас
    в атмосферу веселья и азарта.
    Слот оснащен 5 барабанами и 20 линиями выплат,
    а также разнообразными символами, включая изображения собак различных пород.
    Скачайте The Dog House Dice Show на свое конструкция и наслаждайтесь игрой в любое удобное для
    вас период. У вас вечно будет доступ к вашему любимому слоту,
    даже без интернета. The Dog House Dice Show
    наигрывать на деньги В The Dog House Dice Show предусмотрены
    увлекательные бонусные игры, которые приносят дополнительные
    выигрыши и повышают азарт игры.
    Соберите комбинацию бонусных символов, дабы активировать эти режимы и получить шанс на крупные выплаты.
    The Dog House Dice Show представлять
    на деньги

  • สวัสดี นั่น! ผม เมื่อเร็วๆ
    นี้ ได้พบกับโพสต์บล็อกของคุณ เกี่ยวกับ DG Cassino และ Dream Gaming,
    และผมต้องบอกว่ามันเป็น ข้อมูลที่เป็นประโยชน์

    การศึกษาข้อมูลเพิ่มขึ้น เพิ่ม{ถ้าไม่ใช่ไม่ได้ }สำหรับ โลกของคาสิโนออนไลน์และแพลตฟอร์มการเล่น เป็นสิ่งที่ ดึงดูด

    ผมพบ{ข้อมูลที่น่าสนใจ}เกี่ยวกับ DG คาสิโนการพนัน จากการอธิบายของคุณ ดูเหมือนว่าพวกเขามีประสบการณ์การพนันที่ดีและส่งมอบได้
    เรียบร้อยด้วยแพลตฟอร์มที่ใช้งานง่าย

    การผสาน Dream Gaming เข้ากับแพลตฟอร์มของพวกรวดเข้าไปให้ เพิ่มความตื่นเต้น
    ให้กับ{ผู้ที่ชื่นชอบ / ปัจจัย/ผู้ที่ชืินชอบ/ผู้ถือคุณสำคัญ}ให้{ผู้ที่ชื่นชอบ / เกี่ยวกับ}การเล่น

    ผมรู้สึก{ชื่นชม/เคารพ}ในวิธีที่คุณได้ไล่ระบุ คุณสอดคล้องกับ{แต่ละ / เป็นตัวเอง / เป็นเอกลักษณ์ / ไม่มีใครที่จะเหมือน} ข้อมูลสำหรับ DG คาสิโนการพนัน เช่น เกมผู้แจกไพ่สดและความเข้ากันได้ที่ยืดหยุ่นในการใช้งานบนมือถือ/แพลตฟอร์มโทรศัพท์เคลื่อนที่/Mobile
    River/Mobile

    ข้อมูลที่ถูกกระชับของคุณเกี่ยวกับการ{ป้องกัน/ป้องกัน/ป้องกัน}ข้อมูลโดย DG คาสิโนการพนัน ผ่านมาตามว่าบังคับ

    โดยรวมแล้ว, โพสต์บล็อกของคุณได้ให้ข้อมูลที่มีคุณค่า เกี่ยวกับ
    DG คาสิโนการพนัน และ
    Dream Gaming เข้าถึงผมอยากรู้

    my web page … การพนันคาสิโนออนไลน์

  • Direct web slots, PG SLOT, big break, no minimum, providing the number 1 slot game service, receive unlimited bonuses, True Wallet, not through an agent. Direct website of major camps The newest slot website, breaks often 2024.
    ⭐️✨

    สล็อต 66

  • Asking questions are truly fastidious thing if you are not understanding anything totally, except this post provides
    pleasant understanding even.

  • For most recent news you have to pay a quick visit world-wide-web and on internet I found this website
    as a finest site for most recent updates.

  • ยินดีต้อนรับเข้าไปสู่บริษัท Cicon Interiorซึ่งให้บริการช่างตกแต่งภายในครบวงจรในสไตล์ที่ไม่ซ้ำใคร ด้วยความพิถีพิถันและมีคุณภาพสูง หากคุณกำลังมองหาบริการเฟอร์นิเจอร์ชิ้นในอาคารที่จะสร้างความประทับใจให้กับบ้าน คอนโดหรือออฟฟิศของคุณ บริษัท Cicon Interior ที่คุณสามารถพูดคุยและให้คำปรึกษาเกี่ยวกับการสร้างเอกลักษณ์และความเป็นตัวคุณของการออกแบบบิ้วอินที่คุณต้องการ
    ด้วยประสบการณ์และความเชี่ยวชาญของทีมงานที่มีคุณภาพ คุณจะได้รับการดูแลอย่างใกล้ชิดและครอบคลุมทุกขั้นตอนของงานบิ้วอิน จนถึงการ
    built inเสร็จสิ้น กับ Cicon Interior คุณจะได้รับผลลัพธ์ เฟอร์นิเจอร์ชิ้นในอาคารที่มีคุณภาพทั้งมีการออกแบบที่ดี และความทนทาน และการบริการสูงที่จะเป็นประโยชน์ต่อคุณในระยะยาว.

    My blog :: บิ้วอิน ตู้เสื้อผ้า

  • Los casinos de criptomonedas son portales de apuestas en línea que permiten a los jugadores realizar apuestas utilizando divisas virtuales como Ethereum, Bitcoin o
    Litecoin. Estas innovadoras plataformas están aumentando su atractivo en el
    mercado español y otros países de habla hispana debido a varias ventajas que ofrecen.
    Una de las características más atractivas de los criptocasinos es la accesibilidad.

    Por ejemplo, algunos sitios permiten a los usuarios acceder o crear una cuenta de forma ágil utilizando sus datos de Google.
    Además, muchos criptocasinos son compatibles con VPN, lo que proporciona una
    protección extra de confidencialidad y seguridad para
    los jugadores.
    Los criptocasinos suelen ofrecer una gran diversidad de opciones de juego, incluyendo
    slots y otros opciones de juego tradicionales. La agilidad es otro factor importante, ya que estos sitios generalmente son veloces tanto en la
    navegación como en la ejecución de los juegos.
    En cuanto a los incentivos y ofertas, los criptocasinos en el mercado hispano ofrecen tentadores incentivos para captar a nuevos jugadores.
    Por ejemplo, algunos casinos ofrecen recompensas de hasta 5000 dólares y aseguran retiros veloces.

    Un aspecto importante a considerar es la política KYC
    (Know Your Customer). Algunos criptocasinos funcionan sin requisitos KYC, lo que significa que
    los usuarios pueden participar y realizar transacciones
    sin necesidad de proporcionar datos personales exhaustivos.
    Sin embargo, es importante tener en cuenta que la falta de KYC puede suponer riesgos en términos de seguridad y cumplimiento normativo.

    El crecimiento de los criptocasinos ha sido considerable.
    Por ejemplo, Lucky Block, una plataforma de criptocasino, alcanzó posicionarse como referente en el sector en solo seis meses, alcanzando 200.000
    usuarios activos.
    En resumen, los criptocasinos ofrecen una alternativa de apuestas vanguardista y potencialmente más confidencial para los apostadores españoles y
    de otros países hispanohablantes, combinando la adrenalina de los juegos de casino tradicionales con las beneficios de las criptomonedas.

  • Casinocờ trò chơi tiền ảo crypto casino trong Tiếng
    Việt cho 60 từ Bàn tiền điện tử crypto casino
    là nền tảng bàn cuộc vui trực tuyến sử dụng tiền ảo như
    Bitcoin Ethereum để giao dịch Người chơi có thể đặt
    cược chơi các trò cuộc vui như poker blackjack slots
    mà không cần tiết lộ thông tin cá nhân Crypto casino mang lại sự an toàn tốc độ giao dịch nhanh chóng bảo mật cao và minh bạch

  • เกมคาสิโน ‘Joker Slot Game’

    ‘Joker Slot Game’ คือ เกมคาสิโนออนไลน์ ที่หวังจะ การสนใจ
    อย่างมากมาย ในปัจจุบัน เกมตัวนี้ มีเสน่ห์ ที่มากมาย และหวังจะ การติดตาม จากทั่วโลก

    เริ่มต้น จากการจัดทำ ที่ดึงดูดใจ
    และสร้างความประทับใจ โดยมี ภาพประกอบ และรูปสัญลักษณ์
    ที่เกี่ยวเนื่อง กับตัวละครหลัก โจ๊กเกอร์ ที่ เป็นที่รู้จัก กันดี ในวงการภาพยนตร์ นอกจากนี้ ยังมี เสียง
    ที่ช่วย ให้ผู้เล่น ได้สัมผัส เย่อหยิ่งเหมือน กำลังอยู่ใน บรรยากาศ ของตัวละคร โจ๊กเกอร์ผู้บ้าคลั่ง

    ด้านการ โครงสร้างการเล่น ของ ‘Joker
    Slot Game’ ก็ น่าสนใจเช่นกัน ทั้งยัง โครงสร้างการเล่น
    ที่ง่ายต่อการเข้าใจ และเล่น ได้ง่าย คนเล่น ก็สามารถ เพลิดเพลินกับกา
    กิจกรรมเล่นเกม และทุ่มเท ค้นหาเส้นทาง รางวัลการเงิน ซึ่งมี มากมายหลาก ช่องทาง
    ไม่ว่าจะเป็นการจ่ายเงินรางวัล ที่แน่นอน และการจ่ายเงินรางวัล แบบสุ่ม ที่ช่วยเพิ่ม ความตื่นเต้น ให้กับผู้ใช้งาน

    ยังมิได้หมดเพียงเท่านั้น ‘Joker
    Slot Game’ ยังคงมี ความสามารถ ที่โดดเด่น ที่น่าสนใจ เช่นเดียวกับ โบนัสพิเศษ ฟรีสปิน

    ยังมีประเด็นที่น่าสนใจอื่นๆ ด้วย ‘Joker Slot Game’ ยังมีสิ่งที่น่าสนใจ ที่น่าสนใจ ที่ช่วยเสริม ให้เกมตัวนี้ เข้าถึง ความนิยม อย่างกว้างขวาง จากกลุ่มผู้ใช้งาน เกมคาสิโนออนไลน์

    ในขณะเดียวกัน ‘Joker Slot Game’ ยังคงเป็น ข้อเสีย บางอย่าง อันเป็น อาจก่อให้เกิด ความสับสน
    ของ ผู้ใช้งาน บางส่วน ในบางกรณี

    อย่างไรก็ตาม ผู้เล่น ก็สามารถ ได้รับความเพลิดเพลิน อย่างเต็มประสิทธิภาพ
    และมี ความตื่นเต้น ในการ
    เล่น ‘Joker Slot Game’ ผู้พัฒนา ควรจะ แก้ไข ข้อบกพร่อง ที่เกี่ยวข้อง
    เพื่อที่จะให้ นักพนัน พร้อมที่จะ ได้รับความตื่นเต้น ไปกับ ‘Joker Slot Game’ ได้อย่างเต็มความสามารถ

  • В Кент казино уничтожать
    тьма-тьмущая игр, каждая из которых имеет свои правила.
    Однако, самостоятельно от выбранной игры, ключевыми моментами являются:
    2. Бонусы за депозиты: Казино Кент предлагает регулярные бонусы за депозиты.
    В зависимости от суммы депозита, игрок может получить дополнительные бонусные деньжонки на свой игровой счет.
    Выигрыш: если ваши ставки совпали с результатом, вы получаете выигрыш в соответствии с коэффициентами.
    Важно отметить, что регистрационный бонус не может быть выведен зараз после его получения.
    Обычно он подлежит отыгрышу, то наворачивать
    вам необходимо смастерить определенное число ставок на сумму бонуса, чтобы вывести любые выигрыши, полученные с
    его помощью. Точные условия отыгрыша бонуса указываются в правилах акции.

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

  • Saved as a favorite, I like your website!

  • We stumbled over here different web address and thought I might check things out.
    I like what I see so now i am following you. Look
    forward to looking over your web page for a second time.

  • เกมวงล้อ ‘Joker Slot Game’

    ‘Joker Slot Game’ เป็น เกมคาสิโน ที่ได้รับ ความชื่นชอบ อย่างมากมาย ในปัจจุบัน เกมตัวนี้ มี ที่ดึงดูด และหวังจะ การติดตาม จากผู้ติดตาม

    เริ่มต้น จากการวางแผน ที่สวยงาม และสร้างความตื่นเต้น
    ที่ประกอบด้วย ภาพ และสัญลักษณ์ ที่ปรากฏ กับตัวกลาง โจ๊กเกอร์ ที่ เป็นที่รู้จัก อย่างมาก ในวงการความบันเทิง นอกจากนี้ ด้วย เสียงประกอบ ประกอบ ให้คนดู รู้สึก เสมือน อยู่ใน ประวัติความเป็นมา ของตัวหลัก
    โจ๊กเกอร์

    เกี่ยวกับ รูปแบบการเล่น ของ ‘Joker Slot
    Game’ ก็ เป็นที่น่าสนใจ พร้อมกับ ระบบการเล่น ที่เรียบง่าย และทำความเข้าใจ อย่างรวดเร็ว ผู้เล่น จึงสามารถ เพลิดเพลินไปกับ การหมุนสล็อต และทุ่มเท
    ดำเนินตาม การจ่ายเงินรางวัล ที่มี มากมายหลาก ตัวเลือก ทั้งการจ่ายเงินรางวัล ที่ไม่เปลี่ยนแปลง และการจ่ายเงินรางวัล ที่ไม่แน่นอน ที่กระตุ้นให้เพิ่ม ความท้าทาย ให้กับผู้เข้าร่วม

    ยังมิได้หมดเพียงเท่านั้น ‘Joker Slot
    Game’ ยังคงมี คุณลักษณะ ที่น่าสนใจ ที่หลากหลาย อาทิ
    โบนัสต่างๆ การหมุนโดยไม่เสียค่าใช้จ่าย

    อีกทั้ง ‘Joker Slot Game’ ยังมีข้อได้เปรียบ
    หลายประการ ที่ส่งเสริม ให้เกมนี้ มี การติดตาม มากยิ่งขึ้น จากกลุ่มผู้ติดตาม สล็อตออนไลน์

    แม้ว่า ‘Joker Slot Game’ ยังมีอยู่ ข้อจำกัด บางประการ ซึ่ง ควรจะ
    ความสับสน ต่อ บุคคลทั่วไป บางคน ในบางกรณี

    ดังนั้นจึง ผู้เล่น พร้อมที่จะ เพลิดเพลิน อย่างเต็มความสามารถ และมี ความเพลิดเพลิน ในการ ทดลองใช้ ‘Joker Slot Game’ ผู้ดูแล อาจจะต้อง ปรับใช้ ข้อด้อย ที่ถูกระบุ เพื่อ ผู้ติดตาม ย่อมสามารถ ได้รับความเพลิดเพลิน ระหว่าง
    ‘Joker Slot Game’ ได้อย่างเต็มศักยภาพ

    Feel free to visit my web-site; เล่นคาสิโนออนไลน์ได้เงินจริง
    (atavi.com)

  • Be grateful for Your Comment!

    I’m Elated you Encountered the Entry Valuable.

    If you’re Intrigued by Delving into more Choices in the online Punting Space, I’d Advise Delving into CMD368.

    They Provide a Extensive selection of Stimulating
    Sports Opportunities, Livestream, and a Intuitive Interface.

    What I Truly Prefer about CMD368 is their Focus to
    Responsible Punting. They have Reliable Policies and Features to Enable Customers Exercise control.

    Whether you’re a Veteran Enthusiast or Untrained in the Bookmaking, I Reckon you’d Genuinely Savor the
    Venture.

    Please Become a member By way of the URL and
    Get in touch if you have More Queries.

    My page :: online casino singapore (http://www.metooo.es)

  • ชื่อเรื่อง: ความรู้เกี่ยวกับ ‘PPSLOT’ และข้อควรระวัง

    แทนถึง คำศัพท์ที่มีความหมายเฉพาะในวงการ
    ตลาด เกมและคาสิโนออนไลน์ คำนี้มักถูก กล่าวใช้ เป็นคำย่อสำหรับ การจัดการ เกมคาสิโนออนไลน์ที่รวมถึง การริเริ่ม และ การเก่ง เกม

    ‘PPSLOT’ กล่าวถึง เกม คาสิโนออนไลน์ที่มี ความพิเศษ
    และ เป็นที่พึงพอใจ อย่างมาก ที่ ผู้เล่นสามารถ ทำกิจกรรม
    และ สร้างสรรค์ ได้โดยง่าย ผ่านทางอุปกรณ์อิเล็กทรอนิกส์ต่างๆ เช่น อุปกรณ์พกพา

    ‘PPSLOT’ ได้รับ ความเป็นที่ยอมรับ
    เป็นอย่างมาก เนื่องจาก การพักผ่อน เกมผ่านระบบ โทรศัพท์มือถือ ที่มี ความน่าเชื่อถือ และ ทำให้ผู้เล่น
    เข้าใช้ ได้จากทุกที่ทุกเวลา

    นอกจากนี้ ‘PPSLOT’ ประกอบด้วย กระบวนการ การปฏิบัติการ
    ที่มี ความครบถ้วน มี กิจกรรมเกม ที่ น่าสนใจ ให้ เพลิดเพลิน และ เพิ่มเติมด้วย กระบวนการ
    ป้องกันความปลอดภัย ที่ ก้าวหน้า

    อย่างไรก็ตาม การทำกิจกรรม ‘PPSLOT’
    ควรต้อง กระทำด้วย ความพินิจพิจารณา และ จัดการ ตนเองให้อยู่ในระดับที่ พอดี
    โดยมีวัตถุประสงค์เพื่อ
    หลีกเลี่ยง ความเสียหาย ที่ อาจนำไปสู่ ขึ้นทั้งในด้าน จริยธรรม

    โดย ผู้มีส่วนร่วม ‘PPSLOT’
    ดังนั้นจึงเป็นสิ่งที่ ให้ความระมัดระวัง อย่างมาก ที่ การทำ ‘PPSLOT’
    อย่างระมัดระวัง จะ
    ส่งผลให้ การ พักผ่อน
    ได้อย่าง ปลอดภัย การตระหนักถึง ความอันตราย
    ที่ อาจก่อให้เกิด ขึ้นจาก การใช้ ‘PPSLOT’ เป็นเรื่องที่ คนที่เล่น ต้อง ให้ ความเอาใจใส่ เป็นอย่างมาก

    นอกจากนี้ ผู้เล่น ‘PPSLOT’ จำเป็น
    ศึกษา นโยบาย ที่ มีส่วนเกี่ยวข้อง กับ
    การเล่น ‘PPSLOT’ อย่างถ่องแท้ ทั้งนี้เพื่อ สามารถจะ มีส่วนร่วม ได้อย่าง เหมาะสม และ หลีกเลี่ยงการเกิด
    ความเดือดร้อน ใดๆ ขึ้น

    การ ทำกิจกรรม ‘PPSLOT’ อย่าง ชาญฉลาด
    และ ตรวจสอบ ตนเองให้อยู่ในระดับที่เหมาะสม จะช่วยให้ การพักผ่อน ได้อย่าง ไม่ส่งผลกระทบ มากยิ่งขึ้น

    Take a look at my website — คาสิโนออนไลน์ที่ถูกกฎหมาย

  • Hey this is kind of of off topic but I was wondering if blogs use WYSIWYG
    editors or if you have to manually code with HTML.
    I’m starting a blog soon but have no coding experience so I wanted
    to get guidance from someone with experience.
    Any help would be greatly appreciated!

  • After looking into a few of the blog articles on your web page, I honestly like your way of writing a blog.
    I added it to my bookmark webpage list and will be checking back in the
    near future. Please check out my web site too and let me know your opinion.

  • When I initially commented I clicked the «Notify me when new comments are added» checkbox and now
    each time a comment is added I get four emails with the same comment.
    Is there any way you can remove me from that service?

    Appreciate it!

  • I am extremely impressed with your writing skills and also
    with the layout on your weblog. Is this a paid theme or did
    you modify it yourself? Anyway keep up the excellent quality writing, it is rare to see a
    nice blog like this one today.

  • Hi there, always i used to check website posts here early in the morning, because i love to gain knowledge of more and more.

  • Wow! At last I got a website from where I know how to actually obtain valuable facts regarding my study and knowledge.

  • Hi there, its good article on the topic of media print, we all know
    media is a fantastic source of data.

  • Hi mates, its wonderful piece of writing concerning teachingand fully explained, keep it
    up all the time.

  • Fantastic beat ! I would like to apprentice whilst you amend your website, how could i subscribe for a blog web site?

    The account aided me a acceptable deal. I had been a little bit acquainted of
    this your broadcast offered vivid clear idea

  • Hello There. I discovered your blog using msn. This is a
    very smartly written article. I’ll be sure to bookmark it
    and come back to learn more of your helpful info.
    Thank you for the post. I’ll definitely return.

  • I all the time used to study article in news papers but now as I am a user of net therefore
    from now I am using net for content, thanks to web.

  • I know this website gives quality dependent articles and extra information, is there any other website which provides such information in quality?

  • We stumbled over here different website and thought I might check things out.
    I like what I see so now i am following you. Look forward to
    looking at your web page yet again.

  • Hi to every one, the contents existing at this web site are actually remarkable
    for people experience, well, keep up the good work fellows.

  • Thanks. Quite a lot of postings.

  • It’s an remarkable post in support of all the online users; they will
    take benefit from it I am sure.

  • ชื่อเรื่อง: ความรู้เกี่ยวกับ ‘PPSLOT’ และข้อควรระวัง

    คือ คำศัพท์ที่มีความหมายเฉพาะในวงการ
    ตลาด เกมและคาสิโนออนไลน์ คำนี้มักถูกใช้ เป็นคำย่อสำหรับ การให้บริการ เกมคาสิโนออนไลน์ที่รวมถึง การทำกิจกรรม และ การเข้าร่วม
    เกม

    ‘PPSLOT’ สะท้อนถึง เกมคาสิโนออนไลน์ คาสิโนออนไลน์ที่มี
    ความเป็นเอกลักษณ์ และ เป็นที่พึงพอใจ อย่างมาก ซึ่ง
    ผู้เล่นสามารถ สนุกสนาน และ ร่วม ได้โดยง่าย ผ่านทางอุปกรณ์อิเล็กทรอนิกส์ต่างๆ เช่น อุปกรณ์พกพา

    ‘PPSLOT’ มีความ ความเป็นที่ยอมรับ เป็นอย่างมาก
    ซึ่ง การเล่น เกมผ่านระบบ คอมพิวเตอร์
    ที่มี ความรวดเร็ว และ อำนวยความสะดวกให้ผู้เล่น
    สนุกสนาน ได้จากทุกที่ทุกเวลา

    นอกจากนี้ ‘PPSLOT’ มีลักษณะ
    องค์ประกอบ การปฏิบัติการ
    ที่มี มาตรฐาน มี กิจกรรมเกม ที่ น่าสนใจ
    ให้ เพลิดเพลิน และ ประกอบกับ
    กลไก เสริมความปลอดภัย ที่ มีประสิทธิภาพ

    อย่างไรก็ตาม การพักผ่อน
    ‘PPSLOT’ พึงกระทำ กระทำด้วย ความระมัดระวัง และ จัดการ ตนเองให้อยู่ในระดับที่
    เหมาะกับตน โดยมีวัตถุประสงค์เพื่อ หลีกเลี่ยงปัญหา
    ที่ อาจส่งผลให้เกิด ขึ้นทั้งในด้าน จริยธรรม

    โดยผู้เล่น ‘PPSLOT’ ดังนั้นแล้ว
    ให้ความใส่ใจ อย่างมาก ซึ่ง
    การใช้ ‘PPSLOT’ อย่างเหมาะสม จะ นำไปสู่ การ พักผ่อน ได้อย่างเหมาะสม การตระหนักถึง ผลกระทบ ที่ อาจนำไปสู่ ขึ้นจาก การทำกิจกรรม ‘PPSLOT’ เป็นเรื่องที่ คนที่เล่น ต้อง
    ให้ ความระมัดระวัง เป็นอย่างมาก

    นอกจากนี้ ผู้เล่น ‘PPSLOT’ จำเป็น
    เรียนรู้ แนวทาง ที่ สัมพันธ์ กับ
    การใช้งาน ‘PPSLOT’ อย่างถ่องแท้ ทั้งนี้เพื่อ
    สามารถจึง ดำเนินการ ได้อย่าง ตามข้อบังคับ และมิก่อให้เกิด ความยุ่งยาก
    ใดๆ ขึ้น

    การ สร้างความสนุก ‘PPSLOT’ อย่าง
    ฉับไว และ จัดการ ตนเองให้อยู่ในระดับที่ สมควร จะ เป็นส่วนหนึ่งของ
    การทำกิจกรรม ได้อย่าง ได้ประโยชน์ มากยิ่งขึ้น

    my webpage :: สล็อตpp

  • This piece of writing is really a nice one it assists new web visitors,
    who are wishing for blogging.

  • Well expressed genuinely. !

  • Amazing a lot of valuable knowledge.

  • ไมโครเกมมิ่ง (Microgaming)
    เป็นบริษัทผู้พัฒนาซอฟต์แวร์เกมที่มีชื่อเสียงในวงการคาสิโนออนไลน์ ไมโครเกมมิ่ง (Micro Gaming) ได้สร้างเกมคาสิโนที่ได้รับความนิยมอย่างแพร่หลาย เช่น เกมสล็อต รูเล็ต และบาคาร่า
    ไมโครเกมมิ่ง (Microgaming) เป็นบริษัทที่มีความเชี่ยวชาญในการสร้างเกมส์ที่มีกราฟิกสวยงาม และคุณภาพเสียงที่ดี ถ้าคุณกำลังมองหาประสบการณ์การเล่นคาสิโนที่สนุกและมีคุณภาพ
    ไมโครเกมมิ่ง (Microgaming) คือตัวเลือกที่ดีที่สุด!

    Here is my homepage :: คาสิโนออนไลน์ถูกกฎหมาย

  • Completed Reading a Blog Post: A Formal Contribution to the Comment
    Section and an Invitation to Join «KING855»

    ‘After thoroughly perusing the blog post, I would like to
    deliver the following feedback to the forum.

    Your viewpoints concerning the theme were quite mind-expanding .
    I was in alignment with a number of the assertions you
    mentioned .

    It is heartening to see such an lively discussion taking place .

    If you are inclined in deeper delving into this issue ,
    I would warmly encourage you to participate in the
    «KING855» community . There , you will have the opportunity to engage with
    kindred spirit members and delve deeper into these intriguing subjects.

    I am confident your involvement would be a meaningful enhancement
    to the dialogue.

    Thank you contribution , and I anticipate the possibility of continuing this stimulating dialogue .

    Review my blog post — online casino e-wallets

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

  • Kindly fellow observer ,

    I encountered the thoughts shared in this blog post to be
    exceptionally enlightening . The writer’s mastery of the content is genuinely
    commendable.

    If you are desiring a exhilarating and profitable internet-based gaming
    escapade , I would gladly appeal to you to investigate
    the choices of VIVARO CASINO.

    With its vast collection of captivating pastimes , lavish perks
    , and efficient layout, VIVARO CASINO bestows an unrivaled
    amusement environment that serves both rookie and seasoned devotees equally
    .

    I exhort you to check out VIVARO CASINO and uncover
    the thrill that is ready to be experienced you.
    I am sure you will deem the venture to be incredibly
    delightful .

    Kindest wishes

    My web-site … online casino accessibility

  • إخلاص لك على هذا المدخل المثير للاهتمام للاهتمام كان من المثير للاهتمام
    حقًا قراءة رأيك حول هذا الموضوع أود أن أدعوك إلى
    الانضمام إلى كازينو التشفير لمزيد من المناقشات و التواصل المثمرة هناك الكثير من الفرص للتواصل مع أشخاص آخرين
    مهتمين بهذا الموضوع وتبادل الأفكار أتطلع إلى
    سماع آرائك وآرائك الأخرى
    في المستقبل

  • I do not even know how I ended up here, but I thought this post
    was good. I don’t know who you are but certainly you are going to a famous
    blogger if you aren’t already 😉 Cheers!

  • Hello to every body, it’s my first go to see of this web
    site; this blog includes awesome and genuinely excellent information for readers.

  • My family all the time say that I am wasting my time here
    at net, except I know I am getting knowledge everyday by reading
    thes good posts.

  • O universo dos cassinos com moedas digitais está em crescimento constante, oferecendo uma
    variedade de opções para apostadores lusófonos. Desde jogos com Bitcoin até jogos de azar online em português, há
    alternativas para diversos perfis. Os aficionados podem aproveitar de clássicos como roleta crypto e blackjack usando moedas digitais, ou
    apostar em slots com pagamento em criptomoedas. Para os entusiastas de apostas esportivas, as apostas esportivas com Ethereum são uma
    opção atraente. Os cassinos Bitcoin em português não apenas oferecem uma diversão garantida, mas também atraem jogadores com generosos bônus de cassino em criptomoedas.
    E para aqueles que são fãs de poker, o poker na internet usando crypto está se tornando cada vez mais
    popular. Com tantas opções disponíveis, o porvir das
    apostas digitais em crypto parece promissor para a comunidade de língua portuguesa.

  • O cenário dos cassinos com moedas digitais está
    em constante evolução, oferecendo uma variedade de opções para jogadores portugueses.
    Desde apostas usando criptomoedas até jogos de azar online em
    português, há opções para todos os tipos de jogadores.
    Os entusiastas podem desfrutar de clássicos como roleta usando moedas digitais e 21
    com criptomoedas, ou arriscar-se em caça-níqueis com
    prêmios em crypto. Para os amantes de esportes, as apostas esportivas com Ethereum são uma opção emocionante.
    Os cassinos Bitcoin em português não apenas
    oferecem uma diversão garantida, mas também chamam a atenção com atrativos bônus em
    moedas digitais. E para aqueles que gostam de jogos
    de cartas, o poker na internet usando crypto está
    se tornando extremamente procurado. Com tantas opções disponíveis, o horizonte do gambling
    online com moedas digitais parece brilhante para a
    comunidade lusófona.

  • Thank you for every other informative site.
    The place else could I get that type of info written in such a perfect manner?
    I’ve a undertaking that I am simply now working on, and
    I have been on the look out for such information.

  • Sotheast Financial Nashville
    131 Belle Forestt Cir #210,
    Nashville, TN 37221, United Ꮪtates
    18669008949
    Southeast Financial management data

  • Commercial Loan Interest Rates — Why So Very High?

    소액 대출 (http://maryclare.com/)

  • It is truly a great and helpful piece of info. I am happy that you simply
    shared this helpful information with us. Please stay us up to date like this.
    Thanks for sharing.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *