Aqui no Lab tem inúmeros tópicos sobre acionamento indevido de relé com o ESP01, durante a energização.
Não sei o como o pessoal resolveu.
Sugiro que pesquise no Lab.
no ESP01 e me enrolei.
Alguém poderia me informar se é possível aferir temperatura e umidade e esboçar os dados no WebServer e ainda colocar um botão de ON/OFF pra controlar os relés??
Maaanos, como mesclar os códigos??? Ajudemmm!
Em anexo até onde consegui.…
Consegui fazer funcionar normalmente do jeito que eu queria.
Meu único problema é no momento que conecto o ESP8266 na energia. Ele já aciona o relé e abre o portão. Se acontecer uma queda de energia, o portão abre sozinho.
…
figura a seguir, que preparei a partir de um print do seu esquemático:
Note que vc está alimentando o módulo do Relé com 3,3V, assim como o Adaptador para o ESP01.
Ocorre que o fabricante do seu relé só garante acionamento "pleno", se a tensão na bobina for pelo menos 3,5V (a tensão nominal de acionamento é 5V na bobina). Então mesmo que eventualmente o relé acione com 3,3V, não é o ideal, pois poderá falhar (principalmente se o relé sofrer pequenas pancadas mecânicas quando estiver em uso, acionado).
O outro ponto, é que o Regulador LDO que está na placa Adaptadora do ESP01 (segundo o esquemático da Robocore, é um "AP2112"), só irá regular a tensão de saída de forma confiável, se a tensão de entrada estiver pelo menos 0,2V acima da própria saída. Ou seja, se vc quer regular 3,3V, então deve entrar com pelo menos 3,5V. No seu esquema, vc está entrando com os 3,3V, o que significa instabilidades na tensão de saída (mesmo que vc meça isso com multímetro, não vai perceber as instabilidades, pois elas são de alta-frequência). Há um agravante aqui: é o ESP01 quem está sendo alimentado pelo LDO, ou seja, há um bom consumo de energia, o que exige uma tensão de Dropout (a diferença entre entrada e saída no LDO) maior ainda que 0,2V (como 0,25V a 0,3V pelo menos). Não espere nestas condições de alimentação que vc colocou, que o ESP01 funcione sempre corretamente, devido justamente às instabilidades no regulador LDO.
Assim, para esta questão da alimentação, basta mudar o "setting" da sua fonte para 5V. Com isso, o LDO funcionará estável, e o relé será confiavelmente acionado.
Quanto ao problema com o GPIO2, verifiquei pelo esquemático da placa adaptadora da Robocore, que esta placa não influencia neste sinal. O sinal GPIO2 está vindo direto e somente da sua placa ESP01. Então neste caso, o problema pode ser com seu código. Mas veja: sem alimentar seu Sistema corretamente, o programa pode ter comportamentos anormais. Garanta a alimentação correta, principalmente porque problemas na alimentação podem resultar em BOOT incorreto do ESP8266.
Assim que possível, irei analisar seu código, mas se algum colega aqui do Garagem tiver algum tempo, peço que ajude na análise, pois só poderei fazer isso amanhã depois das 18 hrs.
Abrçs,
Elcids
…
Adicionado por Elcids Chagas ao 21:31 em 21 maio 2018
les, sejam as mais sofisticadas, pra nós são todas importantes).
Alguns comentários sobre meu último post, onde descrevi o problema que vc estava confrontando:
1) mencionei que o GPIO2 estando em "0", como acabava ocorrendo no seu design durante o BOOT do ESP, força o "Modo "UART" ser iniciado pelo ESP (o modo de gravação do código, que todo mundo usa). Na verdade para entrar neste modo, a combinação dos GPIOs é outra, conforme pode ser vista no meu primeiro post (a tal "Tabela 3"). Então o que faz o ESP "travar" quando o GPIO2 está em "0" durante o BOOT ? a resposta pra isso está na tabela a seguir:
Como se pode observar, para o ESP01, quando o GPIO2 está em "0" durante o BOOT, resulta em uma combinação que não é considerada válida. Obviamente, que algo deve ocorrer nessa situação, mas não é divulgado pelo Fabricante, pois provavelmente é reservado para situações de testes na Linha de Produção da Fábrica. Claro que se você gastar horas e horas analisando o código nativo residente do ESP8266, poderá descobrir, mas acho que não vale a pena né?
Também, note que para o ESP01, apenas as 4 primeiras linhas da Tabela são aplicáveis, pois esta placa tem o GPIO15 do ESP8266 ligado a 0V (GND).
E a Tabela pode ser usada para o também popular ESP12, e como este tem o GPIO15 "livre", então todas as combinações se aplicam a essa placa.
Essa Tabela e outras informações significativas, podem ser encontradas neste link: ESP8266 Arduino Core
2) reforço meu conselho de usar 5V para alimentar o Relé, pois se você olhar o datasheet que está no site do Robocore (é fabricado pela Metaltex), vai ver que a tensão mínima da Bobina que é garantido acionar os contatos, é de 3,5V. Se vc alimentar a Bobina com 3,3V, eventualmente um ou outro Relé do mesmo modelo, irá falhar no acionamento, pois você estaria no limiar da tensão mínima de acionamento (na verdade já abaixo desse limiar). Também se acionado com 3,3V, uma pequena pancada no Relé poderá abrir os contatos (e talvez não feche novamente), pois a força do campo magnético criado pela corrente na Bobina (e que aciona os contatos) não será tão forte como em 5V. Além disso, 5V é a tensão nominal desse modelo de Relé.
3) Sua plaquinha Adaptadora para o ESP01 (a da Robocore), possui um regulador LDO na mesma. Isto permite você alimentar o ESP01 seguramente por ela, pois a saída desse LDO é de 3,3V. Outro ponto: o LDO exige uma tensão mínima de entrada maior que a tensão de saída (os 3,3V). Então a plaquinha adaptadora não deve ser alimentada com exatos 3,3V (caso vc a alimente com essa tensão, o LDO não "terá força" para suprir a necessidade de corrente do ESP01, e hora ou outra este poderá falhar).
Finalizando, alguns comentários sobre o código:
1) procure usar a técnica que mostrei, usando os defines para os números dos pinos, e usando os nomes funcionais para os pinos no restante do código (como por exemplo o "pino_Rele" e o "pino_Pisca"), isso certamente deixará seu código mais claro e fácil de trabalhar.
2) Sobre as sentenças lógicas para as decisões de acionamento do Relé, a partir da Hora atual, e dos valores "Ativa" e "Desativa", veja as figuras que preparei a seguir:
e
Bem estas duas últimas figuras, me poupam palavras (ufa!!!) para descrever.
Pessoal, há alguns meses atrás, levantei os esquemáticos do ESP01 e do ESP12, o mais confiável que pude, a partir de diversas referências (em sites e do próprio fabricante), e inclusive medindo alguns pontos nas próprias placas.
Para o ESP01, encontrei duas versões bem solidificadas no mercado, que chamei de "revisão 1" e "revisão 2". Para o ESP12, desenhei apenas uma revisão. Todas os três esquemáticos estou disponibilizando no anexo no final do post.
Mas pra "enfeitar o pavão", seguem os prints para a "rev 2" do ESP01, e para o ESP12:
Luiz, caso tenha algo que possamos colaborar, estaremos à disposição.
Abraços.
Elcids
…
Adicionado por Elcids Chagas ao 20:54 em 22 maio 2018
pensar que vc estava se referindo à uma corrente tipo "in rush" (que poderia existir, afinal há a parte de RF do ESP8266 que consome uma boa corrente).
Mas pelo que entendemos agora, seu problema são os pulsos iniciais que existem em alguns pinos do ESP8266. Eles existem sim, e são uma saída do "debuger" do ESP8266, que é feita tanto no sinal "UART0_TXD" (o "GPIO1"), quanto no sinal "UART1_TXD" (o "GPIO2"), durante o startup do Sistema (inclusive, via serial do Arduino ou qualquer programa de Terminal, você consegue ver o "despejo" de dados na GPIO1, que é feita a 74880 bps).
Por exemplo, se vc estiver usando o "GPIO1" do ESP01 (ou seja, ESP8266), e seu relé for acionado por nível "0" ("LOW"), então vc vai ter acionamentos indesejados do relé durante o startup do ESP8266.
Isto é mencionado no guia de utilização do ESP8266. Há como mudar isso via código, mas aí vc vai ter que mexer no "código base" do ESP, e se aprofundar mais pra poder aprender isso (no guia inclusive, é explicado o que vc tem que fazer).
Mas há outras formas de contornar o problema via Hardware, e é simples. Mas é necessário que vc post o seu hardware (circuito), mostrando como está usando o ESP01 e as conexões externas (Relés, etc). Se vc estiver usando aqueles módulos de Relé, então coloque também uma foto ("boa") deste módulo, e de preferência o circuito do mesmo (se vc tiver). Embora não necessário, postar o código também pode ajudar.
Abrçs
Elcids
…
Adicionado por Elcids Chagas ao 12:40 em 20 junho 2018
com o GPIO2 e o acionamento do Relé.
Mas do ponto de vista dos sinais de controle do ESP01 (os GPIOs) não encontrei nenhum problema no seu código.
Então voltei a análise para o Hardware, desta vez de forma mais calma (pois ontem foi tudo muito atribulado). Então ficou claro pra mim onde estava seu problema. O problema ocorre por causa de um divisor resistivo, formado pelo "pullup" interno do ESP01 (o valor deste pullup é algo entre 20k e 40k), e o resistor de base do transistor que existe no seu módulo do Relé. Eu não sei qual o valor do resistor de base, mas por uma pesquisa rápida, parece algo como 1k. Isto causa uma tensão baixa no GPIO2 no momento do BOOT do ESP01, o que faz com ele vá para o modo de programação (também chamado de "Modo UART"), e assim não execute o seu código já gravado anteriormente na FLASH do ESP01.
O resistor de base é o que eu mostro na figura a seguir:
Se possível confira o valor deste resistor (com um multímetro, caso não seja possível ler no corpo do resistor), pois não tive como saber apenas pela foto (e no site da Robocore não há informação alguma). Veja que na plaquina tem dois resistores, e o de base é o que eu marquei em "rosa". Observe que mesmo que o resistor seja mais alto que 1k, por exemplo 10k, ainda sim é quase certo que ocorrerá o problema, pois quando se calcula o divisor de tensão com estes valores (já considerando a tensão base-emissor do transistor da plaquinha do Relé), a tensão resultante ainda não atingirá o nível "1" do ESP01 (pois o resistor de "pullup" interno do ESP pode chegar a mais de 30k).
Para driblar esse problema, use o circuito que desenhei na figura a seguir:
Não tenho prática alguma com o "Fritzing", então tentei desenhar o circuito acima da melhor forma possível, como mostro a seguir:
Observe que o que fiz, foi bloquear o divisor de tensão com um Diodo, durante o BOOT do ESP. Os outros dois resistores são apenas para adequação dos níveis de tensão a fim de garantir o ON/OFF do Relé.
Observe que é muito importante que o Diodo seja do tipo "Schottky". Um Diodo desse tipo relativamente fácil de encontrar é o BAT85.
Caso não encontre o BAT85, qualquer outro diodo "Schottky" pode ser usado. Outra opção, é usar um diodo de Germânio (como os famosos 1N60 ou 1N34). Sempre observe o lado certo de ligar o Diodo (seja qual for este diodo).
Apenas em último caso (se não conseguir encontrar um "Schottky" ou um de Germânio) use um diodo de sinal de silício (por exemplo o famigerado 1N4148). Mas só em último caso.
Veja também que o mesmo problema ocorre se vc usar o GPIO0 pra acionar o Relé, pois assim como o GPIO2, este também tem um resistor de "pullup" interno.
Também note que como vc está usando a plaquinha adaptadora para o ESP01, a melhor opção pra vc é alimentar o Sistema com 5V, conforme expliquei em um post anterior.
Sobre seu código, tomei a liberdade de organizar ele (não que estivesse muito desorganizado). Inclusive inseri alguns comentários. Um ponto muito importante é que substitui os nomes dos pinos de controle, pela função que de fato realizam (exemplo: "pino_Rele"), e acrescentei "#defines" para a numeração dos pinos do ESP01, facilitando muito, pois para trocar a função dos pinos você não precisa mudar no código inteiro, mas apenas nas linhas de definição que mostro abaixo:
Espero que isso facilite seu manuseio do código. Esta deve ser uma prática comum em programação.
Nota final muito importante: tenho praticamente certeza que há um erro na sentença lógica que avalia a hora e verifica se deve ligar ou desligar o Relé, quando o "Ativa" é maior que o "Desativa".
Em minha análise a sentença deveria ser muito mais simples que a que está no seu código. Veja como acho que seria:
Mas não mexi nisso no seu código, deixei exatamente como estava. Mas acho que vc deveria dar uma olhada na lógica da sentença que vc está usando.
Anexei os arquivos "ino" e do "Fritzing" a este post (veja logo abaixo).
Espero ter contribuído de alguma forma ou outra.
Abrçs,
Elcids
…
Adicionado por Elcids Chagas ao 9:42 em 22 maio 2018
ussão seria sobre o funcionamento do I2C e o padrão do HX711.
Conforme dados que pesquisei na internet, o HX711 não é I2C.
Então, fiquei na dúvida sobre como os dois funcionam juntos.
A biblioteca que estou utilizando é a LiquidCrystal, que pode ser instalada pelo arduino IDE via sketch.
Acho que só utilizei o lcd.print() para imprimir os textos no LCD. Já o lcd.write() utilizei para inserir um caractere customizado.
O Wire.endTransmission() foi utilizado para parar a transmissão de dados para o LCD e liberar as portas para o HX711. Pelo menos essa foi a lógica que implementei.
Aguardo por sugestões.
Gostaria de aprender mais e sei que aqui no labdegaragem só tem fera!!!…
nte:
GPIO0 ---> Rele
GPIO2 ---> Pushbutton
De forma que ao pressionar o pushbutton fosse alterado o estado do rele, se estava ligado, ficar Off e vice versa, porém também queria esse controle via interface web ou mqtt pra sabe se está ligado ou não poder alterar o estado pela página da web...
Já consegui fazer acender e apagar dois leds pela interface web porém estou quebrando a cabeça em como fazer isso....
Pensei no seguinte, uma variavel ficaria atrelada ao rele, que poderia ser tipo bit se 0 rele off, se 1 relé on, o mesmo para a interface web onde o botão ficaria com o status da variável e se clicado alterar para o estado inverso, e o botão físico a mesma coisa.
Acontece que não encontrei nenhuma forma de alterar o status dessa variável se alguém puder me dar uma luz fico agradecido...…
Adicionado por Adilio Santos ao 16:39 em 17 março 2016
clique na figura para "zoom")
Na primeira revisão, o Relé era acionado por "HIGH" no Arduino, e o nível lógico do sinal "GPIO0" controla diretamente o MOSFET (Canal N) que aciona a bobina do Relé. Isto pode ser conferido no esquema elétrico dessa revisão, conforme mostro na figura a seguir:
(clique na figura para "zoom")
Já o outro módulo ao qual o sr se refere, é provavelmente uma revisão "4". Nesta revisão, algumas coisas foram alteradas. Uma delas, é que o Relé tem bobina para 3.3V (isso aumenta a corrente necessária para acionar o Relé, embora a Potência consumida para obter-se este acionamento, ainda seja a mesma da revisão 1). Mas isto não tem efeito no Sistema, uma vez que já existe na plaquinha do módulo um Regulador de Tensão para 3.3V.
Outra coisa, é que nesta revisão "4", também foram acrescentados Resistores de "pullup" para os sinais "GPIO0" e "CH_PD". Também foi acrescentado um circuito clássico "PUC" ("Power Up Clear") para o sinal "RST", assim garantindo que o ESP01 seja resetado quando o Sistema é energizado.
E finalmente, foi acrescentado um "Opto-acoplador" entre o Gate do MOSFET e o sinal "GPIO0" do ESP01. Devido à forma como o LED interno deste Opto-acoplador está conectado no circuito deste módulo, o Relé deve ser acionado por "LOW" no sinal "GPIO0".
Estas características podem ser observadas no esquemático da revisão "4", conforme mostro na figura a seguir:
(clique na figura para "zoom")
Para facilitar, aconselho que use logo no início do seu código, um "#define" para especificar o nível lógico ("HIGH" ou "LOW") que deve ser aplicado ao "GPIO0" para ligar o Relé, o que terá efeito em todo seu programa, e facilitará manter duas versões (para um caso ou outro). Na figura a seguir mostro um exemplo disso, neste caso para a revisão "4", onde o Relé deve ser acionado por "LOW":
(clique na figura para "zoom")
E para configurar o pino, e fazer o controle ON/OFF do Relé, pode ser como mostro na figura a seguir:
(clique na figura para "zoom")
E caso queira conhecer algumas "artimanhas" referentes ao acionamento desses módulos de Relés mais "genéricos" (mas que também se aplicam ao módulo "ESP-01S"), veja um tópico recente aqui no LDG onde descrevo algumas características relacionadas.
O tópico é este: "Módulo Relé 8 canais sem JD-VCC"
Espero ter ajudado.
Abrçs,
Elcids…
Adicionado por Elcids Chagas ao 11:27 em 27 abril 2020