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

vk

Ниже показан пример скетча  беспроводного датчика влажности с возможностью "дергания" пинов для Arduino.Структура отправляемых данных должна соответствовать массиву в файле nRF-USB.h исходного кода клиентской утилиты nRF24L01+USB.

Клиент подойдет и для варианта щлюза Ethernet-nRF24L01.

Порядок данных массива: 1 байт номер клиента,2 байта чтения analogread,1 байт свободный,2 байта счетчик ошибок,4 байта счетчик передач,4 байта тип float температура,4 байта тип float влажность.

Скетч подходит для Arduino на базе м/к Atmega 328,Atmega168,Atmega88,Atmega8.

Библиотека для датчика  влажности используется универсальная с автоматическим определением датчиков со странички Датчики влажности DHT11 и DHT22

Возможен вариант скетча с спящим режимом, в котором отправка данных может происходить,например,раз в 5 минут - в таком режиме работа от батареи может быть значительно дольше.

/*
Пример работы клиента
*/

#define chclient 1 // номер клиента 1...
#define timeoutper 400 // таймаут запросов от сервера.
#define timesend 300 // интервал отправки данных,для обычных датчиков можно установить время выше.

#include <SPI.h>

#include "DHT.h"

DHT dht;

#include "nRF24L01.h"
#include "RF24.h"

unsigned long time1=0;
unsigned long time2=0;

#define RELE_1 6 //
#define RELE_2 7


//
// Set up nRF24L01 radio on SPI bus plus pins 9 & 10

RF24 radio(9,10);
//

// 0 -прием , 1 -передача
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL,0xF0F0F0F0D2LL};
//

// структура принятых данных.МЕНЯТЬ НЕЛЬЗЯ
typedef struct{
byte identifier;
byte val1;
byte val2;
byte val3;
byte val4;
}
nf0;
nf0 servernf;

// структура отправляемых данных.Изменяемые данные.Размер структуры должен быть не больше 32 байт !
typedef struct{
  byte identifier;// номер передатчика.МЕНЯТЬ НЕЛЬЗЯ

  int Analog;
  boolean test_data;
unsigned int Error_Message; // счетчик ошибок
unsigned long count;// счетчик передач для контроля качества канала
 float temperature_Sensor;// передаём температуру.
 float Humidity_Sensor;// передаём влажность
}
nf1;
nf1 clientnf; 


void setup() {

dht.setup(3); // DHT датчик на пине 3

pinMode(RELE_1, OUTPUT);

pinMode(RELE_2, OUTPUT);

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;
}

byte errorstate;

void loop() {



//---------------------------------для чтения сенсоров--------------------------
  if ((millis()-time1) >= 1000) {     // обновляем сенсоры раз в секунду (1000млс)
//  тут будут опросы сенсоров

  
clientnf.temperature_Sensor = dht.getTemperature();
clientnf.Humidity_Sensor = dht.getHumidity();

clientnf.Analog=analogRead(0); //пример передачи int данных

time1 = millis();
  }


//************************************************************************************************/
  if ((millis() - time2) >= timesend || errorstate !=0) {
   
if (clientnf.count <= 2147483646)  clientnf.count++;      // счетчик передач для контроля качества канала
else clientnf.count = 0;   
    
  radio.stopListening();
  bool ok = radio.write( &clientnf, sizeof(clientnf) );
  radio.startListening();
 
  unsigned long started_waiting_at = millis();
  bool timeout = false;
  while ( ! radio.available() && ! timeout )
  
  if (millis() - started_waiting_at > timeoutper ) timeout = true;


  if ( timeout ) {
  //  счетчик ошибок
  clientnf.Error_Message++;
  errorstate++; // счетчик ошибок для повтора
  }
  else {
    radio.read( &servernf, sizeof(servernf) );
    errorstate=0;
}
if (errorstate>=3) errorstate=0; // не более 3 попыток для повтора
//************************************************************************************************/


if (servernf.identifier == chclient) { // выполнение команд с сервера,если данные предназначены для этого клиента:

// val1= 10 -значит дергаем пинами, val2 - номер пина, val3 - состояние пина
// не забудте установить режим OUTPUT для нужных пинов.
// nRF-USB write 1 10 7 1 1 - что значит установить на 7 выводе логический уровень 1
    if (servernf.val1==10) digitalWrite(servernf.val2,servernf.val3);
   
// val1= 11 -значит управляем ШИМ пинами, val2 - номер пина, val3 - уровень 0..255.
// не забудте установить режим OUTPUT для нужных пинов.
// ШИМ возможен только на некоторых пинах !!
    if (servernf.val1==11) analogWrite(servernf.val2,servernf.val3);


}

    time2 = millis();      
  }

} // конец loop



UPD:Последнее обновление от 23.01.2014

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