Skocz do zawartości

Brak odczytu z czujników DS18B20 + nRF24L01


slon2005

Pomocna odpowiedź

Korzystając z biblioteki kolegi farmaceuta stworzyłem taki kod

#include <OneWire.h>
#include <DS18B20.h>
#include "dht.h"
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 myRF24 (7, 8);
byte address[6] = "00001"; 
dht DHT22;
#define ONEWIRE_PIN 10
#define DHT22PIN 9
OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);

// Adres czujnika
byte address1[8] = {0x28, 0xB4, 0x43, 0xED, 0x5C, 0x21, 0x1, 0x2D};
byte address2[8] = {0x28, 0x2A, 0x90, 0xD2, 0x5C, 0x21, 0x1, 0x4D};
byte address3[8] = {0x28, 0x19, 0xBC, 0xB9, 0X5C, 0x21, 0x1, 0x24};


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

void loop() {

  
  int chk = DHT22.read(DHT22PIN);         //sprawdzenie stanu sensora, a następnie wyświetlenie komunikatu na monitorze szeregowym
 float wilgoc = (DHT22.humidity);
 float temp0 = (DHT22.temperature);

  
  Serial.print("RH: ");              //wyświetlenie wartości wilgotności
  Serial.println(wilgoc);
  Serial.print("T1: ");           //wyświetlenie temperatury
  Serial.println(temp0);
 
delay(50);
   if (sensors.available())   //ds18b20
  {
     float temp1 = sensors.readTemperature(address1);
     float temp2 = sensors.readTemperature(address2);
     float temp3 = sensors.readTemperature(address3);

    Serial.print("T2: ");
    Serial.println(temp1);
    Serial.print("T3: ");
    Serial.println(temp2);
    Serial.print("T4: ");
    Serial.println(temp3);
    
    sensors.request(address1);
    sensors.request(address2);                
    sensors.request(address3);
  }
   
  delay(3000);
}

 jak tylko dodam do void setup 

  myRF24.begin();

pokazuje się -237.15 na czujnikach ds18b20, dht22 cały czas pokazuje dobrze. usunę myRf24.begin(); i pomiary się pokazują poprawnie. kondensator dodałem prosto w płytkę RF 100 μF 25V później 220 μF 50V - dalej nic. następna będzie próba z mills chyba. 

Link do komentarza
Share on other sites

9 minut temu, farmaceuta napisał:

Hmm...moze kolejnosc wywolywan begin() zmien w setup()? , A tak tylko z ciekawosci spruboj te ds'y podpiac pod inny pin..

Noooo Mistrzu... Nie wiem czy sam bym tego spróbował. Wrzuciłem na 3 pin i chodzi ! ! ! 😀😀😀😀

 

Dziękuję;)

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

Panowie, pojawił mi się kolejny problem tym razem w odbiorniku, przebrnąłem już przez batalię zasilania nrf, teraz wszystko działa, jednak wyniki wyświetlają mi się bardzo dziwnie, nadajnik składa się z arduino uno klona, 3 x DS10b20, jednego dht22, NRF24L01 ze wzmacniaczami i adaptery zasilające. Odbiornik to tylko NRF24L01 ze wzmacniaczem i oled SH1106. na odbiorniku podglądam wyniki pobrane z nadajnika i widzę 5 pozycji po kolei RH,T1,T2,T3,T4 i tylko w HR pojawiają się wyniki, ale.... w pierwszym przesyle jest to wynik RH w drugim przesyle w pozycji RH jest wynik z T1 w następnym przesyle z T2 itd

#include <nRF24L01.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8);
float RH;
float T1;
float T2;
float T3;
float T4;
void setup(void) {
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, 00001);
radio.startListening();
Serial.begin(9600);
Serial.println("Temperature Starting.....");
delay(1000);
Serial.println("by www.elec-cafe.com");
delay(1000);
}
void loop(void){
if (radio.available()) {
float wilgoc;
float temp0;
float temp1;
float temp2;
float temp3;
 
radio.read(&wilgoc, sizeof(float));
RH = wilgoc;
radio.read(&temp0, sizeof(float));
T1 = temp0;
radio.read(&temp1, sizeof(float));
T2 = temp1;
radio.read(&temp2, sizeof(float));
T3 = temp2;
radio.read(&temp3, sizeof(float));
T4 = temp3;

Serial.println("Odczyty : ");
Serial.print("RH: ");
Serial.println(RH);
Serial.print("T1: ");
Serial.println(T1);
Serial.print("T2: ");
Serial.println(T2);
Serial.print("T3: ");
Serial.println(T3);
Serial.print("T4: ");
Serial.println(T4);
}}

42136111_Zrzutekranu(110).thumb.png.54351a7d851209bfff3c43e011321c98.png

Dlaczego tak się dzieje? W następnej odpowiedzi wstawię kod z nadajnika i widok z monitora, bo drugi dla wygody mam podpięty pod inny komputer.

Link do komentarza
Share on other sites

