Me llego un ESP8266, habia escuchado mucho sobre lo fascinante de este micro modulo Wifi. No lo creía hasta ahora.
Es mas estoy jugando con el asi, que cualquier idea para implementar es bienvenida:
Les dejo un pequeño codigo que revisa las redes Wifi disponibles y muestra por Monitor Serial los nombres y la intensidad de señal.
String mensaje = "";
String recibido ="";
int intensidad =0;
byte index=0;
byte inten[30];
String nombre[30];
#define DEBUG true
String sendData(String command, const int timeout, boolean debug){
String response = "";
Serial1.print(command); // send the read character to the esp8266
long int time = millis();
while( (time+timeout) > millis()){
while(Serial1.available()){
char c = Serial1.read(); // read the next character.
response+=c;
}
}
if(debug)
{
Serial.print(response);
}
return response;
}
void carga_lista(){
unsigned long C_tiempo= millis();
String command = "AT+CWLAP\r\n";
Serial1.print(command);
}
void serialEvent1(){
String nombre1 ="";
byte intenso = 0;
byte inicio = 0;
byte final = 0;
byte inte_pos = 0;
//while(Serial1.available()<50){}
while(Serial1.available()){
char myChar = Serial1.read();
if(myChar==10){
Serial1.read();
//Serial.println(recibido);
if(recibido.startsWith("+CWLAP:(")){
inte_pos = recibido.indexOf("(")+1;
inicio = recibido.indexOf(",")+1;
final = recibido.indexOf(",",inicio);
intenso = recibido.charAt(inte_pos)-'0';
nombre1 = recibido.substring(inicio, final);
//Serial.print("Inicio:\t");Serial.println(inicio);
//Serial.print("Final :\t");Serial.println(final);
nombre[index]=nombre1;
inten[index]=intenso;
//Serial.print("Nombre:\t");Serial.println(nombre1);
//Serial.print("Intensidad:\t");Serial.println(intenso);
index++;
}
recibido="";
}else {
recibido+=myChar;
}
//Serial.write(myChar);
}
}
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
sendData("AT+RST\r\n",2000,DEBUG); // reset module
sendData("AT+CWMODE=3\r\n",1000,DEBUG); // configure as access point
sendData("AT+RST\r\n",2000,DEBUG); // reset module
Serial.println("Listo");
carga_lista();
}
unsigned long tiempo = millis();
void loop(){
if(millis()-tiempo>10000){
for(int i = 0; i < index; i++){
Serial.print("Nombre:\t"); Serial.println(nombre[i]);
Serial.print("Alcanc:\t"); Serial.println(inten[i]);
Serial.println();
}
index=0;
carga_lista();
tiempo=millis();
}
}
Comento que estoy realizando un servidor Web con este modulo que muestra la señal leída por un HC-SR04. Pero cuando hago la solicitud de datos desde una PC o tablet, los valores se alteran, y se vuelve inestable. Sigo trabajando, pero el codigo quedo en la oficina. Si alguien tiene idea de como solucionarlo les agradeceria.
max-saeta, lo mejor de este módulo es poder usarlo sin un Arduino.
Así tenemos un sistema IoT (Internet de las cosas) por menos de 3€.
En unos días publicaré un paso a paso de un sistema así. Controlar las salidas GPIO via wifi.
Me interesa. Ya que es muy fácil su uso y no requiere mucho para hacerlo funcionar. Pero por ahora lo estoy integrando a proyectos que ya tenia.
Jopapa estuve revisando tu pagina, bastante interesante. Sobretodo lo de la cierra para cortar las baquelitas, creo que te copiare.
Sigo jugando con los codigo. Este es una modificación del de arriba, solo que agrego un LCD/KEYPAD para mostrar las redes. Así pude ir por todo el edificio y buscar donde se original las redes wifi. Jajajaja.
#include <LiquidCrystal.h>
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
#define DEBUG true
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
String mensaje = "";
String recibido = "";
int intensidad = 0;
int contador = 0;
byte index = 0;
byte inten[30];
String nombre[30];
//--------------------------------------------------------------------------------------------------
// RUTINA DEL TECLADO
//--------------------------------------------------------------------------------------------------
int read_LCD_buttons()
{
int adc_key_in = analogRead(0); // read the value from the sensor
if (adc_key_in > 850) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 250) return btnUP;
if (adc_key_in < 450) return btnDOWN;
if (adc_key_in < 650) return btnLEFT;
if (adc_key_in < 850) return btnSELECT;
return btnNONE; // when all others fail, return this...
}
String sendData(String command, const int timeout, boolean debug){
String response = "";
Serial1.print(command); // send the read character to the esp8266
long int time = millis();
while( (time+timeout) > millis()){
while(Serial1.available()){
char c = Serial1.read(); // read the next character.
response+=c;
}
}
if(debug)
{
Serial.print(response);
}
return response;
}
void carga_lista(){
unsigned long C_tiempo= millis();
String command = "AT+CWLAP\r\n";
Serial1.print(command);
}
void serialEvent1(){
String nombre1 ="";
byte intenso = 0;
byte inicio = 0;
byte final = 0;
byte inte_pos = 0;
while(Serial1.available()){
int myChar = Serial1.read();
if(myChar==10){
//Serial.println(recibido);
//Serial1.read();
if(recibido.startsWith("+CWLAP:(")){
inte_pos = recibido.indexOf("(")+1;
inicio = recibido.indexOf("\"")+1;
final = recibido.indexOf("\"",inicio);
intenso = recibido.charAt(inte_pos)-'0';
nombre1 = recibido.substring(inicio, final);
nombre[index]=nombre1;
inten[index]=intenso;
//Serial.println(nombre1);
index++;
}
recibido="";
}else {
recibido+=char(myChar);
}
}
}
void muestra(){
if(index>=0){
lcd.clear();
lcd.print(nombre[contador]);
lcd.setCursor(0,1);
lcd.print("Intensidad: ");lcd.print(inten[contador]);
}
}
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
lcd.begin(16,2);
lcd.print("Wifi Disponibles");
sendData("AT+RST\r\n",2000,DEBUG); // reset module
sendData("AT+CWMODE=3\r\n",1000,DEBUG); // configure as access point
//sendData("AT+RST\r\n",2000,DEBUG); // reset module
Serial.println("Listo");
carga_lista();
if(index>0)muestra();
}
unsigned long tiempo = millis();
void loop(){
switch (read_LCD_buttons()) {
case btnRIGHT:
index=0;
contador=0;
while(read_LCD_buttons()==btnRIGHT){}
carga_lista();
muestra();
break;
case btnUP:
while(read_LCD_buttons()==btnUP){}
if(contador<index-1)contador++;
muestra();
break;
case btnDOWN:
if(contador>0)contador--;
while(read_LCD_buttons()==btnDOWN){}
muestra();
break;
}
}
apoco no se dieron cuenta que así se llama una de las redes?
never mind.
También tengo un modulo de esos, pero no he podido hacer nada, me enrolle un poco con los freemwares que hay disponibles y el trabajo que tengo pendiente.
pero esta interesante tu proyecto, me parece que puedes mostrar el numero de redes disponibles y en otra pantalla, presionando un boton x, un rastreador de señal de una red determinada, con una barra que represente la intensidad de la señal.
con eso puedes rastrear donde hay señal en una casa y/o detectar donde haría falta un repetidor, algo tambien muy util seria ver el canal de la señal, para evitar que la que se va a medir este en un canal cercano a otras.
ya se que eso lo hace un celular pero, quedaría bonito el proyecto.
Yo logre montar un servidor web con este tutorial y el ESP 8266, http://www.prometec.net/servidor-web-esp8266/, lo que no e conseguido es poder resivir imagenes desde este servidor y mostralas en el navegador, si alguien me puede ayudar se los agradeceria mucho.