Ir ao conteúdo
  • Cadastre-se

Conectando o NodeMCU usando protocolo MQTT


Posts recomendados

Olá pessoal,
estou desenvolvendo um TCC na área de automação. Sou estudante de Engenharia elétrica e estou com um problema de conexão do NodeMCU usando protocolo MQTT (cloudMQTT é o broken) controlado pelo MQTTDash (que é um App para Android).

Não estou conseguindo fazer o acionamento de dois ou mais Leds pelo ESP8266 NodeMCU. Estou anexando até onde foi desenvolvido o código para que, quem puder me dar uma força, eu agradeço muito!! :D Ah, estou usando a IDE Arduino para desenvolver o código. A base do código foi retirado da página "Infotrônica para Zumbis".

O código está em um arquivo de texto (.txt) anexado. Quem puder baixar e dar uma analisada mais aprofundada e me indicar onde estou errando, agradeço muito.

Att.
Pedro Henrique Capriglione
Um mero estudante sofrendo um pouco com programação.

NodeMCU usando protocolo MQTT (cloudMQTT é o broken) controlado pelo MQTTDash.txt

Link para o comentário
Compartilhar em outros sites

Só por curiosidade até onde teu código vai? No código tem vários textos a serem imprimidos se cada fase for atendida

tipo esse aqui em baixo deveria ter algum aviso disso (só aparece* uma vez duas 3 ou todo tempo as mensagens?):

imprimirSerial(true, "Conectado!! :)");

Também quero ver a fonte de onde você tirou isso, quero link !?

 

Estou estranhando de você chamar o controlador de leds fora do void principal que será executado só uma vez, mas pode ser que tenha um loop fora do loop principal que não to vendo.

 

O "void loop" só tem você dizendo para reconectar caso não esteja ligado e iniciar o cliente... este último que pelo número grande de bibliotecas que você chamou no início do código, deve ser alguma função escondia dentro dessas bibliotecas...

Só isso, você não está verificando acredito eu o tempo todo, só uma vez... mas só acho ^^

 

Complicado para mim ver esse código, pois pode ter funções sendo chamadas pelas bibliotecas. O ideal era você fazer o código em partes... indo do mais fácil para o difícil o que seria: ligar o esp a tua rede e ligar um led e desligar. Depois fazer algo mais complexo de ligar um led a partir de texto e finalmente ir para essa teu código gigante....

 

 

Mas to chutando aqui... Enfim,,,,,,

Link para o comentário
Compartilhar em outros sites

Bommu Perneta,

No programa original (ele é designado para ligar apenas um único Led, ou seja, uma única saída) eu gostaria que fosse ligado mais leds na saída do NodeMCU, mas eu não consigo alterar essa programação da forma correta.

Toda ajuda que puder ser dada eu vou agradecer imensamente!!

Este é o link do programa original:
https://bitbucket.org/MarcoRabelo/esp8266/src/8b530e758b97d3b53febe67233a0bf60d0ec6a53/06-MQTT_WiFiManager_Rele/MQTT_WiFiManager_Rele/MQTT_WiFiManager_Rele.ino?at=master&fileviewer=file-view-default

Link para o comentário
Compartilhar em outros sites

Eu ainda não programei em para memórias eeprom... mas analisando ao código original e o teu... você está chamando as variáveis (pegando o valor) do mesmo endereço da memória

 

statusAntD5 = EEPROM.read(0);

e

statusAntD0 = EEPROM.read(0);

 

É o mesmo endereço... Ou seja você está trabalhando com portas separadas com uma só variável, ou as duas acendem os as duas apagam. Se for isso que você quer mesmo e não o contrário podemos prosseguir analisando o código... Mesmo eu não tendo o teu módulo ^^

 

http://labdegaragem.com/profiles/blogs/tutorial-usando-a-eeprom-do-arduino-para-armazenar-dados-de-forma

