Como fazer a interface de um sensor de temperatura DS18B20 com o driver Onewire do MicroPython

Cómo conectar un sensor de temperatura DS18B20 con el controlador MicroPython Onewire

El protocolo 1-Wire es un estándar propietario para comunicaciones de datos en serie de Maxim Integrated. Este protocolo es un estándar de comunicación de datos maestro-esclavo de baja velocidad, semidúplex, bidireccional y de bajo consumo utilizado por varios dispositivos, incluidos sensores de temperatura, relojes en tiempo real, EEPROM, dispositivos de identificación (protección de propiedad intelectual), temporizadores e iButtons. .

Sólo puede haber un dispositivo maestro en un bus estándar de 1 cable, con hasta 100 dispositivos esclavos. La comunicación serie está totalmente controlada y gestionada por el dispositivo maestro. El protocolo no utiliza una señal de reloj y los datos se comunican en intervalos de tiempo fijos. Esto significa que los dispositivos esclavos deben sincronizarse con el maestro para operaciones de lectura y escritura.

El bus estándar de 1 cable tiene un mínimo de dos cables: una línea de datos y el retorno a tierra. La mayoría de los dispositivos de 1 cable tienen tres terminales. La tercera línea se agrega para una oferta positiva.

Para un bus de dos líneas, los terminales VDD y GND del esclavo de 1 cable están conectados al retorno a tierra. La señal y los datos son proporcionados por la línea de datos. Esto se llama modo de alimentación parasitaria.

En un autobús con tres líneas, el VDD también está asignado a la alimentación positiva. A esto se le llama alimentación convencional. El modo se considera más confiable que la energía parásita porque esta última depende del tiempo de activación de la línea de datos.

Algunos dispositivos de 1 cable tienen cinco terminales para un mayor acceso a la línea para la detección de secuencia.

Como 1-Wire es un protocolo propietario, no tiene implementación de hardware en microcontroladores. Sin embargo, se implementa en el software de la mayoría de los microcontroladores y computadoras de placa única debido a la popularidad de los dispositivos de 1 cable, como los iButtons.

MicroPython implementa el protocolo 1-Wire en su software, utilizando bit-banging. El patrón se puede aplicar a cualquier pin con capacidad de salida. En este artículo, cubriremos el controlador MicroPython Onewire y analizaremos cómo se puede utilizar para interactuar con un sensor de temperatura DS18B20.

El protocolo
Para el protocolo 1-Wire, la comunicación de datos con los dispositivos esclavos la controla el maestro. Como no hay señal de reloj, los esclavos deben sincronizar su reloj interno con las señales del dispositivo maestro. El maestro puede ser un microcontrolador, una microcomputadora o una computadora de escritorio.

El maestro utiliza cinco tipos de señales para comunicarse con los dispositivos esclavos: reinicio, presencia, escritura 0, escritura 1 y lectura.

El maestro inicia la comunicación con los esclavos con una señal de reinicio. En respuesta, los esclavos tirarán de la línea de datos, que será muestreada por el maestro como señal de presencia. Una vez confirmada la presencia de al menos un esclavo en el bus, el maestro comienza a enviar comandos ROM.

El primer comando es el comando de búsqueda de ROM, que busca las direcciones ROM de los esclavos conectados. Cada esclavo de 1 cable se identifica mediante una dirección ROM de 64 bits. Cuando el maestro recibe las direcciones ROM de los esclavos conectados, busca conflictos de direcciones. El dispositivo maestro utiliza además las direcciones para identificar un dispositivo de 1 cable y comunicar los comandos de función asociados con él.

Los comandos ROM tienen una longitud de 8 bits. Todos los datos, ya sean escritos o leídos desde dispositivos esclavos, también están en grupos de 8 bits.

De forma predeterminada, la línea de datos se eleva con la ayuda de una resistencia pull-up externa. Sin este pull-up, la comunicación de datos no sería posible.

El reinicio es la primera señal enviada por el maestro. Esto se hace llevando la línea de datos a 480 nodos. Luego libera la línea de datos, permitiendo que la resistencia pull-up levante la línea de datos.

Los dispositivos esclavos cuentan con un multivibrador monoestable básico para detectar el estado de la línea de datos y la duración de los pulsos. Cuando se conectan al bus, los esclavos pueden detectar una señal de reinicio y responder tirando de la línea de datos hacia abajo entre 60 y 240 nudos.

  • Si después de una señal de reinicio la línea de datos todavía está alta, el maestro supone que no hay esclavos conectados al bus.
  • Si tras una señal de reset se reduce la línea de datos, el maestro reconoce que al menos un esclavo está conectado al bus.

