W tym wpisie opiszę jak wywołać i wykorzystać funkcję: void Termometry(), odpowiada ona za odczyt temperatury z czujników DS18B20. Ja do jednego PINu mam podpięte 8 sztuk. Są one połączone około 12 metrowymi przewodami. Rezystor dobrałem doświadczalnie i w moim przypadku jest to 3,3k. Gdy był 4,7k to czujniki pokazywały 0*C. Teraz wszystko jest dobrze. Odczyty robię co minutę i wysyłam do Domoticza
Deklaracja na początku kodu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
##include <OneWire.h> // For communication with a Dallas thermometer and other #include <DallasTemperature.h> // Dallas thermometer library //__________________________________________________________SETTINGS FOR DS18B20 #define ONE_WIRE_BUS 2 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); DeviceAddress DS18B20Sensor0 = { 0x28, 0xFF, 0x62, 0xB2, 0x85, 0x16, 0x4, 0x3C };//Tutaj komentarz DeviceAddress DS18B20Sensor1 = { 0x28, 0xFF, 0xFD, 0x37, 0x86, 0x16, 0x5, 0x6 };//Tutaj komentarz DeviceAddress DS18B20Sensor2 = { 0x28, 0xFF, 0x8C, 0x37, 0x86, 0x16, 0x5, 0xA6 };//Tutaj komentarz DeviceAddress DS18B20Sensor3 = { 0x28, 0xFF, 0x46, 0xC8, 0x6B, 0x18, 0x1, 0xB8 };//Tutaj komentarz DeviceAddress DS18B20Sensor4 = { 0x28, 0xFF, 0x6C, 0x9B, 0x86, 0x16, 0x5, 0xC7 };//Tutaj komentarz DeviceAddress DS18B20Sensor5 = { 0x28, 0xFF, 0x68, 0x5A, 0xB4, 0x16, 0x5, 0xFF };//Tutaj komentarz DeviceAddress DS18B20Sensor6 = { 0x28, 0xFF, 0x59, 0xB7, 0xC0, 0x16, 0x4, 0x4D };//Tutaj komentarz DeviceAddress DS18B20Sensor7 = { 0x28, 0xFF, 0xEF, 0xC7, 0xC0, 0x16, 0x4, 0x36 };//Tutaj komentarz unsigned long termometryTime = 60000; unsigned long previousMillis = 0; String Location[10] = {"Nazwa","Nazwa","Nazwa","Nazwa","Nazwa","Nazwa","Nazwa","Nazwa","Nazwa","Nazwa"} |
Funkcja SETUP:
1 |
sensors.begin();//inicjowanie czujników |
Funkcja LOOP:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
unsigned long currentMillis = millis();//This code will be executed every specified time (In this case 60000 ms = 1 minute) if (currentMillis - previousMillis > termometryTime) { previousMillis = currentMillis; //Assign the current time to the previousMillis variable sensors.requestTemperatures(); Termometry(DS18B20Sensor0, 28, 11, 1.0, Location[0]);//Tutaj komentarz Termometry(DS18B20Sensor1, 27, 11, 1.5, Location[1]);//Tutaj komentarz Termometry(DS18B20Sensor2, 29, 11, 1.0, Location[2]);//Tutaj komentarz Termometry(DS18B20Sensor3, 30, 11, 1.0, Location[3]);//Tutaj komentarz Termometry(DS18B20Sensor4, 36, 11, 1.0, Location[5]);//Tutaj komentarz Termometry(DS18B20Sensor5, 38, 11, 0.0, Location[7]);//Tutaj komentarz Termometry(DS18B20Sensor6, 39, 11, 0.0, Location[8]);//Tutaj komentarz Termometry(DS18B20Sensor7, 40, 11, 0.0, Location[9]);//Tutaj komentarz } |
Kod funkcji:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
void Termometry(DeviceAddress deviceAddress, int idx, int TEMPERATURE_PRECISION, float correction, String location) { sensors.setResolution(deviceAddress, TEMPERATURE_PRECISION); float temp = sensors.getTempC(deviceAddress); temp = temp - correction; if(temp<=0){ } else { String url = "/json.htm?type=command&param=udevice&idx="; if (SerialPrintGet == 1) { Serial.print("Temperature = "); Serial.print(temp); Serial.print(" - "); Serial.println(location); } url += idx; url += "&nvalue=0&svalue="; url += temp; sendGET(url, SerialPrintGet); delay(10); } } |