очень нужна помощь в прошивки nrf24l01

maks665
Offline
Зарегистрирован: 30.05.2019

очень нужна помощь в прошивки. У меня есть два модуль nrf24l01 и две реле, хочу сделать так, при нажатии на кнопку одно реле открылось и при отпускании кнопки реле закрылось, это у меня получилось но вторая кнопка должна работать так, при нажатии и отпускании кнопки второе реле должно открыться и при нажатии и отпускании кнопки реле должно закрыться. Помогите пожалуйста 

это передатчик тут я изголялся как мог мне получается надо сделать на кнопку флажок но не фига не получается 

#include <SPI.h>

#include "nRF24L01.h"
#include "RF24.h"
 
RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги
 
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
 
byte button = 6;
byte button1 = 3;  // кнопка на 3 цифровом
byte potent = 0; // потенциометр на 0 аналоговом
byte slider = 1; // движковый потенциометр на 1 аналоговом пине
 
byte transmit_data[4]; // массив, хранящий передаваемые данные
byte latest_data[4]; // массив, хранящий последние переданные данные
boolean flag; // флажок отправки данных
 
 
 
void setup() {
 
  pinMode(3, INPUT); // настроить пин кнопки
  
  pinMode(6, INPUT);
 Serial.begin(9600);
  
  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах
 
  radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
  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.stopListening();  //не слушаем радиоэфир, мы передатчик
}
 
void loop() {
 
  
  transmit_data[0] = digitalRead(3); // инвертированный (!) сигнал с кнопки
 
  transmit_data[1] = digitalRead(6);
 
 
  transmit_data[2] = map(analogRead(potent), 0, 1023, 0, 180); // получить значение
  // в диапазоне 0..1023, перевести в 0..180, и записать на 1 место в массиве
  transmit_data[3] = map(analogRead(slider), 0, 1023, 0, 255);
 
 
 
 
 
  for (int i = 0; i < 3; i++) { // в цикле от 0 до числа каналов
    if (transmit_data[i] != latest_data[i]) { // если есть изменения в transmit_data
      flag = 1; // поднять флаг отправки по радио
      latest_data[i] = transmit_data[i]; // запомнить последнее изменение
    }
  }
 
  if (flag == 1) {
    radio.powerUp(); // включить передатчик
    radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио
    flag = 0; //опустить флаг
    radio.powerDown(); // выключить передатчик
  }
 
}
 
 
это приемник  
 
 
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h>
 
RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги
 
byte recieved_data[4]; // массив принятых данных
byte relay = 2;
byte relay1 = 6;
byte servo = 7;
byte mosfet = 5;
Servo myservo;
 
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
 
