Skocz do zawartości

Brak odczytu z czujników DS18B20 + nRF24L01


slon2005

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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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 do komentarza
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.