Después de confirmar la presencia de un esclavo de 1 cable, el maestro comienza a escribir ROM y comandos de función. En respuesta a estos comandos, el maestro leerá los dispositivos esclavos. Como se mencionó, los comandos y los datos están en grupos de 8 bits. Se comunican como paquetes donde los errores en cada bloque de 8 bits se revisan con una verificación de redundancia cíclica (CRC).

A nivel de señal, cada bit se comunica en un intervalo de tiempo fijo de 60 us o menos si el bus está sobrecargado. Hay un intervalo de 1us entre cada intervalo de tiempo, por lo que la resistencia pull-up puede alinear la línea de datos entre la comunicación de cada bit.

  • Para escribir '0', el maestro baja la línea de datos durante todo el intervalo de tiempo de 60 us y luego la suelta durante el intervalo de 1 us entre intervalos de tiempo.
  • Para escribir '1', el capitán tira de la línea de datos hacia abajo durante 15 nudos y luego la suelta durante un intervalo de 1us entre pasos de tiempo.
  • Los esclavos toman muestras de bits del maestro después de 30 nodos de cada intervalo de tiempo.

En este punto, el amo vuelve a leer al esclavo, poco a poco. Los datos del esclavo se siguen comunicando en grupos de 8 bits. El maestro baja la línea de datos en 1 us y la libera, y luego toma muestras de los datos del bus después de 15 us.

  • Si el esclavo escribe '0' en el bus, mantendrá la línea suspendida durante todo el intervalo de tiempo de 60 us. Luego vacía la línea de datos durante un intervalo de 1us entre pasos de tiempo.
  • Si el esclavo escribe '1' en el bus, mantendrá la línea desconectada durante 15 nodos. Luego libera la línea de datos para que la resistencia pull-up levante la línea de datos.
  • El maestro toma muestras de datos después de 15 nodos de cada paso de tiempo.

Así el maestro comunica las señales de reset y presencia, escribe 1, escribe 0 y lee las señales con los esclavos de 1 hilo. El protocolo se implementa mediante microcontroladores y computadoras que utilizan bit-banging o el receptor-transmisor asíncrono universal (UART).

Obtenga más información sobre el protocolo 1-Wire aquí .

Controlador MicroPython Onewire
MicroPython implementa el controlador Onewire como un paquete de biblioteca, que ahora forma parte del firmware estándar de MicroPython. La biblioteca se llama hilo único . Se puede importar a un script MicroPython usando esta instrucción:

importar un hilo

El controlador de un solo cable incluye dos bibliotecas: new y ds18x20 . La clase Onewire es una implementación genérica del protocolo 1-Wire. El ds18x20 es una implementación específica del protocolo de lectura de temperatura de termómetros digitales de 1 cable como el DS18B20 y el DS18S20.

Se puede acceder a estas bibliotecas siguiendo estas instrucciones:

importar un hilo
importar ds18x20
importar onewire, ds18x20

El cable único El controlador depende del tiempo del firmware de MicroPython y de los módulos de la máquina. Se utilizan tres constantes para los comandos ROM, que se enumeran a continuación.

La clase Onewire del controlador se crea una instancia con una función constructora. El constructor tiene este prototipo:

OneWire (pin)

El método constructor toma solo un argumento (es decir, el pin donde se implementa el protocolo 1-Wire). Un pin pasado como argumento debe tener capacidad de salida.

Los otros métodos proporcionados por Onewire clase son los siguientes:

  • reiniciar : envía la señal de reinicio. Si se detecta algún esclavo de 1 cable, devolverá Verdadero. De lo contrario, devuelve Falso. Este método no acepta ningún argumento.
  • bit de lectura : lee un bit de la línea de datos. No se necesitan argumentos. Devuelve un valor booleano, que es Verdadero si el bit de lectura es '1' o Falso si el bit de lectura es '0'.
  • Readingbyte : lee un byte de la línea de datos. Llama al método read_bit ocho veces y almacena cada bit en un objeto de bytes. El byte lo devuelve el método.
  • leer (recuento) : lee el número especificado de bytes de la línea de datos. Itera el método read_byte el número de veces especificado como argumento. Los bytes se almacenan en un objeto de búfer, que devuelve el método.
  • escribir bit (valor) : escribe un bit, '0' o '1' en la línea de datos. Se requiere un argumento booleano.
  • writebyte(valor) : escribe un byte en la línea de datos. Toma un objeto de byte como argumento.
  • escribir (buf) : escribe un grupo de bytes en la línea de datos. Toma un objeto de búfer como argumento. Todos los bytes almacenados en el objeto del búfer se escriben en la línea de datos.
  • select_rom(rom) : selecciona un esclavo de 1 subproceso específico con el que hablar. El esclavo se identifica por su dirección de 64 bits. Este método toma una matriz de bytes de 8 bytes como argumento. El bytearray se llama objeto ROM .
  • crc8 (datos) : se utiliza para realizar una verificación de redundancia cíclica de los datos. Toma un objeto de búfer como argumento.
  • Escanear : Se utiliza para escanear esclavos de 1 cable conectados al bus. Devuelve una lista de direcciones ROM para todos los esclavos conectados. Cada dirección ROM es una matriz de bytes de 8 bytes.
  • _search_rom(l_rom, diferencia) : se utiliza para detectar direcciones ROM comprobando si cada una es una dirección ROM válida de 64 bits o no. Se llama método de escaneo interno y se utiliza para buscar dispositivos de 1 cable conectados.

