Всем привет, требуется помощь с пониманием того, как отправить передатчик в сон вместе с 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();
}
}