Сон на передатчике nrf24l01

Всем привет, требуется помощь с пониманием того, как отправить передатчик в сон вместе с nRF24L01, при нажатии на кнопку и прерыванием на той же кнопке при повторном нажатии отправлять обратно в сон (для экономии батарейки).

Код самой функции Sleep почти без изменений (перенес сюда radio.powerUp(); ) взят с форума, где несколько участников подтвердили его работоспособность (включая человека который задавал вопрос по этой функции).

В чем проблема - в отправку мк в сон верю на слово ребятам из форума, но отключение передачи данных работает только при зажатии (скорее всего из-за логической конструкции которая содержит radio.powerUp(); при нажатии кнопки, но так как конструкция не в цикле, то выполняется код только при зажатии кнопки), также пытался использовать булев тип для того, чтобы задать режим работы радио, но все равно или не работало вообще или примерно также.

Изначальный код вообще отправлял данные после пробуждения и прекращал сам примерно через минуту, подозреваю из-за булева флажка в части:

if (flag == 1) {
//radio.powerUp() раньше был здесь, но перенес в функцию Sleep.
encryptData();
radio.write(&transmit_data, sizeof(transmit_data));
flag = 0;
radio.powerDown();
}

Полный код:

#include <avr/sleep.h>
#include <avr/power.h>     
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"

RF24 radio(9, 10);
int TOUCH = 2;


const uint64_t pipe = 0xE8E8F0F0E1LL;
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};

byte hallSensor = A0;
byte transmit_data[3];
byte latest_data[3];
boolean flag;

byte guid[] = {0x12, 0x34, 0x56, 0x78};

void setup(){
  pinMode(TOUCH, INPUT);
  Serial.begin(28800);

  radio.begin();
  radio.setAutoAck(1);
  radio.setRetries(0, 15);
  radio.enableAckPayload();
  radio.setPayloadSize(32);

  radio.openWritingPipe(pipe);
  radio.setChannel(0x60);

  radio.setPALevel (RF24_PA_MAX);
  radio.setDataRate (RF24_2MBPS);

  radio.powerUp();
  radio.stopListening();
}

void encryptData() {
  for (int i = 0; i < 3; i++) {
    transmit_data[i] = transmit_data[i] ^ guid[i % 4];
  }
}

void Interrupt(void){
}

void Sleep(void){
  delay(250);
  sleep_enable();
  attachInterrupt(0, Interrupt, HIGH);
  power_all_disable();             
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  MCUCR |= (1<<BODS) | (1<<BODSE);
  MCUCR &= ~(1<<BODSE); 
  sleep_mode();
  
  sleep_disable();
  detachInterrupt(0); 
  power_all_enable();
  delay(5);
  
  if(digitalRead(TOUCH)){ 
    delay(20);
    radio.powerUp();
  }
  delay(250);
}

void loop(){
  int hallValue = analogRead(hallSensor);
  if (hallValue > 512) {
    transmit_data[0] = 1;
    transmit_data[1] = map(hallValue, 512, 1023, 0, 255);
  } else {
    transmit_data[0] = 2;
    transmit_data[1] = map(hallValue, 0, 511, 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) {
     encryptData();
    radio.write(&transmit_data, sizeof(transmit_data));
    flag = 0;
    radio.powerDown();
  }
  if (digitalRead(TOUCH)){
    Sleep();
  }
}

написано много, а что хотите от форума - непонятно

Помочь усыпить радио при нажатии, и при повторном нажатии разбудить (ну или при зажатии усыплять, тогда сделаем кнопку с фиксацией), заранее спасибо за любой совет

Ничего не понял, кто на ком стоял? Кто кого куда отправляет или посылает? Вы можете как-то по-русски изъясняться?

Смысл в том, что нужно уводить nRF24L01 в состояние сна, я как бы не пытался, он все равно продолжает передавать данные

Так распишите внятно, по пунктам, когда и куда “уводить”, когда и откуда “выводить”. Не ленитесь, напишите понятно.

значит у вас данные постоянно меняются. У вас в коде ясно написано - если данные изменились, их нужно передать независимо от любых других настроек.

Да, я так и предполагал и написал об этом, можете посоветовать, как изменить код ( я просто этого франкенштейна собирал из кучи разных скетчей, сам новичок еще)

  1. При нажатии на кнопку увести ардуино и радио в сон
  2. Выводить из сна прерыванием на ту же кнопку

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