Skocz do zawartości

Brak odczytu z czujników DS18B20 + nRF24L01


Pomocna odpowiedź

Witam, mam problem z programem. Chcę odczytać temperatury z 3 czujników temperatury DS18B20 oraz temperaturę i wilgotność z dht22 oraz wysłać je przez nrf24L01 do innego arduino. Problem  jest w tym  że jak tylko w void setup dodam wszystkie pozycje od NRF to od razu DS18 pokazują -127 stopni. zamieniając miejscami w kodzie, czasem uzyskam efekt że przy pierwszym odczycie dobrze odczyta temperatury, a każdy kolejny nadal będzie miał -127 stopni.  Czy one wzajemnie siebie blokują? czy jest szansa zastosować je w jednym projekcie? wartości odczytywałem w monitorze szeregowym tylko w nadającym arduino. 

#include <OneWire.h>
#include <DallasTemperature.h>
#include "dht.h"
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

RF24 myRF24 (7, 8);
byte address[6] = "00001";
dht DHT22;
 
OneWire oneWire(10); //Podłączenie do Pinu 10 DS18b20
DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki DS18b20
 
void setup(void) {
  Serial.begin(9600);
 sensors.begin();  //Inicjalizacja czujnikow DS18b20
   myRF24.begin();
  myRF24.openWritingPipe(address);
  myRF24.setPALevel(RF24_PA_MAX);
  myRF24.stopListening();
}
 
void loop(void) { 
   //Pobranie temperatury czujnika DS18b20
 float pierwszy = (sensors.getTempCByIndex(0));
  sensors.requestTemperatures();
  Serial.println("Odczyt: ");
  Serial.print("Pierwszy: ");
  Serial.println(pierwszy);
  Serial.print("Drugi: ");
  Serial.println(sensors.getTempCByIndex(1));
  Serial.print("Trzeci: ");
  Serial.println(sensors.getTempCByIndex(2)); // Koniec kodu dla DS18b20

  int chk = DHT22.read(9);
  float wilgoc = (DHT22.humidity);
  float temp = (DHT22.temperature);
  Serial.println("DHT22: ");
  Serial.print("Wilgotnosc (%): ");              //wyświetlenie wartości wilgotności
  Serial.println(wilgoc);
  Serial.print("Temperatura (C): ");           //wyświetlenie temperatury
  Serial.println(temp);


  
  delay(1000);
}

 

Link to post
Share on other sites
(edytowany)

Wszystkie maja dzialac...a tam nie ma byc przypadkiem request()? Nie trzeba podac adresow czujnikow?...ja korzystalem z innej biblioteki i bylo ok (pozniej Ci podrzuce przyklad i libsa)

Edytowano przez farmaceuta
  • Lubię! 1
Link to post
Share on other sites

Ja tam bym najpierw poprosił o zmierzenie temperatur a potem próbował to je odczytać.

@farmaceuta nie trzeba podawać adresów.

 

  • Lubię! 2
Link to post
Share on other sites
12 minut temu, ethanak napisał:

 

@farmaceuta nie trzeba podawać adresów.

 

To jakos dziwnie tak, bo majac trzy czujniki skad mam wiedziec z ktorego aktualnie odczytalem? W tej "mojej" bibliotece mam adresy i wywolujac request() dla wszystkich bodajze, odczytuje temp. po adresie...domyslam sie ze tu jest podobnie tylko ze to jest w bibliotece, a w kodzie odwoluje sie po indeksie, ale i tak na poczatku musze "zgadnac" ktory indeks- ktory czujnik...(strasznie zamotalem😓)

  • Lubię! 1
Link to post
Share on other sites
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

ja korzystam z tego i dziala... http://akademia.nettigo.pl/ds18b20/.

#include <OneWire.h>
#include <DS18B20.h>

#define ONEWIRE_PIN 8

OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);

// Adres czujnika
byte address1[8] = {0x28, 0xD2, 0xCB, 0x48, 0xF6, 0xDE, 0x3C, 0xDF};
byte address2[8] = {0x28, 0xB1, 0x6D, 0xA1, 0x3, 0x0, 0x0, 0x11};
byte address3[8] = {0x28, 0xB1, 0x6D, 0xA1, 0x3, 0x0, 0x0, 0x11};


void setup() {
  sensors.begin();
  sensors.request(address1);
  sensors.request(address2);                 //DS18B20
  sensors.request(address3);
  
  
  Serial.begin(9600);
  
 
}

void loop() {
  

   if (sensors.available())
  {
     float temp1 = sensors.readTemperature(address1);
     float temp2 = sensors.readTemperature(address2);
     float temp3 = sensors.readTemperature(address3);

    Serial.println(temp1);
    Serial.println(temp2);
    Serial.println(temp3);
    
    sensors.request(address1);
    sensors.request(address2);                
    sensors.request(address3);
  }
  
}

wystarczy ze uzyjesz tak

sensors.request();

(adres jest opcjonalny) (musisz uzyc szkicu do odczytu adresu i umiescic go w kodzie powyzej)

Edytowano przez farmaceuta
  • Lubię! 1
Link to post
Share on other sites

@farmaceuta Ta biblioteka potrafi również czytać po adresach, nie tylko po indeksach. W dodatku requestTemperatures blokuje dopóki dane nie będą gotowe (chyba że nie chcesz, ale zakłada że chcesz). Ważne jest, aby najpierw wywołać requestTemperatures() a dopiero potem odczytywać wyniki.

 

 

  • Lubię! 1
