RESOLVIDO - ESP8266 12 - E não roda código do loop ao usar biblioteca Wifimanager

Para fins de teste de estabilidade resolvi unir 2 códigos no ESP preparado para IDE do Arduino de modo que o mesmo crie uma rede com um configurador de wirelles via web usando a biblioteca Wifimanager (https://github.com/tzapu/WiFiManager) e ao mesmo tempo o exemplo Blink do arduino.

A idéia é ficar piscando a led do modulo enquanto o mesmo estiver ligado, para ter certeza visualmente que ele está ligado e funcionando, e comparar se a rede está disponível e funcional nesse período de teste. É um teste de estabilidade do módulo.

O código é o seguinte:

//=======================

#include <ESP8266WiFi.h> //https://github.com/esp8266/Arduino

//needed for library
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h> //https://github.com/tzapu/WiFiManager


void setup() {
pinMode(2, OUTPUT);

// put your setup code here, to run once:
Serial.begin(115200);
//Monitora funcionamento

//WiFiManager
//Local intialization. Once its business is done, there is no need to keep it around
WiFiManager wifiManager;
//reset saved settings
//wifiManager.resetSettings();

//set custom ip for portal
//wifiManager.setAPConfig(IPAddress(10,0,1,1), IPAddress(10,0,1,1), IPAddress(255,255,255,0));

//fetches ssid and pass from eeprom and tries to connect
//if it does not connect it starts an access point with the specified name
//here "Rede teste"
//and goes into a blocking loop awaiting configuration
wifiManager.autoConnect("Configura_brinco_01");
//or use this for auto generated name ESP + ChipID
//wifiManager.autoConnect();


//if you get here you have connected to the WiFi
Serial.println("conetado!");

}


void loop() {
digitalWrite(2, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(2, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}

//=====================

O estranho que é a parte do blink não funciona de forma nenhuma. Mesmo se eu trocar o pino digital para outro, nesse código específico por comodidade estou usando o LED da própria placa do NodeMCU Lolin.

Será que alguém tem idéia do porque o código do led não funciona e o do wifi sim?

Detalhe: Se eu coloco só o código do blink funciona normal o led. 

Não dá nenhum erro de compilação quando uno os 2 códigos.

Exibições: 5805

Responder esta

Respostas a este tópico

Edilson,

A partir do momento que você gravou algum sketch no ESP, você já não tem mais firmware nenhum; foi regravado pelo processo de compilação e upload.

Quanto aos erros, passe seu código completo para que possamos analisar.

digitalWrite(2, HIGH); 
delay(1000); 
digitalWrite(2, LOW); 

Não use o pino2, a não ser que já tenho esgotado os pinos livres de seu ESP. Use o 4 ou o 5, de preferência.

Você já examinou algum dos desenhos que lhe foram enviados ? 

Essa loop acima vai deixar o pino 2 em HIGH praticamente o tempo todo... para que ele pisque é necessário um delay também após enviar LOW. Troque por isso:

digitalWrite(4, HIGH); 
delay(1000); 
digitalWrite(4, LOW); 

delay(1000); 

E coloque seu led no pino 4.

Edilson, recomendo que estude as informações sobre a sua placa NodeMCU.

http://www.nodemcu.com/index_en.html

https://nodemcu.readthedocs.io/en/master/

Não gostei disso :

Forum out of service 

Please ask questions and discuss instackoverflow
documents are here nodemcu.readthedocs.io

" NodeMCU tem mapeamento pin estranho. 
Números PIN escritos no quadro em si não correspondem aos números de pinos ESP8266 GPIO.

Temos constantes definidas para fazer usando esta placa mais fácil:

Se você quiser usar NodeMCU pino 5, use D5 para o número de pino, e será traduzido para o 'real' pino GPIO 14.

static const uint8_t D0 = 16;
static const uint8_t D1 = 5;
static const uint8_t D2 = 4;
static const uint8_t D3 = 0;
static const uint8_t D4 = 2;
static const uint8_t D5 = 14;
static const uint8_t D6 = 12;
static const uint8_t D7 = 13;
static const uint8_t D8 = 15;
static const uint8_t D9 = 3;
static const uint8_t D10 = 1;

https://iotbytes.wordpress.com/nodemcu-pinout/

Pois é Murta....

E para complicar ainda mais um pouco tem vários releases de NodeMCU...0.9, V1, V2 e agora V3. Mais a Wemos...

Esse mapa de constantes que você passou acima está dentro de algum include ou você que fez ?

Tirei daqui (como postado acima) 

" NodeMCU tem mapeamento pin estranho. 
Números PIN escritos no quadro em si não correspondem aos números de pinos ESP8266 GPIO.

Temos constantes definidas para fazer usando esta placa mais fácil:

O link apontado ai está furado Murta;

https://github.com/esp8266/Arduino/blob/esp8266/hardware/esp8266com...

Encontrei o pins_arduino.h_na minha instalação em:

/home/odilon/.arduino15/packages/esp8266/hardware/esp8266/2.3.0-rc2/variants/nodemcu

E sim, as constantes estão definidas lá.

Não entendo por que está dando erro na compilação do Edilson, a biblioteca WiFiManager faz referência a esse include.

Bom, eu não uso a WiFiManager, usei-a apenas para fins didáticos.

Confira sua instalação Edilson, esse arquivo tem que existir. E você poderá usar as constantes.

Com certeza terei que estudar, mas o que preciso realmente saber é por que o pino 2 que funciona no exemplo blink perfeitamente (Pino 2 = led interna da placa lolin V3). 

E se eu misturo com outro código esse mesmo pino 2 não funciona?

Já testei em 3 esp e acontece o mesmo.

Quanto ao mapeamento, no seu exemplo o pino 2 aparece como D4, o que é uma saída de pino externo da placa e não a Led interna, está correto isso?

Pelo que percebi isso são declarações de constantes para forçar a definição dos pinos, acho legal isso, assim posso definir cada pino. Interessante vou testar.

#include <ESP8266WiFi.h>

//needed for library
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>


static const uint8_t D0 = 16;
static const uint8_t D1 = 5;
static const uint8_t D2 = 4;
static const uint8_t D3 = 0;
static const uint8_t D4 = 2;
static const uint8_t D5 = 14;
static const uint8_t D6 = 12;
static const uint8_t D7 = 13;
static const uint8_t D8 = 15;
static const uint8_t D9 = 3;
static const uint8_t D10 = 1;


void setup() {
pinMode(D4, OUTPUT);


Serial.begin(115200);
WiFiManager wifiManager;

wifiManager.autoConnect("Configura_rede");

Serial.println("conetado!");

}


void loop() {
digitalWrite(D4, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(D4, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second

}

Agora a diferença é que a LED da placa fica sempre ligada, o resto funciona normalmente, mas a parte de delay para piscar a cada um segundo, não funciona.

PS.: Já testei removendo os comentários ali no código do delay e fica o mesmo.

Cabei de descobrir uma coisa, peguei um esp com Firmware NodeMCU para Lua e tasquei o código do arduino direto sem fazer upgrade de firmware e funcionou o exemplo blink.

Revendo melhor descobri que quando se grava o sketch ele vira o firmware, por isso atualizar firmware no esp é irrelevante a não ser que deseje usar comandos AT (Caso o esp não esteja com o firmware padrão de fabrica AT).
E ai quando se usa um sketch por exemplo se você não dizer ao chip o que cada pino é, ele simplesmente não sabe ou seja não existe uma pré definição de pinos,apenas uma pré definição de GPO onde você vai dizer a ele que o GPO tal é = ao pino X. Se não fizer isso ele não funciona nenhum pino direito.

Percebi isso por que quando se compila o código ele vira um arquivo .bin (Binário), e arquivo binário é sempre a mesma linguagem binária, inclusive as firmwares depois de compiladas vao ser gravadas em binário, moral da história qualquer código binário colocado lá dentro do esp funciona, desde que defina as funções do esp como por exemplo que as saidas GPOs  são pinos com número X

O processador Risc do ESP lê binário como linguagem nativa.



Mas de qualquer forma ainda estou com o problema do pisca pisca que não funciona hehe.

Caro Edilson, todas essas informações estão no ,meu tutorial . 

ESP8266 - Usando IDE Arduino (exemplos ADAFRUIT/SPARKFUN )
http://labdegaragem.com/forum/topics/conhecendo-o-esp8266?commentId...

"Observação importante : Quando você usa a IDE do Arduino, o firmware AT do ESP8266 é apagado. Portanto se deseja usar novamente o AT SDK, será necessário fazer o download novamente ." 

Não testei o controle dos pinos usando a IDE do Arduino, mas creio que o FW usa a pinagem informada no github ! Relativa a pinagem do Arduino. 

Tutorial completo (com índice) :

http://labdegaragem.com/forum/topics/conhecendo-o-esp8266

É mesmo, eu também achei que estivesse usando o FW do NodeMCU. A falta de padronização dá nisso. 

Muita confusão !

Então sugiro que estude isso :

https://github.com/esp8266/Arduino

https://github.com/esp8266/Arduino/tree/master/doc

Qual é o modelo do ESP8266 usando no NodeMCU ? É o ESP8266-12E ?

https://github.com/esp8266/Arduino/blob/master/doc/esp12.png

O Led azul do modulo EP8266-12  esta conectado no GPIO 1 , mas no ESP8266-12E  o Led esta conectado no pino GPIO 2.  O led do GPIO 2 (D2) corresponde ao pino TX1 da comunicação serial (secundária) Sugiro que  desative a comunicação serial no seu Sketch, para efeito de testes. 

Exato é o ESP-12E

Olha só upei o código com a tua lista de constantes de pinos, nesse módulo que estava com firmware de NodeMCU, os outros estão atualizados com firmware para a IDE do arduino. Fiz isso nesse post a alguns dias: 

http://labdegaragem.com/forum/topics/nodemcu-usar-com-a-ide-do-ardu-no

Olha que interessante:

No módulo que está a firmware do NodeMCU - funciona o pisca pisca  blink, a serial cai a velocidade a força para 78880, mesmo eu setando em 115200. Aparece a rede wirelles para conecção e configuração, mas não abre no navegador pelo IP padrão 192.168.4.1

No módulo com firmware atualizado para IDE do arduino, o mesmo código não funciona o blink, mas funciona até a conexão no navegador pelo ip e me permite configurar a rede.

O código ficou assim:

#include <ESP8266WiFi.h>

//needed for library
#include <DNSServer.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>


static const uint8_t D0 = 16;
static const uint8_t D1 = 5;
static const uint8_t D2 = 4;
static const uint8_t D3 = 0;
static const uint8_t D4 = 2;
static const uint8_t D5 = 14;
static const uint8_t D6 = 12;
static const uint8_t D7 = 13;
static const uint8_t D8 = 15;
static const uint8_t D9 = 3;
static const uint8_t D10 = 1;


WiFiManager wifiManager; // antes do setup

void setup() {
pinMode(D4, OUTPUT);


Serial.begin(115200);
WiFiManager wifiManager;

wifiManager.autoConnect("Configura_rede");

Serial.println("conetado!");

}


void loop() {
digitalWrite(D4, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(D4, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second

}

Terei que sair agora, mas na volta vou ler seus links quero estudar isso a fundo obrigado por estar fornecendo tanto material, vou tentar criar uma biblioteca para padronizar os Pinos, para podermos usar na ide do arduino diretamente como na linguagem do arduino, na verdade o que estou tentando fazer é justamente complementar a biblioteca wifimanager se der certo mais adiante, será uma biblioteca que incluira as principais funções basicas para o esp em uma include apenas, como um configurador da rede via wifi, padronização de pinos etc.

Edilson, dá uma olhada nesses dois links:

https://www.youtube.com/watch?v=VkBLvjNgH50

https://github.com/esp8266/Arduino/tree/master/doc/ota_updates

Não tenho essa placa do exemplo do youtube. Testei numa Wemos D1 Mini, em um ESP-12 NodeMCU V 0.9 e ESP-12 NodeMCU V2. Não testei no ESP-01, mas deve funcionar também.

Está rolando igual um reloginho. 

Meu próximo passo é fazer o update pela internet. Achei um link que mostra como fazer isso com o Visual Studio, mas não tenho nem Windows... quanto mais Visual Studio.

Vou procurar para o Linux, quando encontrar posto aqui.

Boa sorte !!

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço