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

O protocolo 1-Wire é um padrão proprietário para comunicação de dados serial da Maxim Integrated. Este protocolo é um padrão de comunicação de dados mestre-escravo de baixa velocidade, half-duplex, bidirecional e de baixa potência usado por vários dispositivos, incluindo sensores de temperatura, relógios em tempo real, EEPROMs, dispositivos de identificação (proteção de propriedade intelectual), temporizadores e iButtons.

Só pode haver um dispositivo mestre em um barramento padrão de 1 fio, com até 100 dispositivos escravos. A comunicação serial é totalmente controlada e gerenciada pelo dispositivo mestre. O protocolo não utiliza sinal de clock e os dados são comunicados em intervalos de tempo fixos. Isso significa que os dispositivos escravos devem sincronizar com o mestre para as operações de leitura e gravação.

O barramento padrão de 1 fio possui no mínimo dois fios: uma linha de dados e o retorno de terra. A maioria dos dispositivos de 1 fio possui três terminais. A terceira linha é adicionada para uma oferta positiva.

Para um barramento com duas linhas, os terminais VDD e GND do escravo de 1 fio são conectados ao retorno de terra. O sinal e os dados são fornecidos pela linha de dados. Isso é chamado de modo de alimentação parasita.

Para um ônibus com três linhas, o VDD também é atribuído à alimentação positiva. Isso é chamado de alimentação convencional. O modo é considerado mais confiável do que a alimentação parasita porque esta última depende do tempo de pull-up na linha de dados.

Alguns dispositivos de 1 fio possuem cinco terminais para maior acesso às linhas para detecção de sequência.

Como o 1-Wire é um protocolo proprietário, não possui implementação de hardware em microcontroladores. No entanto, ele é implementado no software da maioria dos microcontroladores e computadores de placa única devido à popularidade dos dispositivos de 1 fio – como os iButtons.

MicroPython implementa o protocolo 1-Wire em seu software, usando bit-banging. O padrão pode ser aplicado a qualquer pino com capacidade de saída. Neste artigo, abordaremos o driver Onewire do MicroPython, discutindo como ele pode ser usado para fazer interface com um sensor de temperatura DS18B20.

O protocolo
Para o protocolo 1-Wire, a comunicação de dados com os dispositivos escravos é controlada pelo mestre. Como não há sinal de relógio, os escravos devem sincronizar seu relógio interno com os sinais do dispositivo mestre. O mestre pode ser um microcontrolador, microcomputador ou computador desktop.

O mestre utiliza cinco tipos de sinais para comunicação com os dispositivos escravos: Reset, Presença, Escrita 0, Escrita 1 e Leitura.

O mestre inicia a comunicação com os escravos com um sinal de reset. Em resposta, os escravos puxarão a linha de dados, que será amostrada pelo mestre como um sinal de presença. Uma vez confirmada a presença de pelo menos um escravo no barramento, o mestre inicia o envio dos comandos ROM.

O primeiro comando é o comando search ROM, que procura os endereços ROM dos escravos conectados. Cada escravo de 1 fio é identificado por um endereço ROM de 64 bits. Quando o mestre recebe os endereços ROM dos escravos conectados, ele procura por conflitos de endereço. Os endereços são ainda usados ​​pelo dispositivo mestre para identificar um dispositivo de 1 fio e comunicar os comandos de função associados a ele.

Os comandos ROM têm 8 bits de comprimento. Todos os dados, sejam eles gravados ou lidos nos dispositivos escravos, também estão em grupos de 8 bits.

Por padrão, a linha de dados é elevada com a ajuda de um resistor pull-up externo. Sem este pull-up, a comunicação de dados não seria possível.

O reset é o primeiro sinal enviado pelo mestre. Isso é feito puxando a linha de dados para 480 nós. Em seguida, ele libera a linha de dados, permitindo que o resistor pull-up puxe a linha de dados para cima.

Os dispositivos escravos possuem um multivibrador monoestável básico para detectar o estado da linha de dados e a duração dos pulsos. Quando conectados ao barramento, os escravos podem detectar um sinal de reset e responder puxando a linha de dados para baixo por 60~240 nós.

  • Se, após um sinal de reset, a linha de dados ainda estiver elevada, o mestre assume que nenhum escravo está conectado ao barramento.
  • Se, após um sinal de reset, a linha de dados for reduzida, o mestre reconhece que pelo menos um escravo está conectado ao barramento.

