# [Aporte] Modulo Wifi ESP8266



## george.manson.69 (Ene 18, 2015)

Hola,

En este post vamos a dar un pequeño ejemplo del uso del modulo esp8266 que es un modulo wifi con stack TCP/UDP.

​
Descripción:
Este modulo es una solución wifi basado en el circuito integrado ESP8266, este modulo nos permitirá desarrollar cosas con internet a un bajo costo.

Características esenciales:
       •Comandos AT•Solo con 4 pines para la comunicación•Actualización de Firmware por Serial•Comunicación UART

Conexión:

​
Interfaz:

​

```
'''
Created on 11/01/2015

@author: jorge
'''

import socket

ip="192.168.1.68"
port=7777
MESSAGE="Hello World!!"
a = bytes(MESSAGE, 'utf-8')

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.bind((ip,port))

print("Connect...",ip,",",port)

try:
	while True:

	    print("Waiting for data...",ip,",",port)
	    data,addr = sock.recvfrom(1024)
	    print("Data -> ",data, "Adr->",addr)
	    sock.sendto(a,addr)
	    
except KeyboardInterrupt:

	sys.close()
```

Comandos:







*Video:*






Saludos!

Hola a todos,

En este post vamos a usar la librería que hemos desarrollado para el modulo ESP8266.

*Video:*







```
///////////////////////////////////////////////////////////
/*
*//**
*@file	Main.c
*@Company	ucursos.blogspot.com
*@brief Uso del modulo esp8266 con libreria UDP
*@Version	1.0
*@date	14/01/2015
*@author George
*/
///////////////////////////////////////////////////////////

/*________________Includes_____________________*/


#include	<lpc11xx.h>
#include	"esp8266.h"
#include	"SetClock48Mhz.h"
#include	"SetSoftUart.h"

/*________________Defines______________________*/


/*________________Variables____________________*/

uint8_t DataCount = 0;
char Data[20];

ESP8266Config MyEsp8266;

/*********************************************************************//**
 * @brief		Funcion Principal
 * @param[in]	None
 * @return 		None
 **********************************************************************/

int main(void){

	//Configuramos Perifericos
	SetClockTo48Mhz();
	SetSoftUART(9600);
	SetUartTo(115200);

	
	//Configuramos Modulos
	
	Dir_Pin_Reset_ESP8266;
	
	MyEsp8266.Ssid="modem";
	MyEsp8266.Password="password";
	MyEsp8266.MultiConnection=0;
	MyEsp8266.TypeConnection="UDP";
	MyEsp8266.IPConnection="192.168.1.96";
	MyEsp8266.PortConnection="7777";
	MyEsp8266.WifiMode=3;
	MyEsp8266.DataMode=0;
	MyEsp8266.Response="!8266";
	
	soft_write_string_rom("ESP8266 Inicializando...\r");

	//*Habilitamos la interrupcion por recepcion de datos UART
	//Para trabajar con el modulo ESP8266

	NVIC_EnableIRQ(UART_IRQn);
	
	//Inicializamos el Modulo ESP8266
	
	if(ESP8266_Init(MyEsp8266)){

		soft_write_string_rom("Error to Connect, Reconnecting...\r\n");
		
		while(ESP8266_Init(MyEsp8266));

	}
	
	soft_write_string_rom("ESP8266 Conectado!");
	
	while(1){

		if(!ESP8266IsConnected()){
			
			for(DataCount=0;DataCount<sizeof(Data);DataCount++){

				Data[DataCount]='A';

			}
			
			if(ESP8266_SendData(Data,sizeof(Data),MyEsp8266.Response,5)){

				soft_write_string_rom("Error to Send Data\r\n");
				
			}
			
		}else{
			soft_write_string_rom("Error to Connect, Reconnecting...\r\n");
			while(ESP8266Reconnecting(MyEsp8266)>0);

		}

		delay_ms(200);
		delay_ms(200);
	}

}
```

Python Code:


```
'''
Created on 08/05/2014

@author: jorge
'''
import socket


ip="192.168.1.96"
port=7777
MESSAGE="!8266"
a = bytes(MESSAGE, 'utf-8')

sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
sock.bind((ip,port))

print("Connect...",ip,",",port)
while True:
    print("Waiting for data...",ip,",",port)
    data,addr = sock.recvfrom(1024)
    print("Data -> ",data, "Adr->",addr)
    sock.sendto(a,addr)
```

Download:

http://www.mediafire.com/download/qdbypcpnee7mzt2/ESP8266.zip


----------



## papirrin (Ene 19, 2015)

Muy bueno el modulo,  ayer  me puse a estudiar como hacer un servidor web con microcontrolador y no parece tan dificil, aunque todavia no me explico como se envian los archivos de imagen para que los lea el explorador de web  eso si parece que esta un poco complejo.


----------



## miborbolla (Ene 19, 2015)

papirrin dijo:


> Muy bueno el modulo,  ayer  me puse a estudiar como hacer un servidor web con microcontrolador y no parece tan dificil, aunque todavia no me explico como se envian los archivos de imagen para que los lea el explorador de web  eso si parece que esta un poco complejo.




A mi parecer no sirve o no esta pensado para Web server (se necesita mucho trabajo y gráficas pues ¿en donde las guardas?); mas bien esta concebido para comunicación TCP/UDP, yo hasta ahora estoy con UDP, y funciona bien.

Saludos


----------



## papirrin (Ene 19, 2015)

No en entendi muy bien si dices que sirve o no sirve para web server, y es la primera vez que comienzo a estudiar eso asi que no entiendo los protocolos...


pero mira este video de un servidor web hiper sencillo con arduino...






lo que no se si es que pudiera enviar las imagenes, y claro que estaria pensando en una pagina web con un iconito o algo que no se vea tan blanco y negro osea nada imagenes de alta resolucion.



> e necesita mucho trabajo y gráficas pues ¿en donde las guardas?


el guardarlas es lo de menos se podrian poner en una memoria SD controlada con el micro. supongo que el unico inconveniente seria la velocidad.


----------



## miborbolla (Ene 19, 2015)

Me refiero a que por la capacidad natural de almacenamiento de un microcontrolador, no veo como guardar una pagina web decente con gráficas y todo lo que implica, por eso es que considero que la aplicación mas explotable con cualquier  microcontrolador y el modulo ESP8266, es a través de la comunicación TCP o UDP; con la cual ya puedes establecer la transmisión exclusiva de datos específicos entre tu tarjeta aplicativa y un HOST, o lo que se quiera que soporte el protocolo tcp/ip.

Si apreciamos los ejemplos que nos comparte quien inicia el tema, debemos entender el potencial del protocolo UDP, quizás de manera muy coloquial o simplista podría decir que gracias a este modulo, podemos migrar casi cualquier aplicación rs-232 que tengamos pero a través de tcp/ip.

Tal vez, seria importante antes de utilizar el modulo ESP8266 y que a manera de introducción al mundo TCP/IP (UDP) nos programáramos dos módulos de software en nuestra pc; uno de transmisión y otro de recepción para "descubrir" el potencial de este protocolo, ya aquí nos postearon unos ejemplos en Phyton yo estoy con Microsoft y hay muchos otros lenguajes para probar, como MatLab, Mathematica, etc.

En conclusión, yo considero que el simple echo de poder manipular variables de estado de un microcontrolador a través de tcp/ip con el modulo ESP8266 es una oportunidad muy asequible, sin la pretensión de hacer un web server; para eso ya me iría a un ARM.

Saludos


----------



## papirrin (Ene 19, 2015)

> En conclusión, yo considero que el simple echo de poder manipular variables de estado de un microcontrolador a través de tcp/ip con el modulo ESP8266 es una oportunidad muy asequible, sin la pretensión de hacer un web server; para eso ya me iría a un ARM.




 yo pienso que desde ese punto de vista a lo mejor ya conviene pagar un servicio de servidor y sale mas barato... XD

a mi para lo que me gustaria ese modulo es para hacer paginas de configuracion de hardware tipo router...






imagina, no se,  una cafetera con su propia pagina de configuracion, o no se cualquier cosa que imagines que seguramente ya existe, pero para eso me gustaria ese modulo.

estoy totalmente deacuerdo contigo que ni remotamente se podria hacer una pagina como la de CAM4  ni  de chiste y claro se le puede sacar otras utilidades.


----------



## miborbolla (Ene 19, 2015)

papirrin dijo:


> http://www.yoreparo.com/foros/files/configuracion_router_02.jpg
> 
> imagina, no se,  una cafetera con su propia pagina de configuracion, o no se cualquier cosa que imagines que seguramente ya existe, pero para eso me gustaria ese modulo.




Si, Justamente le llaman el "Internet de las cosas" y en su raiz esta basado en UDP.

Lo que tu invitas a imaginar, pues es por supuesto muy viable y seria el menos en quitarte la entereza, así que pues suerte y a ver como avanza este tema ya veremos como lo enriquecemos mas. Por mi parte estoy migrando una tarjetita que ocupo para Hidroponia que la manipulaba por bluetooth y que terminaba cableandola pos rs232 por falta de cobertura del bluetooth, en las primeras pruebas de este modulo que comentamos, si que cubre bien la distancia que necesito...ahora falta un rato todavía...pero tiene buena pinta.

Saludos


----------



## george.manson.69 (Ene 20, 2015)

papirrin dijo:


> Muy bueno el modulo,  ayer  me puse a estudiar como hacer un servidor web con microcontrolador y no parece tan dificil, aunque todavia no me explico como se envian los archivos de imagen para que los lea el explorador de web  eso si parece que esta un poco complejo.



De poder se puede realizar un web server en un microcontrolador, yo me imagino tener una memoria ROM externa de unos 5 MB donde almacenes tu pagina, y configurar el modulo esp8266 para que trabaje como web server, realizas todos lo comandos automatizamente, y hasta que te pida la pagina, empiezas a leer la ROM enterna y enviarlo al dispositivo que ha hecho la peticion.

El siguiente tutorial que voy a realizar es precisamente eso, usar una memoria ROM donde guarde una pagina completa (Pagina Simple, HTML,CSS , Posiblemente Javascript), la pagina la puedes hacer en http://codepen.io/pen/ cuando tengas lista la pagina, la vaciamos a la memoria ROM ( ahora que lo pienso usar un microSD Card).

Pero todo esto usar un microcontrolador LPC1768 con procesador ARM CORTEX M3.
Saludos!


----------



## papirrin (Ene 20, 2015)

Bueno un par de comentarios...

ese MCU LPC1768 me parecio bestial... sera mi siguiente paso XD... en realidad como primera impresion el modulo wifi me parecio como de la talla de los PICs. pero estuve viendo que alcanza los 115Kbaudios,  asi que si se me hace como para algo un poco mas robustito.

por otro lado yo no le he comprado el modulo ni el MCU, asi que si pones algun ejemplo estaria excelente;  con respecto a lo de la pagina si quieres hago alguna pero en realidad no tenia ningun proyecto especifico, solo que me llamo la atencion el modulo y me puse a investigar un poco, que por cierto muy buenos tus aportes, los voy siguiendo XD.


----------



## JRVEGACOV (Abr 13, 2015)

Como paso la información que recibo del modulo a una base de datos? saben y viceversa pasar de la base de datos al modulo (base de datos SQL Server 2008 R2)


Agradeceré su amable apoyo.


----------



## miborbolla (Abr 14, 2015)

JRVEGACOV dijo:


> Como paso la información que recibo del modulo a una base de datos? saben y viceversa pasar de la base de datos al modulo (base de datos SQL Server 2008 R2)
> 
> 
> Agradeceré su amable apoyo.



El modulo ESP8266 como tal, no tiene los elementos para poder incidir directamente con una base de datos y para lograr algo como lo que sugieres dependerá de quien comande, maneje o interactue con el modulo.

Suponiendo que se cuenta con el acceso al servidor de SQL para montar aplicaciones extras, entonces se puede desarrollar una aplicación que funja para poder estar "escuchando" comandos provenientes desde el modulo ESP8266 vía el protocolo UDP y que los traduzca en comandos SQL para poder afectar las bases que se quieran en dicho servidor SQL.

Así lo hago yo, aunque utilizo MYSQL, en esencia es lo mismo. Asi que hay que tener conocimientos suficientes en SQL, Programación del protocolo tcp/ip y obviamente programar el modulo ESP8266 con algún microcontrolador tal como se ejemplifica por este Tema.

Para el asunto de la programación o aprovechamiento del protocolo tcp/ip, se puede usar, C+, VBasic.net, Python, Pearl etc, etc.

Saludos


----------



## JRVEGACOV (Abr 14, 2015)

> Para el asunto de la programación o aprovechamiento del protocolo tcp/ip, se puede usar, C+, VBasic.net, Python, Pearl etc, etc.




Entonces a grandes rasgos la forma de hacerlo es tener MYSQL - VBasic.net - ESP8266, donde VBasic.net hace la función de un OPCServer, o me equivoco?.


El detalle es como hacer la interacción entre VBasic.net (o el programa que se utilice ) con el ESP8266 y con MYSQL.


----------



## miborbolla (Abr 14, 2015)

No te equivocas, así es la cosa, aunque como siempre cada quien tiene su forma de hacer las cosas, aquí te dejo una pequeño aporte mio al asunto del protocolo UDP y VBasic.net. Aqui no toco el asunto de SQL para no confundir la cosas o conceptos, sin embargo creo que ilustra de manera global tu pregunta; al menos la parte "dificil" que comprende desde la electronica hasta tcp/ip. Ya que sobre como abrir bases de datos desde Visual Basic encontraras mil ejemplos.

Saludos


----------



## JRVEGACOV (Abr 14, 2015)

miborbolla dijo:


> No te equivocas, así es la cosa, aunque como siempre cada quien tiene su forma de hacer las cosas, aquí te dejo una pequeño aporte mio al asunto del ... ...





Excelente, estare revisando el tema y posterior a esto vuelvo con ustedes para el resultado que obtuve .

Saludos y mil gracias por el aporte!


----------



## JRVEGACOV (Abr 14, 2015)

miborbolla dijo:


> No te equivocas, así es la cosa, aunque como siempre cada quien tiene su forma de hacer las cosas, aquí te dejo una pequeño aporte mio al asunto del protocolo UDP y VBasic.netAqui no toco el asunto de SQL para no confundir la cosas o conceptos, sin embargo creo que ilustra de manera global tu pregunta; al menos la parte "dificil" que comprende desde la electronica hasta tcp/ip. Ya que sobre como abrir bases de datos desde Visual Basic encontraras mil ejemplos.
> 
> Saludos



El lenguaje "BASIC" se puede utilizar con arduino? se puede desarollar algo similar a tu ejemplo con este, que funja la función de su PIC? o no lo soporta?

Adicional a esto, el tema de la IP 


> HSerOut ["AT+CIPSTART=",34,"UDP",34,",",34,"192.168.0.2",34,",","7777",",","7777",10,13]'Establecemos conexion UDP con la ip 192.168.0.2 y puertos 7777


Esta conectandose a una IP (MI PC )o se le esta asignando una IP al modulo???

Donde puedo aprender más de los puertos ya que es algo que no termino de entender?


----------



## miborbolla (Abr 15, 2015)

Desde el lado del microcontrolador y lenguaje de programación, si se puede usar el que gustes solo es cuestión de hacerlo, pero me parece que no has comprendido el tema de como aprovechar el modulo ESP8266 para comunicacion tcp/ip, que considero es lo primero que debes superar y en el presente aporte, como en el mio, viene todo muy claro y tratamos de establecer como hacer uso de los comandos de atención (AT) a los que responde el modulo ESP8266.






Saludos


----------



## Dr. Zoidberg (Abr 18, 2015)

JRVEGACOV dijo:


> Donde puedo aprender más de los puertos ya que es algo que no termino de entender?


Eso no tiene gran ciencia. En un sistema operativo con soporte de multitasking, la direccion IP identifica al host y el PUERTO identifica al proceso.
Para verlo mas facil, la direccion IP es como el numero de telefono de una empresa y el PUERTO es el numero de interno de algun empleado.


----------



## JRVEGACOV (Abr 19, 2015)

Dr. Zoidberg dijo:


> Eso no tiene gran ciencia. En un sistema operativo con soporte de multitasking, la direccion IP identifica al host y el PUERTO identifica al proceso.
> Para verlo mas facil, la direccion IP es como el numero de telefono de una empresa y el PUERTO es el numero de interno de algun empleado.



Está entendido ya. Ahora mi pregunta. ¿Trasladándolo con tu ejemplo al empleado, le pueden hacer varias llamadas a la vez? ¿Está limitado a "x" cantidad o no tiene limite?

Mil gracias por sus aportes, me son de inmensa utilidad.


----------



## guidofernandezchambilla (May 20, 2015)

*¿*Q*ué* tal*,* amigos*?* *T*engo una consulta*.*
*H*e adquirido este módulo wifi y quisiera saber  el pin RLD dónde va conectado y para que sirve*.*
*L*es agrade*z*co de antemano sus comentarios*.*


----------



## uagav (Ago 26, 2015)

Hola! mi aporte es la libreria para la construcción del pcb en proteus. compartanla. y espero que les sirva.


----------



## dcsalg (Ene 29, 2016)

Hola una consulta, alguien conecto el ESP8266 a un pic ?  y con un celular con un programa en app inventor se conecta al modulo, y este modulo envia los datos al pic para que haga algo. Alguien realizo algo asi; asi me explica como es eso? nose por donde comenzar. vi algunos comandos AT del modulo jugue un poco con eso pero todo a travez de una placa de esas serie chiquitas que se conectan por usb a la pc. un dato lo que si observe que por ejemplo uno se conecta al modulo osea lo elegi con la computadora donde estan las redes wifi, desde un navegador coloque 192.168.4.1/L01 como ejemplo esto es, y vi en el monitor del modulo estoy usando tipo un hyperterminal cosas asi, y vi que entre muchos datos el texto L01, osea que le llego eso, pero como hago para que eslo lo lea un pic? y con eso encender un led por ejemplo.  y si coloco L10 me encendera un led 10 cosas asi.


----------



## palurdo (Ene 29, 2016)

Usar el módulo mediante comandos AT puede volverse una pesadilla con un proyecto grande teniendo en cuenta que el firmware no es perfecto y se cuelga a veces. Yo cambiaría de enfoque y programaría directamente el ESP8266 para que haga lo que le pida sin necesidad de poner en medio un PIC. Internamente el modulo tiene un procesador de 80MHz y mucha memoria para hacer programas complejos. Tienes el kit de desarrollo de Espressive muy bien explicado y con tutoriales en la comunidad de esp8266.com pero si lo quieres hacer más "familiar" lo puedes programar directamente usando el IDE de arduino. Hay miles de ejemplos en la red para poder hacerlo.

https://github.com/esp8266/Arduino


----------



## dcsalg (Ene 29, 2016)

pero es muy complejo que el pic lea lo que envie el ESP8266? si yo pudiera leer eso como te decia por ejemplo L01 el pic, yo despues median if, switch o lo que sea puedo hacer que haga algo, solo que envie cosas asi L01, L02, L03 y bla bla bla... entonces enciende una luz, u otra u otra y asi y otra cosa jamas programe los ESP ni arduino, solo pic con ccs. pero lo que nose como hacer para leer eso


----------



## wolfalfabeta (Ago 5, 2016)

Hola necesito ayuda con ESP8266
Me compre un ESP8266, para comenzar a manejarlo y a familiarizarme con los comandos AT lo compre junto con un CP2102.

Para las conexiones me base en el diagrama siguiente

En la computadora instalé Tera Term para la comunicación, en la interfaz de Tera cundo energizo el ESP8266 me aparece la información típica de versión y la leyenda     Ready.

