Diltech RM Consultant
/
Double_I2C_Sample
Sample code with BluePill STM32F103C8 and Oled SSD1306 and LCD1602 on same connect on DS18B20.
Diff: ds18b20-single/DS18B20.cpp
- Revision:
- 0:47b4bbc994df
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ds18b20-single/DS18B20.cpp Sun May 29 16:30:05 2022 -0400 @@ -0,0 +1,163 @@ +/* MIT License +* +* Copyright (c) 2020 Lukas Gessner +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in all +* copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +* SOFTWARE. +*/ + +#include "DS18B20.h" + +OWI::OWI(PinName pin):owi_io(pin) +{ + +} + +void OWI::write0() +{ + owi_io.output(); // timeslot = 70us + owi_io.write(0); // owi = 0; + wait_us(60); + owi_io.input(); + wait_us(10); +} + +void OWI::write1() // timeslot = 70us +{ + owi_io.output(); + owi_io.write(0); // owi = 0; + wait_us(6); + owi_io.input(); + wait_us(64); +} + +unsigned char OWI::readBit() +{ + unsigned char readbit; + + owi_io.output(); + owi_io.write(0); // owi = 0; + wait_us(6); + owi_io.input(); + wait_us(9); + readbit = owi_io.read(); + wait_us(55); + + return readbit; +} + +unsigned char OWI::detectPresence() +{ + core_util_critical_section_enter(); + + unsigned char presencebit; + + owi_io.output(); + owi_io.write(0); // owi = 0; + wait_us(480); + owi_io.input(); + wait_us(70); + presencebit = !owi_io.read(); + wait_us(410); + + core_util_critical_section_exit(); + + return presencebit; +} + +void OWI::sendByte(unsigned char data) +{ + core_util_critical_section_enter(); + + unsigned char temp; + unsigned char i; + for (i = 0; i < 8; i++) + { + temp = data & 0x01; + if (temp) + { + this->write1(); + } + else + { + this->write0(); + } + data >>= 1; + } + + core_util_critical_section_exit(); +} + +unsigned char OWI::receiveByte() +{ + core_util_critical_section_enter(); + + unsigned char data; + unsigned char i; + data = 0x00; + for (i = 0; i < 8; i++) + { + data >>= 1; + if (this->readBit()) + { + data |= 0x80; + } + } + + core_util_critical_section_exit(); + return data; +} + + +DS18B20::DS18B20(PinName pin):DS18B20_OWI(pin) +{ + +} + +float DS18B20::readTemp() +{ + unsigned char msb,lsb; + int itemp; + float ftemp; + + DS18B20_OWI.detectPresence(); + DS18B20_OWI.sendByte(OWI_SKIP_ROM); + DS18B20_OWI.sendByte(DS18B20_START); + + #if MBED_MAJOR_VERSION >= 6 + ThisThread::sleep_for(750ms); + #elif MBED_MAJOR_VERSION < 5 + wait(0.75); + #else + ThisThread::sleep_for(750); + #endif + + DS18B20_OWI.detectPresence(); + DS18B20_OWI.sendByte(OWI_SKIP_ROM); + DS18B20_OWI.sendByte(DS18B20_READ_SCRATCH_PAD); + lsb = DS18B20_OWI.receiveByte(); + msb = DS18B20_OWI.receiveByte(); + + itemp = (msb<<8)+lsb; + ftemp = (float)itemp / 16.0f; + + return ftemp; +} + + +