Automatyczne odczytywanie trzech DS18b20 - Wersja do druku +- Arduino Polska Forum (https://forum.arduinopolska.pl) +-- Dział: Korzystanie z Arduino (https://forum.arduinopolska.pl/dzial-korzystanie-z-arduino) +--- Dział: Piaskownica (https://forum.arduinopolska.pl/dzial-piaskownica) +--- Wątek: Automatyczne odczytywanie trzech DS18b20 (/watek-automatyczne-odczytywanie-trzech-ds18b20) |
Automatyczne odczytywanie trzech DS18b20 - OMK - 03-01-2022 Witam. Mam kod który działa. Problem jest taki że jak chcę podłączyć inny DS18b20 to muszę go odczytać i wpisać adres do projektu. Może ktoś pomoże przerobić aby nie trzeba było tego robić za każdym razem jak wymieniam czujnik. Mam jeszcze takie pytanie czy można podłączyć każdy z czujników pod inny pin? Oto początek kodu bo chyba to ma znaczenie? #include <LiquidCrystal_I2C.h> #include <Wire.h> #include <OneWire.h> #include <DallasTemperature.h> #include <Rotary.h> #include <DS3231.h> #include <EEPROM.h> DS3231 clock; RTCDateTime dt, lastdt, setdt; typedef struct czasT_ { byte godz; byte minuta; }; czasT_ czasy[4]; czasT_ tmpczasy[4]; #define ONE_WIRE_BUS 5 // Pin OneWire #define TEMPERATURE_PRECISION 9 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); //DeviceAddress DS_NR1, DS_NR2, DS_NR3; DeviceAddress DS_NR1 = { 0x28, 0xAD, 0xD4, 0x76, 0xE0, 0x01, 0x3C, 0xF6 }; // Tu wpisać adresy czujników DeviceAddress DS_NR2 = { 0x28, 0x4D, 0x1C, 0x76, 0xE0, 0x01, 0x3C, 0xC3 }; // do szukania adresów program OneWireSearch z przykładów DallasTemperature DeviceAddress DS_NR3 = { 0x28, 0xB0, 0xBF, 0x76, 0xE0, 0x01, 0x3C, 0x86 }; #define ON LOW #define OFF HIGH #define PINA 2 // Pin A enkodera (CLK) #define PINB 3 // Pin B enkodera (DT) #define PINSW 4 // Pin SW enkodera (SW) #define RELAY_1 8 // Pin przekaźnika 1 #define RELAY_2 9 // Pin przekaźnika 2 #define PIN_X1 11 // Pin X1 #define PIN_X2 12 // Pin X2 #define BUZZPIN 10 // Pin buzzera alarmu #define MIN_CWU 25 // Minimalna temperatura CWU #define MAX_CWU 70 // Maksymalna tempearatua CWU #define HISTEREZA 5 #define DEBOUNCE_TIME 20 // debauncing przycisku 20 ms #define TEMP_TIME 5000 // 5s czas pomiędzy odczytami temperatury #define MENU_TIME 15000 // 5s po tym czasie wraca automatycznie do ekranu głównego #define HOLD_TIME 5000 // 10s czas przytrzymania przycisku by wejśc w menu #define RELAY1_OFF_TIME 120000 // 2 min #define LCD_OFF_TIME 300000 // 5 min czas wyłaczenia podświetlenia Rotary enkoder = Rotary(PINA, PINB); long int Time = 0; long int tTime = 0; long int mTime = 0; long int rTime = 0; long int pTime = 0; long int eTime = 0; byte TempCWU = 50; byte tmp = 50; byte opcje = 0; byte poz = 1; byte lastpoz = 1; byte E2poz = 1; byte E3poz = 1; byte E4poz = 1; bool swPressed = false; bool flag = false; bool tflag = false; bool eflag = true; bool s10 = false; bool p2minOff = false; bool sysOFF = false; //LiquidCrystal_I2C lcd(0x27,20,4); LiquidCrystal_I2C lcd(0x27,20,4); //LiquidCrystal_I2C lcd2(0x26,16,2); uint8_t customChar[8] = { 0b01100, 0b10010, 0b10010, 0b01100, 0b00000, 0b00000, 0b00000, 0b00000}; float temp1C = 0; float temp2C = 0; float temp3C = 0; float lastT1 = 0; float lastT2 = 0; float lastT3 = 0; uint16_t zakresTmp, zakres1, zakres2, zakres3, zakres4; unsigned long lastDebounceTime = 0; uint8_t debounceDelay = 50; // debouncing - opóźnienie i pozbycie się drganai styków w przyciskach void saveconfig(){ EEPROM.write(0,TempCWU); Pozdrawiam RE: Automatyczne odczytywanie trzech DS18b20 - Robson Kerman - 06-01-2022 Możesz czytać adresy czujników bezpośrednio przed odczytem temperatury. Zamiast tego: Kod: DeviceAddress DS_NR1 = { 0x28, 0xAD, 0xD4, 0x76, 0xE0, 0x01, 0x3C, 0xF6 }; // Tu wpisać adresy czujników Daj to: Kod: oneWire.search(DS_NR1); Można też zrobić to lepiej i obsłużyć brak jakiegoś czujnika: Kod: if (!oneWire.search(DS_NR1)) funkcjaObslugiBledu(DS_NR1); Dla trzech czujników jeszcze to przejdzie, ale dla większej ilości lepiej to zrobić na tablicy. Możesz oczywiście nie korzystać z adresów czujników i zrobić to na ich indeksach. Kod: for (int i = 0; i < 3; i++) {; Albo: Kod: for (int i = 0; i < sensors.getDeviceCount(); i++) {; Oczywiście, można podłączyć każdy czujnik pod inny pin. Jest to opisane w przykładach do biblioteki. |