pasha413 писал(а): ↑02 дек 2019, 11:31
Вот в сетапе отправляю напряжение батареи. но вот как проснуться и отправить напряжение батареи (допустим, каждые сутки) так и не понял, не нашел решения.
Код: Выделить всё
//nrf51822
//6.2mkA
//16mA
#define MY_RADIO_NRF5_ESB
#define MY_PASSIVE_NODE
#define MY_NODE_ID 6
#define MY_DISABLED_SERIAL
#define MY_PARENT_NODE_ID 0
#define MY_LED 0
#define MY_KEY 4
//#define MY_BUTTON_ADC_PIN X // номер пина АЦП смотреть в MyBoardNRF5.cpp
//#define MY_BUTTON_PIN (MY_BUTTON_ADC_PIN X-1) //this is the same pin number MY_BUTTON_ADC_PIN, see the pins table above (only nrf51, I think so)
#define MY_BUTTON_ADC_PIN 6 // номер пина АЦП смотреть в MyBoardNRF5.cpp
//#define MY_BUTTON_PIN 5 //this is the same pin number MY_BUTTON_ADC_PIN, see the pins table above (only nrf51, I think so)
//############## NRF51 ################
// X-1 - X
//p0.01 - AIN2
//p0.02 - AIN3
//p0.03 - AIN4
//p0.04 - AIN5
//p0.05 - AIN6
//p0.06 - AIN7
//############## NRF51 ################
#include <MySensors.h>
#define CHILD_ID_Door 24 // Id сенсоры ноды (0-254)
#define CHILD_ID_VOLT 100
MyMessage msgDoor(CHILD_ID_Door, V_TEXT);
MyMessage msgVolt(CHILD_ID_VOLT, V_VOLTAGE);
int8_t detection;
unsigned long timer = 30;
void presentation() {
sendSketchInfo("DoorSensor", "1.0");
present(CHILD_ID_Door, S_DOOR, "Door Status");
present(CHILD_ID_VOLT, S_MULTIMETER, "Battery");
}
void preHwInit() {
pinMode(MY_LED, OUTPUT);
// pinMode(MY_BUTTON_PIN, INPUT_PULLUP);
pinMode(MY_KEY, INPUT_PULLUP);
digitalWrite(MY_LED, LOW);
}
void before() {
NRF_POWER->DCDCEN = 1; // закоментировать если E73
NRF_UART0->ENABLE = 0;
}
void setup() {
analogReference(AR_VBG);
send(msgVolt.set(((float)hwCPUVoltage()/1000),2)); //отправляю напряжение батареи
lpComp(); // if y use lpcomp interrupt
led(4, 1);
detection = 0;
wait(1000);
}
void loop() {
sleep(2147483647);
if (detection == 1) {
s_lpComp();
if (digitalRead(MY_KEY) == 1) {
send(msgDoor.setDestination(0).set("true!"));
led(2, 1);
wait(100);
}
if (digitalRead(MY_KEY) == 0) {
send(msgDoor.setDestination(0).set("false!"));
led(1, 1);
wait(100);
}
// led(3, 3);
detection = 0;
NRF_LPCOMP->EVENTS_CROSS = 0;
r_lpComp();
} else {
// led(1, 1);
}
}
void led(uint8_t flash, uint8_t iteration) {
// for (int x = 0; x < iteration; x++) { //повтор
for (int i = 0; i < flash; i++) {
digitalWrite(MY_LED, HIGH);
wait(20);
digitalWrite(MY_LED, LOW);
wait(20);
// }
// wait(500);
}
}
void lpComp() {
NRF_LPCOMP->PSEL = MY_BUTTON_ADC_PIN;
NRF_LPCOMP->ANADETECT = 0; // детектирование EVENTS_DOWN.
//ANADETECT=0; // детектирование EVENTS_CROSS.
//ANADETECT=1; // детектирование EVENTS_UP.
//ANADETECT=2; // детектирование EVENTS_DOWN.
NRF_LPCOMP->INTENSET = B1000; // активация прерывания для EVENTS_DOWN
//B1000; // прерываниt для EVENTS_CROSS
//B0100; // прерываниt для EVENTS_UP
//B1000; // прерываниt для EVENTS_DOWN
NRF_LPCOMP->ENABLE = 1;
NRF_LPCOMP->TASKS_START = 1;
NVIC_SetPriority(LPCOMP_IRQn, 15);
NVIC_ClearPendingIRQ(LPCOMP_IRQn);
NVIC_EnableIRQ(LPCOMP_IRQn);
}
void s_lpComp() {
if ((NRF_LPCOMP->ENABLE) && (NRF_LPCOMP->EVENTS_READY)) {
NRF_LPCOMP->INTENCLR = B1000; //деактивация прерывания для LPCOMP
}
}
void r_lpComp() {
NRF_LPCOMP->INTENSET = B1000;
}
#if __CORTEX_M == 0x04
#define NRF5_RESET_EVENT(event) \
event = 0; \
(void)event
#else
#define NRF5_RESET_EVENT(event) event = 0
#endif
//В одну строку..
extern "C" { void LPCOMP_IRQHandler(void) {detection = 1;NRF5_RESET_EVENT(NRF_LPCOMP->EVENTS_CROSS); NRF_LPCOMP->EVENTS_CROSS = 0; MY_HW_RTC->CC[0] = (MY_HW_RTC->COUNTER + 2);}}
Например так:
Код: Выделить всё
//nrf51822
//6.2mkA
//16mA
#define MY_RADIO_NRF5_ESB
#define MY_PASSIVE_NODE
#define MY_NODE_ID 6
#define MY_DISABLED_SERIAL
#define MY_PARENT_NODE_ID 0
#define MY_LED 0
#define MY_KEY 4
//#define MY_BUTTON_ADC_PIN X // номер пина АЦП смотреть в MyBoardNRF5.cpp
//#define MY_BUTTON_PIN (MY_BUTTON_ADC_PIN X-1) //this is the same pin number MY_BUTTON_ADC_PIN, see the pins table above (only nrf51, I think so)
#define MY_BUTTON_ADC_PIN 6 // номер пина АЦП смотреть в MyBoardNRF5.cpp
//#define MY_BUTTON_PIN 5 //this is the same pin number MY_BUTTON_ADC_PIN, see the pins table above (only nrf51, I think so)
//############## NRF51 ################
// X-1 - X
//p0.01 - AIN2
//p0.02 - AIN3
//p0.03 - AIN4
//p0.04 - AIN5
//p0.05 - AIN6
//p0.06 - AIN7
//############## NRF51 ################
#include <MySensors.h>
#define CHILD_ID_Door 24 // Id сенсоры ноды (0-254)
#define CHILD_ID_VOLT 100
MyMessage msgDoor(CHILD_ID_Door, V_TEXT);
MyMessage msgVolt(CHILD_ID_VOLT, V_VOLTAGE);
int8_t detection;
unsigned long timer = 30;
unsigned long sleep_batt = 14400000; // 4 часа
void presentation() {
sendSketchInfo("DoorSensor", "1.0");
present(CHILD_ID_Door, S_DOOR, "Door Status");
present(CHILD_ID_VOLT, S_MULTIMETER, "Battery");
}
void preHwInit() {
pinMode(MY_LED, OUTPUT);
// pinMode(MY_BUTTON_PIN, INPUT_PULLUP);
pinMode(MY_KEY, INPUT_PULLUP);
digitalWrite(MY_LED, LOW);
}
void before() {
NRF_POWER->DCDCEN = 1; // закоментировать если E73
NRF_UART0->ENABLE = 0;
}
void setup() {
analogReference(AR_VBG);
send(msgVolt.set(((float)hwCPUVoltage() / 1000), 2)); //отправляю напряжение батареи
lpComp(); // if y use lpcomp interrupt
led(4, 1);
detection = 0;
wait(1000);
}
void loop() {
sleep(sleep_batt);
if (detection == 1) {
s_lpComp();
if (digitalRead(MY_KEY) == 1) {
send(msgDoor.setDestination(0).set("true!"));
led(2, 1);
wait(100);
}
if (digitalRead(MY_KEY) == 0) {
send(msgDoor.setDestination(0).set("false!"));
led(1, 1);
wait(100);
}
// led(3, 3);
detection = 0;
NRF_LPCOMP->EVENTS_CROSS = 0;
r_lpComp();
} else {
send(msgVolt.set(((float)hwCPUVoltage() / 1000), 2)); //отправляю напряжение батареи
}
}
void led(uint8_t flash, uint8_t iteration) {
// for (int x = 0; x < iteration; x++) { //повтор
for (int i = 0; i < flash; i++) {
digitalWrite(MY_LED, HIGH);
wait(20);
digitalWrite(MY_LED, LOW);
wait(20);
// }
// wait(500);
}
}
void lpComp() {
NRF_LPCOMP->PSEL = MY_BUTTON_ADC_PIN;
NRF_LPCOMP->ANADETECT = 0; // детектирование EVENTS_DOWN.
//ANADETECT=0; // детектирование EVENTS_CROSS.
//ANADETECT=1; // детектирование EVENTS_UP.
//ANADETECT=2; // детектирование EVENTS_DOWN.
NRF_LPCOMP->INTENSET = B1000; // активация прерывания для EVENTS_DOWN
//B1000; // прерываниt для EVENTS_CROSS
//B0100; // прерываниt для EVENTS_UP
//B1000; // прерываниt для EVENTS_DOWN
NRF_LPCOMP->ENABLE = 1;
NRF_LPCOMP->TASKS_START = 1;
NVIC_SetPriority(LPCOMP_IRQn, 15);
NVIC_ClearPendingIRQ(LPCOMP_IRQn);
NVIC_EnableIRQ(LPCOMP_IRQn);
}
void s_lpComp() {
if ((NRF_LPCOMP->ENABLE) && (NRF_LPCOMP->EVENTS_READY)) {
NRF_LPCOMP->INTENCLR = B1000; //деактивация прерывания для LPCOMP
}
}
void r_lpComp() {
NRF_LPCOMP->INTENSET = B1000;
}
#if __CORTEX_M == 0x04
#define NRF5_RESET_EVENT(event) \
event = 0; \
(void)event
#else
#define NRF5_RESET_EVENT(event) event = 0
#endif
//В одну строку..
extern "C" {
void LPCOMP_IRQHandler(void) {
detection = 1;
NRF5_RESET_EVENT(NRF_LPCOMP->EVENTS_CROSS);
NRF_LPCOMP->EVENTS_CROSS = 0;
MY_HW_RTC->CC[0] = (MY_HW_RTC->COUNTER + 2);
}
}
Это очень примитивно правда, тк не учитывает прерывание, тоесть после сработки прерывания сон будет снова установлен на 4 часа после которого будет отправка батарейки. По другому естественно тоже можно, я уже выкладывал, гляньте например в последней фиговине -
https://mysku.ru/blog/diy/77226.html
там правда много букв, ...смотрите как работает вот эта часть:
- 12212.png (66.17 КБ) 17752 просмотра