Após confirmar a presença de um escravo de 1 fio, o mestre começa a escrever ROM e comandos de função. Em resposta a esses comandos, o mestre lerá os dispositivos escravos. Conforme mencionado, os comandos e dados estão em grupos de 8 bits. Eles são comunicados como pacotes onde os erros em cada bloco de 8 bits são revisados ​​com uma verificação de redundância cíclica (CRC).

No nível do sinal, cada bit é comunicado em um intervalo de tempo fixo de 60 us ou menos se o barramento estiver sobrecarregado. Há um intervalo de 1 us entre cada intervalo de tempo, então o resistor pull-up pode puxar a linha de dados para cima entre a comunicação de cada bit.

  • Para escrever '0', o mestre puxa a linha de dados para baixo durante todo o intervalo de tempo de 60 us e depois a libera para o intervalo de 1 us entre os intervalos de tempo.
  • Para escrever '1', o mestre puxa a linha de dados para baixo por 15 nós e depois a libera por um intervalo de 1us entre os intervalos de tempo.
  • Os escravos amostram bits do mestre após 30 nós de cada intervalo de tempo.

Neste ponto, o mestre lê novamente o escravo, pouco a pouco. Os dados do escravo continuam a ser comunicados em grupos de 8 bits. O mestre desce a linha de dados por 1 us e a libera, e então faz uma amostragem dos dados do barramento após 15 us.

  • Se o escravo escrever '0' no barramento, ele manterá a linha suspensa durante todo o intervalo de tempo de 60 us. Em seguida, ele libera a linha de dados para um intervalo de 1 us entre intervalos de tempo.
  • Se o escravo escrever '1' no barramento, ele manterá a linha desconectada por 15 nós. Em seguida, ele libera a linha de dados para que o resistor pull-up puxe a linha de dados para cima.
  • O mestre amostra os dados após 15 nós de cada intervalo de tempo.

É assim que o mestre comunica os sinais de reset e presença, escreve 1, escreve 0 e lê os sinais com os escravos de 1 fio. O protocolo é implementado por microcontroladores e computadores usando bit-banging ou o receptor-transmissor assíncrono universal (UART).

Saiba mais sobre o protocolo 1-Wire em aqui.

Driver Onewire do MicroPython
MicroPython implementa o driver Onewire como um pacote de biblioteca, que agora faz parte do firmware MicroPython padrão. A biblioteca é chamada monofio. Ele pode ser importado em um script MicroPython usando esta instrução:

importar um fio

O monofio driver inclui duas bibliotecas: onovo e ds18x20. A classe Onewire é uma implementação genérica do protocolo 1-Wire. O ds18x20 é uma implementação específica do protocolo de leitura de temperatura de termômetros digitais de 1 fio, como o DS18B20 e DS18S20.

Essas bibliotecas podem ser acessadas usando estas instruções:

importar um fio
importar ds18x20
importar onewire, ds18x20

O Onewire O driver depende do tempo e dos módulos de máquina do firmware MicroPython. Três constantes são usadas para os comandos ROM, listados abaixo.

A classe Onewire do driver é instanciada com uma função construtora. O construtor tem este protótipo:

OneWire (pino)

O método construtor leva apenas um único argumento (ou seja, o pino onde o protocolo 1-Wire está implementado). Um pino passado como argumento deve ter capacidade de saída.

Os outros métodos fornecidos pelo Onewire classe são as seguintes:

  • reiniciar : envia o sinal de reinicialização. Se algum escravo de 1 fio for detectado, ele retornará True. Caso contrário, retorna False. Este método não aceita nenhum argumento.
  • bit de leitura : lê um pouco da linha de dados. Não são necessários argumentos. Ele retorna um valor booleano, que é True se o bit de leitura for '1' ou False se o bit de leitura for '0'.
  • leiturabyte : lê um byte da linha de dados. Ele chama o método read_bit oito vezes e armazena cada bit em um objeto byte. O byte é retornado pelo método.
  • ler em (contar): lê o número especificado de bytes da linha de dados. Ele itera o método read_byte pelo número de vezes especificado como argumento. Os bytes são armazenados em um objeto buffer, que é retornado pelo método.
  • bit de gravação (valor): grava um bit, '0' ou '1,' na linha de dados. É necessário um argumento booleano.
  • escreverbyte(valor): grava um byte na linha de dados. Leva um objeto byte como argumento.
  • escreva (buf): grava um grupo de bytes na linha de dados. Leva um objeto buffer como argumento. Todos os bytes armazenados no objeto buffer são gravados na linha de dados.
  • selecione_rom(rom): seleciona um escravo de 1 fio específico para conversar. O escravo é identificado pelo seu endereço de 64 bits. Este método usa um bytearray de 8 bytes como argumento. O bytearray é chamado de ROM objeto.
  • crc8 (dados): usado para realizar uma verificação de redundância cíclica nos dados. Leva um objeto buffer como argumento.
  • Varredura : usado para varrer os escravos de 1 fio conectados ao barramento. Ele retorna uma lista de endereços ROM para todos os escravos anexados. Cada endereço ROM é um bytearray de 8 bytes.
  • _search_rom(l_rom, diferença): usado para detectar endereços ROM, verificando se cada um é um endereço ROM válido de 64 bits ou não. É chamado de método inside scan , usado para pesquisar dispositivos de 1 fio conectados.

