Всем добрый день.
В акции про Esp-wroom-02 были вопросы для чего можно использовать подобные модули. В сегодняшнем обзоре «сделай сам» мы познакомимся с датчиком температуры DS18B20 в защищенном корпусе, а так же приделаем к нему WiFi, научимся собирать телеметрию и строить графики. Цена в 12$ за пучок датчиков из 10 штук.
Муки выбора
Датчиков для измерения температуры большое множество (DHT11, DHT22, DS18B20, CC2D23S, SHT21, BME280) сравнивать их друг с другом не буду, это давно уже сделано и легко гуглится. Выбор пал на DS18B20 потому как был найден в защитном корпусе пучком и по вполне адекватной цене, ну и скорее всего что с DHT11 и DHT22 уже игрался, их надежность и точность оставляет желать лучшего, а BME280 слишком дорогой.
Особенности DS18B20.
- Для однопроводного интерфейса 1-Wire достаточно одного порта связи с контроллером.
- Каждое устройство имеет уникальный серийный код длиной 64 разряда.
- Возможность подключения нескольких датчиков через одну линию связи.
- Нет необходимости во внешних компонентах.
- Возможность получать питание непосредственно от линии связи. Напряжение питания в пределах 3,0 В … 5,5 В.
- Диапазон измерения температуры -55… +125 °C.
- Погрешность не превышает 0,5 °C в диапазоне -10… +85 °C.
- Разрешение преобразования 9 … 12 бит. Задается пользователем.
- Время измерения, не превышает 750 мс, при максимально возможном разрешении 12 бит.
Фотографии
Пучок датчиков пришел в обычном мягком пакете.
Сам датчик выглядит вот так. Имеет три провода +,- и data.
Датчик + nodemcu v3
Сделай сам
Если вы все еще это читаете, значит у вас есть желание попробовать собрать WiFi датчик. Для этого нам понадобиться
- Nodemcu v3
- Датчик DS18B20
- Соединительные провода
- Аккаунт на thingspeak.com
Подключаем датчик к Nodemcu
- Красный провод — VIN
- Черный провод — GND
- Желтый провод — D4
- Любым проводом нужно замкнуть D0 и RST, это нужно для режима Deepsleep (глубокий сон). Перед прошивкой не забывайте разомкнуть.
Программируем
Для программирования я использовал Arduino IDE, как ее настроить — можно почитать в интернете, это отдельная тема и не данной статьи. За код прошу сильно бить, здесь сборная солянка.
Как код работает:
Производим инициализацию WiFI и датчика температуры, подключаемся к WiFi, считываем данные с датчика, отправляем данные на сервер thingspeak (можем и на собственный openhab либо любой другой сервер умного дома ), затем отправляем модуль в режим глубокого сна на 300 секунд (переменная SLEEP_DELAY_IN_SECONDS), затем nodemcu просыпается и повторяет алгоритм заново.
После регистрации на thingspeak нам необходимо создать новый канал.
Затем нужно открыть вкладку API KEYS и скопировать ключ WRITE API KEY
Ниже представлен код прошивки для nodemcu, замените следующие переменные на свои данные
- ssid — название вашей WiFi
- password — пароль от WiFi
- apiKey — ключ для thingspeak (WRITE API KEY)
- SLEEP_DELAY_IN_SECONDS — каждые сколько секунд отправлять данные. Минимальный интервал для бесплатного использования — 15 секунд.
/*
Sketch which publishes temperature data from a DS1820 sensor to a MQTT topic.
This sketch goes in deep sleep mode once the temperature has been sent to the MQTT
topic and wakes up periodically (configure SLEEP_DELAY_IN_SECONDS accordingly).
Hookup guide:
- connect D0 pin to RST pin in order to enable the ESP8266 to wake up periodically
- DS18B20:
+ connect VCC (3.3V) to the appropriate DS18B20 pin (VDD)
+ connect GND to the appopriate DS18B20 pin (GND)
+ connect D4 to the DS18B20 data pin (DQ)
+ connect a 4.7K resistor between DQ and VCC.
*/
#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define SLEEP_DELAY_IN_SECONDS 300
#define ONE_WIRE_BUS 2 // DS18B20 pin, у NodeMCU это D4
const char* ssid = "WIFI SSID";
const char* password = "WIFI PASSWORD";
const char* server = "api.thingspeak.com";
String apiKey ="api key for write";
int sent=0;
WiFiClient espClient;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature DS18B20(&oneWire);
char temperatureString[6];
void setup() {
// setup serial port
Serial.begin(115200);
// setup WiFi
setup_wifi();
// setup OneWire bus
DS18B20.begin();
}
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
}
Serial.println();
}
float getTemperature() {
//Serial << "Requesting DS18B20 temperature..." << endl;
float temp;
do {
DS18B20.requestTemperatures();
temp = DS18B20.getTempCByIndex(0);
delay(100);
} while (temp == 85.0 || temp == (-127.0));
return temp;
}
void loop() {
float temperature = getTemperature();
sendTeperatureTS(temperature);
//Serial.println();
Serial.println("Connecting to: "+String(temperature));
//Serial << "Closing WiFi connection..." << endl;
WiFi.disconnect();
delay(100);
Serial.println("Entering deep sleep mode for: "+String(SLEEP_DELAY_IN_SECONDS)+" sec.");
//Serial << "Entering deep sleep mode for " << SLEEP_DELAY_IN_SECONDS << " seconds..." << endl;
ESP.deepSleep(SLEEP_DELAY_IN_SECONDS * 1000000, WAKE_RF_DEFAULT);
//ESP.deepSleep(10 * 1000, WAKE_NO_RFCAL);
delay(500); // wait for deep sleep to happen
}
void sendTeperatureTS(float temp)
{
WiFiClient client;
Serial.println("Step sendTeperatureTS");
if (client.connect(server, 80)) { // use ip 184.106.153.149 or api.thingspeak.com
Serial.println("WiFi Client connected ");
String postStr = apiKey;
postStr += "&field1=";
postStr += String(temp);
postStr += "\r\n\r\n";
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: " + apiKey + "\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n");
client.print(postStr);
delay(1000);
Serial.println("Step sendTeperatureTS end");
}//end if
sent++;
client.stop();
Serial.println("Step sendTeperatureTS exit");
}//end send
Что в итоге получим
Данные с указанным вами интервалом будут отправлять на сервер, там по данным будет строиться красивый график.
Кто хочет интегрировать подобные вещи в свои системы умного дома (openhab например), достаточно нужно изменить код для отправки на mqtt-сервер.
К реле от sonoff так же можно подключить данные датчики.
Подведем итог:
- + Плюсы
- + отличный датчик в защищенном исполнении (можно на улицу, в воду или даже в землю)
- + простое подключение и простая работа с датчиком
- + вполне приемлемая цена (до 100 рублей за 1шт)
- — Минусы
- - тонкое сечение проводов
- - бывают аномальные выбросы (непонятное значение температуры 85 градусов, но это баг и в коде фильтруется)
К покупке рекомендую.
ЗЫ А как вашим устройством померять температуру в 85 градусов? ;)
При возможности лучше подключать трёхпроводным способом, массу проблем можно будет избежать.
Вернулся к названию раздела, и за «руками» плюс.
Есть небольшой вопрос, а подключить все датчики сразу не пробовали, и если да, то какой разброс в показаниях.
И если вдруг случайно в кустах оказался термометр, то какую температуру он показывал по сравнению с показанием датчика?
С DTI 1000 вполне бьётся, но все 18В20 таки разные, как бы их на заводе лазером не подгоняли.
Равно, как и автор обзора.
Датчик греется, когда он работает. Как и любой полупроводниковый прибор. Выделяет теплоту. А в данном конкретном случае его ещё засунули в металлическую герметичную гильзу.
Его надо использовать так:
1. Подали питание на датчик каким-нибудь ключом
2. Подождали чуть, пока он включится
3. Запросили температуру
4. Подождали готовности
5. Считали температуру
6. Обесточили
7. Ждём положенный срок до нового измерения
Тогда он будет давать очень точные показания.
Но 90% того, что есть в интернете — это скопипащенные друг у друга скетчи, даже без изменения названия переменных. Тупо читаем в цикле, а питание жарит на всю катушку.
Отсюда и массовая проблема с этим.
Просто даташиты надо читать и хоть чуточку делать что-то, отличное от «толпы». Тогда всё получится, уверен.
PS: Да. Про подтягивание линии к плюсу тоже никто не помнит. А это тоже есть в даташите.
Насчёт всего остального — очень согласен. Несколько лет назад, когда я пытался приколхозить эти датчики к msp430, пришлось читать даташит от корки до корки.
Ну и сейчас эти датчики сплошные подделки, на это тоже надо делать поправку.
Безусловно. Но в Китае оригинальные и не купить, опрометчиво на это рассчитывать.
Не надо его выключать. Самонагрев идёт только в момент преобразования, когда дали команду. И то на десятые доли.
«Я 11 лет считаю спички у вас в коробках — их то 59, то 60, а иногда и 58. Вы там сумасшедшие что ли все???»
Пример на Lua:
Исходник: github.com/dimka-rs/mynodemcu/blob/master/bmp180-dht11/init.lua
Ну и насчёт 85 градусов — в протоколе при общении с датчиком читается scratchpad на несколько байт, там идёт еще и CRC данных, по ним проверяется правильность передачи данных. Надо смотреть, как работает с CRC конкретная либа и что она возвращает в случае, если данные не ОК. Тогда и не будет 85.
Такое имеет смысл городить разве что при наличии уже глубоко закопанной километровой двухпроводной линии.
narodmon.ru
Поэтому включились,
считали 85,
поняли что датчик живой
и начали с ним работать.
питание с датчика надо снимать в простое, чтобы он не добавлял к результату собственное выдаваемое тепло.
2) Стоимость услуг Почты России выросла, т.к. почта РФ обещала перестать принимать безтрековые посылки, а за трековость повышенный ценник
3) Издержки утери.
ну и длина гильзы.
меряю температуру в АКПП. Там до 130 (127 прибор показывает) градусов.
Они берут температуру от провода. Поэтомц для измерения температуры трубы, например, обматывают провод вокруг трубы 2-3 раза, приклеивают датчик и все это в теплоизоляцию. Тогда норм!
Первый раз при включении данные отсылаются, а дальше тишина.
В скетче снизил только задержку отсылки с 300 до 60 чтобы не ждать долго обновления, ну и данные связанные с паролем