Pero cuando quiero enviar el primer comando AT+GMR y pulso enter no hace nada solo el cursor se posiciona sobre la letra A.

Alguien me podría apoyar en que estoy equivocándome.


----------



## Scooter (Ago 5, 2016)

Me parece que no tienes bien configurado el terminal y no envía el retorno de carro.
Yo perdí un par de horas el otro día por esa tontería.


----------



## torres.electronico (Ago 5, 2016)

Scooter dijo:


> Me parece que no tienes bien configurado el terminal y no envía el retorno de carro.
> Yo perdí un par de horas el otro día por esa tontería.



tal cual, o directamente no sale el mensaje


----------



## Scooter (Ago 6, 2016)

Hablando del tema, estoy siguiendo estos manuales:
http://www.prometec.net/arduino-wifi/
Pero uso linux en lugar de windows, con el segundo manual no puedo enviar datos al PC, me huele a que hay que configurar el firewall o algo parecido porque dice que no responde el cliente en la IP de mi PC.

¿Puede ser eso?¿Como se abre ese puerto o lo que sea? Estoy usando linux mint 18


Edito, pues he probado desconectando cortafuegos y tampoco...
Da error en lugar de ok al enviar el comando de establecer la conexión


----------



## wolfalfabeta (Ago 7, 2016)

Gracias, el problema si era la configuración de la Terminal TERA TERM.

Después de cada comando, el ESP8266 espera los caracteres especiales de nueva línea <CR><LF> para ejecutar el comando.

Encontré la información en el siguiente archovo.


----------



## Norberto (Jul 30, 2018)

Consulta : Al entrar a un local de comidas rapidas, me conecto a su red wifi libre y ni bien abro el explorador ingreso a sus paginas cuando yo tenia seteado google como inicio, en algun lado lo vi y esto era posible hacerlo con un ESP8266, osea la idea seria poner el modulo ESP como router wifi y al abrir el explorador directamente entraria a mi pagina creada en el arduino/micro, sin poner direcciones ip.  Si alguno sabe como hacerlo seria bueno compartirlo.


----------



## Jeremias (Mar 2, 2020)

Hola, estoy intentando hacer un sistema de automatización para una casa. Estoy utilizando el modulo Nodemcu. La idea es que cada habitación contenga un modulo y es controlada mediante una pagina en html. El problema se da cuando enciendo todos los módulos, por alguna razón no funciona ninguno. Pero si solo tengo uno funcionando este si responde a la acción en lque se elija en la pagina. Los módulos se conectan al wifi de i casa ya que por puerto serial me informa, pero no puedo acceder a ellos a través de la pagina que utiliza una IP fija correspondiente a cada modulo para acceder a ello. Si les sirve les adjunto el código. Básicamente los códigos de cada modulo son iguales, solo cambia en la parte del loop al momento de decidir a que función dirigirse dependiendo lo almacenado en request. 

