Conexión al sensor de temperatura digital Arduino DS18B20, interfaz de 1 cable, firmware para nodemcu (ESP8266, ESP8266WiFi)

Buenos dias a todos
En la acción sobre Esp-wroom-02 hubo preguntas sobre quéPuede utilizar módulos similares. En la revisión "hágalo usted mismo" de hoy, conoceremos el sensor de temperatura DS18B20 en un estuche seguro, además de conectarle WiFi, aprender a ensamblar telemetría y crear gráficos. Precio a $ 12 por un montón de sensores de 10 piezas.
Sensores de temperatura de elección de harina.un gran número (DHT11, DHT22, DS18B20, CC2D23S, SHT21, BME280) No los compararé entre sí, esto ya se ha hecho durante mucho tiempo y es fácil de buscar en Google. La elección recayó en el DS18B20 porque se encontró en un estuche protector con una viga ya un precio bastante adecuado, bueno, y lo más probable es que ya se jugó con DHT11 y DHT22, su fiabilidad y precisión dejan mucho que desear, y BME280 es demasiado caro.
Funciones DS18B20.

  • Para una interfaz de 1 cable de un solo cable, un puerto de comunicación con el controlador es suficiente.
  • Cada dispositivo tiene un código de serie único con una longitud de 64 bits.
  • La capacidad de conectar múltiples sensores a través de una sola línea de comunicación.
  • No hay necesidad de componentes externos.
  • La capacidad de recibir energía directamente desde la línea de comunicación. Fuente de alimentación dentro de 3.0 V ... 5.5 V.
  • El rango de medición de temperatura es -55 ... +125 ° C.
  • El error no supera los 0.5 ° C en el rango de -10 ... +85 ° C.
  • Resolución de conversión 9… 12 bits. Establecido por el usuario.
  • El tiempo de medición no supera los 750 ms, con la resolución máxima posible de 12 bits.

Fotos El paquete de sensores vino en el paquete suave habitual.

El sensor en sí se ve así. Tiene tres cables +, - y datos.

Sensor + nodemcu v3

Si aún estás leyendo esto, entonces tienes el deseo de intentar ensamblar un sensor WiFi. Para esto necesitamos

  • Nodemcu v3
  • Sensor DS18B20
  • Cables de conexion
  • Cuenta en thingspeak.com

Conectamos el sensor a Nodemcu.

  • Cable rojo - VIN
  • Alambre negro - GND
  • Cable amarillo - D4
  • Cualquier cable que necesite para cerrar el D0 y RST, es necesario para el modo Deepsleep (sueño profundo). Antes de flashear, no olvides abrir.

Nosotros programamos
Para la programación, utilicé el IDE de Arduino, cómo configurarlo. Puede leer en Internet, este es un tema aparte y no este artículo. Para el código, por favor pulsa fuerte, aquí está el hodgepodge.
Cómo funciona el código:
Inicializamos WiFi y sensor.temperatura, conecte a WiFi, lea datos del sensor, envíe datos al servidor de thingspepeak (también podemos utilizar nuestro propio Openhab o cualquier otro servidor doméstico inteligente), luego envíe el módulo a reposo profundo durante 300 segundos (variable SLEEP_DELAY_IN_SECONDS), luego el nodemcu se activa y se repite Algoritmo de nuevo.
Después de registrarnos en thingspeak, necesitamos crear un nuevo canal.


Luego debe abrir la pestaña TECLAS DE API y copiar la clave CLAVE DE ESCRITURA DE LA API.

A continuación se muestra el código de firmware para nodemcu, reemplace las siguientes variables con sus datos

  • ssid - el nombre de tu WiFi
  • contraseña - contraseña wifi
  • apiKey - clave para thingspeak (WRITE API KEY)
  • SLEEP_DELAY_IN_SECONDS: cada cuántos segundos para enviar datos. El intervalo mínimo para uso libre es de 15 segundos.

