Не подскажет что не так в коде? Пытаюсь спящий режим реализовать в скетче. Без кода для NRF24 ардуино с HX711 засыпает и просыпается правильно, а с nrf не засыпает. В библиотеке есть пример, но там модуль отвечает на сообщение, а мне надо чтоб по таймеру.
#include <avr/sleep.h>
#include <avr/power.h>
int times = 0;
ISR(TIMER1_OVF_vect)
{
}
void EnterSleep(void)
{
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_enable();
power_adc_disable();
power_spi_disable();
power_timer0_disable();
power_timer2_disable();
power_twi_disable();
/* 14 раз по 4.2 сек */
for (times = 0; times < 1; ++times) {
sleep_mode();
TCNT1=0x0000;
}
sleep_disable();
power_all_enable();
}
/////////////////////спящий режим////////////////////////
#include <Wire.h>
#include "HX711.h"
#include <OneWire.h>
#include <DallasTemperature.h>
#define chclient 1 // номер клиента 1...
#define timesend 1000 // интервал отправки данных,для обычных датчиков можно установить время выше.
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#define ONE_WIRE_BUS 2
// Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);
unsigned long time1=0;
unsigned long time2=0;
RF24 radio(9,10);
HX711 scale(A1, A0);// parameter "gain" is ommited; the default value 128 is used by the library
//
// 0 -прием , 1 -передача
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL,0xF0F0F0F0D2LL};
//
//// структура отправляемых данных.Изменяемые данные.Размер структуры должен быть не больше 32 байт !/////////
typedef struct{
byte identifier;// номер передатчика.МЕНЯТЬ НЕЛЬЗЯ
int Analog;
int intTempUliy; //Температура
int intTempWozd; //Температура
long longWes; // Весы
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
nf1;
nf1 clientnf;
void setup() {
Serial.begin(9600);
delay(20);
sensors.begin();
delay(20);
radio.begin();
// выбор скорости
radio.setDataRate(RF24_250KBPS);
//radio.setDataRate(RF24_1MBPS);
// radio.setDataRate(RF24_2MBPS);
radio.setPALevel(RF24_PA_MAX);
radio.setChannel(100); //тут установка канала
radio.setCRCLength(RF24_CRC_16);
radio.setAutoAck(false); // выключить аппаратное потверждение
radio.setRetries(15,15);
radio.openWritingPipe(pipes[1]); // Открываем канал передачи
//radio.openReadingPipe(1,pipes[0]); // Открываем канал приема
clientnf.identifier = chclient;
///////////весы
scale.read();
// yield();
scale.set_scale(19.f); // this value is obtained by calibrating the scale with known weights; see the README for details
scale.tare();// reset the scale to 0
// yield();
/////////// весы
/////////////////////спящий режим////////////////////////
TCCR1A = 0x00;
TCNT1=0x0000;
TCCR1B = 0x05;
TIMSK1=0x01;
/////////////////////спящий режим////////////////////////
}
void loop() {
/////////////////////спящий режим////////////////////////
EnterSleep();
/////////////////////спящий режим////////////////////////
//---------------------------------для чтения сенсоров--------------------------
// if ((millis()-time1) >= timesend) { // обновляем сенсоры и отправляем
// тут будут опросы сенсоров
clientnf.Analog=analogRead(A3); //пример передачи int данных
sensors.requestTemperatures(); // считываем температуру с датчиков
//Read first sensor
float temp1 = sensors.getTempCByIndex(0);
//Print first sensor results
Serial.print("T1: ");
Serial.println(temp1);
Serial.println(" ");
//Read second sensor
float temp2 = sensors.getTempCByIndex(1);
//Print second sensor result
Serial.print("T2: ");
Serial.println(temp2);
Serial.println(" ");
//переводим температура
float TempUliy=temp1;
int intTempUliy = (int)TempUliy;
Serial.print(intTempUliy);
float TempWozd=temp2;
int intTempWozd = (int)TempWozd;
Serial.print(intTempWozd);
clientnf.intTempUliy=intTempUliy;
////////////////весы////////////
float Wes = scale.get_units(10); // читаем значение
long longWes =(long)Wes;
if (longWes < 0){
longWes=0;//если показания - то значение ноль
scale.tare();// reset the scale to 0
}
Serial.print("Wes = ");
Serial.println(longWes);
Serial.println(scale.get_units(10));
clientnf.longWes=longWes;
////////Отправляем////////////
radio.stopListening();
bool ok = radio.write( &clientnf, sizeof(clientnf) );
Serial.println ("Otprawil");
// radio.startListening();
////////Отправили////////////
//time1 = millis();
// }
}вот код который взял для примера(рабочий)
#include <avr/sleep.h>
#include <avr/power.h>
int times = 0;
ISR(TIMER1_OVF_vect)
{
}
void EnterSleep(void)
{
set_sleep_mode(SLEEP_MODE_IDLE);
sleep_enable();
power_adc_disable();
power_spi_disable();
power_timer0_disable();
power_timer2_disable();
power_twi_disable();
/* 14 раз по 4.2 сек */
for (times = 0; times < 1; ++times) {
sleep_mode();
TCNT1=0x0000;
}
sleep_disable();
power_all_enable();
}
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
TCCR1A = 0x00;
TCNT1=0x0000;
TCCR1B = 0x05;
TIMSK1=0x01;
}
void loop() {
EnterSleep();
digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(13, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
//Smth...
}