Ключевое ?лово

vk

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
Железо для умного дома

ТЕМА: ESP8266 & "RF24 хаб"

ESP8266 & "RF24 хаб" 14 Май 2016 20:41 #12597

  • Lsar
  • Lsar аватар
  • Не в сети
  • Завсегдатай
  • Сообщений: 190
  • Спасибо получено: 15
  • Репутация: 1
почему тогда на станице пишет error?
Администратор запретил публиковать записи гостям.

ESP8266 & "RF24 хаб" 14 Май 2016 20:43 #12598

  • Adminhs
  • Adminhs аватар
  • Не в сети
  • Администратор
  • Сообщений: 7197
  • Спасибо получено: 1114
  • Репутация: 194
если интервал отправки клиентов больше, чем установлен таймпаут, то будет писать.

интервал не нужно ставить очень частый, достаточно 60 сек
Основной канал проекта в Telegram t.me/wifi_iot
Администратор запретил публиковать записи гостям.

ESP8266 & "RF24 хаб" 17 Май 2016 15:37 #12651

  • Lsar
  • Lsar аватар
  • Не в сети
  • Завсегдатай
  • Сообщений: 190
  • Спасибо получено: 15
  • Репутация: 1
Не подскажет что не так в коде? Пытаюсь спящий режим реализовать в скетче. Без кода для 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...
}
Последнее редактирование: 17 Май 2016 15:40 от Lsar.
Администратор запретил публиковать записи гостям.

ESP8266 & "RF24 хаб" 17 Май 2016 16:37 #12655

  • Lsar
  • Lsar аватар
  • Не в сети
  • Завсегдатай
  • Сообщений: 190
  • Спасибо получено: 15
  • Репутация: 1
нашел вот здесь
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <avr/sleep.h>
#include <avr/wdt.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 3
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

//int battVolts;
int count;    //переменная для счётчика циклов
volatile boolean wdt_tripped=1;

RF24 radio(8,7); 
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };

//создаём структуру для передачи 4х значений
typedef struct{         
  int W;
  int X;
  float Y;
  float Z;
}
B_t;
B_t duino2; 

//режим сна для МК
void system_sleep() {
	delay(2);                            // Wait for serial traffic
	_SFR_BYTE(ADCSRA) &= ~_BV(ADEN);     // Switch ADC off
	set_sleep_mode(SLEEP_MODE_PWR_DOWN);
	sleep_enable();
	sleep_mode();                        // System sleeps here
	sleep_disable();
	_SFR_BYTE(ADCSRA) |= _BV(ADEN);      // Switch ADC on
	}
void wdt_interrupt_mode() {
	wdt_reset();
	WDTCSR |= _BV(WDIE); // Restore WDT interrupt mode
	}
ISR(WDT_vect) {
	wdt_tripped=1;  // set global volatile variable
	}




void setup()
{
  wdt_disable();
	wdt_reset();
	wdt_enable(WDTO_8S);   //пробуждение каждые 8 сек
	count = 0;


sensors.begin();
radio.begin();
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);

}
 
void loop(void)
{ 
radio.powerUp();  //подаём питание на NRF24
radio.stopListening(); // отключаем режим приёма
sensors.requestTemperatures();  
float t = sensors.getTempCByIndex(0);
delay(20);

int vb = getBandgap (); // записываем в переменную vb значение замеренного напряжения с батарии

//записываем в структуру данные для передачи
duino2.W = 11;  // этот номер передатчика для идентификации в принятом пакете данных
duino2.X = vb;  // передаём напряжение батареи
duino2.Y =t;    // передаём температуру
duino2.Z = t;   // продублирована (можно менять на любую переменную)


//тут можно увеличить интервал времени между отправками данных по RF24 за счёт счётчика циклов
wdt_interrupt_mode();
	if (wdt_tripped) {
		count++;
		wdt_tripped = 0;

		if (count == 9) {
		delay(20);
		count = 0;
		}
	}



bool ok = radio.write( &duino2, sizeof(duino2) ); //отправляем данные по RF24
delay (20); 
radio.powerDown(); // отключаем питание RF24
system_sleep();   //МК засыпает
 

}

//внутренний контроль напряжения на батареи 

const long InternalReferenceVoltage = 1062; 
int getBandgap () 
  {
  // REFS0 : Selects AVcc external reference
  // MUX3 MUX2 MUX1 : Selects 1.1V (VBG)  
   ADMUX = _BV (REFS0) | _BV (MUX3) | _BV (MUX2) | _BV (MUX1);
   ADCSRA |= _BV( ADSC );  // start conversion
   while (ADCSRA & _BV (ADSC))
     { }  // wait for conversion to complete
   int results = (((InternalReferenceVoltage * 1024) / ADC) + 5) / 10; 
   return results;
  } // end of getBandgap
Администратор запретил публиковать записи гостям.

ESP8266 & "RF24 хаб" 17 Май 2016 22:34 #12665

  • serenya
  • serenya аватар
  • Не в сети
  • Захожу иногда
  • Сообщений: 50
  • Спасибо получено: 8
  • Репутация: 3
Adminhs пишет:
В данный момент одновременная их работа не возможна , nrf24 работает по софт SPI.
Планируете ли перевести nrf на аппаратный SPI? Хочется в одном устройстве использовать ILI и nrf. А то я уже и платку делать удумал.
Администратор запретил публиковать записи гостям.
Спасибо сказали: Budilnik

ESP8266 & "RF24 хаб" 18 Май 2016 07:58 #12669

  • Adminhs
  • Adminhs аватар
  • Не в сети
  • Администратор
  • Сообщений: 7197
  • Спасибо получено: 1114
  • Репутация: 194
Пока нет, проблема в том, что могут быть коллизии в работе, если будет одновременное обращение к SPI. К NRF24 обращается внутри одного таймера, а вывод информации на ТФТ внутри другого.
Основной канал проекта в Telegram t.me/wifi_iot
Администратор запретил публиковать записи гостям.
Модераторы: FlyRouter
Время создания страницы: 0.158 секунд

Home`s Smart © 2013-2016. г.Киров.
Цитирование материалов возможно только со ссылкой на сайт. Использование фотоматериалов только с разрешения авторов.