Ir ao conteúdo

ViniciusKruz

Membro Pleno
  • Posts

    720
  • Cadastrado em

  • Última visita

Tudo que ViniciusKruz postou

  1. @aphawk Muito legal seu projeto, imagina só a utilidade de uma coisa dessas na agricultura!
  2. Nossa!! eu nunca coloquei o relógio do computador à prova, pra mim, eles eram bem precisos, vou passar a observar, vou acertar meu pc com um servidor de horas e vou acompanhar pra ver a real precisão dele.
  3. @Intrudera6 Me surgiu uma dúvida e até fui consultar, nas placas mãe de computador, a BIOS usa cristal externo + capacitores para o clock do relógio e tem uma precisão incrível. Não sei se as placas mais recentes ainda são assim, mas creio que ainda são. Ou seja, dá pra extrair coisa boa desses sistemas(cristal+capacitor).
  4. @Intrudera6 Entendi, ele não deve ter um cristal externo.
  5. Então, por isto mesmo, não seria mais fácil fazer este controle via hardware mesmo? somente ajustando um capacitor externo.
  6. @Intrudera6 Estou focado em uma outra rotina aqui e estou meio sem tempo pra me preocupar com o RTC agora, mas de imediato, vou ajustar a precisão do PCF de forma básica, já vai resolver por enquanto. Não seria mais fácil fazer este controle com um capacitor externo (trimmer) usando um osciloscópio? considerando que este seu ajuste fino não permanece fiel. Eu por exemplo, não tenho osciloscópio/frequencímetro, sempre ajusto por tentativa e erro.
  7. @Intrudera6 Prometo que o DS3231 será prioridade para o futuro rerere. De imediato, o PCF8583 está resolvendo, eu não ajustei o capacitor do cristal dele ainda, eu só montei e coloquei pra funcionar, nesse momento ele está tremendamente impreciso, mas depois com calma dá pra ajustar com capacitores até ficar razoável, mas depois quero testar o DS3231 com certeza. Quanto à eeprom, realmente esta questão me preocupa, estou usando a eeprom simulada na flash ela é bem limitada no uso, pior é que preciso de 1024 Bytes, é uma quantidade considerável de memória, mas já estou pensando em colocar uma eeprom I2c externa pra deixar a flash de lado.
  8. @aphawk Valeu Paulo!! É bem humilde, é só o pontapé inicial, devagar vou implementando mais coisas nele. Uma coisa que estou achando muito legal é a memória desses ESPs, se eu estivesse usando um PIC18F (que tem uma memória razoável), esse programaaí tinha lotado ele, mas no ESP agora que está em 50% da capacidade. Sem contar que ainda existe a possibilidade de rodar a 160Mhz, que pelos seus testes aí, funciona muito bem.
  9. Bom, estou com meu projetinho começando a ficar como deve, embora o ESP não tenha sido desenvolvido para web server(segundo os desenvolvedores do NodeMcu), eu acho que uma interface simples não vai atrapalhar em nada no sistema, até porque, eles mesmos sugeriram que o ESP fosse usado para, entre outras coisas, câmeras de monitoramento de bebês, ora, se o ESP tem capacidade para transmissão de imagem em "tempo real", porque que ele não poderia prover uma interface visual para seus usuários? Pelo pouco que conheço destes módulos, já estou mais que convencido de que estão subestimando estas gracinhas. Com este pensamento, estou certo que qualquer coisa que seja feita com o ESP, precisa de uma base padrão (Web Server) com algumas características: Login de acesso Meios para "resetar" as configurações em um padrão pre-definido Meios para se efetuar as configurações básicas sem a necessidade de programas externos Meios para que ele seja autônomo e de uma forma ou de outra, deve dar acesso ao Web Server Meios de segurança para que o ESP não saia simplesmente respondendo ou acionando IOs sem uma autenticação Eu fiz esta base, está muito simplesinha, mas já é o suficiente para começar, futuramente vou impementar umas telinhas mais "bonitinhas" com recursos como CSS, JS... Nesta minha base, conforme podem ver nas imagens, tem todas estas características citadas acima. O login não é criptografado (será implementado no futuro), porém o sistema é bem seguro mesmo sem a criptografia, sendo que o mesmo login usado para entrar no sistema, também é exigido nos comandos para acionar IOs ou obter informações. Também implementei uma opção de boot a mais, ou seja, o ESP tenta primeiro se conectar em uma rede cadastrada, caso não consiga, ele inicializa em modo AP e a pessoa pode se conectar à rede Wifi dele e ter acesso ao Web Server para alterar as configurações. Vou postar também o Sketch usado, está meio bagunçado, mas dá pra analisarem as funções. Até que pra quem nunca tinha programado na linguagem do Arduíno, eu acho que está de bom tamanho. /* * * Posições da memória eeprom: * Usuario e senha Wifi: 0 a 96 * Usuário do login web: 100 a 119 * Senha do login web: 120 a 189 * IP: 200 a 203 * Gateway: 204 a 207 * Sub-rede: 208 a 211 * */ #include <ESP8266HTTPClient.h> #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> #include <EEPROM.h> #include <PCF8583.h> #include <IPAddress.h> #include <Esp.h> extern "C"{ #include "user_interface.h" } char dia[]="01"; char _mes[]="01"; char ano[]="2010"; char hora[]="00"; char minuto[]="00"; char segundo[]="00"; int correct_address = 0; PCF8583 p (0xA0); #define MEM_ALOC_SIZE 512 //tamanho da memória eeprom char ssid[] = "Atual"; char password[] = "acesso301"; String user;//usuario da web String pwd;//senha da web boolean restart=false; ESP8266WebServer server(80); os_timer_t mTimer; bool _timeout = false; int Rele1 = 14; int Rele2 = 16; // config static IP IPAddress ip(192, 168, 0, 35); IPAddress gateway(192, 168, 0, 1); IPAddress subnet(255, 255, 255, 0); unsigned int contaTimer=0; //rotina de interrupção void tCallback(void *tCall){ _timeout = true; contaTimer++; } void usrInit(void){ os_timer_setfn(&mTimer, tCallback, NULL); os_timer_arm(&mTimer, 1000, true); } char *convStrToCharArr(String str){ int str_len = str.length() + 1; char char_array[str_len]; str.toCharArray(char_array, str_len); return char_array; } void loadLoginWeb(){ int i=0; for(i=100;i<120;i++){ //usuario: da posição 100 até a 105 if(char(EEPROM.read(i))!= '\0') user += char(EEPROM.read(i)); } for(i=120;i<190;i++){//senha: da posição 106 até a 111 if(char(EEPROM.read(i))!= '\0'){ pwd += char(EEPROM.read(i)); } } } void loadDefault(){ //Grava usuario e senha user="admin"; pwd="admin"; for (int i = 100; i < 120; ++i) { EEPROM.write(i, 0); }//apaga o usuario atual da eeprom for (int i = 0; i < user.length(); ++i){//grava o novo nome de usuario na eeprom EEPROM.write(i+100, user[i]); Serial.println(user[i]); } EEPROM.commit(); for (int i = 120; i < 190; ++i) { EEPROM.write(i, 0); }//apaga a senha atual for (int i = 0; i < pwd.length(); ++i){//grava a nova senha de usuario na eeprom EEPROM.write(i+120, pwd[i]); Serial.println(pwd[i]); } EEPROM.commit(); //grava rede padrão gravaIpLocal("192.168.0.30"); gravaSubrede("255.255.255.0"); gravaGateway("192.168.0.1"); //grava o nome padrão da rede wifi a ser conectada gravaSsid("RedeWifi","pass" ); } String DisplayAddress(IPAddress address)//conversão de endereço ip para string { return String(address[0]) + "." + String(address[1]) + "." + String(address[2]) + "." + String(address[3]); } //Check if header is present and correct bool is_authentified(){ Serial.println("Enter is_authentified"); if (server.hasHeader("Cookie")){ Serial.print("Found cookie: "); String cookie = server.header("Cookie"); Serial.println(cookie); if (cookie.indexOf("ESPSESSIONID=1") != -1) { Serial.println("Authentification Successful"); return true; } } Serial.println("Authentification Failed"); return false; } //login page, also called for disconnect void handleLogin(){ String msg; if (server.hasHeader("Cookie")){ Serial.print("Found cookie: "); String cookie = server.header("Cookie"); Serial.println(cookie); } if (server.hasArg("DISCONNECT")){ Serial.println("Disconnection"); String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESPSESSIONID=0\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n"; server.sendContent(header); return; } if (server.hasArg("USERNAME") && server.hasArg("PASSWORD")){ String _user = server.arg("USERNAME"); String _pwd = server.arg("PASSWORD"); Serial.println("Usuario gravado:"); Serial.println(user); Serial.println("Senha gravada:"); Serial.println(pwd); if (_user.equals(user) && _pwd.equals(pwd)){ String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESPSESSIONID=1\r\nLocation: /\r\nCache-Control: no-cache\r\n\r\n"; server.sendContent(header); Serial.println("Logado com sucesso"); return; } msg = "Login incorreto."; Serial.println("Log in Failed"); } String content = "<html><body> <title>ESP-Control</title>"; content+="<meta http-equiv='Content-Type' content='text/html; charset=utf-8'><br>"; content+="<div class='reformed-form'>"; content+="<form method='post' name='login' id='login' action='/login'><H1>ACESSO AO SISTEMA</H1>"; content+="<dl><dt><label for='usuario'>Usuário</label></dt>"; content+="<dd><input type='text' id='usuario' name='USERNAME' placeholder='Nome do usuário' /></dd></dl><dl><dt>"; content+="<label for='senhalogin'>Senha</label></dt>"; content+="<dd><input type='password' id='senhalogin' name='PASSWORD' placeholder='Senha' /></dd>"; content+="</dl><div id='submit_buttons'><button type='submit'>Entrar</button></div></form></div>"+ msg +"<br>"; content += "<a href='/inline'>Monitor</a></body></html>"; server.send(200, "text/html", content); } void reboot(){ Serial.println("Entrou nas configurações"); String header; if (!is_authentified()){ String header = "HTTP/1.1 301 OK\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n"; server.sendContent(header); return; } int statusCode=0; String content="Reiniciando..."; if (server.hasArg("REBOOT")){//comando para reiniciar o sistema if(server.arg("REBOOT")=="REBOOT"){ String ip_;//= DisplayAddress(WiFi.localIP()); //lê o ip na eeprom for (int i = 0; i < 4; ++i) { ip_[i]= char(EEPROM.read(i+200)); } content = "O sistema esta sendo reiniciado!!"; Serial.println("Reiniciar"); server.send(statusCode, "application/json", content); delay(1000); //ESP.reset(); ESP.restart(); } if(server.arg("REBOOT")=="REBOOTDEF"){ content = "O sistema esta sendo restaurado no padrão de fabrica!!"; Serial.println("Reiniciar padrão de fábrica"); server.send(statusCode, "application/json", content); loadDefault(); delay(1000); ESP.restart(); } return; } content = "<html><body> <title>ESP-Control</title>"; content+="<meta http-equiv='Content-Type' content='text/html; charset=utf-8'><H1>Reinicialização</H1>"; content+="<div class='reformed-form'>"; content+="<form method='post' name='cfg' id='cfg' action='/reboot'>"; content+="<dl><dd><input type='radio' name='REBOOT' value='REBOOT' checked>Reiniciar <br>"; content+="<input type='radio' name='REBOOT' value='REBOOTDEF' >Reiniciar no padrão de fábrica </dd></dl>"; content+="<div id='submit_buttons'>"; content+="<button type='submit'>Reiniciar</button></div></form></div>"; content += "Usuário logado! <a href=\"/login?DISCONNECT=YES\"><br>Sair</a></body></html>"; server.send(200, "text/html", content); } //root page can be accessed only if authentification is ok void handleRoot(){ Serial.println("Enter handleRoot"); String header; if (!is_authentified()){ String header = "HTTP/1.1 301 OK\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n"; server.sendContent(header); return; } String content = "<html><body> <title>ESP-Control</title>"; content+="<meta http-equiv='Content-Type' content='text/html; charset=utf-8'><H1>Menu do sistema</H1><br>"; content+="1-<a href='/confwifi'>Configurar rede Wifi</a><br>"; content+="2-<a href='/confipst'>Configurar LAN</a><br>"; content+="3-<a href='/conflogin'>Configurar login</a><br>"; content+="4-<a href='/relogio'>Relógio</a><br>"; content+="5-<a href='/reboot'>Reiniciar o sistema</a><br>"; //if (server.hasHeader("User-Agent")){ // content += "the user agent used is : " + server.header("User-Agent") + "<br><br>"; //} content += "Usuário logado! <a href=\"/login?DISCONNECT=YES\"><br>Sair</a></body></html>"; server.send(200, "text/html", content); } void conflogin(){ Serial.println("Entrou nas configurações"); String header; if (!is_authentified()){ String header = "HTTP/1.1 301 OK\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n"; server.sendContent(header); return; } if (server.hasArg("USUARIO") && server.hasArg("SENHAATUAL")&& server.hasArg("NOVASENHA")){//enviou configurações de ip String content; int statusCode=0; String usuario = server.arg("USUARIO"); String senha_atual = server.arg("SENHAATUAL"); String novasenha = server.arg("NOVASENHA"); String confnovasenha = server.arg("CONFNOVASENHA"); Serial.println("Novo usuario e senha:"); Serial.println(usuario); Serial.println(novasenha); if (senha_atual == pwd ){//confere a senha atual if (novasenha == confnovasenha ){//confere a nova senha if (usuario.length()<=20 ){//confere o tamanho do usuario for (int i = 100; i < 120; ++i) { EEPROM.write(i, 0); }//apaga o usuario atual da eeprom for (int i = 0; i < usuario.length(); ++i){//grava o novo nome de usuario na eeprom EEPROM.write(i+100, usuario[i]); Serial.println(usuario[i]); } EEPROM.commit(); content = "{\"Sucesso\":\"Novo usuário gravado.\"}"; for (int i = 120; i < 190; ++i) { EEPROM.write(i, 0); }//apaga a senha atual for (int i = 0; i < novasenha.length(); ++i){//grava a nova senha de usuario na eeprom EEPROM.write(i+120, novasenha[i]); Serial.println(novasenha[i]); } EEPROM.commit(); delay(10); user=usuario; pwd=novasenha; //loadLoginWeb();//carrega os novos dados do login //content += "{\"Sucesso\":\"Nova senha gravada.\"}"; //content += "{\"Faça logoff para entrar com a nova senha.\"}"; String header = "HTTP/1.1 301 OK\r\nSet-Cookie: ESPSESSIONID=0\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n"; server.sendContent(header); return; }else{ content = "{\"Erro\":\"Tamanho maximo para o nome do usuario: 20 caract.\"}"; } }else{ content = "{\"Erro\":\"Nova senha difere da confirmação da senha\"}"; } }else{ content = "{\"Erro\":\"Senha atual incorreta.\"}"; } server.send(statusCode, "application/json", content); return; } String ip_local= DisplayAddress(WiFi.localIP()); String content = "<html><body> <title>ESP-Control</title>"; content+="<meta http-equiv='Content-Type' content='text/html; charset=utf-8'><H1>Configurar usuário/senha</H1>"; content+="<div class='reformed-form'>"; content+="<form method='post' name='cfguserpass' id='cfg' action='/conflogin'>"; content+="<dl><dt><label for='user'>Nome do usuário</label>"; content+="</dt><dd><input type='text' id='user' name='USUARIO' value='"+user+"' /></dd></dl>"; content+="<dl><dt><label for='senha_atual'>Senha atual</label>"; content+="</dt><dd><input type='password' id='senha_atual' name='SENHAATUAL' /></dd></dl>"; content+="<dl><dt><label for='novasenha'>Nova senha</label></dt>"; content+="<dd><input type='password' id='novasenha' name='NOVASENHA' /></dd></dl>"; content+="<dl><dt><label for='confsenha'>Conf. nova senha</label></dt>"; content+="<dd><input type='password' id='confsenha' name='CONFNOVASENHA' /></dd></dl>"; content+="<div id='submit_buttons'>"; content+="<button type='submit'>Salvar</button></div></form></div>"; content += "Usuário logado! <a href=\"/login?DISCONNECT=YES\"><br>Sair</a></body></html>"; server.send(200, "text/html", content); } boolean gravaIpLocal(String _qip){ IPAddress qip; if(qip.fromString(_qip.c_str())){ for (int i = 200; i < 204; ++i) { EEPROM.write(i, 0); } //grava o novo IP for (int i = 0; i < 4; ++i){ EEPROM.write(i+200, qip[i]); } EEPROM.commit(); return true; }else{ return false; } } boolean gravaSubrede(String _qmsk){ IPAddress qmsk; if(qmsk.fromString(_qmsk.c_str())){ //limpa a eeprom for (int i = 208; i < 212; ++i) { EEPROM.write(i, 0); } //grava o novo IP for (int i = 0; i < 4; ++i){ EEPROM.write(i+208, qmsk[i]); } EEPROM.commit(); return true; }else{ return false; } } boolean gravaGateway(String _qgtw){ IPAddress qgtw; if(qgtw.fromString(_qgtw.c_str())){ //limpa a eeprom for (int i = 204; i < 208; ++i) { EEPROM.write(i, 0); } //grava o novo Gateway for (int i = 0; i < 4; ++i){ EEPROM.write(i+204, qgtw[i]); } EEPROM.commit(); return true; }else{ return false; } } void confipst(){ Serial.println("Entrou nas configurações"); String header; if (!is_authentified()){ String header = "HTTP/1.1 301 OK\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n"; server.sendContent(header); return; } if (server.hasArg("IPESTACAO") && server.hasArg("GATEWAY")&& server.hasArg("SUBREDE")){//enviou configurações de ip String content="Status:"; int statusCode=0; String _qip = server.arg("IPESTACAO"); String _qgtw = server.arg("GATEWAY"); String _qmsk = server.arg("SUBREDE"); if( gravaIpLocal(_qip)){//se gravou o ip... Serial.print("Novo IP:"); Serial.print(_qip); Serial.println("Gravado com sucesso!"); content+="IP gravado com sucesso.\n"; }else{ Serial.print("Erro ao gravar o IP:"); Serial.print(_qip); content+="Erro ao gravao o IP.\n"; } if(gravaSubrede(_qmsk)){//se gravou o ip... Serial.print("Nova Sub-rede:"); Serial.print(_qmsk); Serial.println("Gravada com sucesso!"); content+="Sub-rede gravada com sucesso.\n"; }else{ Serial.print("Erro ao gravar a Sub-rede:"); Serial.print(_qmsk); content+="Erro ao gravar a Sub-rede.\n"; } if(gravaGateway(_qgtw)){//se gravou o ip... Serial.print("Novo gateway:"); Serial.print(_qgtw); Serial.println("Gravado com sucesso!"); content+="Gateway gravado com sucesso.\n"; }else{ Serial.print("Erro ao gravar o gateway:"); Serial.print(_qgtw); content+="Erro ao gravar o Gateway.\n"; } content+="Para aplicar as configuracoes de rede,\no sistema deve ser reiniciado.\n"; server.send(statusCode, "application/json", content); return; } String ip_local= DisplayAddress(WiFi.localIP()); String msk=DisplayAddress(WiFi.subnetMask()); String gtw=DisplayAddress(WiFi.gatewayIP()); String content = "<html><body> <title>ESP-Control</title>"; content+="<meta http-equiv='Content-Type' content='text/html; charset=utf-8'><H1>Configurar LAN</H1>"; content+="<div class='reformed-form'>"; content+="<form method='post' name='cfg' id='cfg' action='/confipst'>"; content+="<dl><dt><label for='ip'>IP</label>"; content+="</dt><dd><input type='text' id='ip' name='IPESTACAO' value='"+ip_local+"' /></dd>"; content+="</dl><dl><dt><label for='sub_rede'>Sub-rede</label>"; content+="</dt><dd><input type='text' id='sub_rede' name='SUBREDE' value='"+msk+"' /></dd>"; content+="</dl><dl><dt><label for='gateway'>Gateway</label></dt>"; content+="<dd><input type='text' id='gateway' name='GATEWAY' value='"+gtw+"' /></dd>"; content+="</dl><div id='submit_buttons'>"; content+="<button type='submit'>Salvar</button></div></form></div>"; content += "Usuário logado! <a href=\"/login?DISCONNECT=YES\"><br>Sair</a></body></html>"; server.send(200, "text/html", content); } boolean gravaSsid(String qsid, String qpass){ if (qsid.length() > 0 ){ Serial.println("Limpando a eeprom"); for (int i = 0; i < 96; ++i) { EEPROM.write(i, 0); } Serial.println("Gravando ssid na eeprom"); for (int i = 0; i < qsid.length(); ++i){ EEPROM.write(i, qsid[i]); } Serial.println("Gravando senha na eeprom"); for (int i = 0; i < qpass.length(); ++i){ EEPROM.write(32+i, qpass[i]); } EEPROM.commit(); return true; }else{ return false; } } void relogio(){ Serial.println("Entrou nas configurações do relógio"); String header; if (!is_authentified()){ String header = "HTTP/1.1 301 OK\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n"; server.sendContent(header); return; } if (server.hasArg("DIA") && server.hasArg("MES")){//enviou configurações String content; int statusCode=0; String _Dia = server.arg("DIA"); String _Mes = server.arg("MES"); String _Ano = server.arg("ANO"); String _Hora = server.arg("HORA"); String _Min = server.arg("MINUTO"); int _AnoInt=_Ano.toInt(); if(_AnoInt <= 99){//digitou apenas 2 casas _AnoInt+=2000; } p.year = _AnoInt; p.month = _Mes.toInt(); p.day = _Dia.toInt(); p.hour = _Hora.toInt(); p.minute = _Min.toInt(); //p.dow = 1; p.second = 0; p.set_time(); Serial.println(_Dia); Serial.println(_Mes); Serial.println(_Ano); Serial.println(_Hora); Serial.println(_Min); Serial.println("Atualizou o relógio"); content="Data/hora atualizada."; server.send(statusCode, "application/json", content); return; } String content = "<html><body> <title>ESP-Control</title>"; content+="<meta http-equiv='Content-Type' content='text/html; charset=utf-8'><H1>Data e hora no sistema</H1>"; content+="<div class='reformed-form'>"; content+="<form method='post' name='cfg' id='cfg' action='/relogio'>"; content+="<dl><label for='dia'>Dia </label><input type='text' id='dia' name='DIA' value='"+String(dia)+"' size=1/></dl>"; content+="<dl><label for='mes'>Mês </label><input type='text' id='mes' name='MES' value='"+String(_mes)+"' size=1/></dl>"; content+="<dl><label for='ano'>Ano </label><input type='text' id='ano' name='ANO' value='"+String(ano)+"' size=1/></dl>"; content+="<dl><label for='hora'>Hora </label><input type='text' id='hora' name='HORA' value='"+String(hora)+"' size=1/></dl>"; content+="<dl><label for='min'>Min. </label><input type='text' id='min' name='MINUTO' value='"+String(minuto)+"' size=1/></dl>"; content+="<div id='submit_buttons'>"; content+="<button type='submit'>Salvar</button></div></form></div>"; content += "Usuário logado! <a href=\"/login?DISCONNECT=YES\"><br>Sair</a></body></html>"; server.send(200, "text/html", content); } void confwifi(){ Serial.println("Entrou nas configurações"); String header; if (!is_authentified()){ String header = "HTTP/1.1 301 OK\r\nLocation: /login\r\nCache-Control: no-cache\r\n\r\n"; server.sendContent(header); return; } if (server.hasArg("SSID") && server.hasArg("SENHA")){//enviou configurações String content; int statusCode=0; String qsid = server.arg("SSID"); String qpass = server.arg("SENHA"); if(gravaSsid(qsid, qpass)){ content="SSID gravada com sucesso."; }else{ content="Erro ao gravar a SSID."; } server.send(statusCode, "application/json", content); return; } String _ssid(ssid); String content = "<html><body> <title>ESP-Control</title>"; content+="<meta http-equiv='Content-Type' content='text/html; charset=utf-8'><H1>Configurar rede Wifi:</H1>"; content+="<div class='reformed-form'>"; content+="<form method='post' name='cfg' id='cfg' action='/confwifi'>"; content+="<dl><dt><label for='ssid'>SSID</label>"; content+="</dt><dd><input type='text' id='ssid' name='SSID' value='"+_ssid+"' /></dd>"; content+="</dl><dl><dt><label for='senha_ap'>Senha</label>"; content+="</dt><dd><input type='password' id='senha_ap' name='SENHA' /></dd>"; content+="</dl><div id='submit_buttons'>"; content+="<button type='submit'>Salvar</button></div></form></div>"; content += "Usuário logado! <a href=\"/login?DISCONNECT=YES\"><br>Sair</a></body></html>"; server.send(200, "text/html", content); } void act(){ if (server.hasArg("USERNAME") && server.hasArg("PASSWORD")&& server.hasArg("rele1")){ if (server.arg("USERNAME") == user && server.arg("PASSWORD") == pwd ){ if(server.arg("rele1")=="1"){ digitalWrite(Rele1, HIGH); server.send(200, "text/plain", "Rele 1 ligado!"); // send to someones browser when asked } if(server.arg("rele1")=="0"){ digitalWrite(Rele1, LOW); server.send(200, "text/plain", "Rele 1 desligado!"); // send to someones browser when asked } }else{ server.send(200, "text/plain", "Login incorreto."); // send to someones browser when asked } } } //no need authentification void handleNotFound(){ String message = "File Not Found\n\n"; message += "URI: "; message += server.uri(); message += "\nMethod: "; message += (server.method() == HTTP_GET)?"GET":"POST"; message += "\nArguments: "; message += server.args(); message += "\n"; for (uint8_t i=0; i<server.args(); i++){ message += " " + server.argName(i) + ": " + server.arg(i) + "\n"; } server.send(404, "text/plain", message); } bool testWifi(void) { int c = 0; Serial.println("Waiting for Wifi to connect"); while ( c < 20 ) { if (WiFi.status() == WL_CONNECTED) { return true; } delay(500); Serial.print(WiFi.status()); c++; } //Serial.println(""); //Serial.println("Connect timed out, opening AP"); return false; } void drawGraph() { String out = ""; char temp[100]; out += "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"400\" height=\"150\">\n"; out += "<rect width=\"400\" height=\"150\" fill=\"rgb(250, 230, 210)\" stroke-width=\"1\" stroke=\"rgb(0, 0, 0)\" />\n"; out += "<g stroke=\"black\">\n"; int y = rand() % 130; for (int x = 10; x < 390; x+= 10) { int y2 = rand() % 130; sprintf(temp, "<line x1=\"%d\" y1=\"%d\" x2=\"%d\" y2=\"%d\" stroke-width=\"1\" />\n", x, 140 - y, x + 10, 140 - y2); out += temp; y = y2; } out += "</g>\n</svg>\n"; server.send ( 200, "image/svg+xml", out); } char *ipExterno(){//função para pegar o ip externo HTTPClient http; http.begin("http://checkip.dyndns.org/"); //HTTP http.GET(); String payload = http.getString(); int inicioIp=payload.indexOf(':')+2; char strFiltro[18]; for(int h=0;h<18;h++){ strFiltro[h]='\0'; } char c; int t=0; while(t<18 && c!='<'){ c=payload[inicioIp+t]; if(c != '<'){ strFiltro[t]=c; } t++; } http.end(); return strFiltro; } void setup() { Serial.begin(9600); pinMode(Rele1, OUTPUT); // configura o pino do relé 1 como saida pinMode(Rele2, OUTPUT); // configura o pino do relé 2 como saida digitalWrite(Rele1, LOW); digitalWrite(Rele2, LOW); EEPROM.begin(MEM_ALOC_SIZE);//inicializa a eeprom delay(10); loadLoginWeb(); String esid; for (int i = 0; i < 32; ++i) { esid += char(EEPROM.read(i)); } Serial.print("SSID: "); Serial.println(esid); Serial.println("Lendo a senha da rede na EEPROM"); String epass = ""; for (int i = 32; i < 96; ++i) { epass += char(EEPROM.read(i)); } //lê o ip na eeprom for (int i = 0; i < 4; ++i) { ip[i]= EEPROM.read(i+200); } //lê o Gateway na eeprom for (int i = 0; i < 4; ++i) { gateway[i]= EEPROM.read(i+204); } //lê o Sub-rede na eeprom for (int i = 0; i < 4; ++i) { subnet[i]= EEPROM.read(i+208); } WiFi.mode(WIFI_STA);//station WiFi.config(ip, gateway, subnet);//configura o ip fixo boolean AP=false; if ( esid.length() > 1 ) { WiFi.begin(esid.c_str(), epass.c_str()); if (!testWifi()) {//se não conectou, inicializa como AP AP=true; } } usrInit(); //configuração da interrupção server.on("/", handleRoot); server.on("/confwifi", confwifi); server.on("/confipst", confipst); server.on("/login", handleLogin); server.on("/conflogin", conflogin); server.on("/reboot", reboot); server.on("/act", act); server.on("/relogio", relogio); server.on ("/test.svg", drawGraph ); server.on("/inline", [](){ server.send(200, "text/plain", "this works without need of authentification"); }); server.onNotFound(handleNotFound); //here the list of headers to be recorded const char * headerkeys[] = {"User-Agent","Cookie"} ; size_t headerkeyssize = sizeof(headerkeys)/sizeof(char*); //ask server to track these headers server.collectHeaders(headerkeys, headerkeyssize ); server.begin();//inicia o web server if(AP){ Serial.println("Conexao falhou, o sistema entrara em modo Access Point."); WiFi.mode(WIFI_AP);//Access Ponit IPAddress myIP = WiFi.softAPIP(); Serial.println("AP IP address: "); Serial.println(myIP); }else{ Serial.println("Web Server ativo em: http://"); Serial.print(WiFi.localIP()); Serial.print("/"); } Serial.println(""); } void loop() { if(_timeout)//envia data e hora pela serial a cada segundo p.get_time(); sprintf(dia,"%02d",p.day); sprintf(_mes,"%02d",p.month); sprintf(ano,"%04d",p.year); sprintf(hora,"%02d",p.hour); sprintf(minuto,"%02d",p.minute); sprintf(segundo,"%02d",p.second); Serial.print(dia); Serial.print(_mes); Serial.print(ano); Serial.print(hora); Serial.print(minuto); Serial.print(segundo); Serial.println(""); //char time[50]; //sprintf(time, "%02d/%02d/%02d %02d:%02d:%02d", //p.year, p.month, p.day, p.hour, p.minute, p.second); //////Serial.println(time); _timeout = false; } server.handleClient(); }
  10. Estou tendo problemas é com o comando Esp.restart(), pelo que lí, pra esse comando funcionar, o GPIO0 precisa estar em nível alto e o GPIO15 em nível baixo, meu sistema já está assim e não dá o restart, não vou ficar quebrando a cabeça com isso não, se não der certo, vou designar um pino pra fazer o restart via hardware. O estranho é que antes quando o código estava pequeno esse comando funcionava, agora o código está grande, parou! Afff ... Depois vou testar com um código bem pequeno pra ver se volta a funcionar, se não funcionar pode ser algum defeito no ESP.
  11. @aphawk Nossa Paulo, que canseira heim brother!!! Quando acontecem essas coisas o único formatador que já deu certo e conseguiu realmente resolver foi esse: ESP_DOWNLOAD_TOOL_V2.4
  12. @aphawk E o ESP a 160Mhz?? ta rodando bem?
  13. @gabriel de freitass Você já tem alguma experiência na IDE do Arduíno? já consegue gravar/comunicar com o ESP?
  14. @gabriel de freitass Independentemente de saber programar ou não, tudo vai depender do seu empenho, acredito que você não irá encontrar uma solução pronta e mesmo que encontre, sempre precisa fazer uma adaptação ou outra. A primeira coisa que você precisa é saber qual IDE e linguagem irá usar, você disse que pretende usar a IDE do Arduíno, é uma boa opção porque tem muita ajuda pra todo lado, mas mesmo assim, seu entusiasmo é que vai valer no final. O que você quer, é relativamente simples, se quiser somente saber se está ligado/desligado, ou se está disparado, você não precisa ter acesso a ele, mas pode colocar ele para acessar um IOT (site fora da sua residência) e atualizar esta informação lá, daí toda vez que você quiser saber o status do alarme, basta acessar este site(IOT) que terá a informação atualizada. Agora, se além de ver as informações, você quiser também controlar o alarme, aí a história muda bastante porque terá que montar um Web Server e dar permissão na sua rede para ele ser acessado de fora e nesse caso precisa pensar na questão da segurança para que não fique tudo aberto e outras pessoas possam entrar sem autorização... enfim, decida o que quer fazer e vai postando suas dúvidas que na medida do possível tem muita gente boa disposta a ajudar por aqui.
  15. Kkkkkkkk, não precisa colocar tão pertinho da chama não pô, senão pega fogo mesmo!! Kkkkkkk. Basta ligar a fonte do ESP8266 em uma tomada o mais próximo possível da tomada do fogão. Ao acionar o acendedor da chama, se o ESP não travar, aí ta aprovado!! Vocês já viram os testes dos fabricantes de automóveis com relação a interferências? Eles colocam o carro em uma sala com interferências pesadíssimas com o carro funcionando, se a central não travar, ta aprovado. No nosso caso, basta fazer os testes com as coisa mais comuns do dia-a-dia que são motores elétricos, lâmpadas fluorescentes e fogões(mas sem encostar na chama, pode ser uns metros de distância)
  16. @Intrudera6 Baixa a última versão do .net mesmo, se não estiver conseguindo instalar, tenta reiniciar o PC em modo seguro, não sei se o Win8 permite fazer instalações em modo seguro, mas tenta aí. @aphawk Pelos testes com a lâmpada aí deu pra perceber que está bem estável, tem um teste que se passar por ele também, você pode dormir tranquilo: interferência de fogão ao ligar a chama. A alta tensão gerada pra acender interfere e trava quase tudo. O ESPBasic tá ficando bacaninha mesmo.
  17. Tenta instalar o .net 4.5, ele é o mais recente para WIN8. A IDE do Eclipse é muito bom, de repente seria uma boa opção mesmo.
  18. Ela é bem fraquinha mesmo.
  19. Na verdade não era pra mudar nada ao instalar o VS, aliás, se alguma coisa fosse alterada, provavelmente seria relacionado com o .net framework ou ferramentas relacionadas com o SQL Server, fora isto não vejo mais nada que possa ser alterado. Faz assim, entra no painel de controle e veja nos programas instalados, qual é a versão do .net que está instalada, de repente, você desinstalando ela e reinstalando uma versão mais antiga resolva o problema do leitor de PDF. Eu faria assim: removeria o .net instalado e instalaria a versão 4.0 só pra ver se resolve, caso resolva, instale em seguida(sem desinstalar a 4.0) a versão 4.5, isso já deve resolver. Se nada disso resolver, faça uma restauração do Windows para algum ponto antes da instalação do VS. Eu não insisti muito com o VS, logo que ele mostrou instabilidade com minhas bibliotecas e o programa se comportou mal, voltei de imediato para a IDE do Arduíno, com ela o único inconveniente é a demora na compilação mas a estabilidade é 100% adicionado 2 minutos depois Se preocupa não, tem muita ajuda na rede.
  20. @Intrudera6 Você informou o endereço das pastas do Arduíno?
  21. @Intrudera6 A primeira coisa é que sua IDE Arduíno tem que estar funcionando, só depois que você configura o VS, segue pelo tutorial que não tem erro: https://hackaday.io/project/10227-automatales/log/34332-esp8266-arduino-visual-studio qualquer dúvida manda aí.
  22. @Intrudera6 Eu acho que ele não carregou a biblioteca do RTC PCF8583, o sistema deveria ficar enviando data e hora pela serial, mas não envia, gravei varias vezes mas deu na mesma, o estranho é que se não carregou a biblioteca, deveria dar algum erro ao chamar as funções dela, o que não ocorreu. Voltei a usar a IDE do Arduíno e ta 100% agora.
  23. @Intrudera6 Fiz a instalação no Visual Studio seguindo este tutorial, e não foi difícil, pelo contrário, foi muito fácil, mas não mudou nada, continua demorando na compilação, também não era pra menos, porque embora use a IDE do VS, o compilador usado é o do Arduíno, claro que só de poder usar uma IDE poderosa como esta já conta muito, porém, depois de compilado/upload o ESP se comportou muito estranho, ao contrário da IDE do Arduíno que depois do processamento o ESP sempre funciona 100%.
  24. Paulo, tem que ver é se depois de montado isso aí vai dar estabilidade porque nos PIC, que diga-se de passagem: são péssimos em filtragem, e ótimos para receberem interferências(não sei os AVRs se também o são), se colocar frequências altas dá muito trabalho pra não travar, depois faça um teste pra gente se possível, coloca ele pra funcionar a 160Mhz bem próximo de um reator de lâmpada fluorescente, de preferência, ligado na mesma rede elétrica. Se ele não travar, quando a lâmpada for desligada/ligada, está aprovado hehehe
  25. Ossos do ofício meu amigo, é o preço que se paga pra "modernizar" os sistemas!! O Basic em geral costuma ser leve e o seu interpretador é minúsculo, por isso a sua grande disseminação desde o início, mas pode ficar tranquilo, se continuarem a investir nele(modernizando), a hora dele ficar pesado ainda vai chegar kkkkk. É bem provável que eu não consiga com meu conhecimento atual, mas manda aí que será um prazer avaliar as instruções.

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!