Sari la conținut
ELFORUM - Forumul electronistilor

ESP8266 WiFiManager


Untold

Postări Recomandate

  • Răspunsuri 41
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Untold

    15

  • Bandi Szasz

    8

  • zvonacfirst

    6

  • modoran

    2

Top autori în acest subiect

Imagini postate

Era suficient sa scrii asta:

WiFiManager wm;

Inainte de " void setup()", nu cum ai scris tu:

#define WiFiManager wm

. Inca odata iti spun: foloseste butonul "<>" din editor pentru inserarea de cod!

Link spre comentariu
Acum 12 ore, nico_2010 a spus:

Era suficient sa scrii asta:

WiFiManager wm;

Inainte de " void setup()", nu cum ai scris tu:

#define WiFiManager wm

. Inca odata iti spun: foloseste butonul "<>" din editor pentru inserarea de cod!

 

 

 

Acum 11 ore, antemir a spus:

Posteaza codul sursa.

 

// Import required libraries
#include "ESP8266WiFi.h"
#include "ESPAsyncWebServer.h"
#include "WiFiManager.h"
#include "DNSServer.h"
WiFiManager wm;

// Set to true to define Relay as Normally Open (NO)
#define RELAY_NO    true

// Set number of relays
#define NUM_RELAYS  6

// Assign each GPIO to a relay
int relayGPIOs[NUM_RELAYS] = {5, 4, 14, 12, 13, 2};

// Replace with your network credentials
const char* ssid = "********";
const char* password = "***********";

const char* PARAM_INPUT_1 = "relay";  
const char* PARAM_INPUT_2 = "state";

// Create AsyncWebServer object on port 80
AsyncWebServer server(80);

const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE HTML><html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <style>
    html {font-family: Arial; display: inline-block; text-align: center;}
    h2 {font-size: 3.0rem;}
    p {font-size: 3.0rem;}
    body {max-width: 600px; margin:0px auto; padding-bottom: 25px;}
    .switch {position: relative; display: inline-block; width: 120px; height: 68px} 
    .switch input {display: none}
    .slider {position: absolute; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; border-radius: 34px}
    .slider:before {position: absolute; content: ""; height: 52px; width: 52px; left: 8px; bottom: 8px; background-color: #fff; -webkit-transition: .4s; transition: .4s; border-radius: 68px}
    input:checked+.slider {background-color: #2196F3}
    input:checked+.slider:before {-webkit-transform: translateX(52px); -ms-transform: translateX(52px); transform: translateX(52px)}
  </style>
</head>
<body>
  <h2>Viorel Web Server</h2>
  %BUTTONPLACEHOLDER%
<script>function toggleCheckbox(element) {
  var xhr = new XMLHttpRequest();
  if(element.checked){ xhr.open("GET", "/update?relay="+element.id+"&state=1", true); }
  else { xhr.open("GET", "/update?relay="+element.id+"&state=0", true); }
  xhr.send();
}</script>
</body>
</html>
)rawliteral";

// Replaces placeholder with button section in your web page
String processor(const String& var){
  //Serial.println(var);
  if(var == "BUTTONPLACEHOLDER"){
    String buttons ="";
    for(int i=1; i<=NUM_RELAYS; i++){
      String relayStateValue = relayState(i);
      buttons+= "<h4>Relay #" + String(i) + " - GPIO " + relayGPIOs[i-1] + "</h4><label class=\"switch\"><input type=\"checkbox\" onchange=\"toggleCheckbox(this)\" id=\"" + String(i) + "\" "+ relayStateValue +"><span class=\"slider\"></span></label>";
    }
    return buttons;
  }
  return String();
}

String relayState(int numRelay){
  if(RELAY_NO){
    if(digitalRead(relayGPIOs[numRelay-1])){
      return "";
    }
    else {
      return "checked";
    }
  }
  else {
    if(digitalRead(relayGPIOs[numRelay-1])){
      return "checked";
    }
    else {
      return "";
    }
  }
  return "";
}

void setup(){
  // Serial port for debugging purposes
  Serial.begin(115200);

  // Set all relays to off when the program starts - if set to Normally Open (NO), the relay is off when you set the relay to HIGH
  for(int i=1; i<=NUM_RELAYS; i++){
    pinMode(relayGPIOs[i-1], OUTPUT);
    if(RELAY_NO){
      digitalWrite(relayGPIOs[i-1], HIGH);
    }
    else{
      digitalWrite(relayGPIOs[i-1], LOW);
    }
  }
  
  // Connect to Wi-Fi
 if (!wm.autoConnect("Viorel","password")) {
  Serial.println("Faild to connect to WIFI!");
} else {
  Serial.println(WiFi.localIP());
}

  // Route for root / web page
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    request->send_P(200, "text/html", index_html, processor);
  });

  // Send a GET request to <ESP_IP>/update?relay=<inputMessage>&state=<inputMessage2>
  server.on("/update", HTTP_GET, [] (AsyncWebServerRequest *request) {
    String inputMessage;
    String inputParam;
    String inputMessage2;
    String inputParam2;
    // GET input1 value on <ESP_IP>/update?relay=<inputMessage>
    if (request->hasParam(PARAM_INPUT_1) & request->hasParam(PARAM_INPUT_2)) {
      inputMessage = request->getParam(PARAM_INPUT_1)->value();
      inputParam = PARAM_INPUT_1;
      inputMessage2 = request->getParam(PARAM_INPUT_2)->value();
      inputParam2 = PARAM_INPUT_2;
      if(RELAY_NO){
        Serial.print("NO ");
        digitalWrite(relayGPIOs[inputMessage.toInt()-1], !inputMessage2.toInt());
      }
      else{
        Serial.print("NC ");
        digitalWrite(relayGPIOs[inputMessage.toInt()-1], inputMessage2.toInt());
      }
    }
    else {
      inputMessage = "No message sent";
      inputParam = "none";
    }
    Serial.println(inputMessage + inputMessage2);
    request->send(200, "text/plain", "OK");
  });
  // Start server
  server.begin();
}
  