Link para o comentário
Compartilhar em outros sites

É exatamente isso que está acontecendo, ele ascende e apaga os dois leds juntos. Eu quero que seja separado os acionamentos. Como devo proceder para fazer essa alteração? O que devo alterar no programa para que ele funcione corretamente e de forma separada?

Link para o comentário
Compartilhar em outros sites

Escreve na memória em lugares diferentes.

EEPROM.write(address, value);

 

Address vai no arduino 0 e 1023 no Uno... Só colocar em outro endereço... e depois ler o mesmo

EEPROM.read(adress)

 

Como no link do tutorial que coloquei ai em cima. Se você colocar em endereços diferentes e ler de diferentes endereços as variáveis ficam independentes e você pode controlar teus ledes de forma independentes.

Link para o comentário
Compartilhar em outros sites

Mesmo após essas alterações que você citou, ele continua ligando e desligando os dois leds simultaneamente. Acredito que tenha mais algo em conflito.

Estou anexando a alteração que você citou que eu fiz no programa. Se possível, verifique se eu fiz corretamente as devidas alterações ou se precisa alterar mais algo para que ele funcione corretamente e independentemente cada led.

Suas dicas estão sendo valiosas. Muito obrigado desde já!

NodeMCU usando protocolo MQTT (cloudMQTT é o broken) controlado pelo MQTTDash.txt

adicionado 7 minutos depois

Eu tenho este código que funciona perfeitamente para a implementação que eu quero, porém, eu achei a programação que estamos tentando ajustar mais completa (apesar de ser mais difícil a compreensão) para toda a implementação que preciso.

de repente, uma solução seria unir os dois em um único programa caso não se resolva este (o programa que já vinhamos tentando resolver o problema) ou, até mesmo, usar ele (Tutorial_CloudMQTT.txt) como base para resolver os problemas que tem o outro programa
 

Tutorial_CloudMQTT.txt

Link para o comentário
Compartilhar em outros sites

Ta... uma pergunta, quando ocorre ao mesmo tempo a troca dos valores do led quando você digita o comando de ligar e desligar apenas um deles qual a mensagem que aparece? Aparece as mensagens iguais dessa parte aqui do teu código? Tipo você manda desligar o D5 e aparece "Colocando o D5 e, stado Baixo" e também aparece "colocando D0 em stado Baixo"  ? Ou não aparece mensagem, só uma das duas?

  
  if(strMensagem == "ligaD5"){
    imprimirSerial(true, "Colocando o D5 em stado ALTO...");
    digitalWrite(D5, HIGH);
    gravarStatusD5(HIGH);
  }else if(strMensagem == "desligaD5"){
    imprimirSerial(true, "Colocando o D5 em stado BAIXO...");
    digitalWrite(D5, LOW);
    gravarStatusD5(LOW);
  }else{
    imprimirSerial(true, "Trocando o estado do D5...");
    digitalWrite(D5, !digitalRead(D5));
    gravarStatusD5(digitalRead(D5));
  }
  if(strMensagem == "ligaD0"){
    imprimirSerial(true, "Colocando o D0 em stado ALTO...");
    digitalWrite(D0, HIGH);
    gravarStatusD0(HIGH);
  }else if(strMensagem == "desligaD0"){
    imprimirSerial(true, "Colocando o D0 em stado BAIXO...");
    digitalWrite(D0, LOW);
    gravarStatusD0(LOW);
  }else{
    imprimirSerial(true, "Trocando o estado do D0...");
    digitalWrite(D0, !digitalRead(D0));
    gravarStatusD0(digitalRead(D0));
  }

 

Link para o comentário
Compartilhar em outros sites

Assim que eu ligo aparece isso no Monitor Serial da IDE do Arduíno antes de eu digitar comando algum:
Ver anexo: "Primeira Imagem".

Quando eu ligo o D5, aparece esse código na tela:
Ver anexo: "Segunda Imagem".

