Отпишусь, как я подключил несколько датчиков температуры DS18B20 на один пин BlockDuino.
Для удобства я спаял маленький полублок с разъемом 'мама' размером 8х3, т.е. с возможностью подключения до 8ми датчиков и разъемом 'папа' размером 7х2, в качестве коммутатора, т.е. можно перекинуть вход датчиков на любой пин.
Для наглядности, этот полублок я подключил не напрямую, а через кабель. Ну чтоб было точно видно, что используется всего один провод для данных (ну и два для подвода питания), к тому же у меня занят разъем 'мама' на основной плате подключенным экранчиком JM164A. К полублоку подключил два выносных датчика, а один вставил сразу в разъем.
UPDATE!!!
Новое дополнение на ту же тему: Адресная работа с несколькими датчиками температуры DS18B20 с выводом на графический дисплей
|
|
Код:
#include <OneWire.h> #include <DallasTemperature.h> #include <LiquidCrystal.h> // Data wire is plugged into port 3 on the BlockDuino #define ONE_WIRE_BUS 3 #define TEMPERATURE_PRECISION 9 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); LiquidCrystal lcd(7, 8, 9, 10, 11, 12); DeviceAddress Thermometer; byte count; String head[7] = {"Troom = ", "Ttea = ", "Tbeer = ","","","",""}; void setup(void) { // start serial port Serial.begin(9600); Serial.println("Dallas Temperature IC Control Library Demo on BlockDuino.org"); // Start up the library sensors.begin(); lcd.begin(16, 4); lcd.print("setup"); // locate devices on the bus Serial.print("Locating devices..."); Serial.print("Found "); count = sensors.getDeviceCount(); Serial.print(count, DEC); Serial.println(" devices."); lcd.setCursor(0,2); lcd.print("Found "); lcd.print(count, DEC); lcd.println(" devices."); // report parasite power requirements Serial.print("Parasite power is: "); if (sensors.isParasitePowerMode()) Serial.println("ON"); else Serial.println("OFF"); // show the addresses we found on the for (int i=0; i<count; i++){ if (!sensors.getAddress(Thermometer, i)) { Serial.print("Unable to find address for Device "); Serial.println(i); } Serial.println(" Device:"); Serial.print(" Address: "); printAddress(Thermometer); Serial.println(); sensors.setResolution(Thermometer, 9);// set the resolution to 9 bit Serial.print(" Resolution: "); Serial.print(sensors.getResolution(Thermometer), DEC); Serial.println(); } delay(1000); lcd.clear(); } // function to print a device address void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++) { // zero pad the address if necessary if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } } // function to print the temperature for a device void printTemperature(DeviceAddress deviceAddress) { float tempC = sensors.getTempC(deviceAddress); Serial.print("Temp C: "); Serial.print(tempC); Serial.print(" Temp F: "); Serial.print(DallasTemperature::toFahrenheit(tempC)); } // function to print a device's resolution void printResolution(DeviceAddress deviceAddress) { Serial.print("Resolution: "); Serial.print(sensors.getResolution(deviceAddress)); Serial.println(); } // main function to print information about a device void printData(DeviceAddress deviceAddress) { Serial.print("Device Address: "); printAddress(deviceAddress); Serial.print(" "); printTemperature(deviceAddress); Serial.println(); } void loop(void) { // call sensors.requestTemperatures() to issue a global temperature // request to all devices on the bus Serial.print("Requesting temperatures..."); sensors.requestTemperatures(); Serial.println("DONE"); // print temperatures to LCD lcd.clear(); lcd.print(" Temperature"); for (int i=0; i<count; i++){ sensors.getAddress(Thermometer, i); printData(Thermometer); lcd.setCursor(0, i+1); lcd.print(head[i]); lcd.print(sensors.getTempCByIndex(i), 1); lcd.print("oC"); } delay(500); }
Ну и напоследок, то же, но с питанием от батареек, чтобы подчеркнуть автономностью, так сказать ;)
UPDATE!!!
Новое дополнение на ту же тему: Адресная работа с несколькими датчиками температуры DS18B20 с выводом на графический дисплей
Комментариев нет:
Отправить комментарий