как подружить NRF24L01+ и датчик DS18B20

dengeneral
Offline
Зарегистрирован: 04.05.2018

Привет ребята! Помогите пожалуйста с кодом. Собираю беспроводной датчик температуры на ардуино нано. Сделал передачу данных по аналогии с датчиком DHT22 но на принимающей стороне когда вывожу данные пишет просто 75 градусов цельсия.. когда вывожу с передающей ардуинки в ком порт пишет 85 градусов. Но если сделать просто без NRF то все показывает нормально. Вот у меня такой вопрос как сделать так чтобы температуру нормально передвать с датчика этого?

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

dengeneral пишет:

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

дегенерал, надо просто подключить нормально и правильно написать скетч. 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Хрустальный шар сегодня ничего не показывает: ни твоей схемы подключения, ни кода скетчей.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

dengeneral пишет:
Вот у меня такой вопрос как сделать так чтобы температуру нормально передвать с датчика этого?

Вот у меня такой ответ: нужно выполнить четыре пункта:

1. сесть за стол;
2. почесать репу;
3. собрать схему;
4. написать код.

Всё, профит!

Большинство задающих такие вопросы, опускают пункт №2, считая его необязательным. Это большая ошибка. Собственно, это главная причина, почему ничего не работает.

Если ты это проделал, но что-то не получилось, схему, код и копипасту отладочной печати в студию.

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

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

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

dengeneral
Offline
Зарегистрирован: 04.05.2018

Бро. я нормально подключил... 

VCC к 2 цифровому.

DQ к 3 цифровому.

рез 4.7КОМ как положено.

по этому коду все хорошо показывает...


#include <OneWire.h>

#include <DallasTemperature.h>


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

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

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



void setup(void)
{
  Serial.begin(9600);
  lcd.init();                      // инициализируем дисплей
  lcd.backlight();                 // Включаем подсветку дисплея                  
  pinMode(term_power, OUTPUT);     // Определяем пин подключения питания датчика температуры
}

float temperature()
{ // Измеряем температуру 10 секунд
  digitalWrite(term_power, HIGH);                // Включаем питание датчика температуры
  delay(100);                                    // Задержка перед первым измерением
  sensors.requestTemperatures();                 // Запрос на измерение температуры (1-й ошибочный)
  delay(500);                                    // Задержка перед поторным измерением
  sensors.requestTemperatures();                 // Запрос на измерение температуры (повторный)
  float t = float(sensors.getTempCByIndex(0));   // Получаем значение температуры
  digitalWrite(term_power, LOW);                 // Отключаем питание датчика температуры
  delay(1400);                                   // Задержка, чтобы датчик не нагревался от частых измерений
  return (t);                                    // Возвращаем значение температуры в место вызова функции
}

void loop(void)
{
  Serial.println("Temp: " + String(temperature()));
  tk();
  temp();

}

void tk()
{
  lcd.setCursor(3, 0);
  lcd.print ("TERMOKING");
}

void temp()
{
  lcd.setCursor(0, 1);
  lcd.print("Temp: " + String(temperature()));
}


 