Quando eu ativo o D5, ele está trocando o estado do D0 simultaneamente (foi isso que eu entendi segundo o que apareceu na tela quando eu ligo o D5).

O que você sugere que seja feito? Alguma dica ou sugestão?

Código que aparece antes de iniciar qualquer comando.png

Código que aparece quando eu ligo o D5.png

Link para o comentário
Compartilhar em outros sites

Não entendi uma coisa: Na primeira imagem você fala que não digitou nada, nem para ligar e nem para desligar, mas to vendo "trocando estado do D5..." e "trocando estado do D0...". você digitou algo ou o programa automaticamente fica repetindo isso ? É infinito ou tem alguma hora que para?

 

Qual sua intenção deixar o led ligado quando você mandar e desligado também ou ficar ficar piscando e por um tempo que você mandar ele ficar ligado ou desligado? 

 

Vou dormir agora, amanha dou uma olhada melhor e vejo sua reposta. Alguém também pode ajudar aqui durante o processo ^^

 

Várias perguntas, mas quero tentar reduzir as variáveis aqui e reduzir o problema ^^ complicado resolver problema de código assim huhuahauu

 

 

Link para o comentário
Compartilhar em outros sites

Ainda não respondeu... ok... Depois de rever aqui ... você está enviando o comando mas outra parte do programa esta respondendo além do

if(strMensagem == "ligaD5"){
    imprimirSerial(true, "Colocando o D5 em stado ALTO...");
    digitalWrite(D5, HIGH);
    gravarStatusD5(HIGH);
  }else if(strMensagem == "desligaD5"){
    imprimirSerial(true, "Colocando o D5 em stado BAIXO...");
    digitalWrite(D5, LOW);
    gravarStatusD5(LOW);
  }else{
    imprimirSerial(true, "Trocando o estado do D5...");
    digitalWrite(D5, !digitalRead(D5));
    gravarStatusD5(digitalRead(D5));
  }
  if(strMensagem == "ligaD0"){
    imprimirSerial(true, "Colocando o D0 em stado ALTO...");
    digitalWrite(D0, HIGH);
    gravarStatusD0(HIGH);
  }else if(strMensagem == "desligaD0"){
    imprimirSerial(true, "Colocando o D0 em stado BAIXO...");
    digitalWrite(D0, LOW);
    gravarStatusD0(LOW);
  }else{
    imprimirSerial(true, "Trocando o estado do D0...");
    digitalWrite(D0, !digitalRead(D0));
    gravarStatusD0(digitalRead(D0));
  }

Pois se seu comando estivesse funcionando teria a mensagem "Colocando o D5 em estado ALTO" no serial o que não aparece na imagens que você postou... Ou seja, outra parte do programa está mexendo com o ligar e desligar dos leds.

 

Por isso queria saber se isso ai é um loop infinito de pisca pisca ou uma hora para... ou ele vai até certo ponto e para e depois que você manda o led ligar ele gera uma nova linha no serial monitor.

 

O código é grande... to doente e não quero fazer mágica huahuahuauha Normalmente eu mandaria você mesmo rever o teu código mas como você é de elétrica to dando ajuda a mais huhauhauha

Link para o comentário
Compartilhar em outros sites

Desculpa não ter respondido anteriormente, estou mexendo no programa inteiro e estou conseguindo alguns bons resultados. Assim que eu finalizar o programa, posto ele aqui e, caso apareça alguma dúvida durante a minha análise, vou postando pra ver se conseguimos fazer algumas modificações a mais.

O programa tinha muitas falhas (pelo que eu estava analisando) e vários conflitos. Acho melhor (assim como você disse Bommu Perneta) analisar todo o programa e depois vir com questionamentos para possíveis soluções (caso apresente mais falhas ou conflitos).

Agradeço até o momento,
vou ver se finalizo isso dentro de, no máximo, uns 2 à 3 dias.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!