void loop() {

}

 

Editat de Untold
Link spre comentariu
#define ENA   14          // Enable/speed motors Right        GPIO14(D5)
#define ENB   12          // Enable/speed motors Left         GPIO12(D6)
#define IN_1  D1         // L298N in1 motors Right           GPIO15(D8)
#define IN_2  D2        // L298N in2 motors Right           GPIO13(D7)
#define IN_3  D3           // L298N in3 motors Left            GPIO2(D4)
#define IN_4  D4          // L298N in4 motors Left            GPIO0(D3)
  
#include <ESP8266WiFi.h>
#include <WiFiClient.h> 
#include <ESP8266WebServer.h>

String command;             //String to store app command state.
int speedCar = 800;         // 400 - 1023.
int speed_Coeff = 3;

const char* ssid = "NodeMCU Car";
ESP8266WebServer server(80);

void setup() {
 
 pinMode(ENA, OUTPUT);
 pinMode(ENB, OUTPUT);  
 pinMode(IN_1, OUTPUT);
 pinMode(IN_2, OUTPUT);
 pinMode(IN_3, OUTPUT);
 pinMode(IN_4, OUTPUT); 
  
  Serial.begin(115200);
  
// Connecting WiFi

  WiFi.mode(WIFI_AP);
  WiFi.softAP(ssid);

  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
 
 // Starting WEB-server 
     server.on ( "/", HTTP_handleRoot );
     server.onNotFound ( HTTP_handleRoot );
     server.begin();    
}

void goAhead(){ 

      digitalWrite(IN_1, LOW);
      digitalWrite(IN_2, HIGH);
      analogWrite(ENA, speedCar);

      digitalWrite(IN_3, LOW);
      digitalWrite(IN_4, HIGH);
      analogWrite(ENB, speedCar);
  }

void goBack(){ 

      digitalWrite(IN_1, HIGH);
      digitalWrite(IN_2, LOW);
      analogWrite(ENA, speedCar);

      digitalWrite(IN_3, HIGH);
      digitalWrite(IN_4, LOW);
      analogWrite(ENB, speedCar);
  }

void goRight(){ 

      digitalWrite(IN_1, HIGH);
      digitalWrite(IN_2, LOW);
      analogWrite(ENA, speedCar);

      digitalWrite(IN_3, LOW);
      digitalWrite(IN_4, HIGH);
      analogWrite(ENB, speedCar);
  }

