Lâmpada de CO2 (mh-z19)

co2-lampe-main

Aqui, muitas vezes eles falaram sobre o sensor mh-z19 e sobre o esp8266, e também não esqueceram de mencionar o protocolo mqtt.

Eu li tudo isso e decidi combinar a leitura em um dispositivo. Na verdade, na imagem é isso.

Introdução (pular)


Já me inscrevo há muito tempo no Habré e o leio ainda mais, mas não sou particularmente ativo, mas devo dizer que aprendi muitas coisas novas e úteis aqui. E de tempos em tempos o pensamento me atormenta, que é necessário não apenas usar, mas também dar algo e compartilhar. Não posso oferecer nada de novo, mas concluí o meu projeto e me pareceu interessante o suficiente para publicação.

Funções / Firmware


Todo o projeto é construído em esp8266 e, portanto, pode se comunicar bem com a Internet. O protocolo mqtt é usado para transferência de dados. Para ser honesto, eu realmente não fui muito fundo no dispositivo de protocolo, mas a coisa acabou sendo muito conveniente, usei o intermediário mosca para o teste em casa e agora uso o cloudmqtt, eles têm opções gratuitas, para uma ninharia é apenas isso.

Agora você pode ir para as próprias funções.

Quando acendo a lâmpada, parece que já existem configurações salvas; caso contrário, ele ativa o wifi com o nome "CO2.box", no endereço "192.168.4.1" mostra a página de configurações:

Captura de tela


Na verdade, a lâmpada pode funcionar em dois modos:

1. Conecta-se ao broker mqtt, envia dados e mostra o conteúdo de CO2 através do LED.
2. Mostra apenas o conteúdo do LED de CO2 na sala.

O LED pode mudar sua cor de verde para vermelho, em teoria é RGB, mas eu não o conectei com azul, portanto, apenas LED RG. Se o conteúdo de co2 for 400 ppm (PPM Min em webgui), a lâmpada brilha em verde claro e quando a concentração aumenta, a cor fica vermelha quando atinge o máximo (PPM Max em webgui) e começa a piscar em vermelho.

A redefinição é exibida em um botão separado, e também em outro botão. Se você o mantiver pressionado por mais de um segundo, as configurações serão redefinidas.

Código do botão
Inicialização de botão (GPIO0)
// initialise reset button void BtnInit() { // set GPIO 0 PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO0_U, FUNC_GPIO0); // enable pullup resitor PIN_PULLUP_EN(PERIPHS_IO_MUX_GPIO0_U); // disable globar interrupt ETS_GPIO_INTR_DISABLE(); // attach interrupt function ETS_GPIO_INTR_ATTACH(input_intr_handler, NULL); GPIO_DIS_OUTPUT(BTN_CONFIG_GPIO); // empty status GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, BIT(2)); // enable interrupt gpio_pin_intr_state_set(GPIO_ID_PIN(BTN_CONFIG_GPIO), GPIO_PIN_INTR_ANYEDGE); // enable global interrupt ETS_GPIO_INTR_ENABLE(); // timer os_timer_disarm(&DebounceTimer); os_timer_setfn(&DebounceTimer, &debounce_timer_cb, 0); } 

Verifique quanto o botão foi pressionado e redefina

 // button reset pressed void ICACHE_FLASH_ATTR debounce_timer_cb(void *arg){ //disable globar interrupt ETS_GPIO_INTR_DISABLE(); gpio_pin_intr_state_set(GPIO_ID_PIN(BTN_CONFIG_GPIO), GPIO_PIN_INTR_ANYEDGE); ETS_GPIO_INTR_ENABLE(); //start if button was pressed any age (hight or low) if(timepressed){ timepressed = 0; uint32 count = system_get_time() - timecount; #ifdef DEBUG os_printf("DIFF: %d us\n", count); #endif //check time between button on/off, if more 1 sec start delete settings in flash if(count >= 1000000){ if(wipe_flash(DELALLCONF) == 0){ os_timer_disarm(&wifiErrorLedTimer); os_timer_disarm(&ppmMaxLed); os_timer_disarm(&SendDataTimer); os_timer_disarm(&wifiConnCheck); os_printf("\n"); startMode(); } } } else { timepressed = 1; timecount = system_get_time(); #ifdef DEBUG os_printf("SYSTEMTIME: %d\n", timecount); #endif } } 


