Fork of Erik's DS1820 library working on OS6

Dependencies:   LinkedList2

Dependents:   DS1820-example DS1820mitWebserver DS1820ohneWebserver

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?

UserRevisionLine numberNew 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