void goLeft(){

      digitalWrite(IN_1, LOW);
      digitalWrite(IN_2, HIGH);
      analogWrite(ENA, speedCar);

      digitalWrite(IN_3, HIGH);
      digitalWrite(IN_4, LOW);
      analogWrite(ENB, speedCar);
  }

void goAheadRight(){
      
      digitalWrite(IN_1, LOW);
      digitalWrite(IN_2, HIGH);
      analogWrite(ENA, speedCar/speed_Coeff);
 
      digitalWrite(IN_3, LOW);
      digitalWrite(IN_4, HIGH);
      analogWrite(ENB, speedCar);
   }

void goAheadLeft(){
      
      digitalWrite(IN_1, LOW);
      digitalWrite(IN_2, HIGH);
      analogWrite(ENA, speedCar);

      digitalWrite(IN_3, LOW);
      digitalWrite(IN_4, HIGH);
      analogWrite(ENB, speedCar/speed_Coeff);
  }

void goBackRight(){ 

      digitalWrite(IN_1, HIGH);
      digitalWrite(IN_2, LOW);
      analogWrite(ENA, speedCar/speed_Coeff);

      digitalWrite(IN_3, HIGH);
      digitalWrite(IN_4, LOW);
      analogWrite(ENB, speedCar);
  }

void goBackLeft(){ 

      digitalWrite(IN_1, HIGH);
      digitalWrite(IN_2, LOW);
      analogWrite(ENA, speedCar);

      digitalWrite(IN_3, HIGH);
      digitalWrite(IN_4, LOW);
      analogWrite(ENB, speedCar/speed_Coeff);
  }

void stopRobot(){  

      digitalWrite(IN_1, LOW);
      digitalWrite(IN_2, LOW);
      analogWrite(ENA, speedCar);

      digitalWrite(IN_3, LOW);
      digitalWrite(IN_4, LOW);
      analogWrite(ENB, speedCar);
 }

void loop() {
    server.handleClient();
    
      command = server.arg("State");
      if (command == "F") goAhead();
      else if (command == "B") goBack();
      else if (command == "L") goLeft();
      else if (command == "R") goRight();
      else if (command == "I") goAheadRight();
      else if (command == "G") goAheadLeft();
      else if (command == "J") goBackRight();
      else if (command == "H") goBackLeft();
      else if (command == "0") speedCar = 400;
      else if (command == "1") speedCar = 470;
      else if (command == "2") speedCar = 540;
      else if (command == "3") speedCar = 610;
      else if (command == "4") speedCar = 680;
      else if (command == "5") speedCar = 750;
      else if (command == "6") speedCar = 820;
      else if (command == "7") speedCar = 890;
      else if (command == "8") speedCar = 960;
      else if (command == "9") speedCar = 1023;
      else if (command == "S") stopRobot();
}

void HTTP_handleRoot(void) {

if( server.hasArg("State") ){
       Serial.println(server.arg("State"));
  }
  server.send ( 200, "text/html", "" );
  delay(1);
}

 

 

Asta e bun? Ca am facut o masinuta cu nodmcu, am bagat sketch-ul asta si merge!

Link spre comentariu

Se pare ca a mers, s-a compilat si apoi l-am scris in NodeMcu. Acum, mai am o nelamurire: Eu, cand am facut teste cu exemplul din IDE si a mers, cand mi-a aparut fereastra aia cu configuration, i-am dat ssid si pass de la reteaua mea wifi . Acum, cu sketch-ul actual, nu mi-a mai aparut node-ul in retele la laptop ci s-a conectat direct la wifi-ul meu. Asta inseamna ca routerul meu a retinut ip-ul node-ului si acum il conecteaza automat cand ala apare ca AP? Daca e asa, ar trebui sa incerc sa merg unde e alta retea de wifi si sa-l pornesc, teoretic ar trebui sa apara acea fereastra de configurare si eu sa-i bag ssid si pass acele retele, nu? 

Am luat poza asta de aici: https://www.martyncurrey.com/esp8266-and-the-arduino-ide-part-5-adding-wifimanager/

 

 

ESP8266_Part_3_05A_1200.jpg

Untitled.jpg

Editat de Untold
Link spre comentariu

