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.