La biblioteca ds18x20 fue escrita especialmente para obtener lecturas de temperatura de los termómetros digitales DS18B20 y DS18S20. La biblioteca utiliza la clase const de la biblioteca MicroPython.

La biblioteca utiliza las siguientes tres constantes para los comandos de función DS18X20.

Se crea una instancia de la clase DS18X20 mediante una función constructora. El constructor tiene este prototipo:

DS18X20 (un cable)

El constructor toma un objeto de un subproceso como argumento. Los otros métodos proporcionados por la clase DS18X20 incluyen:

  • Escanear : Se utiliza para escanear el sensor de temperatura de 1 cable conectado al bus. Lee las direcciones ROM de los dispositivos de 1 cable conectados y verifica si alguna dirección comienza con 0x10, 0x22 o 0x28. Los primeros 8 bits de la dirección ROM son un código de familia: 0x10 es el código de familia DS18S20, 0x22 es el código de familia DS1922 y 0x28 es el código de familia DS18B20.
  • read_scratch : lee el contenido del scratchpad DS18x20. El bit menos significativo se lee primero hasta el noveno byte. El noveno byte es el byte CRC.
  • write_scratch : escribe tres bytes de datos en el scratchpad DS18x20. El bit menos significativo se envía primero. El primer byte se escribe en el registro TH, el segundo bit en el registro TL y el tercer bit en el registro de configuración.
  • convert_temp(rom=None) : envía el comando de función para iniciar la conversión de temperatura a un dispositivo DS18X20 conectado. Este método no devuelve nada. En su lugar, inicia el dispositivo DS18X20 para comenzar la conversión de temperatura. Este método no le permite seleccionar un sensor de temperatura de 1 cable específico. A los sensores DS18x20 conectados al bus de 1 cable se les ordena iniciar la conversión de temperatura.
  • read_temp (rom=None) : Lee la temperatura del dispositivo DS18X20 especificado una vez que se completa la conversión. De lo contrario, no devuelve nada. El sensor DS18x20 específico se selecciona pasando la dirección ROM como argumento. Si no se pasa la dirección ROM, se seleccionará automáticamente cualquier sensor DS18x20 conectado a un bus de 1 cable.

Las bibliotecas y clases que se analizan aquí son parte del marco oficial de MicroPython. También hay algunos controladores específicos de placa para termómetros de 1 cable y DS18x20. Estos controladores deben estar cargados en la tarjeta respectiva.

Estos controladores específicos de la tarjeta pueden tener métodos de clase diferentes o adicionales, como convertir la lectura de temperatura sin procesar a grados Celsius. El controlador Onewire en el marco oficial de MicroPython se puede buscar en la carpeta micropython-xxx\drivers\onewire .

Controlador MicroPython Onewire en ESP8266 y ESP32
El controlador Onewire de MicroPython funciona en todos los pines de ESP8266 y ESP32. Aquí hay un ejemplo:

Pin de importación de máquina
importar un hilo
flujo = onewire.OneWire(Pin(12))
ai.scan
ow.reset
ow.readbyte
ai.writebyte(0x12)
ai.write('123')
ow.select_rom(b'12345678′)

Un ejemplo válido usando la biblioteca ds18x20:

tiempo de importación, ds18x20
ds = ds18x20.DS18X20(ow)
roms = ds.scan
ds.convert_temp
hora.sleep_ms(750)
para rom en roms:
imprimir(ds.read_temp(rom))

Sensor de temperatura DS18B20
DS18B20 es un termómetro digital de 1 cable de Maxim Integrated. El sensor tiene capacidad multipunto, lo que permite interconectar varios sensores DS18B20 en una única línea de datos como una red distribuida. Produce una medición de temperatura con escalas de resolución de 9 a 12 bits. El rango de temperatura de funcionamiento del DS18B20 es de -55˚ a 125˚ C con una precisión de +/-0,5˚ C. La resolución predeterminada del sensor es de 12 bits, que mide la temperatura con una precisión de 0,0625 W.

El sensor tarda menos de 750 ms en convertir una lectura. Por tanto, es posible obtener mediciones de temperatura a intervalos de un segundo a partir de la red de sensores.

El voltaje de funcionamiento del DS18B20 es de 3,3~5 V y el consumo de corriente es de aproximadamente 1 mA. Este sensor de temperatura puede interactuar fácilmente con cualquier microcontrolador o microcomputadora siempre que esté disponible una biblioteca de software para el protocolo 1-Wire.

El sensor viene en dos tipos de embalaje y uno es resistente al agua.

El DS18B20 tiene este diagrama de pines:

En la versión resistente al agua del sensor,

Los pines se identifican mediante un código de colores del sensor resistente al agua. Las líneas de datos GND, CDD y D son cables negros, rojos y amarillos.

Preparando ESP8266 y ESP32
El IDE de MicroPython debe estar listo para escribir, editar y cargar código. También puedes utilizar uPyCraft IDE o Thonny IDE para el software. Con la ayuda del IDE respectivo, cargue el firmware MicroPython para ESP8266 o ESP32. Aprenda cómo preparar uPyCraft IDE y cargar el firmware MicroPython para ESP8266/ESP32 .

Interfaz DS18B20 con ESP8266
El DS18B20 se puede conectar al ESP8266 en modo de energía parásita o convencional. Para el modo de energía parásita, conecte el pin de salida del DS18B20 a cualquiera de los GPIO del ESP8266.

A continuación, el pin de salida está conectado a GPIO4. Elimine los datos del pin alto conectándolo al pin de 3V del ESP8266 a través de la resistencia de 4.7K. Conecte los pines GND y VDD del DS18B20 a tierra del ESP8266.

Para el modo de alimentación convencional, conecte el pin VDD del DS18B20 a 3V en lugar de GND.

Interfaz DS18B20 con ESP32
El DS18B20 se puede interconectar con el ESP32 en modo de energía parásita o convencional. Para el modo de alimentación parásita, el VDD y GND del DS18B20 están conectados a tierra. El pin de salida de datos del DS18B20 se conecta a cualquiera de los GPIO del ESP32 con alto voltaje a través de la resistencia de 4,7K.

Para energía convencional, conecte VDD de DS18B20 a ESP32 en lugar de tierra.

Secuencia de comandos MicroPython

máquina de importación, onewire, ds18x20, tiempo
ds = ds18x20.DS18X20(onewire.OneWire(máquina.Pin(4)))
roms = ds.scan
print('Dispositivos DS encontrados: ', roms)
mientras que Verdadero:
ds.convert_temp
hora.sleep_ms(750)
para rom en roms:
imprimir (rom)
imprimir(ds.read_temp(rom))

Resultados

Interfaz de múltiples DS18B20 con ESP8266
Se pueden conectar muchos sensores DS18B20 al mismo cable. La biblioteca MicroPython puede leer temperaturas de todos los sensores conectados simultáneamente.

Para el modo de energía parásita, realice las mismas conexiones de circuito que se muestran a continuación.

Se recomienda el modo de alimentación convencional cuando se conectan varios DS18B20 al bus de 1 cable. Para el modo de energía convencional, realice las conexiones del circuito como se muestra a continuación.

Interfaz de múltiples DS18B20 con ESP32
Se pueden conectar varios sensores DS18B20 al ESP32. Para el modo de energía parásita, realice las conexiones del circuito que se muestran a continuación.

Para el modo de energía convencional, realice las conexiones del circuito que se muestran a continuación.

Secuencia de comandos MicroPython

máquina de importación, onewire, ds18x20, tiempo
ds = ds18x20.DS18X20(onewire.OneWire(máquina.Pin(4)))
roms = ds.scan
print('Dispositivos DS encontrados: ', roms)
mientras que Verdadero:
ds.convert_temp
hora.sleep_ms(750)
para rom en roms:
imprimir (rom)
imprimir(ds.read_temp(rom))
hora de dormir(5)

Resultados

Conclusión
MicroPython tiene un controlador bien escrito para dispositivos de 1 cable y un controlador independiente para dispositivos DS18BX20, que funciona con DS18B20, DS1922 y DS18S20.

Es fácil conectar los termómetros digitales DS18X20 con ESP8266 y ESP32. Se pueden conectar varios dispositivos DS18X20 al mismo bus de 1 cable sin ningún problema. El mismo código MicroPython funciona para termómetros DS18X20 únicos y múltiples.

contenido relacionado

Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.