Da, acum m-am lamurit, e prima oara cand lucrez cu asa ceva. Cand am scris  nodul cu exemplul din IDE, el a salvat credentialele de aici si acum se autoconecteaza. Am scris un nod nou, ce nu era folosit niciodata, si acum imi apare AP-ul lui, si anume Viorel, cum este in sketch, iar cand ii dau connect, imi apare ferastra aia cu configuration unde sa ii bag credentialele de la reteaua mea de wifi. Ceea ce inseamna ca jucarica functioneaza, drept pt care iti multumesc din suflet pentru ajutor si sunt happy ca am mai invatat ceva!

Untitled.png

Untitled.jpg

Editat de Untold
Link spre comentariu
  • 3 luni mai târziu...

Deoarece subiectul pe care il propun pentru discutie este legat tot de WiFiManager, imi permit sa folosesc acest topic pentru a posta, cu speranta ca @Untold nu se va supara. Daca este o problema am sa solicit adminului stergerea sau mutarea.

Lucrez la un proiect personal pentru care am scris un cod. Proiectul este un ceas NTP cu WEMOS si cu afisarea orei si temperaturii pe un afisaj printat 3D cu leduri adresabile WS2812B, este deja functional si urmeaza a fi prezentat pe forum.

Sunt incepator in programare si m-am lovit de o problema pe care nu o pot rezolva desi incerc de o saptamana sa gasesc o solutie.

Un filmulet cu ceasul:

https://imgur.com/aqH4R5t

Ideea este urmatoarea: este eleganta configurarea wireles pentru credentialele de conectare la reteaua WiFi iar biblioteca WiFiManager ofera solutia. Dar, fiind vorba despre un ceas NTP, mai este un parametru care ar putea fi introdus in interfata de configurare: offset-ul pentru fusul orar. Offset-ul pentru ora de iarna/vara l-am rezolvat printrun switch care pune un pin al WEMOS-ului la HIGH sau LOW.

Ce am facut: am pregatit un cod de test in care am adaugat in interfata oferita de WiFiManager un al treilea parametru, asa cum se poate vedea in poza urmatoare, si anume offset-ul pentru fusul orar:

 

dmJAnfB.jpg

 

Urmarind afisarile din Serial Monitor, totul functioneaza bine pana la citirea offsetului stocat in EEPROM, desi cred ca de fapt problema este la scriere.

 

*wm:AP IP address: 192.168.4.1
Conecteaza-te pentru configurarea Wi-Fi si pentru a seta fusul orar.
*wm:Starting Web Portal 
*wm:10 networks found
*wm:Connecting to NEW AP: George_
*wm:connectTimeout not set, ESP waitForConnectResult... 
*wm:Connect to new AP [SUCCESS] 
*wm:Got IP Address: 
*wm:192.168.01.152 
Configurarile salvate!
Offset scris in EEPROM: 7200
*wm:config portal exiting 
Read timeZoneOffset = 0.00
**********************
rlb|⸮⸮⸮rb⸮b⸮nnlnnb
*wm:Connecting to SAVED AP: George_
*wm:connectTimeout not set, ESP waitForConnectResult... 
*wm:AutoConnect: SUCCESS 
*wm:STA IP Address: 192.168.01.152
Read timeZoneOffset = 0.00
**********************

 

Dupa cum se vede citirea EEPROM-ului returneaza o valoare nula. Aceasta este problema pentru care nu reusesc sa gasesc solutia.

 

Citind acest topic si vazand ca initiatorul a primit ajutor pentru rezolvarea problemei pe care o intampina, sper ca si eu sa primesc suportul necesar. Nu trebuie sa-mi dati un peste, ci doar o undita cu care sa il prind. La final, daca nu voi fi in stare sa pesuiesc, voi accepta si pestele. Important este sa invat ceva. Multumesc in avans.

Codul pe care l-am pregatit pentru acest exercitiu este urmatorul:
 

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <NTPClient.h>
#include <EEPROM.h>

const char* WebServerName = "MyClock";
const char* WebServerPass = "********";

#define EEPROM_SIZE 512

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);

int timeZoneOffset = 0;  // Offsetul implicit in secunde
WiFiManagerParameter timeZoneParam("fus_orar", "Fus orar (ore):", "", 10);

void configModeCallback(WiFiManager *myWiFiManager) {
  Serial.println("Conecteaza-te pentru configurarea Wi-Fi si pentru a seta fusul orar.");
}