void setup() {
  Serial.begin(9600); //открываем порт для связи с ПК
 
  pinMode(2, OUTPUT); // настроить пин реле как выход
  pinMode(6, OUTPUT);
  pinMode(mosfet, OUTPUT); // настроить пин мосфета как выход
 
  myservo.attach(servo);
 
  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах
 
  radio.openReadingPipe(1, address[0]);     //хотим слушать трубу 0
  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 loop() {
  byte pipeNo;
  while ( radio.available(&pipeNo)) {  // слушаем эфир со всех труб
    radio.read( &recieved_data, sizeof(recieved_data) );         // чиатем входящий сигнал
    digitalWrite(2, recieved_data[0]); // подать на реле сигнал с 0 места массива
    
    digitalWrite(6, recieved_data[1]);
    
    myservo.write(recieved_data[1]); // повернуть серво на угол 0..180
    // значение получено с 1 элемента массива
    analogWrite(mosfet, recieved_data[2]); // подать на мосфет ШИМ сигнал
    // в соответствии с принятыми данными со 2 места массива, диапазон 0...255
  }
}

помогите дописать уже 3 дня не могу сделать по-разному пробовал  не чего не получается

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Прочти прикрепленную тему: "Вставка кода..." и сделай правильно. Без этого даже смотреть код никто не станет.

maks665
Offline
Зарегистрирован: 30.05.2019

#include <SPI.h>

#include "nRF24L01.h"
#include "RF24.h"
 
RF24 radio(9, 10); 
//RF24 radio(9,53); 
 
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; 
 
byte button = 6;
byte button1 = 3;  
byte potent = 0; 
byte slider = 1; 
 
byte transmit_data[4]; 
byte latest_data[4];
boolean flag; 
 
 
 
void setup() {
 
  pinMode(3, INPUT);
  
  pinMode(6, INPUT);
 Serial.begin(9600);
  
  radio.begin(); 
  radio.setAutoAck(1);         
  radio.setRetries(0, 15);    
  radio.enableAckPayload();   
  radio.setPayloadSize(32);    
 
  radio.openWritingPipe(address[0]);  
  radio.setChannel(0x60); 
  radio.setPALevel (RF24_PA_MAX); 
  radio.setDataRate (RF24_250KBPS);
 
 
  radio.powerUp();
  radio.stopListening();  
}
 
void loop() {
 
  
  transmit_data[0] = digitalRead(3);
 
  transmit_data[1] = digitalRead(6);
 
 
  transmit_data[2] = map(analogRead(potent), 0, 1023, 0, 180); 
 
  transmit_data[3] = map(analogRead(slider), 0, 1023, 0, 255);
 
 
 
 
 
  for (int i = 0; i < 3; i++) { 
    if (transmit_data[i] != latest_data[i]) { 
      flag = 1; 
      latest_data[i] = transmit_data[i];
    }
  }
 
  if (flag == 1) {
    radio.powerUp(); 
    radio.write(&transmit_data, sizeof(transmit_data)); 
    flag = 0;
    radio.powerDown(); 
  }
maks665
Offline
Зарегистрирован: 30.05.2019

[quote=maks665]

как то так? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

maks665 пишет:

как то так? 

Не совсем.

Код должен быть кодом, а текст - текстом. А Вы зачем-то и текст в код запихали и даже комментарием не обозначили..

Код должен быть таким, чтобы любой желающий мог его скопировать к себе и откомпилировать, а не разгребать что Вы там в него всунули.

maks665
Offline
Зарегистрирован: 30.05.2019

пардон ща все исправлю 

maks665
Offline
Зарегистрирован: 30.05.2019

так?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, так-то лучше.

maks665
Offline
Зарегистрирован: 30.05.2019
это приемник  
 
 
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h>
 
RF24 radio(9, 10); 
//RF24 radio(9,53); 
 
byte recieved_data[4]; 
byte relay = 2;
byte relay1 = 6;
byte servo = 7;
byte mosfet = 5;
Servo myservo;
 
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};
 
void setup() {
  Serial.begin(9600); 
 
  pinMode(2, OUTPUT); 
  pinMode(6, OUTPUT);
  pinMode(mosfet, OUTPUT); 
 
  myservo.attach(servo);
 
  radio.begin();
  radio.setAutoAck(1);       
  radio.setRetries(0, 15);   
  radio.enableAckPayload();    
  radio.setPayloadSize(32);     
 
  radio.openReadingPipe(1, address[0]);     
  radio.setChannel(0x60);  
 
  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_250KBPS); 
  
  
  radio.powerUp();
  radio.startListening();  
}
 
void loop() {
  byte pipeNo;
  while ( radio.available(&pipeNo)) {  
    radio.read( &recieved_data, sizeof(recieved_data) );       
    digitalWrite(2, recieved_data[0]);
   
    digitalWrite(6, recieved_data[1]);
    
    myservo.write(recieved_data[1]); 
    
    analogWrite(mosfet, recieved_data[2]);
   
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

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

В приемнике дважды используется параметр recieved_data[1], а recieved_data[3] не используется вовсе.

Возможно это не все ошибки...

maks665
Offline
Зарегистрирован: 30.05.2019

это понятно, но оно не мешает работе приемника мне надо что бы одна кнопка при нажатии  одно реле открылось и при отпускании кнопки реле закрылось, это у меня получилось но вторая кнопка должна работать так, при нажатии и отпускании кнопки второе реле должно открыться и при нажатии и отпускании кнопки реле должно закрыться.

maks665
Offline
Зарегистрирован: 30.05.2019

получается в передатчик я должен поместить дополнительно вот это? в том я русле думаю 

boolean butt_flag = 0;

 

boolean butt;
 
void loop() {
  butt = digitalRead(6);
   
   if (butt == 1 && butt_flag == 0) {
    butt_flag = 1;
  Serial.println("Button pressed");
  led_flag = !led_flag;
  digitalWrite(13, led_flag);
  
  }
  
  if (butt == 0 && butt_flag == 1) {
    butt_flag = 0;
  Serial.println("Button released");
  }
}