NFR24L01 и ds18b20 передача и прием данных.

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Искал как это сделать легко и просто, много видео, но нет готового решения. 

Прошу обратить внимание на то, что разбираться с Ардуино только начал и ищу темы где разжевывают все досканально. Разбираюсь в силу своих возможностей и делюсь некоторыми познаниями и упрощениями. 

 

Вот хочу предложить пример приема-передачи данных с датчика ds18b20 с одного модуля. Если кому будет интересно. позже предложу решение по передачи и приему с нескольких датчиков в совокупности с датчиком DHT11. 

В скетче описал все своими словами. 

Если возникнет непреодолимое желание покритиковать - не стесняйтесь, но без фанатизма, делайте скидку :) 

 

Итак, вот скетч для передатчика: 

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <OneWire.h>  //библиотека работы шины для ds18b20
#include <DallasTemperature.h> //библиотека для считывания температуры с ds18b20
  
const uint64_t pipe = 0xF0F1F2F3F4LL; //идентификатор передачи данных.
RF24 radio(9, 10); //указываем пины подключения передатчика.
OneWire  oneWire(2);  //указываем пины для подключения датчиков ds18b20.
DallasTemperature ds(&oneWire); //активируем библиотеку ds.

DeviceAddress sensor1 = {0x28, 0xFF, 0x68, 0x6A, 0x84, 0x16, 0x5, 0x69}; //адрес первого датчика.
DeviceAddress sensor2 = {0x28, 0xFF, 0xAA, 0x37, 0x82, 0x16, 0x5, 0x5C}; //адрес второго датчика.

void setup(){
  Serial.begin(9600); //открываем пот обмена данными.
  ds.begin();  //запускаем функцию считывания температуры ds.
  radio.begin(); //делаем инициализацию.
  delay(2); //ждем реакции модуля передачи данных. 
  radio.setChannel(9); // канал для передачи данных (0-127).
  radio.setDataRate(RF24_1MBPS); //указываем на какой скорости будут общаться модули.
  radio.setPALevel(RF24_PA_HIGH); //указываем мощность передатчика.  
  radio.openWritingPipe(pipe); // открываем трубу на передачу.
} 