void saveConfigCallback() {
  Serial.println("Configurarile salvate!");

  // Verifica daca campul fusului orar este gol
  String timeZoneValue = timeZoneParam.getValue();
  if (!timeZoneValue.isEmpty()) {
    timeZoneOffset = timeZoneValue.toFloat() * 3600;  // Converteste offsetul din ore in secunde
    EEPROM.put(1, timeZoneOffset);
    EEPROM.commit();
    Serial.print("Offset scris in EEPROM: ");
    Serial.println(timeZoneOffset);
  }
}

void setup() {
  Serial.begin(115200);

  EEPROM.begin(EEPROM_SIZE);
  
  // Adauga parametrii pentru WiFiManager
      WiFiManager wifiManager;
      wifiManager.setAPCallback(configModeCallback);
      wifiManager.setSaveConfigCallback(saveConfigCallback);

      wifiManager.addParameter(&timeZoneParam);
  
  // Optional, doar daca se doreste resetarea setarilor la fiecare pornire
  // wifiManager.resetSettings(); // Reseteaza setarile salvate anterior

  // Seteaza timpul de asteptare pentru conectarea in modul configurare
      wifiManager.setConfigPortalTimeout(180);

  // Incepe conectarea la WiFi
  // Seteaza numele retelei (SSID) si parola pentru serverul web
      if (!wifiManager.autoConnect(WebServerName, WebServerPass)) {
        Serial.println("Nu s-a putut realiza conexiunea la WiFi si nu s-a putut crea serverul web.");
        delay(3000);
        ESP.reset();
        delay(5000);
      }

  // Read data from EEPROM
      float TimeZoneOffset;
      EEPROM.get(1, TimeZoneOffset);
      Serial.print("Read timeZoneOffset = ");
      Serial.println(TimeZoneOffset);
      Serial.print("**********************");

  // Seteaza fusul orar dupa conectarea la WiFi
      timeZoneOffset = String(timeZoneParam.getValue()).toFloat() * 3600;
      timeClient.begin();
      timeClient.setTimeOffset(timeZoneOffset);

  EEPROM.end();
}

void loop() {
  // Actualizare timp de la serverul NTP
  timeClient.update();
}

 

Editat de zvonacfirst
Link spre comentariu