Para mqtt , a autenticação do usuário via login / passe é suportada. Você pode garantir que os dados sejam enviados via https, mas para isso é necessário incorporar um certificado no firmware, o que era contrário ao conceito - eu queria que todas as configurações fossem feitas via webgui.

O problema


Eu queria executar o servidor DNS no esp8266, para que ele sempre retornasse seu endereço e não precisasse inserir um endereço IP. Infelizmente, na minha versão do esp8266 sdk, encontrei um bug que não cria corretamente um pacote Ethernet e que a soma de verificação não converge para lá e a resposta do cliente é ignorada. Vi o erro através do wireshark e também um erro semelhante foi descrito no fórum espressif. Então eu deixei a ideia.



O firmware geralmente não foi ruim, mas, por exemplo, eu ainda não descobri / descobri como fechar a conexão tcp corretamente; portanto, quando envio dados do navegador, ele (o navegador) espera por algo e não fecha a conexão.

Em geral, a qualidade do código, na minha opinião, não era muito alta (ou horrível), isso é porque este é meu segundo projeto com (o primeiro projeto foi um relógio ), além do fato de que o SDK de alguma forma não é muito claro e muitas vezes a documentação não ajudou muito e teve que procurar exemplos.

Por exemplo, eu queria colocar a gravação do flash em um arquivo separado, mas depois disso as configurações pararam de ser gravadas no flash. Eu nunca encontrei o porquê.

Lado de ferro


Então eu tentei sair com um conjunto mínimo de componentes, parecia funcionar muito bem. No começo, eu queria usar a primeira versão do esp8266, encontrei na Internet uma maneira de gerenciar o registro de turnos com apenas um pino. Tudo funcionou no proteus, mas não ao vivo. Penso que o meu problema era não encontrar capacitores adequados.

esp12e


Usei o ESP8266 12e, pois possui 4mb de memória e sete pinos que podem ser usados. No começo e quase até o final do projeto, eu queria usar quatro monitores adicionais de sete segmentos, conectados através de quatro registros de turno 74hc595 , mas mais tarde, quando comecei a montar o quadro, tudo me pareceu um pouco complicado e redundante. Em geral, eu os removi, mas nos commits ainda há o código onde estava a tela. Portanto, se alguém precisar, então você pode tomar a parte certa.

Eu também queria que tudo isso funcionasse do usb, diretamente do usb do computador ou através de uma fonte de alimentação (como um telefone). Peguei a fonte de alimentação da antiga nokia (n900), ela fornece 1A, o que foi suficiente para os olhos, mas foi necessário diminuir a tensão do esp8266 para 3.3v.

Por isso, usei o asm1117 e o primeiro problema estava me esperando, por algum motivo ele deu apenas 3c, o esp8266 funcionou, mas não era estável e erros muito estranhos apareceram ao trabalhar.

Por exemplo, ele esp8266 não conseguiu gravar dados no flash, apenas reiniciou, demorei um pouco, até que percebi de onde vinham os erros, quase pulei com um pandeiro.
O próprio Asm1117 produziu os 3.3-3.5v necessários, mas no esp8266 era apenas 2.8-3.1v. Em princípio, eu realmente não resolvi o problema, suspeito que (a tensão) estava caindo nos fios. Então refiz como na figura abaixo e tudo começou a funcionar de forma estável.

Como agora


5v também era necessário apenas para o sensor de co2, pelo modo como consegui obtê-lo por 3,3v. Mas havia problemas em que ele aumentava seus valores em algum momento de uma hora até 2000 ppm, mas se ele apenas desligasse e ligasse novamente, então os valores imediatamente cairiam.

Esquema


A saída do log é conectada ao GPIO2 se algo de repente não funcionar. A comunicação com o sensor de CO2 ocorre como padrão - através do uart.

Bem, parecia que não havia nada de particularmente complicado. Do circuito que estava na foto acima, espalhei o quadro. Eu já tinha experiência, antes eu treinava no relógio e lá tudo era um pouco mais complicado. Em geral, ficou assim:


Infelizmente, tenho um erro aqui (marcado em vermelho), que notei apenas no final. O aterramento do sensor de CO2 está conectado a esse pino, mas esse aterramento não está conectado ao restante e, dessa forma, o sensor não funcionou, tive que conectar uma ponte nesse local.


Lutim, torção, broca, serra


Na foto acima, você pode ver que tudo foi feito por pilhagem. Eu usei o método com ácido cítrico, li sobre ele em um gato de rádio . Eles escrevem que a melhor reação é obtida.

Meu conjunto de ferramentas para saques, na verdade, tudo acontece na caixa verde à direita.

Tudo o que você precisa para maconha


Depois de diluir a solução, coloquei o recipiente em uma pia com água morna, a água não deve estar mais quente que 40-45 graus.

Exemplo


Ficou muito bem em princípio, infelizmente só tenho fotos da primeira versão, mas houve erros.

Houve algum problema com o usb, decidi usar o micro usb para reduzi-lo, tinha algumas peças, mas não sabia como montá-las. É assim:


Como você pode ver, não há nada para consertá-lo na placa; você só pode soldar duas protuberâncias laterais, o que eu fiz. A montagem mostrou-se muito fraca e mesmo ao testar tudo saiu.

Então eu pedi pequenas placas onde o micro usb já estava conectado. Algo assim:

Taxa


Eu tranquei tudo isso - foi uma boa solução, ainda funciona.


No final, parecia assim

Ambos os lados



Habitação


No artesanato doméstico, esse costuma ser um grande problema, para fazer tudo de maneira organizada e bonita. Quando iniciei o projeto, eu ainda não tinha uma impressora 3D, mas desde o início eu queria imprimir o estojo. Pensei que poderia ser encomendado em algum lugar. Ao procurar onde imprimir o estojo, decidi que era melhor comprar uma impressora 3D para mim. Em princípio, não havia requisitos especiais, o principal é que imprime normalmente e não custa muito. Ele parou na Anet A8. Imprime surpreendentemente bem, embora por muito tempo.

Então eu criei um modelo 3D do caso, reconheci apenas a terceira opção como bem-sucedida.

Opções com falha





Estes são os modelos 3D que fiz para o caso. Dentro do corpo, encontra-se um material de ponderação, como contrapeso à esfera de cima, de modo que o corpo ficou um pouco alto.

Foto mais perto


Juntos, fica assim:



Capa da foto. Ela teve que ser praticamente martelada no caso. São necessários dois pequenos furos na parte superior para que você possa pressionar os botões. A solução não é muito bem-sucedida, você precisa de algo fino e longo e também precisa encontrar os botões internos por toque. Em princípio, acho sem problemas, mas para alguém sem treinamento será difícil.


Então eu mantenho o LED RGB na bola por cima:


Algumas outras fotos




Conclusão


Eu nem sabia no começo o que escrever de maneira inteligente. Eu pensei que talvez pudesse listar alguns problemas, havia muitos deles.

De fato, o projeto acabou sendo mais para treinamento. Quando eu comecei a fazê-lo, em algum momento do ano passado no verão, pareceu-me um dispositivo útil e com algumas pretensões ao design e, em geral, deveria ter sido bonito. Mas agora, quando eu fiz, acabou de alguma forma e não é muito necessário, embora pareça nada (minha esposa gosta), agora está de pé no canto (desligado).

Eu terminei o firmware em algum lugar no começo de dezembro e já esqueci muito de tudo o que estava escrito, então havia um ponto controverso em termos de treinamento também.

Agora eu não faria isso, em vez de uma bola, anexaria algo pequeno, como um farol do mar.

Todo o projeto está no github . Há uma placa e um código divorciados, bem como modelos 3D (se alguém quiser imprimir tudo). A propósito, os tubos têm um tamanho de M10x20mm.

PS: Alguns pontos sobre mim pessoalmente:

1. Este é o meu primeiro artigo, talvez eu tenha relido muito aqui, mas mesmo assim seja solidário.
2. O firmware não está escrito muito bem, talvez alguém queira refazê-lo.
3. Peço desculpas antecipadamente pela abundância de palavras em inglês, desde os 16 anos de idade que não moro em um país de língua russa e, portanto, muitas vezes não sei como algumas coisas são chamadas em russo.

Source: https://habr.com/ru/post/pt402625/


All Articles