void loop(){  
  ds.requestTemperatures(); // считываем температуру с датчиков
  float data [2];  //создаем массив из 2-х переменных. 
  data[0] = float(ds.getTempC(sensor1)); //присваиваем первому значению массива данные с sensor1 (за один раз можно отправить до 32 байт).
  data[1] = float(ds.getTempC(sensor2)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  radio.write(&data, sizeof(data)); // передаем массив и его размер. 
   Serial.println(data[0]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[1]); //выводим данные в сериал порт для проверки. 
   Serial.println(); //пробел.
   delay(500); //ждем пол секунды.  
} 

Комментарий: Хотелось бы обратить внимание на значения float в строке 29-31, они позволяют передавать и принимать сотые доли значения датчика температуры. Если нужны только целые числа, то достаточно в строке 29 float заменить на int. Массивом data[] мы можем передавать любые значения, с любых датчиков и потенциметров. Для этого необходимо в строке 29 указать колличество данных в массиве ну и соответсвенно укахать их в самом массиве.

 

Ну и скетч для приемника: 

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
  
  const uint64_t pipe = 0xF0F1F2F3F4LL; //первый идентификатор передачи данных.
  RF24 radio(9, 10); //указываем пины подключения передатчика.

void setup(){
  Serial.begin(9600); //открываем пот обмена данными.
  radio.begin(); //делаем инициализацию.
  delay(2); //ждем реакции модуля передачи данных. 
  radio.setChannel(9); // канал для передачи данных (0-127).
  radio.setDataRate(RF24_1MBPS); //указываем на какой скорости будут общаться модули.
  radio.setPALevel(RF24_PA_HIGH); //указываем мощность передатчика.  

  radio.openReadingPipe(1,pipe); //Можно открыть все трубы разом. 
  radio.startListening(); //включаем приемник и начинаем слушать трубу. 
} 


void loop(){  
  float data [2];  //создаем массив из 2-х переменных. 
  if (radio.available()){ //проверяем не пришло ли чего в буфер. 
  radio.read(&data, sizeof(data)); //читаем массив и указываем сколько пришло. 
   Serial.println(data[0]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[1]); //выводим данные в сериал порт для проверки. 
   Serial.println(); //пробел.  
  }
} 

Спаибо за внимание. Полезу подключать несколько передатчиков к одному приемнику. 

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Кстати, при подключении датчика ds18b20 будьте аккуратны. Если при подключении он включается в режиме "кипятилькик", значит перепутали плюс с минусом. В интернете есть разные схемы и у меня при неправильном подключении он разогрелся до 100 градусов... 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Zombrero пишет:

у меня при неправильном подключении он разогрелся до 100 градусов... 

Чем измеряли? Или сам показал?

a5021
Offline
Зарегистрирован: 07.07.2013

Цитата:

delay(2); //ждем реакции модуля передачи данных. 

Что это за реакция и как она себя проявляет?

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

a5021 пишет:

Цитата:

delay(2); //ждем реакции модуля передачи данных. 

Что это за реакция и как она себя проявляет?

Да так, на всякий случай, что бы не было сбоев при слишком быстром запросе данных. 

a5021
Offline
Зарегистрирован: 07.07.2013

Внутри функции setup() не происходит никаких запросов данных.

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

a5021 пишет:

Внутри функции setup() не происходит никаких запросов данных.


Да, согласен, видимо поэтому не могу присвоить значения переменным, что бы их вывести на дисплей. Завтра займусь этим. Если есть что подсказать - буду благодарен.

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Все афигенно, но есть проблема: на принимаемой части ардуино подключина к дисплею nextion, так же к датчику DHT11, питается от двух аккумуляторов 18650 через понижайка на выходе 5 вольт.

Так вот: при подключении начинается глюк, ардуино не обрабатывает данные. Если саму ардуионо отсоединить то всего, залить скетч, и подключить не отсоеденяя то компа - все работает, при отключении usb работает, но вот если все выключить и включить заново - замолкает.
Думаю проблема с питанием... Не знаю куда копать....

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Поделюсь своим проектом. Он вполне работоспособный, едиственная проблемма в том, что ардуинка приемника и передачи данных на дисплей Nextion запускается без подключения системы, т.е. вытащив ее из платы расширения, подключаю через USB или обычного аккумалятора, потом вставляю в плату расширения, к которой подключенна вся система и все работает. Если выключить питание и включить - не запускается (не передает данные и не горил светодиод приема данных.  

Если кто увидит ошибки и недочеты в коде приемника, которые могут влиять на его сбои в работе при запуске - буду признателен. 

Итак, задача этой части проекта снимать показания температур и влажности, по средствам датчиков ds18b20 и DHT11 и путем беспроводной связи выводить их на дисплей Nextion. В перспективе нужно еще три ардуины с передатчиком и соответсвенно нужно будет дополнить код приемника, для получения данных с трех других Ардуино. 

Кстати, ардуино в связке с датчиком NFR24L01 совместно с платой питания для NRF превосходно работает от стандартного аккумулятора для мобильника (LiPo). 

 

Передатчик:

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <OneWire.h>  //библиотека работы шины для ds18b20.
#include <DallasTemperature.h> //библиотека для считывания температуры с ds18b20.
#include <dht11.h> //подключаем библиотеку DHT11.
dht11 DHT; //что то назначаем для DHT11.
#define DHT11_PIN 4 //указываем пин на который подключен датчик DHT11. 

const uint64_t pipe = 0xF0F1F2F3F4LL; //идентификатор передачи данных.
RF24 radio(9, 8); //указываем пины подключения передатчика.
OneWire  oneWire(2);  //указываем пины для подключения датчиков ds18b20.
DallasTemperature ds(&oneWire); //активируем библиотеку ds.

DeviceAddress sensor1 = {0x28, 0xFF, 0x90, 0x41, 0x81, 0x16, 0x3, 0xFD}; //адрес первого датчика.
DeviceAddress sensor2 = {0x28, 0xFF, 0x7E, 0xA9, 0x83, 0x16, 0x3, 0x9F}; //адрес второго датчика.
DeviceAddress sensor3 = {0x28, 0xFF, 0x70, 0xA9, 0x83, 0x16, 0x3, 0x3D}; //адрес третьего датчика.
DeviceAddress sensor4 = {0x28, 0xFF, 0x34, 0x58, 0x82, 0x16, 0x4, 0x1D}; //адрес третьего датчика.
DeviceAddress sensor5 = {0x28, 0xFF, 0x98, 0xEC, 0x81, 0x16, 0x3, 0xF7}; //адрес третьего датчика.
DeviceAddress sensor6 = {0x28, 0xFF, 0x83, 0x1B, 0x85, 0x16, 0x5, 0x4F}; //адрес третьего датчика.




void setup(){
  Serial.begin(9600); //открываем пот обмена данными.
  ds.begin();  //запускаем функцию считывания температуры ds.
  radio.begin(); //делаем инициализацию.
  delay(2); //ждем реакции модуля передачи данных. 
  radio.setChannel(9); // канал для передачи данных (0-127).
  radio.setDataRate(RF24_1MBPS); //указываем на какой скорости будут общаться модули.
  radio.setPALevel(RF24_PA_HIGH); //указываем мощность передатчика.  
  radio.openWritingPipe(pipe); // открываем трубу на передачу.
} 


void loop(){  
  ds.requestTemperatures(); // считываем температуру с датчиков
  float chk; //создаем переменную для показаний с датчика DHT11.
  chk = DHT.read(DHT11_PIN);    // читаем данные с датчика DHT11.
  float data [8];  //создаем массив из 8-ми переменных. 
  data[0] = float(ds.getTempC(sensor1)); //присваиваем первому значению массива данные с sensor1 (за один раз можно отправить до 32 байт).
  data[1] = float(ds.getTempC(sensor2)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  data[2] = float(ds.getTempC(sensor3)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  data[3] = float(ds.getTempC(sensor4)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  data[4] = float(ds.getTempC(sensor5)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  data[5] = float(ds.getTempC(sensor6)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  data[6] = float(DHT.humidity); //присваиваем второму значению массива данные влажности с DHT11 (за один раз можно отправить до 32 байт).
  data[7] = float(DHT.temperature); //присваиваем второму значению массива данные температуры с DHT11 (за один раз можно отправить до 32 байт).
  radio.write(&data, sizeof(data)); // передаем массив и его размер. 
   Serial.println(data[0]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[1]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[2]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[3]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[4]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[5]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[6]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[7]); //выводим данные в сериал порт для проверки. 
   Serial.println(); //пробел.
   delay(500); //ждем пол секунды.  
} 

 

Приемник: 

#include <SPI.h> //библтотека для NRF24L01.
#include "nRF24L01.h" //библиотека для NRF24L01.
#include "RF24.h" //библиотека для NRF24L01.
#include <SoftwareSerial.h> //Подключения серийного порта ПК
#include <Nextion.h> //Подключем библиотеку для работы с дисплеем Nextion
#include <stDHT.h> //Подключаем библиотеку для работы с датчиками DHT11
   DHT sens(DHT11); //Указываем тип датчика DHT11 или DHT22
   SoftwareSerial nextion(6, 7);// Nextion TX на пин 6 (не подключен) и RX на пин 7.
   Nextion myNextion(nextion, 9600); //Скорость передачи данных на дисплей Nextion
   const uint64_t pipe = 0xF0F1F2F3F4LL; //первый идентификатор передачи данных.
   RF24 radio(9, 10); //указываем пины подключения передатчика.

void setup() {
  myNextion.init(); // Для дисплея Nextion
  pinMode (8, INPUT); //Определяем пин как вход DHT
  digitalWrite(8, HIGH); //Подаем напряжение на датчик DHT
  Serial.begin(9600); //Скорость передачи данных

  radio.begin(); //делаем инициализацию.
  radio.setChannel(120); // канал для передачи данных (0-127).
  radio.setDataRate(RF24_1MBPS); //указываем на какой скорости будут общаться модули.
  radio.setPALevel(RF24_PA_HIGH); //указываем мощность передатчика.  
  radio.openReadingPipe(1,pipe); //Можно открыть все трубы разом. 
  radio.startListening(); //включаем приемник и начинаем слушать трубу. 
}

void loop(void) {
  ///////////////////////////прием данных от NRF24L01////////////////////
  float data [8];  //создаем массив из 2-х переменных. 
  if (radio.available()){ //проверяем не пришло ли чего в буфер. 
  radio.read(&data, sizeof(data)); //читаем массив и указываем сколько пришло. 
  Serial.println("sensor1");
  Serial.println(data[0]); //выводим данные в сериал порт для проверки. 
  Serial.println("sensor2");
  Serial.println(data[1]); //выводим данные в сериал порт для проверки. 
  Serial.println("sensor3");
  Serial.println(data[2]); //выводим данные в сериал порт для проверки. 
  Serial.println("sensor4");
  Serial.println(data[3]); //выводим данные в сериал порт для проверки. 
  Serial.println("sensor5");
  Serial.println(data[4]); //выводим данные в сериал порт для проверки. 
  Serial.println("sensor6");
  Serial.println(data[5]); //выводим данные в сериал порт для проверки. 
  Serial.println("DHT11-%");
  Serial.println(data[6]); //выводим данные в сериал порт для проверки.
  Serial.println("DHT11-t");
  Serial.println(data[7]); //выводим данные в сериал порт для проверки.
  Serial.println(); //пробел.  
}

  
  float h1 = sens.readHumidity(8); //Присвоение значений температуры для DHT
  float t1 = sens.readTemperature(8); //Присвоение значений влажности для DHT
    
  //myNextion.setComponentText("t0", String(t1)); //отправка данных на дисплей Nextion от датчика DHT1
  //delay(200);
  //myNextion.setComponentText("t1", String(h1)); //отправка данных на дисплей Nextion от датчика DHT1
  //delay(200);
  myNextion.setComponentText("t2", String(t1)); //отправка данных на дисплей Nextion от датчика DHT2
  delay(200);
  myNextion.setComponentText("t3", String(h1)); //отправка данных на дисплей Nextion от датчика DHT2
  delay(200);
  myNextion.setComponentText("t4", String(data[7])); //отправка данных на дисплей Nextion от датчика DHT3
  delay(200);
  myNextion.setComponentText("t5", String(data[6])); //отправка данных на дисплей Nextion от датчика DHT3
  delay(200);
  //myNextion.setComponentText("t6", String(t1)); //отправка данных на дисплей Nextion от датчика DHT4
  //delay(200);
  //myNextion.setComponentText("t7", String(h1)); //отправка данных на дисплей Nextion от датчика DHT4
  //delay(200);
  //myNextion.setComponentText("t8", String(t1)); //отправка данных на дисплей Nextion от датчика DHT5
  //delay(200);
  //myNextion.setComponentText("t9", String(h1)); //отправка данных на дисплей Nextion от датчика DHT5
  //delay(200);

//Отправка данных температур бойлеров на дисплей Nextion, стр. 1
 
  myNextion.setComponentText("t10", String(data[0])); //отправка данных на дисплей Nextion от датчика DS18B20-1
  delay(200);
  myNextion.setComponentText("t11", String(data[1])); //отправка данных на дисплей Nextion от датчика DS18B20-2
  delay(200);
  myNextion.setComponentText("t12", String(data[2])); //отправка данных на дисплей Nextion от датчика DS18B20-3
  delay(200);
  myNextion.setComponentText("t13", String(data[3])); //отправка данных на дисплей Nextion от датчика DS18B20-4
  delay(200);
  myNextion.setComponentText("t14", String(data[4])); //отправка данных на дисплей Nextion от датчика DS18B20-5
  delay(200);
  myNextion.setComponentText("t15", String(data[5])); //отправка данных на дисплей Nextion от датчика DS18B20-6
  delay(200);
  Serial.println(t1);
  Serial.println(h1); 
 }

Ну вот пока что все. Спасибо за внимание. Ардуинки закончились, буду ждать новых что бы подключить остальные необходимые датчики. 

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

В чем проявляется проблемма в сборке приемника: при включении питания идет сброс данных на дисплее Nextion, он раз в секунду "обнуляется", не работает приемник NRF24L01, данные с датчика DHT11, подключенного на ардуине - передаются на дисплей, но т.к. их показания в третьей вклидке (на третьей странице) видно их долю секунды, потом дисплей сбрасывается на главную, словно раз в секнду происходит короткое замыкание. 

Для решения проблеммы исключил причины не дающие работать принимаемой части: питание - в норме, передача данных на дисплей Nextion - в норме, питание дисплея nextion  и возможные помехи - в норме. 

Нашел причину не желания работать всей системы в целом, при включении питания в принимаемой части - при отключении приемника NRF24L01 все заработало. Теперь буду действовать методом тыка. Во первых не буду подключать канал MOSI, т.к. он для приема данных, а я на неко ничего не отправляю и попробую переназначить выводы CE и CSW. Много библиотек подключенно, что то с чем то конфликтует видимо...г

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Опытным путем выявил чт проблемма с 13-м мином. Отключаю 13-й пин, сапускается сисема и ардуинка, через пару секунд подключаю 13-й ин (SCN - выбор режима приема-передачи) и все работает как положенно.  

Эту ветку уже видимо ни кто не читает, поищу профильную тему, спрошу там наверное. 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Zombrero пишет:
Если есть что подсказать - буду благодарен.

мне кажется что можно без лобовых решений и покороче

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <OneWire.h>  //библиотека работы шины для ds18b20.
#include <DallasTemperature.h> //библиотека для считывания температуры с ds18b20.
#include <dht11.h> //подключаем библиотеку DHT11.
dht11 DHT; //что то назначаем для DHT11.
#define DHT11_PIN 4 //указываем пин на который подключен датчик DHT11. 

const uint64_t pipe = 0xF0F1F2F3F4LL; //идентификатор передачи данных.
RF24 radio(9, 8); //указываем пины подключения передатчика.
OneWire  oneWire(2);  //указываем пины для подключения датчиков ds18b20.
DallasTemperature ds(&oneWire); //активируем библиотеку ds.

DeviceAddress sensor[6] = {0x28, 0xFF, 0x90, 0x41, 0x81, 0x16, 0x3, 0xFD}, //адрес первого датчика.
                          {0x28, 0xFF, 0x7E, 0xA9, 0x83, 0x16, 0x3, 0x9F}, //адрес второго датчика.
                          {0x28, 0xFF, 0x70, 0xA9, 0x83, 0x16, 0x3, 0x3D}, //адрес третьего датчика.
                          {0x28, 0xFF, 0x34, 0x58, 0x82, 0x16, 0x4, 0x1D}, //адрес третьего датчика.
                          {0x28, 0xFF, 0x98, 0xEC, 0x81, 0x16, 0x3, 0xF7}, //адрес третьего датчика.
                          {0x28, 0xFF, 0x83, 0x1B, 0x85, 0x16, 0x5, 0x4F}; //адрес третьего датчика.




void setup() {
  Serial.begin(9600); //открываем пот обмена данными.
  ds.begin();  //запускаем функцию считывания температуры ds.
  radio.begin(); //делаем инициализацию.
  delay(2); //ждем реакции модуля передачи данных.
  radio.setChannel(9); // канал для передачи данных (0-127).
  radio.setDataRate(RF24_1MBPS); //указываем на какой скорости будут общаться модули.
  radio.setPALevel(RF24_PA_HIGH); //указываем мощность передатчика.
  radio.openWritingPipe(pipe); // открываем трубу на передачу.
}


void loop() {
  ds.requestTemperatures(); // считываем температуру с датчиков
  float chk; //создаем переменную для показаний с датчика DHT11.
  chk = DHT.read(DHT11_PIN);    // читаем данные с датчика DHT11.
  float data [8];  //создаем массив из 8-ми переменных.
  for (byte i = 0; i < 6; i++) {
    data[i] = float(ds.getTempC(sensor[i]));
  };
  data[6] = float(DHT.humidity); //присваиваем второму значению массива данные влажности с DHT11 (за один раз можно отправить до 32 байт).
  data[7] = float(DHT.temperature); //присваиваем второму значению массива данные температуры с DHT11 (за один раз можно отправить до 32 байт).
  radio.write(&data, sizeof(data)); // передаем массив и его размер.
  for (byte i = 0; i < 8; i++) {
    Serial.println(data[i]); //выводим данные в сериал порт для проверки.
  };
  Serial.println(); //пробел.
  delay(500); //ждем пол секунды.
}

 

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Красиво. То же верно. Возьму на заметку. С лобовыми решениями новичку проще :) Но мне нравится Ваш вариант. Спасибо. 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

я там скобочки не поставил, а то скажите потом не работает ....


DeviceAddress sensor[6] = { {0x28, 0xFF, 0x90, 0x41, 0x81, 0x16, 0x3, 0xFD}, //адрес первого датчика.

                          {0x28, 0xFF, 0x7E, 0xA9, 0x83, 0x16, 0x3, 0x9F}, //адрес второго датчика.

                          {0x28, 0xFF, 0x70, 0xA9, 0x83, 0x16, 0x3, 0x3D}, //адрес третьего датчика.

                          {0x28, 0xFF, 0x34, 0x58, 0x82, 0x16, 0x4, 0x1D}, //адрес третьего датчика.

                          {0x28, 0xFF, 0x98, 0xEC, 0x81, 0x16, 0x3, 0xF7}, //адрес третьего датчика.

                          {0x28, 0xFF, 0x83, 0x1B, 0x85, 0x16, 0x5, 0x4F} }; //адрес третьего датчика.

 

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

xDriver пишет:

я там скобочки не поставил, а то скажите потом не работает ....

Спасибо :) А то действительно смотрю и думаю: что то там не так :))) 

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Zombrero пишет:

В чем проявляется проблемма в сборке приемника: при включении питания идет сброс данных на дисплее Nextion, он раз в секунду "обнуляется", не работает приемник NRF24L01, данные с датчика DHT11, подключенного на ардуине - передаются на дисплей, но т.к. их показания в третьей вклидке (на третьей странице) видно их долю секунды, потом дисплей сбрасывается на главную, словно раз в секнду происходит короткое замыкание. 

Для решения проблеммы исключил причины не дающие работать принимаемой части: питание - в норме, передача данных на дисплей Nextion - в норме, питание дисплея nextion  и возможные помехи - в норме. 

Нашел причину не желания работать всей системы в целом, при включении питания в принимаемой части - при отключении приемника NRF24L01 все заработало. Теперь буду действовать методом тыка. Во первых не буду подключать канал MOSI, т.к. он для приема данных, а я на неко ничего не отправляю и попробую переназначить выводы CE и CSW. Много библиотек подключенно, что то с чем то конфликтует видимо...г

Проблему решил по совету пользователя здесь:http://arduino.ru/forum/apparatnye-voprosy/nrf24l01#comment-255080 На питание премника впаял электролитический конденсатор на 10 микрофарад. Проблема ушла.

Efendis
Efendis аватар
Offline
Зарегистрирован: 25.01.2017

Приветствую, тоже хочу сделать метео станцию, у меня есть уже свой готовый скетч, но он не опробован, так как пока мешает работа, и только сегодня получил вторую нану для взаимодействия друг с другом ардуино, но у меня еще реализовано исключение самонагрева ds18b20, так как есть статьи о том что этот датчик нагревается и искажает показания в плюс. Предлагаю тут поддержать проект до его полного отшлифофывания.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Efendis пишет:
у меня есть уже свой готовый скетч, но он не опробован

Это сильно! :)

Efendis пишет:
Предлагаю тут поддержать проект до его полного отшлифофывания.

Не вопрос! Щас Клапауций придёт - поддержит!

 

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Efendis пишет:
но у меня еще реализовано исключение самонагрева ds18b20, так как есть статьи о том что этот датчик нагревается и искажает показания в плюс.

У меня в скетче для передатчика последней строкой стоит задержка на пол секунды. Датчики не греются, тестировал часов 5-8, изменений не было.

Могу выложить финальную версию с подключением -4 х отдельных передатчиков на один приемник.

В принципе проект уже протестирован. Осталось дождаться пару деталюшек из Китая, вот-вот должен приехать шлейф для модуля управления реле. Тогда могу и видос выложить готового проекта, если кому интересно.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

с этого конденсатора и нужно было начинать. много раз про него писали

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

jeka_tm пишет:

с этого конденсатора и нужно было начинать. много раз про него писали

А мне вот не попалась на глаза эта инфа... Что только не пробовал. Выход SCK уже и резистором подтягивал к массе и кондер к массе, и кондер с резистором к массе... уже хотел кнопку ставить, что бы отклуючать этот пин при запуске в ручную :)))) 