Salut! Pare incomplet setup-ul. Am adaugat si eu alti parametri si a mers fara probleme. Am plecat de la un exemplu de utilizare a bibliotecii WiFiManager(https://github.com/tzapu/WiFiManager). Atasez un exemplu utilizat de mine :

 

void setup() {
  Serial.begin(115200);
  Serial.print(__FILE__); Serial.print(" ");Serial.println(__DATE__);
//  display.clear();                              // Clear the display:
  pinMode(dstPin, INPUT_PULLUP);
  delay(1000);  
  Serial.setDebugOutput(true);

  Serial.println("\n Starting");
  WiFi.setSleepMode(WIFI_NONE_SLEEP); // disable sleep, can improve ap stability

  Serial.println("Error - TEST");
  Serial.println("Information- - TEST");

  Serial.println("[ERROR]  TEST");
  Serial.println("[INFORMATION] TEST");  


  wm.setDebugOutput(true);
  wm.debugPlatformInfo();

  //reset settings - for testing
  // wm.resetSettings();
  // wm.erase();

  // setup some parameters

  WiFiManagerParameter custom_html("<p style=\"color:pink;font-weight:Bold;\">This Is Custom HTML</p>"); // only custom html
  WiFiManagerParameter custom_mqtt_server("server", "mqtt server", "", 40);
  WiFiManagerParameter custom_mqtt_port("port", "mqtt port", "", 6);
  WiFiManagerParameter custom_mqtt_user("mqtt_user", "mqtt user", "", 16);
  WiFiManagerParameter custom_mqtt_pass("mqtt_pass", "mqtt pass", "", 16); // id is invalid, cannot contain spaces
  WiFiManagerParameter custom_local_tz("local_tz", "Local TZ", "", 2);//,"pattern='\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}'"); // custom input attrs (ip mask)

  // callbacks
  wm.setAPCallback(configModeCallback);
  wm.setWebServerCallback(bindServerCallback);
  wm.setSaveConfigCallback(saveWifiCallback);
  wm.setSaveParamsCallback(saveParamCallback);
  wm.setPreOtaUpdateCallback(handlePreOtaUpdateCallback);

  // add all your parameters here
  wm.addParameter(&custom_html);
  wm.addParameter(&custom_mqtt_server);
  wm.addParameter(&custom_mqtt_port);
  wm.addParameter(&custom_mqtt_user);
  wm.addParameter(&custom_mqtt_pass);
  wm.addParameter(&custom_local_tz);

  // set values later if you want
  custom_html.setValue("test",4);
  custom_mqtt_server.setValue("test.ro",12);
  custom_mqtt_port.setValue("5883",6);
  custom_mqtt_user.setValue("user",8);

  // set custom html menu content , inside menu item "custom", see setMenu()
  const char* menuhtml = "<form action='/custom' method='get'><button>Custom</button></form><br/>\n";
  wm.setCustomMenuHTML(menuhtml);

  // invert theme, dark
  wm.setDarkMode(true);

  // show scan RSSI as percentage, instead of signal stength graphic
  // wm.setScanDispPerc(true);


  std::vector<const char *> menu = {"wifi","wifinoscan","info","param","custom","close","sep","erase","update","restart","exit"};
  wm.setMenu(menu); // custom menu, pass vector

  wm.setHostname(("WM_"+wm.getDefaultAPName()).c_str());
  // wm.setHostname("WM_RANDO_1234");
  
  if(!WMISBLOCKING){
    wm.setConfigPortalBlocking(false);
  }

  //sets timeout until configuration portal gets turned off
  //useful to make it all retry or go to sleep in seconds
  wm.setConfigPortalTimeout(120);

  wm.setBreakAfterConfig(true); // needed to use saveWifiCallback

  wifiInfo();

  if(!wm.autoConnect("WM_AutoConnectAP","12345678")) {
    Serial.println("failed to connect and hit timeout");
  }
  else if(TEST_CP) {
    // start configportal always
    delay(1000);
    Serial.println("TEST_CP ENABLED");
    wm.setConfigPortalTimeout(TESP_CP_TIMEOUT);
    wm.startConfigPortal("WM_ConnectAP","12345678");
  }
  else {
    //if you get here you have connected to the WiFi
     Serial.println("connected...yeey :)");
  }
  
  wifiInfo();
  pinMode(ONDDEMANDPIN, INPUT_PULLUP);

  seg.begin();
  Wire.setClock(100000);
  seg.displayOn();
  seg.setDigits(4);
//  configTime(MY_TZ, MY_NTP_SERVER);
  timeClient.begin();

  #ifdef USEOTA
    ArduinoOTA.begin();
  #endif

}

Sigur, se poate simplifica dupa nevoile tale.

Succes!

Editat de Viorel A
Link spre comentariu

Rezolvat.

Acum afiseaza in Serial monitor offsetul salvat. 

Prima data am introdus offsetul de 2 ore si am salvat, ca urmare a citit 7200 secunde.

Apoi am modificat offsetul la 3 ore si a citit 10800 secunde. Dupa reset a citit tot 10800 secunde.

Read timeZoneOffset = 7200
*wm:AutoConnect 
*wm:Connecting to SAVED AP: George_
*wm:connectTimeout not set, ESP waitForConnectResult... 
*wm:AutoConnect: FAILED for  9342 ms
*wm:StartAP with SSID:  MyClock
*wm:AP IP address: 192.168.4.1
Conecteaza-te pentru configurarea Wi-Fi si pentru a seta fusul orar.
*wm:Starting Web Portal 
*wm:12 networks found
*wm:13 networks found
*wm:Connecting to NEW AP: George_
*wm:connectTimeout not set, ESP waitForConnectResult... 
*wm:Connect to new AP [SUCCESS] 
*wm:Got IP Address: 
*wm:192.168.01.116 
Configurarile salvate!
Offset scris in EEPROM: 10800
*wm:config portal exiting 
rl⸮r$⸮n⸮l⸮b|⸮⸮⸮rb⸮
*wm:AutoConnect 
*wm:Connecting to SAVED AP: George_
*wm:connectTimeout not set, ESP waitForConnectResult... 
*wm:AutoConnect: SUCCESS 
*wm:STA IP Address: 192.168.01.116
Read timeZoneOffset = 10800

 

Ideea mi-a dat-o @antemir, drept pentru care adanca plecaciune. Nu avea ce sa caute acea linie acolo si mai aveam float pe undeva unde trebuia sa fie int.

Ca urmare postez codul care functioneaza. L-am integrat si in codul ceasului si functioneaza corect.

Multumesc pentru ajutor.

 

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <WiFiManager.h>
#include <NTPClient.h>
#include <EEPROM.h>

const char* WebServerName = "MyClock";
const char* WebServerPass = "********";

#define EEPROM_SIZE 512

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP);

