slon2005 1 Napisano 13 maja Udostępnij Napisano 13 maja 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); } Cytuj Link to post Share on other sites
farmaceuta 357 13 maja Udostępnij 13 maja (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 13 maja przez farmaceuta 1 Cytuj Link to post Share on other sites
ethanak 2 883 13 maja Udostępnij 13 maja Ja tam bym najpierw poprosił o zmierzenie temperatur a potem próbował to je odczytać. @farmaceuta nie trzeba podawać adresów. 2 Cytuj Link to post Share on other sites
farmaceuta 357 13 maja Udostępnij 13 maja 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) 1 Cytuj Link to post Share on other sites
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. 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
ethanak 2 883 13 maja Udostępnij 13 maja @farmaceuta dokładnie tak jak piszesz 2 Cytuj Link to post Share on other sites
farmaceuta 357 13 maja Udostępnij 13 maja (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 13 maja przez farmaceuta 1 Cytuj Link to post Share on other sites
ethanak 2 883 13 maja Udostępnij 13 maja @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. 1 Cytuj Link to post Share on other sites
farmaceuta 357 13 maja Udostępnij 13 maja (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 13 maja przez farmaceuta 1 Cytuj Link to post Share on other sites
slon2005 1 16 maja Autor tematu Udostępnij 16 maja 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. Cytuj Link to post Share on other sites
ethanak 2 883 16 maja Udostępnij 16 maja Może to pomoże: https://forum.arduino.cc/t/nrf24-and-dallastemperature-wont-work-together/279474 1 Cytuj Link to post Share on other sites
farmaceuta 357 16 maja Udostępnij 16 maja Ja tylko dodam ze biblioteka ktora zaproponowalem dziala elegancko z nrf24, i przy uzyciu available() nie blokuje calego kodu... 1 Cytuj Link to post Share on other sites
slon2005 1 16 maja Autor tematu Udostępnij 16 maja 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? Cytuj Link to post Share on other sites
ethanak 2 883 16 maja Udostępnij 16 maja Ja zawsze lutuję 100nf bezpośrednio na płytce nrf - bez kondensatora rzadko działa. 1 Cytuj Link to post Share on other sites
farmaceuta 357 16 maja Udostępnij 16 maja 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... 1 Cytuj Link to post Share on other sites
ethanak 2 883 16 maja Udostępnij 16 maja Przy okazji: kondensator na płytce stykowej nic nie daje (próbowałem z ciekawości różnych kombinacji). 1 Cytuj Link to post Share on other sites
Pomocna odpowiedź
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!