А 47МФд - для неко много будет или то же норм? 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

хз. я 10мкф керамику обычно паяю размера 0805. хорошо подходит

Efendis
Efendis аватар
Offline
Зарегистрирован: 25.01.2017

Вот мой проект, ардуино с дисплеем, датчиками и временем на кухне будет в коробочке, датчик1 температура на кухне, датчик2 температура за окном.

Все это дело отображается на дисплее 1602 и передается по NRFке в комнату где вторая ардуина со своими дачиками принимает и отображает все это на дисплее 1604 (Дисплей пока не пришел)  вместе с показаниями в комнате, дальше идет реализация датчика движения на подсветку экрана, чтобы экран подсвечивался при наличии движения в комнате и ночью не освещал всю комнату. Кстати очень удобно. В коде приема это все пока закоментировано, но работает. В данном случае изза отсутствия втрого дисплея данные получаю тестово на комп.

По поводу перегрева DS18B20, соглашусь спорный вопрос, но все равно оставлю так, это не мешает и занимает всего лишь один цифровой пин.

Передающая сторона:

#include <SPI.h>                          // библиотека для работы с шиной SPI
#include "nRF24L01.h"                     // библиотека радиомодуля
#include "RF24.h"                         // ещё библиотека радиомодуля
#include <Wire.h>                         // Подключаем библиотеку для работы с I2C-устройствами
#include <OneWire.h>                      // Подключаем библиотеку для работы с OneWire-устройствами
#include <DS3231.h>                       // Подключаем библиотеку для работы с модулем DS3231
#include <LiquidCrystal_I2C.h>            // Подключаем библиотеку для работы с модулем LCD1602_I2C
#include <DallasTemperature.h>            // Подключаем библиотеку для работы с модулем DS18B20