как подключишь NRF так просто выводит в порт 85 и все ... (((
dengeneral
Offline
Зарегистрирован: 04.05.2018

Ворота пишет:

dengeneral пишет:
Вот у меня такой вопрос как сделать так чтобы температуру нормально передвать с датчика этого?

Вот у меня такой ответ: нужно выполнить четыре пункта:

1. сесть за стол;
2. почесать репу;
3. собрать схему;
4. написать код.

Всё, профит!

Большинство задающих такие вопросы, опускают пункт №2, считая его необязательным. Это большая ошибка. Собственно, это главная причина, почему ничего не работает.

Если ты это проделал, но что-то не получилось, схему, код и копипасту отладочной печати в студию.

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

 

подключил я все...

 

вот по этому коду все ок... но как подключишь NRF то все.. выводит 85

[code]
#include <OneWire.h>

#include <DallasTemperature.h>


#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

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

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



void setup(void)
{
  Serial.begin(9600);
  lcd.init();                      // инициализируем дисплей
  lcd.backlight();                 // Включаем подсветку дисплея                  
  pinMode(term_power, OUTPUT);     // Определяем пин подключения питания датчика температуры
}

float temperature()
{ // Измеряем температуру 10 секунд
  digitalWrite(term_power, HIGH);                // Включаем питание датчика температуры
  delay(100);                                    // Задержка перед первым измерением
  sensors.requestTemperatures();                 // Запрос на измерение температуры (1-й ошибочный)
  delay(500);                                    // Задержка перед поторным измерением
  sensors.requestTemperatures();                 // Запрос на измерение температуры (повторный)
  float t = float(sensors.getTempCByIndex(0));   // Получаем значение температуры
  digitalWrite(term_power, LOW);                 // Отключаем питание датчика температуры
  delay(1400);                                   // Задержка, чтобы датчик не нагревался от частых измерений
  return (t);                                    // Возвращаем значение температуры в место вызова функции
}

void loop(void)
{
  Serial.println("Temp: " + String(temperature()));
  tk();
  temp();

}

void tk()
{
  lcd.setCursor(3, 0);
  lcd.print ("TERMOKING");
}

void temp()
{
  lcd.setCursor(0, 1);
  lcd.print("Temp: " + String(temperature()));
}

[/code]

 

b707
Offline
Зарегистрирован: 26.05.2017

Денгенерал, ты читаешь, что тебе пишут? Выкладывай свой код, КОТОРЫЙ НЕ РАБОТАЕТ, а не библиотечные примеры. Нафига они нам?

И укажи полную схему подключения, а не только две ноги датчика.

Без этого разбиратся будешь сам, никто помогать не станет.

dengeneral
Offline
Зарегистрирован: 04.05.2018

b707 пишет:

Денгенерал, ты читаешь, что тебе пишут? Выкладывай свой код, КОТОРЫЙ НЕ РАБОТАЕТ, а не библиотечные примеры. Нафига они нам?

И укажи полную схему подключения, а не только две ноги датчика.

Без этого разбиратся будешь сам, никто помогать не станет.

 

Читаю читаю =). Зачем так орать то? ))

В общем вот 2 кода.. передатчик и приемник... Вроде как все заработало.. начал передовать правильную температуру... но только в челых числах. помоги пожялуйста округлить до 10-х. непойму как сделать.. или что то в коде не так... коды нашел на просторах инета... вот сижу туплю над ними )

// передатчик температуры с 18b20 . _18b20_tx_p1.ino
// без запроса 
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h> // https://github.com/maniacbug/RF24
#include <OneWire.h>
#define term_power 2    
const uint64_t pipe = 0xF0F1F2F3F4LL; // индитификатор передачи, "труба"
 
RF24 radio(9, 10); // CE, CSN
OneWire  ds(3);  

void setup(){
  Serial.begin(9600);
  pinMode(term_power, OUTPUT);
  radio.begin();
  delay(2);
  radio.setChannel(9); // канал (0-127)
 
  radio.setDataRate(RF24_250KBPS);    
  radio.setPALevel(RF24_PA_HIGH);   

  radio.openWritingPipe(pipe); // открываем трубу на передачу.
   
} 


void loop(){  
  digitalWrite(term_power, HIGH);
  ////////////// 18b20 //////////////
  byte addr[8];  
  byte data[12];
   if (!ds.search(addr)) { // если 18b20 не найден
     float temperature = -128;
     radio.write(&temperature, sizeof(temperature));
     delay(5000);
  }
   ds.reset_search(); 
  
  ds.reset();            
  ds.select(addr);        
  ds.write(0x44);      
  delay(1000);   
 
  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);          

  for (int i = 0; i < 9; i++) data[i] = ds.read();    

  int raw = (data[1] << 8) | data[0];
  if (data[7] == 0x10) raw = (raw & 0xFFF0) + 12 - data[6];  
  float temperature = raw / 16.0;
 /////////////////////////////// 
 
  // отправляем данные и указываем сколько байт пакет
  Serial.println(temperature);
  radio.write(&temperature, sizeof(temperature)); 
  delay(1400);
} 
/// приемник _18b20_rx_2.ino
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h> // https://github.com/maniacbug/RF24
#include <Wire.h>
#include <LiquidCrystal_I2C.h>  // подключаем библиотеку ЖКИ
LiquidCrystal_I2C lcd(0x27, 16, 2);

const uint64_t pipe01 = 0xF0F1F2F3F4LL; // идентификатор передачи, "труба"
const uint64_t pipe02 = 0xF0F1F2F3F1LL; // могут различатся только на младший байт

RF24 radio(9, 10); // CE, CSN


void setup()

{
  lcd.init();                      // инициализируем дисплей
  lcd.backlight();                 // Включаем подсветку дисплея
  lcd.setCursor(4, 0);
  Serial.begin(9600);
  radio.begin();

  delay(2);
  radio.setChannel(9); // канал (0-127)
  radio.setDataRate(RF24_250KBPS);
  radio.setPALevel(RF24_PA_HIGH);

  radio.openReadingPipe(1, pipe01); // открываем трубу с индитификатором "pipe01"
  radio.openReadingPipe(2, pipe02); // открываем трубу с индитификатором "pipe02"
  //  radio.openReadingPipe(0,pipe01); // или открываем все трубы разом
  radio.startListening(); // включаем приемник, начинаем слушать трубу
  lcd.print("TERMOKING");
  delay(1000);
}

//  radio.stopListening(); // останавливает приём (нужно перед началом передачи)


void loop()
{
  uint8_t pipeNum = 0;

  if (radio.available(&pipeNum)) { // проверяем не пришло ли чего в буфер.
    if (pipeNum == 1) {
      float temperature = 0;
      radio.read(&temperature, sizeof(temperature));

      Serial.println(pipeNum);
      if (temperature < 0) Serial.print("-");
      else Serial.print("+");
      Serial.println(temperature);
      Serial.println();
      lcd.setCursor(0, 1);
      lcd.print("Temp: " + String(temperature));
      //lcd.setCursor(6, 1);
     // lcd.print("Temp: " + String(temperature()));
    }
    if (pipeNum == 2) {
      int data[2] = {0};
      radio.read(&data, sizeof(data));
      
      Serial.println(pipeNum);
      if (data[0] < 0) Serial.print("-");
      else Serial.print("+");
      Serial.print(data[0]);
      Serial.print("C  ");
      Serial.print(data[1]);
      Serial.println("%");
      Serial.println();
      
    }
  }
}

 

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

а потомучто, надо, по-хорошему, не тупить над кодами из интернетов, а думать над своими кодами.  Светлодиодиком помигать, релюшечкой пощелкать, для начала.  Потом попытаться прочитать и вывести в сериал/экранчик температуру с даччика ds18b20, потом NRF подключить.  Так, ступенька за ступенькой, придуть и знания.  Только надо многачитать. 

dengeneral
Offline
Зарегистрирован: 04.05.2018

DetSimen пишет:

а потомучто, надо, по-хорошему, не тупить над кодами из интернетов, а думать над своими кодами.  Светлодиодиком помигать, релюшечкой пощелкать, для начала.  Потом попытаться прочитать и вывести в сериал/экранчик температуру с даччика ds18b20, потом NRF подключить.  Так, ступенька за ступенькой, придуть и знания.  Только надо многачитать. 

 

А я думал форумы для того чтобы друг другу помогать... ну ладно че........... 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

dengeneral пишет:

А я думал форумы для того чтобы друг другу помогать... ну ладно че........... 

А я думал, что форумы для того, чтобы общаться по интересам... ну ладно че........... 

dengeneral
Offline
Зарегистрирован: 04.05.2018

Я так понял тут ловить нечего... Злые все какието.. и дофига умные...

sadman41
Offline
Зарегистрирован: 19.10.2016

Интеллегенция сплошная, ёпт.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Иди на Амперку, там тебе помогут...

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Абидели навичка :(((((((((((

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

dengeneral пишет:

А я думал форумы для того чтобы друг другу помогать... 

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