```
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>
#include <Servo.h>

//-------------------VARIABLES GLOBALES--------------------------

int contconexion = 0;
unsigned long previousMillis = 0;

char ssid[50];     
char pass[50];

const char *ssidConf = "wifiConf";
const char *passConf = "12345678";

IPAddress ip(192,168,1,200);     
IPAddress gateway(192,168,1,1);   
IPAddress subnet(255,255,255,0); 

String mensaje = "";

int value = LOW;
int grados=0;
int pos=0;
int lado;
      

WiFiClient espClient;
ESP8266WebServer server(80);
WiFiServer server1(80);
WiFiClient client = server1.available();


Servo cortina;

//-------------------Variables de la casa---------------------

int luz1_cocina=5;            //D1
int luz2_cocina=4;            //D2
int cortina1_cocina=0;        //D3
int cortina2_cocina=2;        //D4
int microf_cocina=12;         //D6
int cargar_password=13;       //D7

//-----------CODIGO HTML PAGINA DE CONFIGURACION---------------

String pagina = "<!DOCTYPE html>"
"<html>"
"<head>"
"<title>Tutorial Eeprom</title>"
"<meta charset='UTF-8'>"
"</head>"
"<body>"
"</form>"
"<form action='guardar_conf' method='get'>"
"SSID:<br><br>"
"<input class='input1' name='ssid' type='text'><br>"
"PASSWORD:<br><br>"
"<input class='input1' name='pass' type='password'><br><br>"
"<input class='boton' type='submit' value='GUARDAR'/><br><br>"
"</form>"
"<a href='escanear'><button class='boton'>ESCANEAR</button></a><br><br>";

String paginafin = "</body>"
"</html>";

//------------------------SETUP WIFI-----------------------------
void setup_wifi() {
// Conexión WIFI
  WiFi.mode(WIFI_STA); //para que no inicie el SoftAP en el modo normal
  WiFi.config(ip, gateway, subnet);
  WiFi.begin(ssid, pass);
 
  while (WiFi.status() != WL_CONNECTED and contconexion <50)
    { //Cuenta hasta 50 si no se puede conectar lo cancela
    ++contconexion;
    delay(250);
    Serial.print(".");
  }
  if (contconexion <50) {   
      Serial.println("");
      server1.begin();
      Serial.println("WiFi conectado");
      // Muestro la IP local asignada. URL del servidor
      Serial.print("Usa esta URL para conectar al servidor: ");
      Serial.println(WiFi.localIP());
      Serial.println(ssid);
      Serial.println(pass);
  }
  else {
      Serial.println("");
      Serial.println("Error de conexion");
  }
}


//-------------------PAGINA DE CONFIGURACION--------------------
void paginaconf() {
  server.send(200, "text/html", pagina + mensaje + paginafin);
}

//--------------------MODO_CONFIGURACION------------------------
void modoconf() {

  WiFi.softAP(ssidConf, passConf);
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("IP del acces point: ");
  Serial.println(myIP);
  Serial.println("WebServer iniciado...");

  server.on("/", paginaconf); //esta es la pagina de configuracion

  server.on("/guardar_conf", guardar_conf); //Graba en la eeprom la configuracion

  server.on("/escanear", escanear); //Escanean las redes wifi disponibles
 
  server.begin();

  while (true) {
      server.handleClient();
  }
}

//---------------------GUARDAR CONFIGURACION-------------------------

void guardar_conf() {
 
  Serial.println(server.arg("ssid"));//Recibimos los valores que envia por GET el formulario web
  grabar(0,server.arg("ssid"));
  Serial.println(server.arg("pass"));
  grabar(50,server.arg("pass"));

  mensaje = "Configuracion Guardada...";
  paginaconf();
}

//----------------Función para grabar en la EEPROM-------------------

void grabar(int addr, String a) {
  int tamano = a.length();
  char inchar[50];
  a.toCharArray(inchar, tamano+1);
  for (int i = 0; i < tamano; i++) {
    EEPROM.write(addr+i, inchar[i]);
  }
  for (int i = tamano; i < 50; i++) {
    EEPROM.write(addr+i, 255);
  }
  EEPROM.commit();
}

//-----------------Función para leer la EEPROM------------------------

String leer(int addr) {
   byte lectura;
   String strlectura;
   for (int i = addr; i < addr+50; i++) {
      lectura = EEPROM.read(i);
      if (lectura != 255) {
        strlectura += (char)lectura;
      }
   }
   return strlectura;
}

//---------------------------ESCANEAR----------------------------

void escanear() { 
  int n = WiFi.scanNetworks(); //devuelve el número de redes encontradas
  Serial.println("escaneo terminado");
  if (n == 0) { //si no encuentra ninguna red
    Serial.println("no se encontraron redes");
    mensaje = "no se encontraron redes";
  } 
  else
  {
    Serial.print(n);
    Serial.println(" redes encontradas");
    mensaje = "";
    for (int i = 0; i < n; ++i)
    {
      // agrega al STRING "mensaje" la información de las redes encontradas
      mensaje = (mensaje) + "<p>" + String(i + 1) + ": " + WiFi.SSID(i) + " (" + WiFi.RSSI(i) + ") Ch: " + WiFi.channel(i) + " Enc: " + WiFi.encryptionType(i) + " </p>\r\n";
      //WiFi.encryptionType 5:WEP 2:WPA/PSK 4:WPA2/PSK 7:open network 8:WPA/WPA2/PSK
      delay(10);
    }
    Serial.println(mensaje);
    paginaconf();
  }
}


//--------------------------funcion PINES--------------------------

void pines(){
 
  //Cocina
  pinMode(luz1_cocina, OUTPUT);
  digitalWrite(luz1_cocina, LOW);
  pinMode(luz2_cocina, OUTPUT);
  digitalWrite(luz2_cocina, LOW);

  //cargar_password
  pinMode(cargar_password,INPUT);
  }

//------------------------------SETUP----------------------------------

void setup() {
 
  // Inicia Serial
  Serial.begin(115200);
  Serial.println("");
  pines();
  EEPROM.begin(512);
 
  if (digitalRead(cargar_password) == 0) {
    Serial.println("Bienvenido al modo configuracion");
    modoconf();
  }
 
  leer(0).toCharArray(ssid, 50);
  leer(50).toCharArray(pass, 50);
 
  setup_wifi();     
}

//--------------------------LOOP--------------------------------

void loop() {
 
  // Compruebo si hay un cliente disponible (una petición)
 
  WiFiClient client = server1.available();
 
  if (!client) {
    return; // En caso de no haber un cliente, no hago nada
  }
 
  // Espero hasta que el cliente realice una petición
 
  Serial.println("¡Nuevo cliente!");
  while(!client.available()){
    delay(1);
  }
 
  // Leo la primera linea de la petición del cliente
 
  String request = client.readStringUntil('\r');     // Leo hasta retorno de carro
  //Serial.println(request);                         //Imprimo la petición
  client.flush();                                    //Limpio el buffer
 

  //LLamo a las funciónes 
      
 if (request.indexOf("/cocina")!=-1)
        cocina(request); 

 if(request.indexOf("/predeterminados")!=-1)
        predeterminados(request);   
   delay(1000);
}

//----------------------funcion Cocina---------------------------

void cocina(String request){
   //cortinas
  if(request.indexOf("/cortina1=izq")!=-1 ){
    lado=1;
    Cortina(lado, cortina1_cocina);
  }
   if(request.indexOf("/cortina1=der")!=-1){
    lado=0;
    Cortina(lado, cortina1_cocina);
  }
  if(request.indexOf("/cortina2=izq")!=-1){
    lado=1;
    Cortina(lado, cortina2_cocina);
  }
   if(request.indexOf("/cortina2=der")!=-1){
    lado=0;
    Cortina(lado, cortina2_cocina);
  }
    
  //luz
  if(request.indexOf("/luz1=on")!=-1){
    lado=1;
    Luz(lado, luz1_cocina);
  }
  if(request.indexOf("/luz1=off")!=-1){
    lado=0;
    Luz(lado, luz1_cocina);
  }
  if(request.indexOf("/luz2=on")!=-1){
    lado=1;
    Luz(lado, luz2_cocina);
  }
  if(request.indexOf("/luz2=off")!=-1){
    lado=0;
    Luz(lado, luz2_cocina);
  }
}

//-----------------funcion predeterminados----------------------------

void predeterminados(String request){
  if(request.indexOf("/opcion1")){
    predet_1();
    }
  if(request.indexOf("/opcion2")){
    predet_2();
    }
  if(request.indexOf("/opcion3")){
    predet_3();
    }
  }

//------------------------PREDETERMINADOS---------------------

//------------------------opcion 1 --------------------------
//Enciende todas las luces de la cocina y cierra las cortinas

void predet_1(){
  delay(1000);
  Luz(1,luz1_cocina);
  delay(1000);
  Luz(1,luz2_cocina);
  delay(1000);
  Cortina(0,cortina1_cocina);
  delay(1000);
  Cortina(0,cortina2_cocina);
  delay(1000);
 }

//------------------------opcion 2 --------------------------
//apaga todas las luces de la casa y cierra todas las cortinas

void predet_2(){
 
  delay(1000);
  Luz(0,luz1_cocina);
  delay(1000);
  Luz(0,luz2_cocina);
  delay(1000);
 
  Cortina(0,cortina1_cocina);
  delay(1000);
  Cortina(0,cortina2_cocina);
  delay(1000); 
 
  }

//------------------------opcion 3 --------------------------
//apaga todas las luces de la casa y abre todas las cortinas

void predet_3(){
  delay(1000);
  Luz(0,luz1_cocina);
  delay(1000);
  Luz(0,luz2_cocina);
  delay(1000);
 
  Cortina(1,cortina1_cocina);
  delay(1000);
  Cortina(1,cortina2_cocina);
  delay(1000);
    
 }

//------------------------FUNCIUONES DE SALIDA--------------------
//----------------------funcion cortina-------------------------------

void Cortina(int lado, int pin){
 
   Serial.println("accion: Cortina");
  cortina.attach(pin);
 
  if (lado==1){
    if (pos==0){
      for (grados=0;grados<=180;grados+=1){
        cortina.write(grados);
        delay(5);
          }
        }
      pos=1;
    }
      
  if (lado==0){
    if (pos==1){ 
      for (grados=180;grados>=0;grados -=1){
      cortina.write(grados);
      delay(5);
        }
      }
      pos=0;
  }
}
 
//---------------------funcion Luz----------------------------

void Luz(int lado, int pin){
  Serial.println("accion: Luz");
 
    if (lado==1)  {
    digitalWrite(pin, HIGH);
  }
  if (lado==0)  {
    digitalWrite(pin, LOW);
  }
}
```

