Přemostění pull-up rezistoru tranzistorem je docela dobrým řešením. Používám to. Pokud použijete například AVR, není ani potřeba přidávat vnější tranzistor. Použije se tranzistor ve výstupním pinu. Postačuje tedy pouze upravit program. Kód může vypadat asi takto:
#define __w1_PORT PORTD
#define __w1_DDR DDRD
#define __w1_PIN PIND
#define __w1_bit PD6
//Vyslání 0:
__w1_PORT &= ~(1 << __w1_bit);
__w1_DDR |= (1 << __w1_bit);
//Vyslání 1 (Sepnuty pull-up tranzistor)
__w1_PORT |= (1 << __w1_bit);
__w1_DDR |= (1 << __w1_bit);
//Nastaveni pro čtení
__w1_PORT |= (1 << __w1_bit);
__w1_DDR &= ~(1 << __w1_bit)
Také jsem to zkoušel.
Vnitřní pull-up rezistor AVR má jinou hodnotu než je doporučená pro DS18B20.
S jedním čidlem a třemi dráty to nicméně chodí velmi spolehlivě.
Na třídrátovou verzi stačí připsat pullup instrukci na správný pin do setup().
Staré Arduino API:
pinMode(pin, INPUT);
digitalWrite(pin, HIGH);
Nové API:
pinMode(pin, INPUT_PULLUP)
Na dvoudrátové parazitní napájení potřebujete kód, který to umí, a dva volné piny, jeden měkký a jeden „tvrdý“ (ten by mohl spínat i externím tranzistor).
Zkoušel jsem i dvoudrátovou verzi s jedním pinem a parazitním napájením a přepínáním mezi vnitřním pull-upem AVR procesoru a logickou 1, a to chodí špatně až vůbec. Proud nedostačuje. (S delší kabeláží a mnoha čidly obecně nelze parazitní napájení doporučit.)
Parazitní napájení funguje bez problémů, dlouhodobě jej používám s vnitřním tranzistorem pinu AVR. Naznak kódu nastaveni pinu jsem uvedl výše.
Aby to fungovalo, je potřeba splnit požadavky v dokumentaci. V tomto případě bude asi problém to, že po zadaní příkazu CONVERT T je nutno pull-up tranzistor sepnout do 10us!
Kód který používám (__w1_PORT |= (1 << __w1_bit);__w1_DDR |= (1 << __w1_bit);) se přeloží (avr-gcc) na dvě instrukce SBI. Provedení instrukce SBI 2 takty. Za 4 takty hotovo. Tzn při taktovaní procesoru pouze i 1 MHz je to bez problémů stihnutelné.
Ale funkce pinMode a digitalWrite jsou o poznaní pomalejší. Jsou to funkce, ... Je to udělané tak aby se to pěkně volalo. Rychlost neřeší. Snadno se tedy stane, že se pull-up tranzistor sepne pozdě a nefunguje to. Nebo ještě hůře, funguje to někdy.
http://garretlab.web.fc2.com/en/arduino/inside/arduino/wiring_digital.c/digitalWrite.html