#include "Arduino.h"
#define ONEWIRE_PIN PA2
static uint8_t ds18b20_read_byte(void)
{
uint8_t i, j, dat;
dat = 0;
for (i = 1; i <= 8; i++)
{
j = ds18b20_read_bit();
dat = (j << 7) | dat >> 1;
}
return dat;
}
static uint8_t ds18b20_read_bit(void)
{
pinMode(ONEWIRE_PIN,OUTPUT);
uint8_t result;
digitalWrite(ONEWIRE_PIN,LOW);
delayMicroseconds(2);
digitalWrite(ONEWIRE_PIN,HIGH);
delayMicroseconds(12);
pinMode(ONEWIRE_PIN,INPUT);
if (digitalRead(ONEWIRE_PIN))
{
result = 1;
}
else
{
result = 0;
}
delayMicroseconds(50);
return result;
}
static void ds18b20_write_byte(uint8_t byte)
{
uint8_t i;
uint8_t first_bit;
pinMode(ONEWIRE_PIN,OUTPUT);
for (i = 1; i <= 8; i++)
{
first_bit = byte & 0x01;
byte = byte >> 1;
if (first_bit)
{ // write 1
digitalWrite(ONEWIRE_PIN,LOW);
delayMicroseconds(2);
digitalWrite(ONEWIRE_PIN,HIGH);
delayMicroseconds(60);
}
else
{ // write 0
digitalWrite(ONEWIRE_PIN,LOW);
delayMicroseconds(60);
digitalWrite(ONEWIRE_PIN,HIGH);
delayMicroseconds(2);
}
}
}
/*******************************************************************************
* @biref Detected presence signal
* @retval result [1: inexistence,0: existence]
*******************************************************************************
*/
static uint8_t ds18b20_check(void)
{
uint8_t result = 1;
uint8_t retry = 0;
pinMode(ONEWIRE_PIN,INPUT);
//If the presence of a signal is not detected (always high)
and it does not exceed 200 us, the loop is executed.
while (digitalRead(ONEWIRE_PIN) && retry < 200)
{
retry++;
delayMicroseconds(1);
}
// If the retry exceeds 200, the DS18B20 does not exist.
if (retry >= 200)
{
result = 1;
}
else
{
retry = 0;
while (!digitalRead(ONEWIRE_PIN) && retry < 240)
{
retry++;
delayMicroseconds(1);
}
if (retry >= 240)
{
result = 1;
}
else
{
result = 0;
}
}
// Serial.printf("check:%d\n",result); To detect if there is a response.
return result;
}
static void ds18b20_rst(void)
{
pinMode(ONEWIRE_PIN,OUTPUT);
digitalWrite(ONEWIRE_PIN,LOW);
delayMicroseconds(750);
digitalWrite(ONEWIRE_PIN,HIGH);
delayMicroseconds(15);// 15us
}
float ds18b20_get_temp(void)
{
uint8_t temp;
uint8_t TL, TH;
short tem;
ds18b20_start();
ds18b20_rst();
ds18b20_check();
ds18b20_write_byte(0xcc);
ds18b20_write_byte(0xbe);
// Read the signal from the DS18B20 sensor.
TL = ds18b20_read_byte(); // LSB
TH = ds18b20_read_byte(); // MSB
if (TH > 7)
{
TH = ~TH;
TL = ~TL;
temp = 0;
}
else
{
temp = 1;
}
tem = TH;
tem <<= 8;
tem += TL;
return (float)tem * 0.0625;
}
static void ds18b20_start(void)// ds1820 start convert
{
ds18b20_rst();
ds18b20_check();
ds18b20_write_byte(0xcc); // skip rom
ds18b20_write_byte(0x44); // convert
}
void setup()
{
Serial.begin(115200);
}
void loop()
{
float control = ds18b20_get_temp();
Serial.printf("temp:%f\n",control);
delay(1000);
}