Modulo Wi-Fi ESP8266

grazie per la risposta, e visto che mi è arrivato un clone non programmato (ne sono sicuro visto che ne ho acquistato uno a 4 relè marcato lctech e tramite l'app proprietaria sono riuscito a settare i relè, invece uno non marcato a relè singolo non ne vuol sapere), come posso risolvere ?

Quel modulo in rete è noto come "LC WM Relay 8266 5V" o "LC 5V WIFI Relay Module".
Originariamente la MCU di supporto era un STM8, poi è stata sostituita da un STC15 che risulta essere una MCU che usa le istruzioni del vetusto (ma sempre vivo!) 8051 della Intel, probabilmente perché costa ancora meno.

Dovrebbe andare con un firmware AI-Thinker altrimenti qui
https://www.letscontrolit.com/forum/viewtopic.php?f=6&t=3245#p16998
C'è quello che mi sembra un firmware alternativo, praticamente uno sketch che fa le veci di quello originale.

Io ho un modulo analogo ma credo che l'ho guastato in quanto dalla seriale della MCU di supporto mi arriva un disturbo continuo.

Se cerchi in rete trovi parecchie pagine che ne parlano. Se non fosse per il costo ridicolo non lo consiglierei affatto preferisco un modulo senza MCU accessoria anche se in rete si trova gente che ha riprogrammato la piccola STM8 ma non il sostituto STC15.

Ti allego anche il docx di istruzioni trovato in rete non mi ricordo più dove.

module wifi istruzioni.zip (875 KB)

Grazie mille, Karma per te.
Ora studio :slight_smile:

Ciao ragazzi, io ho un problema con il mio modulo esp01 che mi si disconnette spesso dalla rete, lo fà anche a voi?
Vorrei capire se è un problema del modulo o di poco segnale WiFi.
C'è un modo per sapere se gli arriva abbastanza segnale dal modem?
Non ha il codice originale ma uno creato da me.
Grazie

WiFi.RSSI(); restituisce un long o int32_t

zoomx:
WiFi.RSSI(); restituisce un long o int32_t

ho implementato il controllo del segnale e lo sto monitorando... oscilla tra -75 e -85
male vero??

Eh si... Dovresti cercare di stare sotto i 50 (max 60) per avere una connessione stabile e con buona velocità. Se non puoi spostare il tuo router oppure il tuo ESP, potresti usare un extender WiFi da mettere a metà strada. Come alternativa, puoi cercare di staccare l'antenna del tuo modulo ESP quanto più possibile da altri oggetti (la parete di un contenitore, il supporto su cui è appoggiato o la parete se è appeso), così dovresti guadagnare qualche dB.

niente da fare.. sono arrivafo a -60 ma il problema persiste.
io ora ho messo un publish verso il server che mi segnala quando avviene la riconnseesione, ma a questo punto mi viene il dubbio che il problema non è il segnale wifi ma perde solo il collegamento verso il server mqtt.

cercando nel codice non riesco a capire dove poter mettere un publish in caso di riconnessione del wifi in modo da capire chi dei due è il colpevole.. mi potete aiutare a capire?
grazie

#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"


#define intervallo 120000  //tempo tra 2 letture di segnale wifi in millisecondi (MODIFICABILE A PIACIMENTO)
char* ricevuto = "";
int risposta = 0;
int segnale;
char inviato = 0;
unsigned long tempinterval; //intervallo tra 2 letture di segnale wifi

/************************* WiFi Access Point *********************************/

#define WLAN_SSID       "......"
#define WLAN_PASS       "...."

/************************* Adafruit.io Setup *********************************/

#define AIO_SERVER      "io.adafruit.com"
#define AIO_SERVERPORT  1883                   // use 8883 for SSL
#define AIO_USERNAME    "...."
#define AIO_KEY         "............."

/************ Global State (you don't need to change this!) ******************/

// Create an ESP8266 WiFiClient class to connect to the MQTT server.
WiFiClient client;

Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

/****************************** Feeds ***************************************/
// impostazioni feed in ricezione o trasmissione
Adafruit_MQTT_Subscribe DomoticaCentrale = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/domotica_centrale");
Adafruit_MQTT_Publish StatoConnessione = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/stato-connessione");
Adafruit_MQTT_Publish SegnaleWifi = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/segnale-wifi");
/*************************** Sketch Code ************************************/


void MQTT_connect();

void setup() {
  Serial.begin(9600);
  delay(10);

  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);

  }
  // Serial.println("WiFi connected");
  //Serial.println("IP address: "); Serial.println(WiFi.localIP());

  // Setup MQTT subscription for onoff feed.
  mqtt.subscribe(&DomoticaCentrale);
}

uint32_t x = 0;