Al principio pense que se debia a que todos trabajan con el mismo puerto (80), pero la verdad que desconozco un poco del tema y no se si eso tiene sentido.


----------



## Miembro eliminado 356005 (Mar 2, 2020)

Modifica el código para que cada módulo espere una cantidad de tiempo aleatorio antes de intentar la primera conexión, por ejemplo, entre 500 y 5000 milisegundos.

```
delay(random(500, 5000));
```
Recuerda que cada módulo debe tener una IP distinta, o solicitarla al servidor de DHCP de la red.


----------



## Jeremias (Mar 2, 2020)

JoaquinFerrero dijo:


> Modifica el código para que cada módulo espere una cantidad de tiempo aleatorio antes de intentar la primera conexión, por ejemplo, entre 500 y 5000 milisegundos.
> 
> ```
> delay(random(500, 5000));
> ...


Hola joaquin, gracias por tu respuesta. Asi es, cada modulo cuenta con una ip distinta, vario el ultimo numero de la misma.

Acabo de darme cuenta que la comunicación con los módulos se me inhibe  cuando conecto otro modulo que funciona como cliente. La idea de este es que haga las peticiones en html mientras es controlado por firebase desde una red externa a la casa. si yo conecto los módulos sin el cliente me funcionan los 4 juntos. Pero cuando enciendo el cliente no me funciona ninguno incluyendo el cliente (pero me muestra por puerto serie que si se conecto al wifi). El codigo del cliente es el siguiente

```
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>
#include <Servo.h>
#include <FirebaseArduino.h>

//-------------------VARIABLES GLOBALES--------------------------
#define FIREBASE_HOST "casaeri.firebaseio.com"    
#define FIREBASE_AUTH "Wb8vIs2kmFe2Krq8j2u2F4Aj9VhhX7c6PzzqOJNB"

int contconexion = 0;
unsigned long previousMillis = 0;

char ssid[50];    
char pass[50];

const char *ssidConf = "wifiConf";
const char *passConf = "12345678";

const char* cocina = "192.168.1.200";
const char* dormitorio_bano = "192.168.1.201";
const char* oficina = "192.168.1.202";

String mensaje = "";

int value = LOW;
int grados=0;
int pos=0;
int lado;
int cargar_password=13;       //D7

WiFiClient espClient;
ESP8266WebServer server(80);
WiFiServer server1(80);
WiFiClient client = server1.available();


//-----------CODIGO HTML PAGINA DE CONFIGURACION---------------

String pagina = "<!DOCTYPE html>"
"<html>"
"<head>"
"<title>Configuracion</title>"
"<meta charset='UTF-8'>"
"</head>"
"<body>"
"</form>"
"<form action='guardar_conf' method='get'>"
"SSID:<br><br>"
"<input class='input1' name='ssid' type='text'><br>"
"PASSWORD:<br><br>"
"<input class='input1' name='pass' type='password'><br><br>"
"<input class='boton' type='submit' value='GUARDAR'/><br><br>"
"</form>"
"<a href='escanear'><button class='boton'>ESCANEAR</button></a><br><br>";

String paginafin = "</body>"
"</html>";

//------------------------SETUP WIFI-----------------------------
void setup_wifi() {
// Conexión WIFI
  WiFi.mode(WIFI_STA); //para que no inicie el SoftAP en el modo normal
  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED and contconexion <50)
    { //Cuenta hasta 50 si no se puede conectar lo cancela
    ++contconexion;
    delay(250);
    Serial.print(".");
  }
  if (contconexion <50) {  
      Serial.println("");
      server1.begin();
      Serial.println("WiFi conectado");
      // Muestro la IP local asignada. URL del servidor
      Serial.print("Usa esta URL para conectar al servidor: ");
      Serial.println(WiFi.localIP());
      Serial.println(ssid);
      Serial.println(pass);
  }
  else {
      Serial.println("");
      Serial.println("Error de conexion");
  }
}


//-------------------PAGINA DE CONFIGURACION--------------------
void paginaconf() {
  server.send(200, "text/html", pagina + mensaje + paginafin);
}

//--------------------MODO_CONFIGURACION------------------------
void modoconf() {

  WiFi.softAP(ssidConf, passConf);
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("IP del acces point: ");
  Serial.println(myIP);
  Serial.println("WebServer iniciado...");

  server.on("/", paginaconf); //esta es la pagina de configuracion

  server.on("/guardar_conf", guardar_conf); //Graba en la eeprom la configuracion

  server.on("/escanear", escanear); //Escanean las redes wifi disponibles

  server.begin();

  while (true) {
      server.handleClient();
  }
}

//---------------------GUARDAR CONFIGURACION-------------------------

void guardar_conf() {

  Serial.println(server.arg("ssid"));//Recibimos los valores que envia por GET el formulario web
  grabar(0,server.arg("ssid"));
  Serial.println(server.arg("pass"));
  grabar(50,server.arg("pass"));

  mensaje = "Configuracion Guardada...";
  paginaconf();
}

//----------------Función para grabar en la EEPROM-------------------

void grabar(int addr, String a) {
  int tamano = a.length();
  char inchar[50];
  a.toCharArray(inchar, tamano+1);
  for (int i = 0; i < tamano; i++) {
    EEPROM.write(addr+i, inchar[i]);
  }
  for (int i = tamano; i < 50; i++) {
    EEPROM.write(addr+i, 255);
  }
  EEPROM.commit();
}

//-----------------Función para leer la EEPROM------------------------

String leer(int addr) {
   byte lectura;
   String strlectura;
   for (int i = addr; i < addr+50; i++) {
      lectura = EEPROM.read(i);
      if (lectura != 255) {
        strlectura += (char)lectura;
      }
   }
   return strlectura;
}

//---------------------------ESCANEAR----------------------------

void escanear() {
  int n = WiFi.scanNetworks(); //devuelve el número de redes encontradas
  Serial.println("escaneo terminado");
  if (n == 0) { //si no encuentra ninguna red
    Serial.println("no se encontraron redes");
    mensaje = "no se encontraron redes";
  }
  else
  {
    Serial.print(n);
    Serial.println(" redes encontradas");
    mensaje = "";
    for (int i = 0; i < n; ++i)
    {
      // agrega al STRING "mensaje" la información de las redes encontradas
      mensaje = (mensaje) + "<p>" + String(i + 1) + ": " + WiFi.SSID(i) + " (" + WiFi.RSSI(i) + ") Ch: " + WiFi.channel(i) + " Enc: " + WiFi.encryptionType(i) + " </p>\r\n";
      //WiFi.encryptionType 5:WEP 2:WPA/PSK 4:WPA2/PSK 7:open network 8:WPA/WPA2/PSK
      delay(10);
    }
    Serial.println(mensaje);
    paginaconf();
  }
}


