Fork of Erik's DS1820 library working on OS6
Dependents: DS1820-example DS1820mitWebserver DS1820ohneWebserver
DS1820.h@1:ce70453af3db, 2020-12-29 (annotated)
- Committer:
- star297
- Date:
- Tue Dec 29 13:11:12 2020 +0000
- Revision:
- 1:ce70453af3db
- Parent:
- 0:a43dcf6ca539
Initial commit.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
star297 | 0:a43dcf6ca539 | 1 | |
star297 | 0:a43dcf6ca539 | 2 | #ifndef MBED_DS1820_H |
star297 | 0:a43dcf6ca539 | 3 | #define MBED_DS1820_H |
star297 | 0:a43dcf6ca539 | 4 | |
star297 | 0:a43dcf6ca539 | 5 | #include "mbed.h" |
star297 | 0:a43dcf6ca539 | 6 | #include "LinkedList2.h" |
star297 | 0:a43dcf6ca539 | 7 | |
star297 | 0:a43dcf6ca539 | 8 | #define FAMILY_CODE _ROM[0] |
star297 | 0:a43dcf6ca539 | 9 | #define FAMILY_CODE_DS1820 0x10 |
star297 | 0:a43dcf6ca539 | 10 | #define FAMILY_CODE_DS18B20 0x28 |
star297 | 0:a43dcf6ca539 | 11 | #define FAMILY_CODE_DS1822 0x22 |
star297 | 0:a43dcf6ca539 | 12 | |
star297 | 0:a43dcf6ca539 | 13 | /** DS1820 Dallas 1-Wire Temperature Probe |
star297 | 0:a43dcf6ca539 | 14 | * |
star297 | 0:a43dcf6ca539 | 15 | * Example for single sensor: |
star297 | 0:a43dcf6ca539 | 16 | * @code |
star297 | 0:a43dcf6ca539 | 17 | * #include "mbed.h" |
star297 | 0:a43dcf6ca539 | 18 | * #include "DS1820.h" |
star297 | 0:a43dcf6ca539 | 19 | * |
star297 | 0:a43dcf6ca539 | 20 | * DS1820 probe(DATA_PIN); |
star297 | 0:a43dcf6ca539 | 21 | * |
star297 | 0:a43dcf6ca539 | 22 | * int main() { |
star297 | 0:a43dcf6ca539 | 23 | * while(1) { |
star297 | 0:a43dcf6ca539 | 24 | * probe.convertTemperature(true, DS1820::all_devices); //Start temperature conversion, wait until completed |
star297 | 0:a43dcf6ca539 | 25 | * printf("It is %3.1foC\r\n", probe.temperature()); |
star297 | 0:a43dcf6ca539 | 26 | * ThisThread::sleep_for(chrono::milliseconds(1000)); |
star297 | 0:a43dcf6ca539 | 27 | * } |
star297 | 0:a43dcf6ca539 | 28 | * } |
star297 | 0:a43dcf6ca539 | 29 | * @endcode |
star297 | 0:a43dcf6ca539 | 30 | */ |
star297 | 0:a43dcf6ca539 | 31 | class DS1820 { |
star297 | 0:a43dcf6ca539 | 32 | public: |
star297 | 0:a43dcf6ca539 | 33 | enum devices{ |
star297 | 0:a43dcf6ca539 | 34 | this_device, // command applies to only this device |
star297 | 0:a43dcf6ca539 | 35 | all_devices }; // command applies to all devices |
star297 | 0:a43dcf6ca539 | 36 | |
star297 | 0:a43dcf6ca539 | 37 | enum { |
star297 | 0:a43dcf6ca539 | 38 | invalid_conversion = -1000 |
star297 | 0:a43dcf6ca539 | 39 | }; |
star297 | 0:a43dcf6ca539 | 40 | |
star297 | 0:a43dcf6ca539 | 41 | /** Create a probe object connected to the specified pins |
star297 | 0:a43dcf6ca539 | 42 | * |
star297 | 0:a43dcf6ca539 | 43 | * The probe might either by regular powered or parasite powered. If it is parasite |
star297 | 0:a43dcf6ca539 | 44 | * powered and power_pin is set, that pin will be used to switch an external mosfet connecting |
star297 | 0:a43dcf6ca539 | 45 | * data to Vdd. If it is parasite powered and the pin is not set, the regular data pin |
star297 | 0:a43dcf6ca539 | 46 | * is used to supply extra power when required. This will be sufficient as long as the |
star297 | 0:a43dcf6ca539 | 47 | * number of probes is limitted. |
star297 | 0:a43dcf6ca539 | 48 | * |
star297 | 0:a43dcf6ca539 | 49 | * @param data_pin DigitalInOut pin for the data bus |
star297 | 0:a43dcf6ca539 | 50 | * @param power_pin DigitalOut (optional) pin to control the power MOSFET |
star297 | 0:a43dcf6ca539 | 51 | * @param power_polarity bool (optional) which sets active state (0 for active low (default), 1 for active high) |
star297 | 0:a43dcf6ca539 | 52 | */ |
star297 | 0:a43dcf6ca539 | 53 | DS1820(PinName data_pin, PinName power_pin = NC, bool power_polarity = 0); // Constructor with parasite power pin |
star297 | 0:a43dcf6ca539 | 54 | ~DS1820(); |
star297 | 0:a43dcf6ca539 | 55 | |
star297 | 0:a43dcf6ca539 | 56 | /** Function to see if there are DS1820 devices left on a pin which do not have a corresponding DS1820 object |
star297 | 0:a43dcf6ca539 | 57 | * |
star297 | 0:a43dcf6ca539 | 58 | * @return - true if there are one or more unassigned devices, otherwise false |
star297 | 0:a43dcf6ca539 | 59 | */ |
star297 | 0:a43dcf6ca539 | 60 | static bool unassignedProbe(PinName pin); |
star297 | 0:a43dcf6ca539 | 61 | |
star297 | 0:a43dcf6ca539 | 62 | /** This routine will initiate the temperature conversion within |
star297 | 0:a43dcf6ca539 | 63 | * one or all DS1820 probes. |
star297 | 0:a43dcf6ca539 | 64 | * |
star297 | 0:a43dcf6ca539 | 65 | * @param wait if true or parisitic power is used, waits up to 750 ms for |
star297 | 0:a43dcf6ca539 | 66 | * conversion otherwise returns immediatly. |
star297 | 0:a43dcf6ca539 | 67 | * @param device allows the function to apply to a specific device or |
star297 | 0:a43dcf6ca539 | 68 | * to all devices on the 1-Wire bus. |
star297 | 0:a43dcf6ca539 | 69 | * @returns milliseconds untill conversion will complete. |
star297 | 0:a43dcf6ca539 | 70 | */ |
star297 | 0:a43dcf6ca539 | 71 | int convertTemperature(bool wait, devices device=all_devices); |
star297 | 0:a43dcf6ca539 | 72 | |
star297 | 0:a43dcf6ca539 | 73 | /** This function will return the probe temperature. Approximately 10ms per |
star297 | 0:a43dcf6ca539 | 74 | * probe to read its RAM, do CRC check and convert temperature on the LPC1768. |
star297 | 0:a43dcf6ca539 | 75 | * |
star297 | 0:a43dcf6ca539 | 76 | * @param scale, may be either 'c' or 'f' |
star297 | 0:a43dcf6ca539 | 77 | * @returns temperature for that scale, or DS1820::invalid_conversion (-1000) if CRC error detected. |
star297 | 0:a43dcf6ca539 | 78 | */ |
star297 | 0:a43dcf6ca539 | 79 | float temperature(char scale='c'); |
star297 | 0:a43dcf6ca539 | 80 | |
star297 | 0:a43dcf6ca539 | 81 | /** This function sets the temperature resolution for the DS18B20 |
star297 | 0:a43dcf6ca539 | 82 | * in the configuration register. |
star297 | 0:a43dcf6ca539 | 83 | * |
star297 | 0:a43dcf6ca539 | 84 | * @param a number between 9 and 12 to specify resolution |
star297 | 0:a43dcf6ca539 | 85 | * @returns true if successful |
star297 | 0:a43dcf6ca539 | 86 | */ |
star297 | 0:a43dcf6ca539 | 87 | bool setResolution(unsigned int resolution); |
star297 | 0:a43dcf6ca539 | 88 | |
star297 | 0:a43dcf6ca539 | 89 | static LinkedList2<node> probes; |
star297 | 0:a43dcf6ca539 | 90 | |
star297 | 0:a43dcf6ca539 | 91 | private: |
star297 | 0:a43dcf6ca539 | 92 | bool _parasite_power; |
star297 | 0:a43dcf6ca539 | 93 | bool _power_mosfet; |
star297 | 0:a43dcf6ca539 | 94 | bool _power_polarity; |
star297 | 0:a43dcf6ca539 | 95 | |
star297 | 0:a43dcf6ca539 | 96 | static char CRC_byte(char _CRC, char byte ); |
star297 | 0:a43dcf6ca539 | 97 | static bool onewire_reset(DigitalInOut *pin); |
star297 | 0:a43dcf6ca539 | 98 | void match_ROM(); |
star297 | 0:a43dcf6ca539 | 99 | void skip_ROM(); |
star297 | 0:a43dcf6ca539 | 100 | static bool search_ROM_routine(DigitalInOut *pin, char command, char *ROM_address); |
star297 | 0:a43dcf6ca539 | 101 | static void onewire_bit_out (DigitalInOut *pin, bool bit_data); |
star297 | 0:a43dcf6ca539 | 102 | void onewire_byte_out(char data); |
star297 | 0:a43dcf6ca539 | 103 | static bool onewire_bit_in(DigitalInOut *pin); |
star297 | 0:a43dcf6ca539 | 104 | char onewire_byte_in(); |
star297 | 0:a43dcf6ca539 | 105 | static bool ROM_checksum_error(char *_ROM_address); |
star297 | 0:a43dcf6ca539 | 106 | bool RAM_checksum_error(); |
star297 | 0:a43dcf6ca539 | 107 | void read_RAM(); |
star297 | 0:a43dcf6ca539 | 108 | static bool unassignedProbe(DigitalInOut *pin, char *ROM_address); |
star297 | 0:a43dcf6ca539 | 109 | void write_scratchpad(int data); |
star297 | 0:a43dcf6ca539 | 110 | bool read_power_supply(devices device=this_device); |
star297 | 0:a43dcf6ca539 | 111 | |
star297 | 0:a43dcf6ca539 | 112 | DigitalInOut _datapin; |
star297 | 0:a43dcf6ca539 | 113 | DigitalOut _parasitepin; |
star297 | 0:a43dcf6ca539 | 114 | |
star297 | 0:a43dcf6ca539 | 115 | char _ROM[8]; |
star297 | 0:a43dcf6ca539 | 116 | char RAM[9]; |
star297 | 0:a43dcf6ca539 | 117 | }; |
star297 | 0:a43dcf6ca539 | 118 | |
star297 | 0:a43dcf6ca539 | 119 | |
star297 | 0:a43dcf6ca539 | 120 | #endif |