/ *
Bosquejo que publica los datos de temperatura de un sensor DS1820 a un tema MQTT.
Este boceto va al MQTT profundo.
tema y se despierta periódicamente (configurar SLEEP_DELAY_IN_SECONDS en consecuencia).
Guía de conexión:
- conecte el pin DSP al pin RST para permitir que el ESP8266 se active periódicamente
- DS18B20:
+ conectar el pin VCC (3.3V) DS18B20 (VDD)
+ conecte GND al pin DS18B20 adecuado (GND)
+ conecte D4 al pin de datos DS18B20 (DQ)
+ conecte una resistencia de 4.7K entre DQ y VCC.
* /
#incluir
#incluir
#incluir
#define SLEEP_DELAY_IN_SECONDS 300
#define ONE_WIRE_BUS 2 // pin DS18B20, para NodeMCU esto es D4
const char * ssid = "WIFI SSID";
const char * password = "WIFI PASSWORD";
const char * server = "api.thingspeak.com";
String apiKey = "api key for write";
int enviado = 0;
WiFiClient espClient;
OneWire oneWire (ONE_WIRE_BUS);
DallasTemperature DS18B20 (& oneWire);
char TemperatureString [6];
configuración vacía () {
// configurar puerto serie
Serial.begin (115200);
// configurar WiFi
setup_wifi ();
// configurar el bus onewire
DS18B20.begin ();
}
void setup_wifi () {
retraso (10);
// Comenzamos conectándonos a una red WiFi
Serial.println ();
Serial.print ("Conectando a");
Serial.println (ssid);
WiFi.begin (ssid, contraseña);
while (WiFi.status ()! = WL_CONECTADO) {
retraso (500);
Serial.print (".");
}
Serial.println ("");
Serial.println ("WiFi conectado");
Serial.println ("dirección IP:");
Serial.println (WiFi.localIP ());
}
devolución de llamada vacía (char * topic, byte * payload, longitud int sin firmar) {
Serial.print ("El mensaje llegó [");
Serial.print (tema);
Serial.print ("]");
para (int i = 0; i <longitud; i ++) {
Serial.print ((char) payload [i]);
}
Serial.println ();
}
float getTemperature () {
// Serie << "Solicitando temperatura DS18B20 ..." << endl;
temperatura de flotación
hacer {
DS18B20.requestTemperatures ();
temp = DS18B20.getTempCByIndex (0);
retraso (100);
} while (temp == 85.0 || temp == (-127.0));
temperatura de retorno
}
bucle de vacío () {
temperatura del flotador = getTemperature ();
temperatura de envío (temperatura);
//Serial.println ();
Serial.println ("Conectando a:" + Cadena (temperatura));
// Serie << "Cierre de la conexión WiFi ..." << endl;
WiFi.disconnect ();
retraso (100);
Serial.println ("Ingreso al modo de suspensión profunda para:" + String (SLEEP_DELAY_IN_SECONDS) + "sec.");
// Serie << "Ingresando el modo de suspensión profunda para" << SLEEP_DELAY_IN_SECONDS << "segundos ..." << endl;
ESP.
//ESP.deepSleep(10 * 1000, WAKE_NO_RFCAL);
retraso (500); // espera que suceda el sueño profundo
}
void sendTeperatureTS (temperatura de flotación)
{
Cliente de WiFiClient;
Serial.println ("Step sendTeperatureTS");
if (client.connect (servidor, 80)) {// usa ip 184.106.153.149 o api.thingspeak.com
Serial.println ("Cliente WiFi conectado");
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);
retraso (1000);
Serial.println ("Step sendTeperatureTS end");
} // terminar si
enviado ++;
client.stop ();
Serial.println ("Step sendTeperatureTS exit");
} // finalizar envio

Lo que obtenemos al final.
Los datos con el intervalo especificado por usted se enviarán al servidor, donde se construirá un hermoso gráfico según los datos.

Quien quiera integrar estas cosas en sus sistemas domésticos inteligentes (por ejemplo, openhab), solo necesita cambiar el código para enviar al servidor mqtt.
Estos sensores también se pueden conectar al relé desde sonoff.
Para resumir:

  • + Pros
  • + Excelente sensor en una versión protegida (puede salir al exterior, al agua o incluso al suelo)
  • + Conexión simple y trabajo simple con el sensor.
  • + precio bastante razonable (hasta 100 rublos por 1 pieza)
  • - Contras
  • - sección delgada de cables
  • - hay emisiones anormales (un valor de temperatura incomprensible de 85 grados, pero esto es un error y se filtra en el código)

Recomiendo comprar.