//------------------------SETUP-----------------------------

void setup() {

  // Inicia Serial
  Serial.begin(115200);
  Serial.println("");
  EEPROM.begin(512);
     
  pinMode(cargar_password, INPUT);
  if (digitalRead(cargar_password) == LOW) {
    Serial.println("Bienvenido al modo configuracion");
    modoconf();
  }

  leer(0).toCharArray(ssid, 50);
  leer(50).toCharArray(pass, 50);

  setup_wifi();

  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
     
}

//--------------------------LOOP--------------------------------

void loop() {
  // Compruebo si hay un cliente disponible (una petición)

  String modo= Firebase.getString("modo");

  WiFiClient client;

  //LLamo a las funciónes      
  if (modo == "\"externo\"")
      Control_Externo();
  delay(1000);
}




//----------------------FUNCIONES DE CONTROL EXTERNO---------------------

//-----------------------funcion Control_externo-------------------

void Control_Externo(){

    Serial.println("Contorl externo");
   
    if (Firebase.getString("cocina")!="\"0\"")
          cocina_ext();
    if (Firebase.getString("baño")!="\"0\"")
        bano_ext();
    if (Firebase.getString("dormitorio")!="\"0\"")
        dormitorio_ext();
    if (Firebase.getString("oficina")!="\"0\"")
        oficina_ext();
    if(Firebase.getString("predeterminados")!="\"0\"")
        predeterminados_ext();
       
  }
//----------------------funcion Cocina---------------------------