A biblioteca ds18x20 foi escrita especialmente para obter leituras de temperatura dos termômetros digitais DS18B20 e DS18S20. A biblioteca faz uso da classe const da biblioteca MicroPython.

As três constantes a seguir para os comandos de função DS18X20 são usadas pela biblioteca.

A classe DS18X20 é instanciada usando uma função construtora. O construtor tem este protótipo:

DS18X20 (um fio)

O construtor usa um objeto de um fio como argumento. Os outros métodos fornecidos pela classe DS18X20 incluem:

  • Varredura : usado para escanear o sensor de temperatura de 1 fio conectado ao barramento. Ele lê os endereços ROM dos dispositivos de 1 fio conectados, verificando se algum endereço começa com 0x10, 0x22 ou 0x28. Os primeiros 8 bits do endereço ROM são um código de família: 0x10 é o código de família do DS18S20, 0x22 é o código de família do DS1922 e 0x28 é o código de família do DS18B20.
  • leitura_scratch : lê o conteúdo do scratchpad DS18x20. O bit menos significativo é lido primeiro até o nono byte. O nono byte é o byte CRC.
  • escrever_scratch : grava três bytes de dados no scratchpad DS18x20. O bit menos significativo é enviado primeiro. O primeiro byte é escrito no registrador TH, o segundo bit no registrador TL e o terceiro bit no registrador de configuração.
  • convert_temp(rom=Nenhum): envia o comando de função para iniciar a conversão de temperatura para um dispositivo DS18X20 conectado. Este método não retorna nada. Em vez disso, ele inicia o dispositivo DS18X20 para iniciar a conversão de temperatura. Este método não permite selecionar um sensor de temperatura de 1 fio específico. Os sensores DS18x20 conectados ao barramento de 1 fio são comandados para iniciar a conversão de temperatura.
  • read_temp (rom=Nenhum): lê a temperatura do dispositivo DS18X20 especificado assim que a conversão for concluída. Caso contrário, não retorna nada. O sensor DS18x20 específico é selecionado passando o endereço ROM como argumento. Se o endereço ROM não for passado, qualquer sensor DS18x20 conectado a um barramento de 1 fio será selecionado automaticamente.

As bibliotecas e classes discutidas aqui fazem parte da estrutura oficial do MicroPython. Existem também alguns drivers específicos da placa para termômetros de 1 fio e DS18x20. Esses drivers devem ser carregados na respectiva placa.

Esses drivers específicos da placa podem ter métodos de classe diferentes ou adicionais, como para a conversão da leitura da temperatura bruta em graus centígrados. O driver Onewire na estrutura oficial do MicroPython pode ser navegado no micropython-xxx\drivers\onewire pasta.

Driver Onewire do MicroPython em ESP8266 e ESP32
O driver Onewire do MicroPython funciona em todos os pinos do ESP8266 e ESP32. Aqui está um exemplo:

do Pin de importação da máquina
importar um fio
ow = onewire.OneWire (Pino (12))
ai.scan
ow.reset
ow.readbyte
ai.writebyte(0x12)
ai.write('123')
ow.select_rom(b'12345678′)

Um exemplo válido usando a biblioteca ds18x20:

hora de importação, ds18x20
ds = ds18x20.DS18X20(ow)
roms = ds.scan
ds.convert_temp
hora.sleep_ms(750)
para rom em roms:
imprimir(ds.read_temp(rom))

Sensor de temperatura DS18B20
DS18B20 é um termômetro digital de 1 fio da Maxim Integrated. O sensor possui capacidade multidrop, permitindo a interface de vários sensores DS18B20 em uma única linha de dados como uma rede distribuída. Ele produz uma medição de temperatura com escalas de resolução de 9 a 12 bits. A faixa de temperatura operacional do DS18B20 é de -55˚ a 125˚ C com uma precisão de +/-0,5˚ C. A resolução padrão do sensor é de 12 bits, que mede a temperatura com uma precisão de 0,0625˚ C.

O sensor leva menos de 750 ms para converter uma leitura. Portanto, é possível obter medições de temperatura em intervalos de um segundo a partir da rede de sensores.

A tensão operacional do DS18B20 é de 3,3 ~ 5V e o consumo de corrente é de cerca de 1mA. Este sensor de temperatura pode interagir facilmente com qualquer microcontrolador ou microcomputador, desde que uma biblioteca de software para o protocolo 1-Wire esteja disponível.

O sensor vem em dois tipos de embalagens e uma é à prova d'água.

O DS18B20 possui este diagrama de pinos:

Na versão à prova d'água do sensor,

Os pinos são identificados por código de cores do sensor à prova d'água. As linhas GND, CDD e dados D são fios preto, vermelho e amarelo.

Preparando ESP8266 e ESP32
O MicroPython IDE deve estar pronto para escrever, editar e fazer upload de códigos. Também é possível usar uPyCraft IDE ou Thonny IDE para o software. Com a ajuda do respectivo IDE, carregue o firmware MicroPython para ESP8266 ou ESP32. Aprenda como para preparar o uPyCraft IDE e fazer upload do firmware MicroPython para ESP8266/ESP32.

Interface DS18B20 com ESP8266
O DS18B20 pode ser conectado ao ESP8266 no modo de alimentação parasita ou convencional. Para o modo de alimentação parasita, conecte o pino de saída do DS18B20 a qualquer um dos GPIOs do ESP8266.

Abaixo, o pino de saída está conectado ao GPIO4. Retire os dados do pino alto conectando-os ao pino 3V do ESP8266 por meio do resistor de 4,7K. Conecte os pinos GND e VDD do DS18B20 ao aterramento do ESP8266.

Para o modo de alimentação convencional, conecte o pino VDD do DS18B20 ao 3V em vez do GND.

Interface DS18B20 com ESP32
O DS18B20 pode ter interface com o ESP32 no modo de alimentação parasita ou convencional. Para o modo de alimentação parasita, o VDD e o GND do DS18B20 são conectados ao terra. O pino de saída de dados do DS18B20 se conecta a qualquer um dos GPIOs do ESP32 com alta tensão por meio do resistor de 4,7K.

Para alimentação convencional, conecte o VDD do DS18B20 ao ESP32 em vez do terra.

Script MicroPython

máquina de importação, onewire, ds18x20, time
ds = ds18x20.DS18X20(onewire.OneWire(máquina.Pin(4)))
roms = ds.scan
print('Dispositivos DS encontrados: ', roms)
enquanto Verdadeiro:
ds.convert_temp
hora.sleep_ms(750)
para rom em roms:
imprimir (rom)
imprimir(ds.read_temp(rom))

Resultados

Interface de vários DS18B20 com ESP8266
Muitos sensores DS18B20 podem ser conectados ao mesmo 1 fio. A biblioteca MicroPython pode ler as temperaturas de todos os sensores conectados simultaneamente.

Para o modo de alimentação parasita, faça as mesmas conexões de circuito mostradas abaixo.

O modo de alimentação convencional é recomendado quando vários DS18B20s estão conectados ao barramento de 1 fio. Para o modo de alimentação convencional, faça as conexões do circuito conforme mostrado abaixo.

Interface de vários DS18B20 com ESP32
Vários sensores DS18B20 podem ser conectados ao ESP32. Para o modo de alimentação parasita, faça as conexões do circuito mostradas abaixo.

Para o modo de alimentação convencional, faça as conexões do circuito mostradas abaixo.

Script MicroPython

máquina de importação, onewire, ds18x20, time
ds = ds18x20.DS18X20(onewire.OneWire(máquina.Pin(4)))
roms = ds.scan
print('Dispositivos DS encontrados: ', roms)
enquanto Verdadeiro:
ds.convert_temp
hora.sleep_ms(750)
para rom em roms:
imprimir (rom)
imprimir(ds.read_temp(rom))
hora.sono(5)

Resultados

Conclusão
MicroPython possui um driver bem escrito para dispositivos de 1 fio e um driver separado para dispositivos DS18BX20 – que funciona com DS18B20, DS1922 e DS18S20.

É fácil fazer a interface dos termômetros digitais DS18X20 com ESP8266 e ESP32. Vários dispositivos DS18X20 podem ser conectados ao mesmo barramento de 1 fio sem problemas. O mesmo código MicroPython funciona para termômetros DS18X20 únicos e múltiplos.

Conteúdo Relacionado

Voltar para o blog

Deixe um comentário

Os comentários precisam ser aprovados antes da publicação.