Fork of Erik's DS1820 library working on OS6
Dependents: DS1820-example DS1820mitWebserver DS1820ohneWebserver
Diff: DS1820.h
- Revision:
- 0:a43dcf6ca539
diff -r 000000000000 -r a43dcf6ca539 DS1820.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DS1820.h Tue Dec 29 13:08:05 2020 +0000 @@ -0,0 +1,120 @@ + +#ifndef MBED_DS1820_H +#define MBED_DS1820_H + +#include "mbed.h" +#include "LinkedList2.h" + +#define FAMILY_CODE _ROM[0] +#define FAMILY_CODE_DS1820 0x10 +#define FAMILY_CODE_DS18B20 0x28 +#define FAMILY_CODE_DS1822 0x22 + +/** DS1820 Dallas 1-Wire Temperature Probe + * + * Example for single sensor: + * @code + * #include "mbed.h" + * #include "DS1820.h" + * + * DS1820 probe(DATA_PIN); + * + * int main() { + * while(1) { + * probe.convertTemperature(true, DS1820::all_devices); //Start temperature conversion, wait until completed + * printf("It is %3.1foC\r\n", probe.temperature()); + * ThisThread::sleep_for(chrono::milliseconds(1000)); + * } + * } + * @endcode + */ +class DS1820 { +public: + enum devices{ + this_device, // command applies to only this device + all_devices }; // command applies to all devices + + enum { + invalid_conversion = -1000 + }; + + /** Create a probe object connected to the specified pins + * + * The probe might either by regular powered or parasite powered. If it is parasite + * powered and power_pin is set, that pin will be used to switch an external mosfet connecting + * data to Vdd. If it is parasite powered and the pin is not set, the regular data pin + * is used to supply extra power when required. This will be sufficient as long as the + * number of probes is limitted. + * + * @param data_pin DigitalInOut pin for the data bus + * @param power_pin DigitalOut (optional) pin to control the power MOSFET + * @param power_polarity bool (optional) which sets active state (0 for active low (default), 1 for active high) + */ + DS1820(PinName data_pin, PinName power_pin = NC, bool power_polarity = 0); // Constructor with parasite power pin + ~DS1820(); + + /** Function to see if there are DS1820 devices left on a pin which do not have a corresponding DS1820 object + * + * @return - true if there are one or more unassigned devices, otherwise false + */ + static bool unassignedProbe(PinName pin); + + /** This routine will initiate the temperature conversion within + * one or all DS1820 probes. + * + * @param wait if true or parisitic power is used, waits up to 750 ms for + * conversion otherwise returns immediatly. + * @param device allows the function to apply to a specific device or + * to all devices on the 1-Wire bus. + * @returns milliseconds untill conversion will complete. + */ + int convertTemperature(bool wait, devices device=all_devices); + + /** This function will return the probe temperature. Approximately 10ms per + * probe to read its RAM, do CRC check and convert temperature on the LPC1768. + * + * @param scale, may be either 'c' or 'f' + * @returns temperature for that scale, or DS1820::invalid_conversion (-1000) if CRC error detected. + */ + float temperature(char scale='c'); + + /** This function sets the temperature resolution for the DS18B20 + * in the configuration register. + * + * @param a number between 9 and 12 to specify resolution + * @returns true if successful + */ + bool setResolution(unsigned int resolution); + + static LinkedList2<node> probes; + +private: + bool _parasite_power; + bool _power_mosfet; + bool _power_polarity; + + static char CRC_byte(char _CRC, char byte ); + static bool onewire_reset(DigitalInOut *pin); + void match_ROM(); + void skip_ROM(); + static bool search_ROM_routine(DigitalInOut *pin, char command, char *ROM_address); + static void onewire_bit_out (DigitalInOut *pin, bool bit_data); + void onewire_byte_out(char data); + static bool onewire_bit_in(DigitalInOut *pin); + char onewire_byte_in(); + static bool ROM_checksum_error(char *_ROM_address); + bool RAM_checksum_error(); + void read_RAM(); + static bool unassignedProbe(DigitalInOut *pin, char *ROM_address); + void write_scratchpad(int data); + bool read_power_supply(devices device=this_device); + + DigitalInOut _datapin; + DigitalOut _parasitepin; + + char _ROM[8]; + char RAM[9]; +}; + + +#endif \ No newline at end of file