RuiViana

TesteEEPROM_ESP.ino

Aug 23rd, 2018
179
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Extarido e modificado do AutoConnectWithFSParametersAndCustomIP da biblioteca WiFiManager
  2. // Era AutoConnectWithFSParametersAndCustomIP_V03
  3. // Versao V03
  4. // Versao V04  Usar interruptor para detectar reset
  5. /*
  6.   Nesta versao, se o interruptor estiver fechado ao ligar o modulo,
  7.   isto pode ser verificado porque a lampada fica acessa ao ligar,
  8.   e antes de 5 segundos for desligado o interruptor, o modulo entra em AP mode.
  9.   Em AP mode ele cria uma rede chamada "AP_Configure", com IP 192.168.1.4.
  10.   Acessando este IP configura-se a red com os novos parametros de:
  11.   SSID. Password, IP, Gateway, e SubNet.
  12. */
  13. #include <FS.h>                           // This needs to be first, or it all crashes and burns...
  14. #include <EEPROM.h>
  15. #include <ESP8266WiFi.h>                  // https://github.com/esp8266/Arduino
  16. #include <ESP8266WebServer.h>
  17. #include <WiFiManager.h>                  // https://github.com/tzapu/WiFiManager
  18. #include <ArduinoJson.h>                  // https://github.com/bblanchon/ArduinoJson
  19.  
  20. char static_ip[16] = "10.0.1.56";         // Default custom static IP
  21. char static_gw[16] = "10.0.1.1";
  22. char static_sn[16] = "255.255.255.0";
  23. bool shouldSaveConfig = false;            // Flag for saving data
  24.  
  25. // Port em uso
  26. // 0 15   SHT 2 MOC 4 SW 5 LED 13 Rst
  27. #include <SHT1x.h>                                          // https://github.com/practicalarduino/SHT1x
  28. #define dataPin  0                                          // GPIO 0  D3  Port para o Data do SHT10
  29. #define clockPin 15                                         // GPIO 15 D8  Port para o Clock do SHT10
  30. SHT1x sht1x(dataPin, clockPin);                             // Instancia shtx1
  31.  
  32. ESP8266WebServer server(80);                                // Instancia server
  33. //  Strings com HTML
  34. String Q_1 = "<!DOCTYPE HTML><html><head><meta http-equiv='refresh' content='2;URL=/Controle'/></head><h1><center>Controle de luz, Temperatura e Umidade</center>";
  35. String Q_2 = "</p></center><h3><BR></h3><html>\r\n";
  36. String Ql = "";                                             // Quarto ligado
  37. String Qd = "";                                             // Quarto desligado
  38. String Qil = "";                                            // Quarto intermediario ligado
  39. String Qid = "";                                            // Quarto intermediario desligado
  40. String LuzQuarto;                                           // String para controle
  41. float temp_c;                                               // Variavel para temperatura
  42. int humidity;                                               // Variavel para umidade
  43. #define Led_Ap_Mode 5                                       // Led indicativo de AP mode
  44. #define Saida1 2                                            // GPIO2 Port para ligar Controle do triac (Pino 2 do MOC3023)
  45. #define Switch1 4                                           // GPIO4 Port para ligar o interruptor
  46. byte Switch1_atual = 0;                                     // Variavel para staus de GPIO5 (Status do interruptor)
  47. unsigned long previousMillis = 0;                           // Variavel para medir periodos
  48. const long interval = 2000;                                 // Periodo de leitura da temperatura e umidade
  49. bool flagRst = 0;                                           // Flag para permitir reset dos parametros SSID e PW
  50. //bool bypass = LOW;                                          // Controle do automatico
  51. byte meuStatus = 0;
  52. #define led5 12
  53. //---------------------------------------
  54. void gettemperature()                                       // Funcoa para ler temperatura e umidade
  55. {
  56.   if (millis() - previousMillis >= interval)                // Se passou o intervalo
  57.   {
  58.     previousMillis = millis();                              // Restaura valor de previousMillis
  59.     humidity = sht1x.readHumidity();                        // Le umidade em SHT10
  60.     temp_c = sht1x.readTemperatureC();                      // Le temperatura em SHT10
  61.   }
  62. }
  63. //-------------------------------
  64. void saveConfigCallback ()                                  // Callback notifying us of the need to save config
  65. {
  66.   Serial.println("Should save config");
  67.   shouldSaveConfig = true;
  68. }
  69. //-------------------------------
  70. void setup()
  71. {
  72.   EEPROM.begin(64);
  73.  
  74.   Ql += Q_1;                                                // Monta tela pra informar que a luz
  75.   Ql += "<p><center>Luz</p><p><a href=\"/Controle?LuzQuarto=off \"><button style=\"background-color: rgb(255, 0,   0);height: 100px; width: 200px;\"><h1> Acesa</h1></button></a>";
  76.   Qd += Q_1;                                                // Monta tela pra informar que a luz
  77.   Qd += "<p><center>Luz</p><p><a href=\"/Controle?LuzQuarto=on \"><button style=\"background-color: rgb(0, 255,   0);height: 100px; width: 200px;\"><h1> Apagada</h1></button></a>";
  78.  
  79.   Serial.begin(115200);                                       // Inicializa Serial
  80.   Serial.println();                                           // Pint
  81.   pinMode(Led_Ap_Mode, OUTPUT);                               // Led_Ap_Mode como saida
  82.   digitalWrite(Led_Ap_Mode, HIGH);                            // Apaga o Led indicativo de AP
  83.   pinMode(led5, OUTPUT);
  84.   digitalWrite(led5, LOW);  
  85.   pinMode(Switch1, INPUT_PULLUP);                             // Switch1 como entrada e liga o resistor de pullup
  86.   delay(20);                                                  // Delay para estabilizar o port
  87.   Switch1_atual = digitalRead(Switch1);                       // Atualiza status de Switch1_atual
  88.   pinMode(Saida1, OUTPUT);                                    // Saida1 como saida
  89.   digitalWrite(Saida1, LOW);                                  // Liga saída
  90.  
  91.  
  92.   meuStatus = EEPROM.read(40);
  93.   Serial.println(meuStatus);
  94.   if (meuStatus == 55)
  95.   {
  96.     digitalWrite(led5, HIGH);
  97.   }
  98.  
  99.  
  100.  
  101.  
  102.   // Reset da rede wifi
  103.   if (digitalRead(Switch1) == LOW)                            // Se interruptor está ligado
  104.   {
  105.     digitalWrite(Saida1, HIGH);                               // Liga saída1
  106.     delay(5000);                                              // Aguarda 5 segundos
  107.     digitalWrite(Saida1, LOW);                                // Desliga saída1
  108.     if (digitalRead(Switch1) == HIGH)                         // Se interruptor continua ligado
  109.     {
  110.       Serial.println("reset SSID e IP  ");
  111.       flagRst = HIGH;                                         // Indica reset de parametros
  112.     }
  113.   }
  114.   /*
  115.     // Bypass da rede wifi
  116.     if (flagRst == LOW)                                          // Se não foi reseted
  117.     {
  118.       if (digitalRead(Switch1) == HIGH)                         // Se interruptor está liberado
  119.       {
  120.         digitalWrite(Saida1, LOW);                              // desliga saída1
  121.         //      yield();
  122.         delay(1000);                                            // Aguarda 5 segundos
  123.         digitalWrite(Saida1, HIGH);                             // Liga saída1
  124.         if (digitalRead(Switch1) == LOW)                        // Se interruptor esta pressionado
  125.         {
  126.           Serial.println("bypassed  ");
  127.           bypass = HIGH;                                        // Desabilita o sistema de wifi
  128.         }
  129.       }
  130.     }
  131.   */
  132.   digitalWrite(Led_Ap_Mode, HIGH);                            // Apaga o Led indicativo de AP
  133.   delay(20);                                                  // Delay para estabilizar o port
  134.   Switch1_atual = digitalRead(Switch1);                       // Atualiza status de Switch1_atual
  135.   digitalWrite(Saida1, LOW);                                  // Liga saída
  136.  
  137.   //  if (bypass == LOW)                                          // Se bypass esta desabilitado
  138.   //  {
  139.   //  else digitalWrite(Saida1, LOW);                             // Se não deliga saida1
  140.  
  141.   //SPIFFS.format();                                          // Clean FS, for testing
  142.   Serial.println("mounting FS...");                           // Read configuration from FS json
  143.   if (SPIFFS.begin())
  144.   {
  145.     Serial.println("mounted file system");
  146.     if (SPIFFS.exists("/config.json"))                        // If file exists, reading and loading
  147.     {
  148.       Serial.println("reading config file");
  149.       File configFile = SPIFFS.open("/config.json", "r");
  150.       if (configFile) {
  151.         Serial.println("opened config file");
  152.         size_t size = configFile.size();
  153.         std::unique_ptr<char[]> buf(new char[size]);          // Allocate a buffer to store contents of the file.
  154.         configFile.readBytes(buf.get(), size);
  155.         DynamicJsonBuffer jsonBuffer;
  156.         JsonObject& json = jsonBuffer.parseObject(buf.get());
  157.         json.printTo(Serial);
  158.         if (json.success())
  159.         {
  160.           Serial.println("\nparsed json");
  161.           if (json["ip"])
  162.           {
  163.             Serial.println("setting custom ip from config");
  164.             strcpy(static_ip, json["ip"]);
  165.             strcpy(static_gw, json["gateway"]);
  166.             strcpy(static_sn, json["subnet"]);
  167.             Serial.println(static_ip);
  168.           }
  169.           else
  170.           {
  171.             Serial.println("no custom ip in config");
  172.           }
  173.         }
  174.         else
  175.         {
  176.           Serial.println("failed to load json config");
  177.         }
  178.       }
  179.     }
  180.   }
  181.   else
  182.   {
  183.     Serial.println("failed to mount FS");
  184.   }
  185.   Serial.println(static_ip);                                  // end read
  186.   WiFiManager wifiManager;
  187.  
  188.   if (flagRst == HIGH)                                        // Se reset foi habilitado
  189.   {
  190.     flagRst = LOW;                                            // Desabilita reset
  191.     wifiManager.resetSettings();                              // Reseta SSID e PW
  192.   }
  193.   digitalWrite(Led_Ap_Mode, HIGH);                            // Acende o Led indicativo de AP
  194.  
  195.   wifiManager.setSaveConfigCallback(saveConfigCallback);      // Set config save notify callback
  196.   IPAddress _ip, _gw, _sn;                                    // Set static ip
  197.   _ip.fromString(static_ip);
  198.   _gw.fromString(static_gw);
  199.   _sn.fromString(static_sn);
  200.   wifiManager.setSTAStaticIPConfig(_ip, _gw, _sn);
  201.  
  202.   // wifiManager.resetSettings();                               // Reset settings - for testing
  203.   EEPROM.write(40, 55);
  204.   EEPROM.commit();
  205.  
  206.   wifiManager.setMinimumSignalQuality();                        // Set minimu quality of signal so it ignores AP's under that quality    //defaults to 8%
  207.   if (!wifiManager.autoConnect("AP_Configure", "password"))
  208.   {
  209.     Serial.println("failed to connect and hit timeout");
  210.     delay(3000);
  211.  
  212.     ESP.reset();                                                // Reset and try again, or maybe put it to deep sleep
  213.     delay(5000);
  214.   }
  215.   //  Serial.println("connected...yeey :)");                    // If you get here you have connected to the WiFi
  216.  
  217.   EEPROM.write(40, 0);
  218.   EEPROM.end();
  219.  
  220.   digitalWrite(Led_Ap_Mode, LOW);                               // Apaga o Led indicativo de AP
  221.   if (shouldSaveConfig)                                         // Save the custom parameters to FS
  222.   {
  223.     Serial.println("saving config");
  224.     DynamicJsonBuffer jsonBuffer;
  225.     JsonObject& json = jsonBuffer.createObject();
  226.     json["ip"] = WiFi.localIP().toString();
  227.     json["gateway"] = WiFi.gatewayIP().toString();
  228.     json["subnet"] = WiFi.subnetMask().toString();
  229.     File configFile = SPIFFS.open("/config.json", "w");
  230.     if (!configFile)
  231.     {
  232.       Serial.println("failed to open config file for writing");
  233.     }
  234.     json.prettyPrintTo(Serial);
  235.     json.printTo(configFile);
  236.     configFile.close();    //end save
  237.   }
  238.   Serial.println("local ip");
  239.   Serial.println(WiFi.localIP());
  240.   Serial.println(WiFi.gatewayIP());
  241.   Serial.println(WiFi.subnetMask());
  242.  
  243.   server.on("/", []()                                       // Ao request
  244.   {
  245.     server.send(200, "text/html", Ql);                      // Executa o HTML Ql (Quarto ligado)
  246.   });
  247.   server.on("/Controle", []()                               // Ao requeste
  248.   {
  249.     //    gettemperature();                                       // Le temperatura e umidade. Comentar se tiver sem sensor pois fica lento
  250.     LuzQuarto = server.arg("LuzQuarto");                    // Recupera o valor do parametro luz enviado
  251.     if (LuzQuarto == "off") digitalWrite(Saida1, LOW);      // Se o valor de luz e off desliga a saida
  252.     if (LuzQuarto == "on") digitalWrite(Saida1, HIGH);      // Se o valor de luz e on liga a saida
  253.  
  254.     if (digitalRead(Saida1) == HIGH)                        // Se a saida esta ligada, carrega a pagina "ligada"
  255.     {
  256.       Qil += Ql;                                            // Monta tela nova quarto ligado
  257.       Qil +=  "<p><center>Temperatura: " + String((float)temp_c) + "C </p>";
  258.       Qil +=  "<p><center>Umidade: " + String((int)humidity) + "% </p>";
  259.       Qil += Q_2;
  260.       server.send(200, "text/html", Qil);                   // Mostra Quarto ligado
  261.       Qil = "";                                             // Limpa valor de temperatura e umidade
  262.     }
  263.     if (digitalRead(Saida1) == LOW)                         // Se a saida esta desligada, carrega a pagina "desligada"
  264.     {
  265.       Qid += Qd;                                            // Monta tela nova quarto desligado
  266.       Qid += "<p><center>Temperatura: " + String((float)temp_c) + "C </p>";
  267.       Qid += "<p><center>Umidade: " + String((int)humidity) + "% </p>";
  268.       Qid += Q_2;
  269.       server.send(200, "text/html", Qid);                   // Mostra Quarto desligado
  270.       Qid = "";                                             // Limpa valor de temperatura e umidade
  271.     }
  272.     delay(100);                                             // Delay
  273.   });
  274.   server.begin();                                           // Inicaliza servidor
  275.   Serial.println("HTTP server started");                    // Imprime
  276.   //  }
  277. }
  278. //-------------------------------
  279. void loop()
  280. {
  281.   server.handleClient();                                    // Executa instancia
  282.  
  283.   if (digitalRead(Switch1) !=  Switch1_atual)               // Se o valor do SW alterou
  284.   {
  285.     delay(40);                                              // Delay
  286.     if (digitalRead(Switch1) !=  Switch1_atual)             // Se o valor do SW alterou
  287.     {
  288.       digitalWrite(Saida1, !digitalRead(Saida1));           // Inverte a saida lamp1
  289.       Switch1_atual = digitalRead(Switch1);                 // Atualisa o Gpio5 atual
  290.     }
  291.   }
  292. }
RAW Paste Data