Link to post
Share on other sites
(edytowany)

Nie no wszystko chyba jest ok w kodzie powyzej...wywoluje request() w setup() i sprawdzam w warunku czy kalkulacje juz gotowe..(available()) jesli tak to odczytuje temp i znow "prosze" o kolejne obliczenie czujnikow..

A spoko..😉 teraz zalapalem ze mowisz o bibliotece z pierwszego posta...no to wszystko by sie zgadzalo bo i ta "moja" blokuje bez request() i czeka az obliczy zamulajac caly kod..

Edytowano przez farmaceuta
  • Lubię! 1
Link to post
Share on other sites

Dzięki za zainteresowanie tematem, faktycznie w tym kodzie co wstawiłem najpierw kazałem mu odczytać wynik, ale to już było po wielu kombinacjach. Sprawa wygląda tak, że mam kod do odczytywania wartości z czujników, wygląda on tak i wszystko działa na monitorze szeregowym.

#include <OneWire.h>
#include <DallasTemperature.h>
#include "dht.h"
OneWire oneWire(10); //Podłączenie do A5
DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki
dht DHT22;

void setup(void) {
  Serial.begin(9600);
  sensors.begin(); //Inicjalizacja czujnikow
}

void loop(void) { 
  sensors.requestTemperatures(); //Pobranie temperatury czujnika
  Serial.print("Pierwszy: ");
  Serial.println(sensors.getTempCByIndex(0));  //Wyswietlenie informacji
  Serial.print("Drugi: ");
  Serial.println(sensors.getTempCByIndex(1));  //Wyswietlenie informacji
  Serial.print("Trzeci ");
  Serial.println(sensors.getTempCByIndex(2));  //Wyswietlenie informacji
  
  int chk = DHT22.read(9);
  float wilgoc = (DHT22.humidity);
  float temp = (DHT22.temperature);
  Serial.println("DHT22: ");
  Serial.print("Wilgotnosc (%): ");              //wyświetlenie wartości wilgotności
  Serial.println(wilgoc);
  Serial.print("Temperatura (C): ");           //wyświetlenie temperatury
  Serial.println(temp);
  
  delay(1000);
}

A teraz po dodaniu Tego co wydaje mi się za potrzebne do nadawania przez RF24 temperatury z DS18B20 Pokazują -127

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 myRF24 (7, 8);
byte address[6] = "00001";

#include <OneWire.h>
#include <DallasTemperature.h>
#include "dht.h"
OneWire oneWire(10); //Podłączenie do A5
DallasTemperature sensors(&oneWire); //Przekazania informacji do biblioteki
dht DHT22;

void setup(void) {
  Serial.begin(9600);
  myRF24.begin();
  myRF24.openWritingPipe(address);
  myRF24.setPALevel(RF24_PA_MIN);
  myRF24.stopListening();
  sensors.begin(); //Inicjalizacja czujnikow
}

void loop(void) { 
  sensors.requestTemperatures(); //Pobranie temperatury czujnika
  Serial.print("Pierwszy: ");
  Serial.println(sensors.getTempCByIndex(0));  //Wyswietlenie informacji
  Serial.print("Drugi: ");
  Serial.println(sensors.getTempCByIndex(1));  //Wyswietlenie informacji
  Serial.print("Trzeci ");
  Serial.println(sensors.getTempCByIndex(2));  //Wyswietlenie informacji
  
    int chk = DHT22.read(9);
  float wilgoc = (DHT22.humidity);
  float temp = (DHT22.temperature);
  Serial.println("DHT22: ");
  Serial.print("Wilgotnosc (%): ");              //wyświetlenie wartości wilgotności
  Serial.println(wilgoc);
  Serial.print("Temperatura (C): ");           //wyświetlenie temperatury
  Serial.println(temp);
  
  delay(1000);
}

Podejrzewam że coś psuję tą biblioteką z RF24 ale nie wiem co bo używam jej pierwszy raz.

Zrzut ekranu (108).png

Zrzut ekranu (109).png

Link to post
Share on other sites

Ja tylko dodam ze biblioteka ktora zaproponowalem dziala elegancko z nrf24, i przy uzyciu available() nie blokuje calego kodu...

  • Lubię! 1
Link to post
Share on other sites
1 godzinę temu, farmaceuta napisał:

Ja tylko dodam ze biblioteka ktora zaproponowalem dziala elegancko z nrf24, i przy uzyciu available() nie blokuje calego kodu...

Właśnie pobrałem i będę testował. Dodawałeś kondensator na nrf24?

Link to post
Share on other sites

Ja zawsze lutuję 100nf bezpośrednio na płytce nrf - bez kondensatora rzadko działa.

  • Lubię! 1
Link to post
Share on other sites
22 minuty temu, slon2005 napisał:

Właśnie pobrałem i będę testował. Dodawałeś kondensator na nrf24?

Tak...jak kolega @ethanak wspomnial...rzadko dziala bez kondensatora, wiec daj odrazu zeby czasu nie marnowac...

  • Lubię! 1
Link to post
Share on other sites

Przy okazji: kondensator na płytce stykowej nic nie daje (próbowałem z ciekawości różnych kombinacji).

  • Lubię! 1
Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.