/*
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
+108 |
6261
94
|
ЗЫ А как вашим устройством померять температуру в 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 чтобы не ждать долго обновления, ну и данные связанные с паролем
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.