void loop() {
  if (millis() > (tempinterval + intervallo)) { //lettura segnale ogni TOT millisecondi impostati nel setup
    long rssi = WiFi.RSSI();
    segnale = int (rssi);
    // Serial.print (segnale);
    SegnaleWifi.publish(segnale);
    tempinterval = millis();
  }
  if (WiFi.status() != WL_CONNECTED) {
    delay(500);
    SegnaleWifi.publish("segnale perso");
  }
  MQTT_connect();

  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(5000))) {
    if (subscription == &DomoticaCentrale) {
      ricevuto = ((char*)DomoticaCentrale.lastread);
      Serial.print(ricevuto);
    }
  }

  if (! mqtt.ping()) {
    mqtt.disconnect();
  }
}

// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect() {
  int8_t ret;

  // Stop if already connected.
  if (mqtt.connected()) {
    return;
  }

  // Serial.print("Connecting to MQTT... ");

  uint8_t retries = 3;
  while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
    // Serial.println(mqtt.connectErrorString(ret));
    // Serial.println("Retrying MQTT connection in 5 seconds...");
    mqtt.disconnect();
    delay(5000);  // wait 5 seconds
    retries--;
    if (retries == 0) {
      // basically die and wait for WDT to reset me
      while (1);
    }
  }
  StatoConnessione.publish("Domotica Connessa");
}

Io ho un segnale che sta poco sopra -70 e mi riesco a connettere ad un semplice server web.
Per pochi dati dovrebbe bastare.

zoomx:
Io ho un segnale che sta poco sopra -70 e mi riesco a connettere ad un semplice server web.
Per pochi dati dovrebbe bastare.

anch'io ora sono intorno ai -70 ma vorrei capire se quelle che rilevo sono disconnessioni dal wifi o dal broker.
come faccio a capirlo?

Salve a tutti,
Avrei qualche domanda da farvi.
Siccome il modulo deve essere alimentato a 3.3V , invece di utilizzare la 5V con 2 diodi collegati, non si potrebbe semplicemente collegarlo alla 3.3V? Faccio questa domanda perchè non so che tipo di diodi si debbano utilizzare.

Grazie in anticipo.

Alessandro

per il modulo va benissimo essere alimentato dalla 3,3V, il problema è con il segnale tx dall'arduino verso l'rx dell'ESP che lavora a +5V, è qui che devi intervenire con diodi o partitore resistivo altrimenti alla lunga bruci l'esp

qualsiasi diodo va bene...

Alessandro_P:
... Siccome il modulo deve essere alimentato a 3.3V , invece di utilizzare la 5V con 2 diodi collegati, non si potrebbe semplicemente collegarlo alla 3.3V?

Se parli della parte "alimentazione", dai tutorial in prima pagina dovresti aver capito che il regolatore a 3.3V di Arduino NON è assolutamrnte sufficiente ad alimentare il ESP8266 che richiede molta più corrente di quanto quel regolatore possa dare.

Guglielmo

gpb01:
Se parli della parte "alimentazione", dai tutorial in prima pagina dovresti aver capito che il regolatore a 3.3V di Arduino NON è assolutamrnte sufficiente ad alimentare il ESP8266 che richiede molta più corrente di quanto quel regolatore possa dare.

Guglielmo

questo passaggio me l'ero fumato :frowning:

Nello schema in prima pagina con 3 diodi fai tutto, sia alimentazione che segnali.
Ci sono anche i modelli di diodi consigliati nello schema

Buon anno a tutti.
Stavo giocherellando con un Lolin32 Pro (che ovviamente monta una ESP-32) e stavo provando uno degli esempi per l'utilizzo del pulsante WPS.

/*
Example Code To Get ESP32 To Connect To A Router Using WPS
===========================================================
This example code provides both Push Button method and Pin
based WPS entry to get your ESP connected to your WiFi router.

Hardware Requirements
========================
ESP32 and a Router having atleast one WPS functionality

This code is under Public Domain License.

Author:
Pranav Cherukupalli <cherukupallip@gmail.com>
*/

#include "WiFi.h"
#include "esp_wps.h"
/*
Change the definition of the WPS mode
from WPS_TYPE_PBC to WPS_TYPE_PIN in
the case that you are using pin type
WPS
*/
#define ESP_WPS_MODE      WPS_TYPE_PBC
#define ESP_MANUFACTURER  "ESPRESSIF"
#define ESP_MODEL_NUMBER  "ESP32"
#define ESP_MODEL_NAME    "ESPRESSIF IOT"
#define ESP_DEVICE_NAME   "ESP STATION"

static esp_wps_config_t config;

void wpsInitConfig(){
  config.crypto_funcs = &g_wifi_default_wps_crypto_funcs;
  config.wps_type = ESP_WPS_MODE;
  strcpy(config.factory_info.manufacturer, ESP_MANUFACTURER);
  strcpy(config.factory_info.model_number, ESP_MODEL_NUMBER);
  strcpy(config.factory_info.model_name, ESP_MODEL_NAME);
  strcpy(config.factory_info.device_name, ESP_DEVICE_NAME);
}

String wpspin2string(uint8_t a[]){
  char wps_pin[9];
  for(int i=0;i<8;i++){
    wps_pin[i] = a[i];
  }
  wps_pin[8] = '\0';
  return (String)wps_pin;
}