Nadajnik:

#include <OneWire.h>
#include <DS18B20.h>
#include "dht.h"
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 myRF24 (7, 8);
dht DHT22;
#define ONEWIRE_PIN 5
#define DHT22PIN 2
OneWire onewire(ONEWIRE_PIN);
DS18B20 sensors(&onewire);

// Adres czujnika
byte address1[8] = {0x28, 0xB4, 0x43, 0xED, 0x5C, 0x21, 0x1, 0x2D};
byte address2[8] = {0x28, 0x2A, 0x90, 0xD2, 0x5C, 0x21, 0x1, 0x4D};
byte address3[8] = {0x28, 0x19, 0xBC, 0xB9, 0X5C, 0x21, 0x1, 0x24};


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

void loop() {

  
    sensors.request(address1);
    sensors.request(address2);                
    sensors.request(address3);
  int chk = DHT22.read(DHT22PIN);         //sprawdzenie stanu sensora, a następnie wyświetlenie komunikatu na monitorze szeregowym
 float wilgoc = (DHT22.humidity);
 float temp0 = (DHT22.temperature);
 float temp1 = sensors.readTemperature(address1);
 float temp2 = sensors.readTemperature(address2);
 float temp3 = sensors.readTemperature(address3);
  
    Serial.print("RH: ");              //wyświetlenie wartości wilgotności
    Serial.println(wilgoc);
    myRF24.write(&wilgoc, sizeof(float));
    delay(1000);
    Serial.print("T1: ");           //wyświetlenie temperatury
    Serial.println(temp0);
    myRF24.write(&temp0, sizeof(float));
    delay(1000);
    Serial.print("T2: ");
    Serial.println(temp1);
    myRF24.write(&temp1, sizeof(float));
    delay(1000);
    Serial.print("T3: ");
    Serial.println(temp2);
    myRF24.write(&temp2, sizeof(float));
    delay(1000);   
    Serial.print("T4: ");
    Serial.println(temp3);
    myRF24.write(&temp3, sizeof(float)); 
    delay(1000);
  }

1306974395_Zrzutekranu(1).thumb.png.a4bf318c73b075a86c4c1ec7a96e4442.png

Już trochę mieszałem dodając przerwy, zawierając to w if poszczególne pomiary, albo wszystkie naraz albo całkowicie kasując if. No nie mogę wpaść na jeden właściwy pomysł. Pewnie zaraz spróbuję wysłać wyniki w jednej wiadomości, ale zastanawiam się dlaczego pętla loop nie wpisuje wyników tam gdzie powinny być tylko podaje jeden wynik i tak jak by szła od początku, później podaje wynik nr2 i znowu od początku...

Link do komentarza
Share on other sites

11 minut temu, slon2005 napisał:

zaraz spróbuję wysłać wyniki w jednej wiadomości

Czyli zgodnie ze sztuką 🙂

Utwórz sobie tablicę czy strukturę, wysyłaj ją w całości i także w całości odbieraj. A wypisywanie "po kolei" wcale nie jest nieprawidłowe - ponieważ wysyłasz pojedynczy wynik nic dziwnego, że tylko jeden jest czytany.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Tak jak teraz to w zyciu dzialac nie bedzie😉 jak juz wyzej @ethanak wspomnial, zrob tablice lub strukture i przesylasz caly pakiet na raz bez ryzyka ze zgubisz "synchronizacje" bajtow...

float tab[5];

myRF24.write(&tab, 20);
float tab[5];

myRF24.read(&tab, 20);

 

  • Pomogłeś! 1
Link do komentarza
Share on other sites

@farmaceuta  Tak zrobię, pierwszy raz będę to robił, czy w kwadratowym nawiasie ma być 5 czy 4, bo świeżo doczytałem że to od 0 się liczy, W nawiasie ta 20 to jest rozmiar, czy na przyszłość wystarczy jak wpiszę sizeof(tab)czy tak nie powinno się robić?

Link do komentarza
Share on other sites

29 minut temu, slon2005 napisał:

@farmaceuta  Tak zrobię, pierwszy raz będę to robił, czy w kwadratowym nawiasie ma być 5 czy 4

Tyle ile ma miec tablica zmiennych, czyli u Ciebie 5 

 

29 minut temu, slon2005 napisał:

@farmaceutabo świeżo doczytałem że to od 0 się liczy

Tak...indeksy ida od zera czyli 

tab[0] = temp0 
tab[1]= temp1 
  //itd

 

29 minut temu, slon2005 napisał:

@farmaceuta czy na przyszłość wystarczy jak wpiszę sizeof(tab)czy tak nie powinno się robić?

 

rozmiar = sizeof(tablica) / sizeof(typ_tablicy)

Edit...pokrecilo mi sie...to powyzej jest wzorem na obliczenie ilosci zmiennych w tablicy! 

A do obliczenia tablicy w bajtach uzywa sie faktycznie sizeof(tab)...(tablice statyczne)

Edytowano przez farmaceuta
  • Lubię! 1