int timeZoneOffset = 0;
WiFiManagerParameter timeZoneParam("fus_orar", "Fus orar (ore):", "", 10);

void configModeCallback(WiFiManager *myWiFiManager) {
  Serial.println("Conecteaza-te pentru configurarea Wi-Fi si pentru a seta fusul orar.");
}

void saveConfigCallback() {
  Serial.println("Configurarile salvate!");

  // Verifica daca campul fusului orar este gol
  String timeZoneValue = timeZoneParam.getValue();
  if (!timeZoneValue.isEmpty()) {
    timeZoneOffset = timeZoneValue.toInt() * 3600;
    EEPROM.put(1, timeZoneOffset);
    EEPROM.commit();
    delay(100);  
    Serial.print("Offset scris in EEPROM: ");
    Serial.println(timeZoneOffset);
    
  }
}

void setup() {
  Serial.begin(115200);
  delay(100);
  EEPROM.begin(EEPROM_SIZE);

  // Read data from EEPROM
  EEPROM.get(1, timeZoneOffset);
  Serial.print("Read timeZoneOffset = ");
  Serial.println(timeZoneOffset);
  
  // Adauga parametrii pentru WiFiManager
  WiFiManager wifiManager;
  wifiManager.setAPCallback(configModeCallback);
  wifiManager.setSaveConfigCallback(saveConfigCallback);
  wifiManager.addParameter(&timeZoneParam);

  // Optional, doar daca se doreste resetarea setarilor la fiecare pornire
  // wifiManager.resetSettings(); // Reseteaza setarile salvate anterior

  // Seteaza timpul de asteptare pentru conectarea in modul configurare
  wifiManager.setConfigPortalTimeout(180);

  if (!wifiManager.autoConnect(WebServerName, WebServerPass)) {
    Serial.println("Nu s-a putut realiza conexiunea la WiFi si nu s-a putut crea serverul web.");
    delay(3000);
    ESP.reset();
    delay(5000);
  }

  // Seteaza fusul orar dupa conectarea la WiFi
  timeClient.begin();
  timeClient.setTimeOffset(timeZoneOffset);

  EEPROM.end(); 
}

void loop() {
  // Verifica starea conexiunii la WiFi
  if (WiFi.status() == WL_CONNECTED) {
    // Actualizare timp de la serverul NTP
    timeClient.update();
  }
}

 

EDIT:

As vrea sa vin cu o constatare referitoere la aceasta linie de cod:

wifiManager.resetSettings();

Reseteaza numai salvarile referitoare la WiFi, adica SSID si PASS, nu si parametrii adaugati, cum este offsetul in cazul meu. Pentru a curata eepromul am folosit un eeprom cleaner pentru ca voiam sa il am curat, sa il citesc, apoi sa il scriu si sa il citesc iar. Dupa resetare am citit ultima valoare salvata si asa am stiut ca este totul in regula.

Editat de zvonacfirst
Link spre comentariu
  • 1 lună mai târziu...

Salutare! Sunt si eu interesat de acest subiect, ba chiar de proiectul colegului @Untold pe care-l rog sa incarce sketch-ul final, functional, daca se poate. Multumesc!

Link spre comentariu
La 04.03.2024 la 20:23, gabitzu2006 a spus:

Salutare! Sunt si eu interesat de acest subiect, ba chiar de proiectul colegului @Untold pe care-l rog sa incarce sketch-ul final, functional, daca se poate. Multumesc!

 

Salut, sigur:GPIO'S.txt

NodeMcu Pinouts.jpg

 

Aici scrii ce vrei tu, iti denumesti iesirile cum vrei tu.

 

String nameRELAYS[NUM_RELAYS] = {"WC Curte", "Bec Curte", "Hidrofor", "Lumina Garaj", "Lumina Magazie Lemne", "Lumina Foisor"};

 

Petru-1_Last_good.ino

Editat de Untold
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări