Блог о веб программировании

2016-09-01

Arduino. Как получить значение температуры от RTC DS3231

Многие уже наверно пользовались Arduino шилдом (модулем) "Часы реального времени" DS3231 (RTC) для получения даты и времени. Однако у DS3231 есть еще и одна полезная особенность как наличие цифрового температурного датчика с точностью измерения ±3°C, который измеряет температуру кристалла микросхемы, а не окружающей среды как многие думают.

Однако несмотря на это мы можем воспользоваться этим датчиком для измерения температуры внешней среды, как показывает практика из показаний датчика температуры надо просто вычесть 2 - 3 градуса, что бы получить температуру "за бортом". Кстати датчик температуры очень чувствительный, достаточно прикоснуться пальцем к микросхеме и температура начинает сразу расти. Поэтому надо учитывать где и как вы размешаете шилд, что бы на него не действовали внешние факторы, такие как нагревание или наоборот охлаждение, тогда вы сможете использовать данные датчика для измерения температуры. Наличие датчика температуры в микросхеме DS3231 позволить вам сэкономить на внешнем датчике температуры и позволить оставить свободным еще один вывод в Arduino.

И так что бы нам получить температуры нам надо в нашу программу функцию получения gettemperature():

float gettemperature() {
    // DS3231_ADDR - это значение адреса DS3231
    uint8_t tMSB, tLSB;
    Wire.beginTransmission(DS3231_ADDR);
    Wire.write(0x11);
    Wire.endTransmission();
    Wire.requestFrom(DS3231_ADDR, 2);
    tMSB = Wire.read();
    tLSB = Wire.read();
    return (tMSB & B01111111) + ( (tLSB >> 6) * 0.25 );
}

А вот как примерно будет выглядеть скетч для Arduino UNO:

//
// Пример получения температуры из DS3231
//
 
#include <Wire.h>
#define DS3231_ADDR 0x68
 
void setup() {
    delay(300);
    Serial.begin(9600);
}
 
void loop() {
    if (millis() % 1000 == 0) {
        Serial.print("Temp:");C
        Serial.println(gettemperature()); // Тут можно сделать коррекцию на ±2-3ºC
    }
}
 
//
// Возвращает значение температуры в float в C
//
float gettemperature() {
    uint8_t tMSB, tLSB;
    Wire.beginTransmission(DS3231_ADDR);
    Wire.write(0x11);
    Wire.endTransmission();
    Wire.requestFrom(DS3231_ADDR, 2);
    tMSB = Wire.read();
    tLSB = Wire.read();
    return (tMSB & B01111111) + ( (tLSB >> 6) * 0.25 );
}

Теперь вы можете получать значения температуры :)

Понравился пост? Поделитесь ссылкой с друзьями, они оценят:

Комментарии

Алексей, честно говоря не тестировал при минусовых температурах, т.к. у меня чип DS3231S о он работает от 0 до +70 :)
Скажите, пожалуйста, данный код вывода температуры корректно отрабатывает отрицательные температуры?

Оставить комментарий