void cocina_ext(){
   Serial.println("Control cocina");
   //cortinas
  if(Firebase.getString("cocina")== "\"cortina1_izq\"") {
    if (client.connect(cocina, 80))
      {
        client.print(String("GET /cocina/cortina1=izq") + " HTTP/1.1\r\n" +"Host: " + cocina + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("cortina1 abierta");
      }  
  }
   if(Firebase.getString("cocina")== "\"cortina1_der\""){
    if (client.connect(cocina, 80))
      {
        client.print(String("GET /cocina/cortina1=der") + " HTTP/1.1\r\n" +"Host: " + cocina + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("cortina1 cerrada");
      }

  }
  if(Firebase.getString("cocina")== "\"cortina2_izq\""){
    if (client.connect(cocina, 80))
      {
        client.print(String("GET /cocina/cortina2=izq") + " HTTP/1.1\r\n" +"Host: " + cocina + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("cortina2 abierta");
      }

  }
   if(Firebase.getString("cocina")== "\"cortina2_der\""){
    if (client.connect(cocina, 80))
      {
        client.print(String("GET /cocina/cortina2=der") + " HTTP/1.1\r\n" +"Host: " + cocina + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("cortina2 cerrada");
      }

  }
   
  //luz
  if(Firebase.getString("cocina")== "\"luz1On\""){
    if (client.connect(cocina, 80))
      {
        client.print(String("GET /cocina/luz1=on") + " HTTP/1.1\r\n" +"Host: " + cocina + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("luz1 on");
      }

  }
  if(Firebase.getString("cocina")== "\"luz1Off\""){
    if (client.connect(cocina, 80))
      {
        client.print(String("GET /cocina/luz1=off") + " HTTP/1.1\r\n" +"Host: " + cocina + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("luz1 off");
      }

  }
  if(Firebase.getString("cocina")== "\"luz2On\""){
    if (client.connect(cocina, 80))
      {
        client.print(String("GET /cocina/luz2=on") + " HTTP/1.1\r\n" +"Host: " + cocina + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("luz2 on");
      }

  }
  if(Firebase.getString("cocina")== "\"luz2Off\""){
    if (client.connect(cocina, 80))
      {
        client.print(String("GET /cocina/luz1=off") + " HTTP/1.1\r\n" +"Host: " + cocina + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("luz2 off");
      }

  }
}
//---------------------funcion baño-----------------------------

void bano_ext(){
   Serial.println("Control baño");  
  //luz
  if(Firebase.getString("bano")== "\"luzOn\""){
    if (client.connect(dormitorio_bano, 80))
      {
        client.print(String("GET /bano/luz=on") + " HTTP/1.1\r\n" +"Host: " + dormitorio_bano + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("luz on");
      }
  }
  if(Firebase.getString("bano")== "\"luzOff\""){
    if (client.connect(dormitorio_bano, 80))
      {
        client.print(String("GET /bano/luz=off") + " HTTP/1.1\r\n" +"Host: " + dormitorio_bano + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("luz off");
      }
  }
}
//-------------------funcion dormitorio----------------------------

void dormitorio_ext(){
  Serial.println("Control dormitorio");
   //cortinas
  if(Firebase.getString("dormitorio")== "\"cortina_izq\""){
    if (client.connect(dormitorio_bano, 80))
      {
        client.print(String("GET /dormitorio/cortina=izq") + " HTTP/1.1\r\n" +"Host: " + dormitorio_bano + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("cortina abierta");
      }
  }
   if(Firebase.getString("dormitorio")== "\"cortina_izq\""){
    if (client.connect(dormitorio_bano, 80))
      {
        client.print(String("GET /dormitorio/cortina=der") + " HTTP/1.1\r\n" +"Host: " + dormitorio_bano + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("cortina cerrada");
      }
  }  
  //luz
  if(Firebase.getString("dormitorio")== "\"luzOn\""){
    if (client.connect(dormitorio_bano, 80))
      {
        client.print(String("GET /dormitorio/luz=On") + " HTTP/1.1\r\n" +"Host: " + dormitorio_bano + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("luz on");
      }
  }
  if(Firebase.getString("dormitorio")== "\"luzOff\""){
    if (client.connect(dormitorio_bano, 80))
      {
        client.print(String("GET /dormitorio/luz=Off") + " HTTP/1.1\r\n" +"Host: " + dormitorio_bano + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("luz off");
      }
  }
  if (Firebase.getString("aire_acond")!= "\"0\"")
    aire_acond_ext();
}

//-----------------funcion aire acondicionado------------------------

void aire_acond_ext(){
  Serial.println("Control aire acondicionado");
  if(Firebase.getString("aire_acond")== "\"aire_acond_apagar\""){
    if (client.connect(dormitorio_bano, 80))
      {
        client.print(String("GET /dormitorio/aire_acond/apagar") + " HTTP/1.1\r\n" +"Host: " + dormitorio_bano + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("apagar");
      }
    }
  if(Firebase.getString("aire_acond")== "\"aire_acond_encender\""){
    if (client.connect(dormitorio_bano, 80))
      {
        client.print(String("GET /dormitorio/aire_acond/encender") + " HTTP/1.1\r\n" +"Host: " + dormitorio_bano + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("encender");
      }
    }
  if(Firebase.getString("aire_acond")== "\"aire_acond_abajo\""){
    if (client.connect(dormitorio_bano, 80))
      {
        client.print(String("GET /dormitorio/aire_acond/bajar_temp") + " HTTP/1.1\r\n" +"Host: " + dormitorio_bano + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("temp abajo");
      }
    }
  if(Firebase.getString("aire_acond")== "\"aire_acond_arriba\""){
    if (client.connect(dormitorio_bano, 80))
      {
        client.print(String("GET /dormitorio/aire_acond/subir_temp") + " HTTP/1.1\r\n" +"Host: " + dormitorio_bano + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("temp arriba");
      }
    }
  }

//---------------------funcion oficina-------------------------------

void oficina_ext(){
  Serial.println("Control oficina");
   //cortinas
  if(Firebase.getString("oficina")== "\"cortina1_izq\""){
    if (client.connect(oficina, 80))
      {
        client.print(String("GET /oficina/cortina=izq") + " HTTP/1.1\r\n" +"Host: " + oficina + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("cortina abierta");
      }
  }
   if(Firebase.getString("oficina")== "\"cortina1_izq\""){
    if (client.connect(oficina, 80))
      {
        client.print(String("GET /oficina/cortina=der") + " HTTP/1.1\r\n" +"Host: " + oficina + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("cortina cerrada");
      }
   
  }  
  //luz
  if(Firebase.getString("oficina")== "\"luzOn\""){
    if (client.connect(oficina, 80))
      {
        client.print(String("GET /oficina/luz=on") + " HTTP/1.1\r\n" +"Host: " + oficina + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("luz on");
      }
 
  }
  if(Firebase.getString("oficina")== "\"luzOff\""){
    if (client.connect(oficina, 80))
      {
        client.print(String("GET /oficina/luz=off") + " HTTP/1.1\r\n" +"Host: " + oficina + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("luz off");
      }
 
  }
}

//-----------------funcion predeterminados----------------------------

void predeterminados_ext(){
  Serial.println("Control predeterminados");
  if(Firebase.getString("predeterminado")== "\"opcion1\""){
    if (client.connect(cocina, 80))
      {
        client.print(String("GET /predeterminados/opcion1") + " HTTP/1.1\r\n" +"Host: " + cocina + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("opcion 1");
      }
   }
   if(Firebase.getString("predeterminado")== "\"opcion2\""){
    if (client.connect(cocina, 80))
      {
        client.print(String("GET /predeterminados/opcion2") + " HTTP/1.1\r\n" +"Host: " + cocina + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("opcion 2 cocina");
      }
    if (client.connect(dormitorio_bano, 80))
      {
        client.print(String("GET /predeterminados/opcion2") + " HTTP/1.1\r\n" +"Host: " + dormitorio_bano + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("opcion 2 baño_dormitorio");
      }
    if (client.connect(oficina, 80))
      {
        client.print(String("GET /predeterminados/opcion2") + " HTTP/1.1\r\n" +"Host: " + oficina + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("opcion 2 oficina");
      }
    }
   if(Firebase.getString("predeterminado")== "\"opcion3\""){
    if (client.connect(cocina, 80))
      {
        client.print(String("GET /predeterminados/opcion3") + " HTTP/1.1\r\n" +"Host: " + cocina + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("opcion 3 cocina");
      }
    if (client.connect(dormitorio_bano, 80))
      {
        client.print(String("GET /predeterminados/opcion3") + " HTTP/1.1\r\n" +"Host: " + dormitorio_bano + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("opcion 3 baño_dormitorio");
      }
    if (client.connect(oficina, 80))
      {
        client.print(String("GET /predeterminados/opcion3") + " HTTP/1.1\r\n" +"Host: " + oficina + "\r\n" +"Connection: close\r\n" +"\r\n");
        client.stop();
        Serial.println("opcion 3 oficina");
      }
    }

  }
```


----------



## Dr. Zoidberg (Mar 2, 2020)

Por que no usas el HomeAssistant o algo así y dejas de dar vueltas con inventos raros??


----------



## sebsjata (Mar 3, 2020)

No uses delay cuando uses wifi o Bluetooth, porque la conexión no funciona así. Es solo una recomendación


----------



## dinoelectro (Mar 3, 2020)

Este modulo, en particular, no me gusta, sobre todo cuando lo quieres utilizar con fines experimentales, por las siguientes razones:

Necesitas en la mayoría de los casos un regulador 3.3V
Necesitas un adaptador USB FTDI
La mayoría de los pines del ESP8266 no son accesibles al usuario
para cargar el firmware debes hacer cambios en el circuito
Por la disposición de sus pines se dificulta mucho las conexiones en un protoboard
Prefiero siempre utilizar módulos mas flexibles como NODEMCU, ESP32, WEMOS D1, son mucho mas prácticos, tal vez un poco mas costosos pero pronto lo ves compensado cuando vas ganando en comodidad, te evitas circuiteria adicional y mucho dolor de cabeza

Sin embargo es de digno de agradecer, el tutorial esta muy bien explicado y documentado.


----------



## miborbolla (Mar 4, 2020)

dinoelectro dijo:


> Este modulo, en particular, no me gusta, sobre todo cuando lo quieres utilizar con fines experimentales, por las siguientes razones:
> 
> Necesitas en la mayoría de los casos un regulador 3.3V
> Necesitas un adaptador USB FTDI
> ...



Solo debes tomar en cuenta que cuando inicio este hilo, que fue en 2015, era una opción formidable que justamente llevaron al desarrollo de los módulos que listas. Y hoy en día sigue siendo una opción para el que ya tiene desarrollado algo muy especifico y que obviamente no requieres del FTDI siendo el método de expansión preferido, el protocolo I2C, que desde un principio ha estado disponible; así que tiene su merito al menos para mi.
 


Incluso existen en el mercado, una buena cantidad de productos comerciales basados en este modulo, sin embargo coincido con usted que hoy en día para el que va a experimentar, es mas económico comenzar con los que mencionas.

 Saludos.


----------



## Hellmut1956 (Mar 5, 2020)

Yo usaría como módulo una laca con el ESP32.


----------



## cosmefulanito04 (Mar 5, 2020)

El D1 Mini pro tiene la ventaja de poder agregar una antena y la señal mejora muchísimo.


----------