void WiFiEvent(WiFiEvent_t event, system_event_info_t info){
  switch(event){
    case SYSTEM_EVENT_STA_START:
      Serial.println("Station Mode Started");
      break;
    case SYSTEM_EVENT_STA_GOT_IP:
      Serial.println("Connected to :" + String(WiFi.SSID()));
      Serial.print("Got IP: ");
      Serial.println(WiFi.localIP());
      break;
    case SYSTEM_EVENT_STA_DISCONNECTED:
      Serial.println("Disconnected from station, attempting reconnection");
      WiFi.reconnect();
      break;
    case SYSTEM_EVENT_STA_WPS_ER_SUCCESS:
      Serial.println("WPS Successfull, stopping WPS and connecting to: " + String(WiFi.SSID()));
      esp_wifi_wps_disable();
      delay(10);
      WiFi.begin();
      break;
    case SYSTEM_EVENT_STA_WPS_ER_FAILED:
      Serial.println("WPS Failed, retrying");
      esp_wifi_wps_disable();
      esp_wifi_wps_enable(&config);
      esp_wifi_wps_start(0);
      break;
    case SYSTEM_EVENT_STA_WPS_ER_TIMEOUT:
      Serial.println("WPS Timedout, retrying");
      esp_wifi_wps_disable();
      esp_wifi_wps_enable(&config);
      esp_wifi_wps_start(0);
      break;
    case SYSTEM_EVENT_STA_WPS_ER_PIN:
      Serial.println("WPS_PIN = " + wpspin2string(info.sta_er_pin.pin_code));
      break;
    default:
      break;
  }
}

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

  Serial.println();

  WiFi.onEvent(WiFiEvent);
  WiFi.mode(WIFI_MODE_STA);

  Serial.println("Starting WPS");

  wpsInitConfig();
  esp_wifi_wps_enable(&config);
  esp_wifi_wps_start(0);
}

void loop(){
  //nothing to do here
}

Mi chiedevo se vi era la possibilità di salvare la SSID e la PASSWORD acquisita tramite WPS in un file nella SD.
Chiedo questo perchè se l'accoppiamento lo fa con il WPS al reset della board le credenziali restano memorizzate ma, se vi è una mancanza di corrente ovviamente va tutto perso e la cosa non mi aggrada molto.
Vorrei quindi fare una cosa tipo: leggo le credenziali da SD, provo a connettermi, se si accoppia OK altrimenti forzo l'accoppiamentro tramite WPS.

Suggerimenti?

Per esp32 abbiamo l'apposito topic, magari il mod può spostare la tua domanda e la mia risposta di la.

Comunque lasciando da parte il discorso Sd, tu hai provato a togliere alimentazione dopo esserti connesso via Wps ?
Non credo sia corretto che si perde la psw.

Se ti connetti ad un router inserendo manualmente la psw, essa viene memorizzate in flash, non la perdi togliendo alimentazione.
Mi aspetto cge sia uguale per Wps, altrimenti aprirei una issue sul core

Ho cercato di leggere il pinout dell'esp-01 ma non ci ho capito molto.
Vorrei sapere se è possibile collegarli un trasmettitore rf 433 (alimentato a 5v) e 2 semplici pulsanti.
Il miei dubbi sono:
Il modulo rf funziona se il segnale gli arriva a 3.3v?
Ci sono abbastanza pin?
Input_pullup esiste anche su questo modulo?
Grazie

testato:
Per esp32 abbiamo l'apposito topic, magari il mod può spostare la tua domanda e la mia risposta di la.

Comunque lasciando da parte il discorso Sd, tu hai provato a togliere alimentazione dopo esserti connesso via Wps ?
Non credo sia corretto che si perde la psw.

Se ti connetti ad un router inserendo manualmente la psw, essa viene memorizzate in flash, non la perdi togliendo alimentazione.
Mi aspetto cge sia uguale per Wps, altrimenti aprirei una issue sul core

In effetti credo ci sia qualche errore nel codice perchè in setup prevede solo   WiFi.mode(WIFI_MODE_STA); e se provo anche a fare il solo reset attende sempre la pressione del tasto WPS come da riga

case SYSTEM_EVENT_STA_START:
      Serial.println("Station Mode Started");

Provo a cercare il topic si EP32 :wink:

Ho cercato di leggere il pinout dell'esp-01 ma non ci ho capito molto.

Eppure è semplice. ci sono 8 pin, due sono di alimentazione, altri due (RST e CH-PD) sono per il funzionamento, due sono le porte (GPIO0 e GPIO2) e gli ultimi due sono la seriale (RX e TX)

Vorrei sapere se è possibile collegarli un trasmettitore rf 433 (alimentato a 5v) e 2 semplici pulsanti.
Il miei dubbi sono:
Il modulo rf funziona se il segnale gli arriva a 3.3v?

si, il modulo RF accetta anche segnali a 3.3V

Ci sono abbastanza pin?
Input_pullup esiste anche su questo modulo?

Si, l'INPUT_PULLUP esiste anche in questi moduli
riguardo ai pin, due ce ne sono e puoi collegarci dei pulsanti e il modulo RF lo puoi collegare su Rx e Tx