DS3231 clock;                         // Связываем объект clock с библиотекой DS3231
RTCDateTime DateTime;                 // Определяем переменную DateTime, как описанную структурой RTCDateTime (структура описана в библиотеке DS3231.h)

#define ONE_WIRE_BUS 4                // Указываем пин подключения data-ввода данных с датчика температуры
#define term_power 7                 // Указываем пин подключения питания датчика температуры

LiquidCrystal_I2C lcd(0x27,16,2);     // Устанавливаем дисплей
OneWire oneWire(ONE_WIRE_BUS);        // Сообщаем библиотеке об устройстве, работающем по протоколу 1-Wire
DallasTemperature sensors(&oneWire);  // Связываем функции библиотеки DallasTemperature с нашим 1-Wire устройством (DS18B20)

DeviceAddress sensor1 = {0x28, 0xEE, 0xEE, 0x46, 0x23, 0x16, 0x01, 0xDD}; // Адрес датчика 1
DeviceAddress sensor2 = {0x28, 0xEE, 0xF6, 0x53, 0x23, 0x16, 0x01, 0x26}; // Адрес датчика 2

RF24 radio(9, 10);                                                          // "создать" модуль на пинах 9 и 10
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

float data[2];

void setup() {
Wire.begin();
lcd.init();
lcd.backlight();                // Включаем подсветку дисплея
clock.begin();                  // Инициализируем DS3231
sensors.begin();                // Запускаем библиотеку измерения температуры
pinMode(term_power, OUTPUT);    // Определяем пин подключения питания датчика температуры

// Работа радиомодуля --------------------------------------------------------------------------------------------------------
  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
  radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp(); //начать работу
  radio.stopListening();  //не слушаем радиоэфир, мы передатчик
// ----------------------------------------------------------------------------------------------------------------------------
}

//Блок измерения датчика DS18B20 sensor 1
//----------------------------------------------------------------
float temp0()
{
      digitalWrite(term_power, HIGH);                // Включаем питание датчика температуры
      delay(100);                                    // Задержка перед первым измерением 
      sensors.requestTemperatures();                 // Запрос на измерение температуры (1-й ошибочный)
      delay(500);                                    // Задержка перед поторным измерением
      sensors.requestTemperatures();                 // Запрос на измерение температуры (повторный)
      float t0 = float(sensors.getTempC(sensor1));   // Получаем значение температуры
      //digitalWrite(term_power, LOW);               // Отключаем питание датчика температуры
      //delay(1000);                                 // Задержка, чтобы датчик не нагревался от частых измерений
      return(t0);                                    // Возвращаем значение температуры в место вызова функции
}
//Блок измерения датчика DS18B20 sensor 2
//----------------------------------------------------------------
float temp1()
{
      // digitalWrite(term_power, HIGH);              // Включаем питание датчика температуры
      delay(300);                                  // Задержка перед первым измерением 
      sensors.requestTemperatures();                 // Запрос на измерение температуры (1-й ошибочный)
      delay(500);                                    // Задержка перед поторным измерением
      sensors.requestTemperatures();                 // Запрос на измерение температуры (повторный)
      float t1 = float(sensors.getTempC(sensor2));   // Получаем значение температуры
      digitalWrite(term_power, LOW);                 // Отключаем питание датчика температуры
      // delay(50000);                               // Задержка, чтобы датчик не нагревался от частых измерений
      return(t1);                                    // Возвращаем значение температуры в место вызова функции
}

void loop()
{
          data[0] = temp0();
          data[1] = temp1();
    
          radio.write(&data, sizeof(data));

          
          DateTime = clock.getDateTime();                       // Заполняем DateTime значениями, полученными при запросе текущего времени
          
          lcd.setCursor(11, 0);
          lcd.print(temp0(),1);
          lcd.print("C ");

          lcd.setCursor(0, 0);
          lcd.print(temp1(),1);
          lcd.print("C ");
          
          lcd.setCursor(0, 1); 
          lcd.print(clock.dateFormat("H.i ", DateTime));     //  Выводим отформатированное время
          
          lcd.setCursor(8, 1);                                       
          lcd.print(clock.dateFormat("d.m.y ", DateTime));   //  Выводим отформатированную дату

delay(60000);
}
//----------------------------------------------------------------

Принимающая сторона:

#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Wire.h>                         // Подключаем библиотеку для работы с I2C-устройствами
#include <LiquidCrystal_I2C.h>            // Подключаем библиотеку для работы с модулем LCD1602_I2C
//DS3231 clock;                         // Связываем объект clock с библиотекой DS3231
//RTCDateTime DateTime;                 // Определяем переменную DateTime, как описанную структурой RTCDateTime (структура описана в библиотеке DS3231.h)
//LiquidCrystal_I2C lcd(0x27, 16, 2);   // Устанавливаем дисплей
//long Temperature = 0, Pressure = 0;

//unsigned long old_time = 0;        // предыдущее время
//unsigned long current_time = 0;    // текущие время

float temp0, temp1;
// float Temperature = 0, Pressure = 0;
float data[2];

RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно


byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

void setup() {
  Serial.begin(9600); //открываем порт для связи с ПК
  Wire.begin();
//  lcd.init();
//  clock.begin();                  // Инициализируем DS3231
//  pinMode(inputPin, INPUT);       // объявляем датчик в качестве INPUT

  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openReadingPipe(1, address[0]);     //хотим слушать трубу 0
  radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp(); //начать работу
  radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
}

void loop() {
  byte pipeNo;
  while ( radio.available(&pipeNo)) {  // слушаем эфир со всех труб
    radio.read( &data, sizeof(data) );         // чиатем входящий сигнал

    temp0 = data[0];
    temp1 = data[1];
  
   Serial.println(temp0,1);
   Serial.println(temp1,1);
    
    
    //Temperature = in_data[2];
    //Pressure = in_data[3];

    //DateTime = clock.getDateTime();                       // Заполняем DateTime значениями, полученными при запросе текущего времени

    //lcd.setCursor(0, 0);
    //lcd.print(Temperature * 0.1, 1);
    // lcd.print("C ");

    //lcd.setCursor(5, 0);
    // lcd.print(temp1, round(1));
    //lcd.print("C ");

   // lcd.setCursor(10, 0);
   // lcd.print(temp2, round(1));
   // lcd.print(" C ");

   // lcd.setCursor(0, 1);
   // lcd.print(Pressure / 133.3, round(1));
    //lcd.print("mm");

   // lcd.setCursor(8, 1);
   // lcd.print(clock.dateFormat("d.m.y", DateTime));   //  Выводим отформатированную дату
delay(60000);
 }
}

 // val = digitalRead(inputPin);  // считываем значение с датчика
 // if (val == HIGH) // проверяем, соответствует ли считанное значение HIGH
 // {
 //   lcd.backlight();  // включаем подсветку

 //   if (pirState == LOW) {
//    }
//  } else {
//    lcd.noBacklight(); // выключаем подсветку
//  }
//  delay(300);
//}

 

P.S. В теме ардуино всего неделю, все взято с примеров других источников. Так что Любые палки в свой огород приму только с положительной стороны.

Efendis
Efendis аватар
Offline
Зарегистрирован: 25.01.2017

Еще реализована отдельная задержка для опроса датчиков температуры в отличии от времени (300мс) опроса датчика движения.

unsigned long old_time = 0;        // предыдущее время
unsigned long current_time = 0;    // текущие время

void loop()
{
//Блок работы опроса датчика
//----------------------------------------------------------------
current_time = millis(); // получаем текущие время
if (old_time == 0 || current_time < old_time || current_time >= (old_time + 60000))
{
        
// сдесь код опроса датчиков и NRFки          
                                     
          
old_time = current_time;
}
//----------------------------------------------------------------

 

Efendis
Efendis аватар
Offline
Зарегистрирован: 25.01.2017

Всё это рабочий код, только рабочий, как закончу проэкт, выложу полностью отшлефованый финальный код.

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

У меня в проекте не полный феншуй: при работе системы, если отключить один из приемников - то на дисплее замирают последние данные. Нет информации о точ что то либо отключено... надо как то это исправить - т.е. если ничего не приходит в текстовое поле посылать текст NoSig, например... 

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016
Наверное это должно выгядеть так: 
uint8_t pipeNum = 0;
  if (radio.available(&pipeNum)){ // проверяем не пришло ли чего в буфер.
    if(pipeNum == 1){
       float data [8];  //создаем массив из 2-х переменных. 
       radio.read(&data, sizeof(data)); //читаем массив и указываем сколько пришло. 
       myNextion.setComponentText("t10", String(data[0])); //отправка данных на дисплей Nextion от датчика DS18B20-1
       delay(200);
       myNextion.setComponentText("t11", String(data[1])); //отправка данных на дисплей Nextion от датчика DS18B20-2
       delay(200);
       ..... }
   else 
      myNextion.setComponentText("t10", String(NoSig)); //отправка данных на дисплей Nextion от датчика DS18B20-1
       delay(200);
       myNextion.setComponentText("t11", String(NoSig)); //отправка данных на дисплей Nextion от датчика DS18B20-2
       delay(200);
       ......}
 
Хотя нет... блин, надо подумать... 
Наверное нужно на дисплее поставить обновление страницы - если данные не будут пступать - они после обновленя не будут отображаться. 
 
Efendis
Efendis аватар
Offline
Зарегистрирован: 25.01.2017

А что часто сбоит передача?

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Efendis пишет:
А что часто сбоит передача?

Нет, но мне важно видеть данные когда необходимо и они всегда должны быть актуальны, что бы понимать что происходит и что нужно предпринять. Немного изменил скетч, в принципе для меня стало даже лучше. 

Efendis
Efendis аватар
Offline
Зарегистрирован: 25.01.2017

Привет всем, никак не могу реализовать так. На болконе сел аккум с передающими данными погоды, соответственно данные не передаются, а на десплее приемной части висит тупо старая информация, кто нить подскажите сделать так чтоб если инфа не пришла писалось что нибудь ну типа noTemp.

Как то нужно реализовать проверку, а как не соображу.

Код приемника:

#include <SPI.h>                                                                      // Библиотека для работы с шиной SPI
#include "nRF24L01.h"                                                                 // Библиотека радиомодуля
#include "RF24.h"                                                                     // Ещё библиотека радиомодуля
#include <Wire.h>                                                                     // Подключаем библиотеку для работы с I2C-устройствами
#include <LiquidCrystal_I2C.h>                                                        // Подключаем библиотеку для работы с модулем LCD1602_I2C
#include <BMP085.h>

//************************************************************************************************************************************************
// Битовая маска символа
byte temp_cel[8] =
{
  0b00000,
  0b01000,
  0b10100,
  0b01000,
  0b00011,
  0b00010,
  0b00011,
}; 

byte mmHg[8] =
{
  B00000,
  B00100,
  B00110,
  B00100,
  B00100,
  B01110,
  B01110,
}; 
//***********************************************************************************************************************************************

BMP085 dps = BMP085();                                                                // Устанавливаем датчик давления
LiquidCrystal_I2C lcd(0x27, 16, 2);                                                   // Устанавливаем дисплей

long Temperature = 0, Pressure = 0;                                                   // Создаем переменные для хранения температуры и давления из BMP185 

int inputPin = 2;                                                                     // Инициализируем пин для получения сигнала от пироэлектрического датчика движения
int pirState = HIGH;                                                                  // Начинаем работу программы, предполагая, что движение есть, чтобы небыло задержки включения дисплея.
int PIR = 0;                                                                          // Переменная для чтения состояния пина
unsigned long old_time = 0;                                                           // Предыдущее время
unsigned long current_time = 0;                                                       // Текущие время

float temp0, temp1;                                                                   // Создаем переменные для хранения температуры
float data[2];                                                                        // Создаем колическо ячеек хранения данных

RF24 radio(9, 10);                                                                    // Создаем модуль на пинах 9 и 10 Для Уно


byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};           // Возможные номера труб

  void setup()
  {
  Wire.begin();                                                                       // Включаем работу с I2C-устройствами
  dps.init();                                                                         // Инициализируем датчик давления 
  lcd.init();                                                                         // Инициализируем дисплей
  lcd.clear();
  lcd.createChar(1, temp_cel);                                                        // Создаем символ под номером 1 температуры   
  lcd.createChar(2, mmHg);                                                            // Создаем символ под номером 2 давление
  radio.begin();                                                                      // Активируем nRF24L01 модуль
  radio.setAutoAck(1);                                                                // Режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);                                                            // Время между попыткой достучаться, число попыток
  radio.enableAckPayload();                                                           // Разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);                                                           // Размер пакета, в байтах

  radio.openReadingPipe(1, address[0]);                                               // Хотим слушать трубу 0
  radio.setChannel(0x60);                                                             // Выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX);                                                     // Уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS);                                                   // Скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp();                                                                    // Включаем (начинаем) nRF24L01 работу
  radio.startListening();                                                             // Начинаем слушать эфир, мы приёмный модуль
}

void loop()
{         
//Блок работы опроса датчика
//----------------------------------------------------------------
current_time = millis();                                                              // Получаем текущие время
if (old_time == 0 || current_time < old_time || current_time >= (old_time + 15000))   // Выполняется цикл 15000мс
{         
          dps.getPressure(&Pressure);
          dps.getTemperature(&Temperature);

          lcd.setCursor(0, 0);
          lcd.print(Temperature*0.1,1);
          lcd.print("\1");                   // Выводим (символ под номером 1) - "\1"
          lcd.print(" ");

          lcd.setCursor(10, 0);  
          lcd.print(Pressure/133.3,1);
          lcd.print("\2");
         // lcd.print("mm");
    
  byte pipeNo;
  while ( radio.available(&pipeNo))                                                     // Слушаем эфир со всех труб
  { 
  radio.read( &data, sizeof(data) );                                                    // Чиатем входящий сигнал
  }
    temp0 = data[0];
    temp1 = data[1];
                
    lcd.setCursor(0, 1);
       
    lcd.setCursor(0, 1);
    lcd.print(temp0,1);
    lcd.print("\1");                   // Выводим (символ под номером 1) - "\1"
    lcd.print(" ");

    lcd.setCursor(11, 1);
    lcd.print(temp1,1);
    lcd.print("\1");                   // Выводим (символ под номером 1) - "\1"
    lcd.print(" ");

old_time = current_time;
}
//----------------------------------------------------------------

PIR = digitalRead(inputPin);                                                            // Считываем значение с датчика
if (PIR == HIGH)                                                                        // Проверяем, соответствует ли считанное значение HIGH
{
lcd.backlight();                                                                        // Включаем подсветку на LCD1602
if (pirState == LOW)                                                                    // Если сигнал с PIR датчика пропал то
{
}
} else {
lcd.noBacklight();                                                                       // Выключаем подсветку на LCD1602
}
delay(300);
}

 

Код передатчика:

#include <SPI.h>                          // библиотека для работы с шиной SPI
#include "nRF24L01.h"                     // библиотека радиомодуля
#include "RF24.h"                         // ещё библиотека радиомодуля
#include <Wire.h>                         // Подключаем библиотеку для работы с I2C-устройствами
#include <OneWire.h>                      // Подключаем библиотеку для работы с OneWire-устройствами
#include <DallasTemperature.h>            // Подключаем библиотеку для работы с модулем DS18B20

#define ONE_WIRE_BUS 4                // Указываем пин подключения data-ввода данных с датчика температуры
#define term_power 7                  // Указываем пин подключения питания датчика температуры

OneWire oneWire(ONE_WIRE_BUS);        // Сообщаем библиотеке об устройстве, работающем по протоколу 1-Wire
DallasTemperature sensors(&oneWire);  // Связываем функции библиотеки DallasTemperature с нашим 1-Wire устройством (DS18B20)

DeviceAddress sensor1 = {0x28, 0xEE, 0xEE, 0x46, 0x23, 0x16, 0x01, 0xDD}; // Адрес датчика 1
DeviceAddress sensor2 = {0x28, 0xEE, 0xF6, 0x53, 0x23, 0x16, 0x01, 0x26}; // Адрес датчика 2

RF24 radio(9, 10);                                                          // "создать" модуль на пинах 9 и 10
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

float data[2];

void setup() {
//Serial.begin(9600);             //открываем порт для связи с ПК
Wire.begin();
sensors.begin();                // Запускаем библиотеку измерения температуры
pinMode(term_power, OUTPUT);    // Определяем пин подключения питания датчика температуры

// Работа радиомодуля --------------------------------------------------------------------------------------------------------
  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
  radio.setChannel(0x60);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp(); //начать работу
  radio.stopListening();  //не слушаем радиоэфир, мы передатчик
// ----------------------------------------------------------------------------------------------------------------------------
}

//Блок измерения датчика DS18B20 sensor 1
//----------------------------------------------------------------
float temp0()
{
      digitalWrite(term_power, HIGH);                // Включаем питание датчика температуры
      delay(100);                                    // Задержка перед первым измерением 
      sensors.requestTemperatures();                 // Запрос на измерение температуры (1-й ошибочный)
      delay(500);                                    // Задержка перед поторным измерением
      sensors.requestTemperatures();                 // Запрос на измерение температуры (повторный)
      float t0 = float(sensors.getTempC(sensor1));   // Получаем значение температуры
      //digitalWrite(term_power, LOW);               // Отключаем питание датчика температуры
      //delay(1000);                                 // Задержка, чтобы датчик не нагревался от частых измерений
      return(t0);                                    // Возвращаем значение температуры в место вызова функции
}
//Блок измерения датчика DS18B20 sensor 2
//----------------------------------------------------------------
float temp1()
{
      // digitalWrite(term_power, HIGH);              // Включаем питание датчика температуры
      delay(300);                                  // Задержка перед первым измерением 
      sensors.requestTemperatures();                 // Запрос на измерение температуры (1-й ошибочный)
      delay(500);                                    // Задержка перед поторным измерением
      sensors.requestTemperatures();                 // Запрос на измерение температуры (повторный)
      float t1 = float(sensors.getTempC(sensor2));   // Получаем значение температуры
      digitalWrite(term_power, LOW);                 // Отключаем питание датчика температуры
      // delay(50000);                               // Задержка, чтобы датчик не нагревался от частых измерений
      return(t1);                                    // Возвращаем значение температуры в место вызова функции
}

void loop()
{
          data[0] = temp0();
          data[1] = temp1();
    
          radio.write(&data, sizeof(data));
          //Serial.println(temp0(),1);
          //Serial.println(temp1(),1);
         
delay(30000);
}

 

Short Circuit
Short Circuit аватар
Offline
Зарегистрирован: 17.05.2015

Zombrero пишет:

Кстати, при подключении датчика ds18b20 будьте аккуратны. Если при подключении он включается в режиме "кипятилькик", значит перепутали плюс с минусом. В интернете есть разные схемы и у меня при неправильном подключении он разогрелся до 100 градусов... 

потом такие обычно дохнут в процессе работы, поэтому лучше не кипятить..

Efendis
Efendis аватар
Offline
Зарегистрирован: 25.01.2017

Окончательный код с проверкой пришли ли данные. Если данные не приходят в течении минуты, строка затирается. Тем самым показывая что данных от передатчика нет.

#include <SPI.h>                                                                      // Библиотека для работы с шиной SPI
#include "nRF24L01.h"                                                                 // Библиотека радиомодуля
#include "RF24.h"                                                                     // Ещё библиотека радиомодуля
#include <Wire.h>                                                                     // Подключаем библиотеку для работы с I2C-устройствами
#include <LiquidCrystal_I2C.h>                                                        // Подключаем библиотеку для работы с модулем LCD1602_I2C
#include <BMP085.h>

//************************************************************************************************************************************************
// Битовая маска символа
byte temp_cel[8] =
{
  0b00000,
  0b01000,
  0b10100,
  0b01000,
  0b00011,
  0b00010,
  0b00011,
};

byte mmHg[8] =
{
  B00000,
  B00100,
  B00110,
  B00100,
  B00100,
  B01110,
  B01110,
};
//***********************************************************************************************************************************************

BMP085 dps = BMP085();                                                                // Устанавливаем датчик давления
LiquidCrystal_I2C lcd(0x27, 16, 2);                                                   // Устанавливаем дисплей

long Temperature = 0, Pressure = 0;                                                   // Создаем переменные для хранения температуры и давления из BMP185

int inputPin = 2;                                                                     // Инициализируем пин для получения сигнала от пироэлектрического датчика движения
int pirState = HIGH;                                                                  // Начинаем работу программы, предполагая, что движение есть, чтобы небыло задержки включения дисплея.
int PIR = 0;                                                                          // Переменная для чтения состояния пина
unsigned long old_time = 0;                                                           // Предыдущее время
unsigned long current_time = 0;                                                       // Текущие время

float temp0, temp1;                                                                   // Создаем переменные для хранения температуры
float data[2];                                                                        // Создаем колическо ячеек хранения данных

RF24 radio(9, 10);                                                                    // Создаем модуль на пинах 9 и 10 Для Уно

byte wachdog = 0;
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};           // Возможные номера труб

void setup()
{
  Wire.begin();                                                                       // Включаем работу с I2C-устройствами
  dps.init();                                                                         // Инициализируем датчик давления
  lcd.init();                                                                         // Инициализируем дисплей
  lcd.clear();
  lcd.createChar(1, temp_cel);                                                        // Создаем символ под номером 1 температуры
  lcd.createChar(2, mmHg);                                                            // Создаем символ под номером 2 давление
  radio.begin();                                                                      // Активируем nRF24L01 модуль
  radio.setAutoAck(1);                                                                // Режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);                                                            // Время между попыткой достучаться, число попыток
  radio.enableAckPayload();                                                           // Разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);                                                           // Размер пакета, в байтах

  radio.openReadingPipe(1, address[0]);                                               // Хотим слушать трубу 0
  radio.setChannel(0x60);                                                             // Выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX);                                                     // Уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS);                                                   // Скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS //должна быть одинакова на приёмнике и передатчике! при самой низкой скорости имеем самую высокую чувствительность и дальность!!

  radio.powerUp();                                                                    // Включаем (начинаем) nRF24L01 работу
  radio.startListening();                                                             // Начинаем слушать эфир, мы приёмный модуль
}

void loop()
{  
  byte pipeNo;
  while ( radio.available(&pipeNo))                                                     // Слушаем эфир со всех труб
  {
    wachdog = 0;
    radio.read( &data, sizeof(data) );                                                    // Чиатем входящий сигнал
  }
  {
    temp0 = data[0];
    temp1 = data[1];
  }
  //Блок работы опроса датчика
  //----------------------------------------------------------------
  current_time = millis();                                                              // Получаем текущие время
  if (old_time == 0 || current_time < old_time || current_time >= (old_time + 15000))   // Выполняется цикл 15000мс
  {
    wachdog++;
    dps.getPressure(&Pressure);
    dps.getTemperature(&Temperature);
    
    lcd.setCursor(0, 0);
    lcd.print(Temperature * 0.1, 1);
    lcd.print("\1");
    lcd.print(" ");

    lcd.setCursor(10, 0);
    lcd.print(Pressure / 133.3, 1);
    lcd.print("\2");

    lcd.setCursor(0, 1);
    lcd.print(temp0, 1);
    lcd.print("\1");
    lcd.print(" ");

    lcd.setCursor(11, 1);
    lcd.print(temp1, 1);
    lcd.print("\1");
    lcd.print(" ");

    if (wachdog >= 4)
    {
      lcd.setCursor(0, 1);
      lcd.print("                ");
    }
    old_time = current_time;
  }
  //----------------------------------------------------------------

  PIR = digitalRead(inputPin);                                                            // Считываем значение с датчика
  if (PIR == HIGH)                                                                        // Проверяем, соответствует ли считанное значение HIGH
  {
    lcd.backlight();                                                                        // Включаем подсветку на LCD1602
  } else
  {
    lcd.noBacklight();                                                                       // Выключаем подсветку на LCD1602
  }
  delay(300);
}

Помогли с решением: http://arduino.on.kg/forum/post/27/#p27

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Efendis пишет:

Окончательный код с проверкой пришли ли данные. Если данные не приходят в течении минуты, строка затирается. Тем самым показывая что данных от передатчика нет.

 

А я добавил условие: если данные приходят - он отправляет их на дисплей, если данных нет - пишет "NoSig". Таким образом у меня постоянное движение на дисплее - не совсем "офисно", но мне очень понравилось. 

Efendis
Efendis аватар
Offline
Зарегистрирован: 25.01.2017

Скинь рабочий скетч.

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Прием данных температур на первую ардуино и их посыл на дисплей:



#include <SPI.h> //библтотека для NRF24L01.
#include "nRF24L01.h" //библиотека для NRF24L01.
#include "RF24.h" //библиотека для NRF24L01.
#include <SoftwareSerial.h> //Подключения серийного порта ПК
#include <Nextion.h> //Подключем библиотеку для работы с дисплеем Nextion
#include <stDHT.h> //Подключаем библиотеку для работы с датчиками DHT11
   DHT sens(DHT11); //Указываем тип датчика DHT11 или DHT22
   SoftwareSerial nextion(6, 7);// Nextion TX на пин 6 (не подключен) и RX на пин 7.
   Nextion myNextion(nextion, 9600); //Скорость передачи данных на дисплей Nextion
   const uint64_t pipe01 = 0xF0F1F2F3F4LL; //первый идентификатор передачи данных (котельная).
   const uint64_t pipe02 = 0xF0F1F2F3F3LL; //второй идентификатор передачи данных (улица).
   //const uint64_t pipe03 = 0xF0F1F2F3F2LL; //второй идентификатор передачи данных (1-й эт.).
   //const uint64_t pipe04 = 0xF0F1F2F3F1LL; //второй идентификатор передачи данных (2-й э.).
   RF24 radio(9, 10); //указываем пины подключения передатчика.

int sensePin = A5; //Назначаем аналоговый пин 5 как вход датчика LED посветки.
int ledPin = A4; //Назанчаем аналоговый пин 4 как выход питания для LED подсветки. 

void setup() {
  myNextion.init(); // Для дисплея Nextion
  pinMode (8, INPUT); //Определяем пин как вход DHT
  digitalWrite(8, HIGH); //Подаем напряжение на датчик DHT
  Serial.begin(9600); //Скорость передачи данных
  analogReference(DEFAULT); 
  pinMode (ledPin, OUTPUT);


  radio.begin(); //делаем инициализацию.
  radio.setChannel(120); // канал для передачи данных (0-127).
  radio.setDataRate(RF24_1MBPS); //указываем на какой скорости будут общаться модули.
  radio.setPALevel(RF24_PA_HIGH); //указываем мощность передатчика.  
  radio.openReadingPipe(1,pipe01); //Открытие трубы на первый передатчик.
  radio.openReadingPipe(2,pipe02); //Открытие трубы на второй передатчик.
  //radio.openReadingPipe(3,pipe03); //Открытие трубы на второй передатчик.
  //radio.openReadingPipe(4,pipe04); //Открытие трубы на второй передатчик.
  radio.startListening(); //включаем приемник и начинаем слушать трубу. 
}

void loop(void) {

  int val = analogRead(sensePin); //Создаем переменную для датчика LED подсветки. 
  val = constrain(val, 50,700); //Обозначим границы показаний датчика LED подсветки. 
  int ledLevel = map(val, 50, 700, 255, 0); //Создаем интервал работы и и нтенсивность LED подсветки. 
  analogWrite(ledPin, ledLevel); //Прсваиваем зависимость показаний датчика и LED подсветки.

  ///////////////////////////прием данных от NRF24L01 в котельной////////////////////
 uint8_t pipeNum = 0;
  if (radio.available(&pipeNum)){ // проверяем не пришло ли чего в буфер.
    if(pipeNum == 1){
  float data [8];  //создаем массив из 2-х переменных. 
  radio.read(&data, sizeof(data)); //читаем массив и указываем сколько пришло. 
  Serial.println("sensor1");
  Serial.println(data[0]); //выводим данные в сериал порт для проверки. 
  Serial.println("sensor2");
  Serial.println(data[1]); //выводим данные в сериал порт для проверки. 
  Serial.println("sensor3");
  Serial.println(data[2]); //выводим данные в сериал порт для проверки. 
  Serial.println("sensor4");
  Serial.println(data[3]); //выводим данные в сериал порт для проверки. 
  Serial.println("sensor5");
  Serial.println(data[4]); //выводим данные в сериал порт для проверки. 
  Serial.println("sensor6");
  Serial.println(data[5]); //выводим данные в сериал порт для проверки. 
  Serial.println("DHT11-%");
  Serial.println(data[6]-10.0); //выводим данные в сериал порт для проверки.
  Serial.println("DHT11-t");
  Serial.println(data[7]); //выводим данные в сериал порт для проверки.
  Serial.println(); //пробел.  
  myNextion.setComponentText("t10", String(data[0])); //отправка данных на дисплей Nextion от датчика DS18B20-1
  delay(200);
  myNextion.setComponentText("t11", String(data[1])); //отправка данных на дисплей Nextion от датчика DS18B20-2
  delay(200);
  myNextion.setComponentText("t12", String(data[2])); //отправка данных на дисплей Nextion от датчика DS18B20-3
  delay(200);
  myNextion.setComponentText("t13", String(data[3])); //отправка данных на дисплей Nextion от датчика DS18B20-4
  delay(200);
  myNextion.setComponentText("t14", String(data[4])); //отправка данных на дисплей Nextion от датчика DS18B20-5
  delay(200);
  myNextion.setComponentText("t15", String(data[5])); //отправка данных на дисплей Nextion от датчика DS18B20-6
  delay(200);
  myNextion.setComponentText("t4",  String(data[7])); //отправка данных на дисплей Nextion от датчика DHT3
  delay(200);
  myNextion.setComponentText("t5",  String(data[6]-10.0)); //отправка данных на дисплей Nextion от датчика DHT3
  delay(200);

  if (pipeNum !=2 & pipeNum !=3 &pipeNum !=4) {
  myNextion.setComponentText("t10", String("NoSig")); //отправка данных на дисплей Nextion от датчика DS18B20-1
  myNextion.setComponentText("t11", String("NoSig")); //отправка данных на дисплей Nextion от датчика DS18B20-2
  myNextion.setComponentText("t12", String("NoSig")); //отправка данных на дисплей Nextion от датчика DS18B20-3
  myNextion.setComponentText("t13", String("NoSig")); //отправка данных на дисплей Nextion от датчика DS18B20-4
  myNextion.setComponentText("t14", String("NoSig")); //отправка данных на дисплей Nextion от датчика DS18B20-5
  myNextion.setComponentText("t15", String("NoSig")); //отправка данных на дисплей Nextion от датчика DS18B20-6
  myNextion.setComponentText("t4",  String("NoSig")); //отправка данных на дисплей Nextion от датчика DHT3
  myNextion.setComponentText("t5",  String("NoSig")); //отправка данных на дисплей Nextion от датчика DHT3
}
 }
  }
 
  
///////////////////////////прием данных от NRF24L01 на улице////////////////////
 if (radio.available(&pipeNum)){ // проверяем не пришло ли чего в буфер.
    if(pipeNum == 2){
  float data [2];  //создаем массив из 2-х переменных. 
  radio.read(&data, sizeof(data)); //читаем массив и указываем сколько пришло. 
  Serial.println("DHT11-2%");
  Serial.println(data[0]+10.0); //выводим данные в сериал порт для проверки. 
  Serial.println("DHT11-2C");
  Serial.println(data[1]+2.0); //выводим данные в сериал порт для проверки. 
  myNextion.setComponentText("t0", String(data[1]+2.0)); //отправка данных на дисплей Nextion от датчика DHT1
  delay(200);
  myNextion.setComponentText("t1", String(data[0]+10.0)); //отправка данных на дисплей Nextion от датчика DHT1
  delay(200);

  if (pipeNum !=1 & pipeNum !=3 &pipeNum !=4) {
  myNextion.setComponentText("t0", String("NoSig")); 
  myNextion.setComponentText("t1", String("NoSig"));
}
 }
  }
  

/*
///////////////////////////прием данных от NRF24L01 на 1-м эт. ////////////////////
 if (radio.available($pipeNum)){ // проверяем не пришло ли чего в буфер.
    if(pipeNum==3){
  float data [2];  //создаем массив из 2-х переменных. 
  radio.read(&data, sizeof(data)); //читаем массив и указываем сколько пришло. 
  Serial.println("DHT11-3%");
  Serial.println(data[0]); //выводим данные в сериал порт для проверки. 
  Serial.println("DHT11-3C");
  Serial.println(data[1]); //выводим данные в сериал порт для проверки. 
  myNextion.setComponentText("t6", String(data1)); //отправка данных на дисплей Nextion от датчика DHT1
  delay(200);
  myNextion.setComponentText("t7", String(data0)); //отправка данных на дисплей Nextion от датчика DHT1
  delay(200);
  
  if (pipeNum !=1 & pipeNum !=2 &pipeNum !=4) {
  myNextion.setComponentText("t6", String("NoSig")); 
  myNextion.setComponentText("t7", String("NoSig"));
}
 }
  }
*/

/*
///////////////////////////прием данных от NRF24L01 на 2-м эт. ////////////////////
 if (radio.available($pipeNum)){ // проверяем не пришло ли чего в буфер.
    if(pipeNum==4){
  float data [2];  //создаем массив из 2-х переменных. 
  radio.read(&data, sizeof(data)); //читаем массив и указываем сколько пришло. 
  Serial.println("DHT11-4%");
  Serial.println(data[0]); //выводим данные в сериал порт для проверки. 
  Serial.println("DHT11-4C");
  Serial.println(data[1]); //выводим данные в сериал порт для проверки. 
  myNextion.setComponentText("t8", String(data1)); //отправка данных на дисплей Nextion от датчика DHT1
  delay(200);
  myNextion.setComponentText("t9", String(data0)); //отправка данных на дисплей Nextion от датчика DHT1
  delay(200);

  if (pipeNum !=1 & pipeNum !=2 &pipeNum !=3) {
  myNextion.setComponentText("t8", String("NoSig")); 
  myNextion.setComponentText("t9", String("NoSig"));
}
 }
  }
*/

  

  float h1 = sens.readHumidity(8); //Присвоение значений температуры для DHT
  float t1 = sens.readTemperature(8); //Присвоение значений влажности для DHT
  myNextion.setComponentText("t2", String(t1)); //отправка данных на дисплей Nextion от датчика DHT2
//  delay(200);
  myNextion.setComponentText("t3", String(h1)); //отправка данных на дисплей Nextion от датчика DHT2
//  delay(200);
  Serial.println(t1);
  Serial.println(h1); 
 }

Отправка данных с первого передатчика:


#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <OneWire.h>  //библиотека работы шины для ds18b20.
#include <DallasTemperature.h> //библиотека для считывания температуры с ds18b20.
#include <dht11.h> //подключаем библиотеку DHT11.
dht11 DHT; //что то назначаем для DHT11.
#define DHT11_PIN 4 //указываем пин на который подключен датчик DHT11. 

const uint64_t pipe = 0xF0F1F2F3F4LL; //идентификатор передачи данных.
RF24 radio(9, 8); //указываем пины подключения передатчика.
OneWire  oneWire(2);  //указываем пины для подключения датчиков ds18b20.
DallasTemperature ds(&oneWire); //активируем библиотеку ds.

DeviceAddress sensor1 = {0x28, 0xFF, 0x90, 0x41, 0x81, 0x16, 0x3, 0xFD}; //адрес первого датчика.
DeviceAddress sensor2 = {0x28, 0xFF, 0x7E, 0xA9, 0x83, 0x16, 0x3, 0x9F}; //адрес второго датчика.
DeviceAddress sensor3 = {0x28, 0xFF, 0x70, 0xA9, 0x83, 0x16, 0x3, 0x3D}; //адрес третьего датчика.
DeviceAddress sensor4 = {0x28, 0xFF, 0x34, 0x58, 0x82, 0x16, 0x4, 0x1D}; //адрес третьего датчика.
DeviceAddress sensor5 = {0x28, 0xFF, 0x98, 0xEC, 0x81, 0x16, 0x3, 0xF7}; //адрес третьего датчика.
DeviceAddress sensor6 = {0x28, 0xFF, 0x83, 0x1B, 0x85, 0x16, 0x5, 0x4F}; //адрес третьего датчика.




void setup(){
  Serial.begin(9600); //открываем пот обмена данными.
  ds.begin();  //запускаем функцию считывания температуры ds.
  radio.begin(); //делаем инициализацию.
  delay(2); //ждем реакции модуля передачи данных. 
  radio.setChannel(120); // канал для передачи данных (0-127).
  radio.setDataRate(RF24_1MBPS); //указываем на какой скорости будут общаться модули.
  radio.setPALevel(RF24_PA_HIGH); //указываем мощность передатчика.  
  radio.openWritingPipe(pipe); // открываем трубу на передачу.
} 


void loop(){  
  ds.requestTemperatures(); // считываем температуру с датчиков
  float chk; //создаем переменную для показаний с датчика DHT11.
  chk = DHT.read(DHT11_PIN);    // читаем данные с датчика DHT11.
  float data [8];  //создаем массив из 8-ми переменных. 
  data[0] = float(ds.getTempC(sensor1)); //присваиваем первому значению массива данные с sensor1 (за один раз можно отправить до 32 байт).
  data[1] = float(ds.getTempC(sensor2)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  data[2] = float(ds.getTempC(sensor3)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  data[3] = float(ds.getTempC(sensor4)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  data[4] = float(ds.getTempC(sensor5)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  data[5] = float(ds.getTempC(sensor6)); //присваиваем второму значению массива данные с sensor2 (за один раз можно отправить до 32 байт).
  data[6] = float(DHT.humidity); //присваиваем второму значению массива данные влажности с DHT11 (за один раз можно отправить до 32 байт).
  data[7] = float(DHT.temperature); //присваиваем второму значению массива данные температуры с DHT11 (за один раз можно отправить до 32 байт).
  radio.write(&data, sizeof(data)); // передаем массив и его размер. 
   Serial.println(data[0]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[1]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[2]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[3]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[4]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[5]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[6]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[7]); //выводим данные в сериал порт для проверки. 
   Serial.println(); //пробел.
   delay(500); //ждем пол секунды.  
} 

отправка данных со свторого передатчика: 


#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <dht11.h> //подключаем библиотеку DHT11.
dht11 DHT; //что то назначаем для DHT11.
#define DHT11_PIN 4 //указываем пин на который подключен датчик DHT11. 

const uint64_t pipe = 0xF0F1F2F3F3LL; //идентификатор передачи данных.
RF24 radio(9, 8); //указываем пины подключения передатчика.

void setup(){
  Serial.begin(9600); //открываем пот обмена данными.
  radio.begin(); //делаем инициализацию.
  delay(2); //ждем реакции модуля передачи данных. 
  radio.setChannel(120); // канал для передачи данных (0-127).
  radio.setDataRate(RF24_1MBPS); //указываем на какой скорости будут общаться модули.
  radio.setPALevel(RF24_PA_HIGH); //указываем мощность передатчика.  
  radio.openWritingPipe(pipe); // открываем трубу на передачу.
} 


void loop(){  
  float chk; //создаем переменную для показаний с датчика DHT11.
  chk = DHT.read(DHT11_PIN);    // читаем данные с датчика DHT11.
  float data [2];  //создаем массив из 8-ми переменных. 
  data[0] = float(DHT.humidity); //присваиваем второму значению массива данные влажности с DHT11 (за один раз можно отправить до 32 байт).
  data[1] = float(DHT.temperature); //присваиваем второму значению массива данные температуры с DHT11 (за один раз можно отправить до 32 байт).
  radio.write(&data, sizeof(data)); // передаем массив и его размер. 
   Serial.println(data[0]); //выводим данные в сериал порт для проверки. 
   Serial.println(data[1]); //выводим данные в сериал порт для проверки. 
   Serial.println(); //пробел.
   delay(519); //ждем пол секунды.  
} 

 

 

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

p.s. В выводе данных датчика DHT11 делал грубую корректировку значений, что бы хоть как то приблизить к истине их значения...

Efendis
Efendis аватар
Offline
Зарегистрирован: 25.01.2017

Кто знает, подскажите, хочу отправлять с нескольких передатчиков, и принимать на две ардуины, то есть с балкона будут отправлены данные на экран на кухне и на дисплей в другой комнате. Будет работать?

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

Efendis пишет:
Кто знает, подскажите, хочу отправлять с нескольких передатчиков, и принимать на две ардуины, то есть с балкона будут отправлены данные на экран на кухне и на дисплей в другой комнате. Будет работать?

 

В теории все должно работать. Приедут еще модули - попробую. 

vovka1021
Offline
Зарегистрирован: 02.02.2016

окончательный рабочий код можно увидеть? спасибо

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

vovka1021 пишет:

окончательный рабочий код можно увидеть? спасибо

мой или собеседника?

vovka1021
Offline
Зарегистрирован: 02.02.2016

Zombrero, ваш. и прошивку для дисплея если не трудно. спасибо

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

vovka1021 пишет:

Zombrero, ваш. и прошивку для дисплея если не трудно. спасибо

Пока еще в процессе отладки. При отсутствии сигнала от основного передатчика, приемная ардуина входит в какой т цикл и происходит конфликт работы второго ардуино на реле и дисплея... так же входит в какой то цикл... Не разобрался еще до конца... 

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

И еще не понятно: три датчика DS18B20 с длинной кабеля более 4-х метров показывают заниженные показания. Не понятно почему... В тестовом режиме работали идентично другим, без погрешности, а тут примерно 10 градусов разница. Резисторы пробовал менять до 470Ом, не помогло...  Может помехи от электропроводки, но ведь они цифровые...?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

температура проводов влияет

Zombrero
Zombrero аватар
Offline
Зарегистрирован: 30.10.2016

jeka_tm пишет:

температура проводов влияет

Есть какое то решение? 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Zombrero пишет:

Есть какое то решение? 

Посеребрённые провода из безксилородной меди :)