проблемы с модулями nRF24L01+
- Войдите на сайт для отправки комментариев
Добрый день
Прошу помощи у сообщества. в зимнюю пору начал реализовывать проект по автоматизации теплиц, представлял себе это в виде 3х контроллеров, 2 в теплицах - управляют форточками, поливом, и рапортуют о своем состоянии на 3й контроллер, который уже, посредством СМС докладывается мне о происшевствиях. Частично данный проект был реализован - контроллеры теплиц хлопают форточками, и шлют данные на 3й контроллер. затык в обратной связи - посредством кнопок на 3м контроллере я планировал запускать необходимые функции на контроллерах теплиц, но не выходит каменный цветок(
фрагмент кода с контроллера теплиц, собран на основе ардуино мега
#include "nRF24L01.h" // библиотека радиомодуля
#include "RF24.h" // ещё библиотека радиомодуля
RF24 radio(24, 26); // CE, CSN
void setup(void)
{ radio.setPayloadSize(32); //размер пакета, в байтах
radio.openReadingPipe(1, address[1]); //хотим слушать трубу 1
radio.setChannel(0x60); //выбираем канал (в котором нет шумов!)
radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
//должна быть одинакова на приёмнике и передатчике!
//при самой низкой скорости имеем самую высокую чувствительность и дальность!!
radio.powerUp(); //начать работу
radio.startListening(); //начинаем слушать эфир, мы приёмный модуль
}
void Transmit()
{
lastTransmit = ((time.Hours * 60) + time.minutes);
//заполняем массив для передачи
teplData[0] = tempDS18B20, 0; // температура по DS
teplData[1] = tempDHT22, 0; // температура по DH
teplData[2] = DHT22.hum, 0; // влажность по DH
teplData[3] = i; // следующий полив
teplData[4] = doorOpen; // состояние двери
teplData[5] = StateWindows; // состояние окон
radio.stopListening(); //останавливаем прослушку эфира, мы передающий модуль
radio.openWritingPipe(address[1]); //мы - труба 1, открываем канал для передачи данных
radio.write(&teplData, sizeof(teplData)); // отправляем данные и указываем сколько байт пакет
radio.startListening(); //начинаем слушать эфир, мы приёмный модуль
}
void Resive()
{
Serial.println(radio.available());
if (radio.available()) // проверяем не пришло ли чего в буфер.
{
radio.read(&reciveData, sizeof(reciveData));
}
if (reciveData == 1)
{
Transmit();
}
if (reciveData == 2)
{
open_window();
}
if (reciveData == 3)
{
close_window();
}
if (reciveData == 4)
{
poliv();
}
reciveData = 0;
}
void loop()
{ if ((((time.Hours * 60) + time.minutes) - lastTransmit) > 10)
{
Transmit(); //передача данных на основной контроллер
}
Resive(); //прием данных с основного контроллера
}
фрагмент кода с 3его контроллера, собран на ардуино уно
#include "nRF24L01.h"
#include "RF24.h"
RF24 radio(9, 10); // CE, CSN
void setup() {
radio.begin();
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openReadingPipe(1, address[1]); //хотим слушать трубу 1
radio.openReadingPipe(2, address[2]); //хотим слушать трубу 2
radio.setChannel(0x60); //выбираем канал (в котором нет шумов!)
radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
//должна быть одинакова на приёмнике и передатчике!
//при самой низкой скорости имеем самую высокую чувствительность и дальность!!
radio.powerUp(); //начать работу
radio.startListening(); //начинаем слушать эфир, мы приёмный модуль
}
float Transmit(byte tepl)
{
if (tepl == 1)
{
radio.stopListening(); //останавливаем прослушку эфира, мы передающий модуль
radio.openWritingPipe(address[1]); //мы - труба 1, открываем канал для передачи данных
radio.write(&transmitData, sizeof(transmitData)); // отправить по радио
radio.startListening(); //начинаем слушать эфир, мы приёмный модуль
transmitData = 0;
}
if (tepl == 2)
{
radio.stopListening(); //останавливаем прослушку эфира, мы передающий модуль
radio.openWritingPipe(address[2]); //мы - труба 2, открываем канал для передачи данных
radio.write(&transmitData, sizeof(transmitData)); // отправить по радио
radio.startListening(); //начинаем слушать эфир, мы приёмный модуль
transmitData = 0;
}
}
void loop()
{
if (radio.available(&pipe)) // проверяем не пришло ли чего в буфер.
{
Serial.println("211");
if (pipe == 1)
{
radio.read(&teplData1, sizeof(teplData1));
lcdData();
lastUpdateTepl1 = ((time.Hours * 60) + time.minutes);
lcd1.setCursor(11, 1);
lcd1.print(time.gettime("H:i")); // выводим время получения данных
}
if (pipe == 2)
{
radio.read(&teplData2, sizeof(teplData2));
lcdData();
lastUpdateTepl2 = ((time.Hours * 60) + time.minutes);
lcd2.setCursor(11, 1);
lcd2.print(time.gettime("H:i")); // выводим время получения данных
}
}
if ((((time.Hours * 60) + time.minutes) - lastUpdateTepl1) > 15) //если нет данных с теплицы более 15 мин - отправляем запрос
{
lastUpdateTepl1 = ((time.Hours * 60) + time.minutes-5);
transmitData = 1;
Transmit(1);
}
if ((((time.Hours * 60) + time.minutes) - lastUpdateTepl2) > 15) //если нет данных с теплицы более 15 мин - отправляем запрос
{
lastUpdateTepl2 = ((time.Hours * 60) + time.minutes-5);
transmitData = 1;
Transmit(2);
}
}
как резюме моего вопроса - от меги на уно пакеты приходят, обратно - нет, укажите пжа возможную проблему.
проблема по железу была
спасла намотка волшебной проволочки на антену модуля НРФ
Покупайте качественные НРФки. Даже с усилителем и антенной некачественные работают плохо
проблема по железу была
спасла намотка волшебной проволочки на антену модуля НРФ
Что-то у меня намотка пролоки не сказывается никак - модули больше чем на 5-7 м не работают
брал в магазине греатвалл, по ссылке алексгвера
брал в магазине греатвалл, по ссылке алексгвера
провод наматал бездумно, кусок что под руку попался
дальность не проверял, придет весна - покажет - пробьет ли 15м и 2 кирпичных стены