Link do komentarza
Share on other sites

8 godzin temu, farmaceuta napisał:


rozmiar = sizeof(tablica) / sizeof(typ_tablicy)

Edit...pokrecilo mi sie...to powyzej jest wzorem na obliczenie ilosci zmiennych w tablicy! 

Drobna uwaga. Bezpieczniejszy idiom to:

sizeof(array) / sizeof(array[0])

Bo już widzę jak ktoś zmieniając typ tablicy będzie szukał w kodzie poprzedniego typu użytego w sizeof. A jeżeli ktoś widział IDE, które takie coś potrafi, to kłaniam się przed jego autorami.

Edytowano przez trainee
Link do komentarza
Share on other sites

(edytowany)

No to dzięki Wam już jestem na ukończeniu;) Wszystko się przesyła, ja nauczyłem się podstawy tablicy, a kody wyglądają przejrzyście. Myślę że już chyba ostatnie pytanie mam, czy przy użyciu nrf24 powinno się używać delaya, żeby nie rozpędzać arduino za bardzo? Jeżeli tak to przy nadawaniu powinien być delay, a przy odbieraniu już nie? Pytam, bo odczyty na odbiorniku są nieregularne. W tym projekcie akurat nie ma to żadnego znaczenia czy odświeży mi się za 0,1s czy za 10s ale, po prostu chciałbym wiedzieć czy można jakimś szczegółem to upiększyć, żeby pomiar był równo co 3-5 sekund i też tak samo się odczytywał? Mam wrażenie że nie ma synchronizacji nadania z odbiorem i niektóre odczyty przepadają. Delay w sumie nie pomaga, a w niektórych próbach nawet szkodził.

Po dodaniu funkcji, żeby zwracał komunikat w przypadku zerwania połączenia zauważyłem że na monitorze często ją gubi. Oczywiście bez delay-ów i tak jest kilkadziesiąt odczytów w ciągu sekundy ale czy tak powinno być a funkcja zgłaszania awarii powinna się uruchamiać dopiero po jakimś czasie zerwania połączenia?

2069965891_Zrzutekranu(2).thumb.png.9b68726bd1ec4ef63fe3fd9606502b3d.png

Nadajnik:

#include <OneWire.h>
#include <DS18B20.h>
#include <SPI.h>
#include "DHT.h"
#include <nRF24L01.h>
#include <RF24.h>
RF24 myRF24 (7, 8); 
DHT dht(2, DHT22);
OneWire onewire(5);
DS18B20 sensors(&onewire);
byte address1[8] = {0x28, 0xB4, 0x43, 0xED, 0x5C, 0x21, 0x1, 0x2D};
byte address2[8] = {0x28, 0x2A, 0x90, 0xD2, 0x5C, 0x21, 0x1, 0x4D};
byte address3[8] = {0x28, 0x19, 0xBC, 0xB9, 0X5C, 0x21, 0x1, 0x24};
float wyniki[5];
void setup() {
  Serial.begin(9600);
  dht.begin();
  sensors.begin();
  myRF24.begin();
  myRF24.openWritingPipe(00001);  
}
void loop() {
   sensors.request(address1);
   sensors.request(address2);                
   sensors.request(address3);
   wyniki[2] = sensors.readTemperature(address1);
   wyniki[3] = sensors.readTemperature(address2);
   wyniki[4] = sensors.readTemperature(address3);
   wyniki[0] = dht.readHumidity();
   wyniki[1] = dht.readTemperature();
   myRF24.write(wyniki, sizeof(wyniki)); 
}

Odbiornik:

#include <nRF24L01.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8);
float wyniki[5];
void setup(void) {
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(0, 00001);
radio.startListening();
Serial.begin(9600);
Serial.println("Temperature Starting.....");
delay(1000);
Serial.println("by www.elec-cafe.com");
delay(1000);
}
void loop(void){
if (radio.available()) {
radio.read(&wyniki, sizeof(wyniki));
Serial.println("Odczyty : ");
Serial.print("RH: ");
Serial.println(wyniki[0]);
Serial.print("T1: ");
Serial.println(wyniki[1]);
Serial.print("T2: ");
Serial.println(wyniki[2]);
Serial.print("T3: ");
Serial.println(wyniki[3]);
Serial.print("T4: ");
Serial.println(wyniki[4]);
}
if (!radio.available()) {
Serial.println("Awaria!");
}
}
Edytowano przez Gieneq
Link do komentarza
Share on other sites

W nadajniku umiesc sensors.available()...wtedy odczytujesz wyniki tylko wtedy kiedy juz zostaly wykonane obliczenia...dodatkowo mozesz nadawac jakos systematycznie np co sekunde...

if (sensors.available() && millis() - last > 1000UL) { 

  // tutaj caly kod lacznie z 
   // wysylaniem i request()
  last = millis();
}

Odbiornik jest wporzadku..

(request() umiesc na koncu if'a)

Edytowano przez farmaceuta
Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.