MEDINAKO 03esp8266

Circuito de MediNako

El Circuito de MediNako es en realidad muy simple, solo se requieren los siguientes componentes muy baratos y fáciles de conseguir.

Diagrama de Circuito de MediNako

Los cuales se conectan como se muestra en el siguiente diagrama:

Circuito de MediNako

Como se logra percatar el dispositivo medinako tiene un Módulo De Vibración Arduino que genera una vibración en el recipiente contenedor y al mismo tiempo el modulo Ky-037 Microfono Sensor De Sonido Arduino recibe las señales de sonido y las manda al Dispositivo ESP8266 que se encarga de enviar las señales al servidor que las interpreta vía inteligencia artificial y retorna el resultado.

Códigos del dispositivo medinako.

Descargar e instalar ESP82 en Arduino

Descargar Arduino desde este link https://www.arduino.cc/en/software

Descargar e Instalar ESP32 en Arduino IDE
Descargar e Instalar ESP32 en Arduino IDE

Conectamos ESP32 vía USB a la computadora:

Conectar ESP32
Conectar ESP32

Configurar ESP32 en Arduino IDE

Agregamos las librerías de ESP32 haciendo click en Archivo -> Preferencias y pegamos este link https://arduino.esp8266.com/stable/package_esp8266com_index.json

Agregar librerías de esp32 en Arduino IDE
Agregar librerías de esp32 en Arduino IDE

Vamos a Herramientas -> Placa: “Arduino” -> Gestor de tarjetas

Menu Gestor de tarjetas
Menu Gestor de tarjetas

Buscamos esp82 e instalamos la versión 1.0.4 y damos click en instalar

image 38

Ahora vamos a Herramientas-> Placa Generic ESP8266 -> ESP8266 board -> Generic ESP8266 Module

image 39

Cargar un código de MediNako

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>
#include <WiFiUdp.h>

//IP DEL SERVIDOR (Cambiar esta ip por la del servidor de IA)
const char* ipServidor = "192.168.100.2";
//Variables
int i = 0;
int statusCode;
const char* ssid = "text";
const char* passphrase = "text";
String st;
String content;
String estadoEntrenar;
// PIN DEL VIBRADOR (5 en esp86 como el 0 en Arduino)
int pinVibrador = 5;
// Alamacenamos el estado del vibrador si esta encendido o apagado
bool estadoVibrador = false;
bool estadoVibradorEntrenar = false;
// Variable que envia dato via udp
WiFiUDP mWiFiUDP;
WiFiUDP mWiFiUDP2;
WiFiUDP mWiFiUDP3;
//Function Decalration
bool testWifi(void);
void launchWeb(void);
void setupAP();
//Establishing Local server at port 80 whenever required
ESP8266WebServer server(80);
//Variables para contar 10 segundos para apagar el grabar sonido
unsigned long tiempo1 = 0;
unsigned long tiempo2 = 0;
unsigned long tiempoSegundos = 0;
void setup()
{
  Serial.begin(115200);
  //APAGAMOS EL LED PARA QUE NO GASTE CORRIENTE (NO SE PORQUE TIENE QUE ESTAR EN HIGH PARA APAGAuR)
  //digitalWrite(2,HIGH);
  //INICIALIZAMOS EL PIN QUE INICIA EL VIBRADOR
  pinMode(pinVibrador, OUTPUT);
  Serial.println("Desconectamos antes de conectar el WiFi");
  WiFi.disconnect();
  //La memoria permanente EEPROM
  EEPROM.begin(512);
  delay(10);
  pinMode(LED_BUILTIN, OUTPUT);
  //Leemos desde la memoria EEPROM el SSID y el pass
  Serial.println("Cargamos el ssid desde la memoria EEPROM");
  String esid;
  for (int i = 0; i < 32; ++i)
  {
    esid += char(EEPROM.read(i));
  }
  Serial.print("SSID: ");
  Serial.println(esid);

  Serial.println("Cargamos el pass desde la memoria EEPROM");
  String epass = "";
  for (int i = 32; i < 96; ++i)
  {
    epass += char(EEPROM.read(i));
  }
  Serial.print("PASS: ");
  Serial.println(epass);

  //Ingresamos el usuario y la contrasena que guardamos previamente en la EEPROM
  WiFi.begin(esid.c_str(), epass.c_str());
  //Si nos pudimos conectar a la red WiFi cerramos el setup
  if ( testWifi() )
  {
    //Iniciamos AP
    WiFi.softAP("Medidor", "");
    Serial.println("Conexion exitosa a Wifi con la ip ");
    Serial.println(WiFi.localIP());
    Serial.print("Calidad de conexion: ");
    Serial.println(WiFi.RSSI());
    //Cargamos todas las paginas en html
    createWebServer();
    //Iniciamos el servicio web
    server.begin();
    return;
  }
  //Si no nos pudimos conectar a la red WiFi
  else
  {
    Serial.println("Activamos el HotSpot");
    //Cargamos la web en donde vamos recibir el ssid y el pass del modem WiFi
    launchWeb();
    //Habilitamos la conexion AP
    setupAP();
  }
  Serial.println("Esperando...");
  //Nos mantenemos a la escucha de que nos hayamos conectado al Modem Wifi
  while ((WiFi.status() != WL_CONNECTED))
  {
    //Serial.print(".");
    delay(100);
    server.handleClient();
  }
}
void loop() {
  //Si el wifi esta conectado enviamos datos de audio via udp
  if ((WiFi.status() == WL_CONNECTED))
  {
    enviarDatosUDP();
    enviarDatosUDPEntrenar();
    delay(5);
  }
}
//Probamos si la conexion al wifi esta activa
bool testWifi()
{
  int c = 0;
  Serial.println("Esperando a que se conecte el WiFi");
  while ( c < 20 ) {
    //Si se esablecio la conexion al WiFi retornamos un true
    if (WiFi.status() == WL_CONNECTED)
    {
      return true;
    }
    delay(500);
    Serial.print("*");
    c++;
  }
  Serial.println("");
  Serial.println("Se termino el tiempo, procedemos a activar AP");
  return false;
}

void launchWeb()
{
  Serial.println("");
  if (WiFi.status() == WL_CONNECTED)
  {
    Serial.println("WiFi connected");
  }
  Serial.print("Local IP: ");
  Serial.println(WiFi.localIP());
  Serial.print("SoftAP IP: ");
  //Serial.println(WiFi.softAPIP());
  createWebServer();
  // Start the server
  server.begin();
  Serial.println("Servidor iniciado");
}
void setupAP()
{
  //Desconectamos el Wifi
  //Obtenemos la cantidad de redes que hay
  int n = WiFi.scanNetworks();
  Serial.println("Escaneo de redes");
  if (n == 0)
  {
    Serial.println("No se encontraron redes");
  }
  else
  {
    Serial.print(n);
    Serial.println(" Redes encontradas");
    for (int i = 0; i < n; ++i)
    {
      // Mostramos SSID y RSSI de cada red
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*");
      delay(10);
    }
  }
  Serial.println("");
  //Variable que mostrara una lista de las redes a las que nos podemos conectar (<ol> es una lista en HTML)
  st = "<ol>";
  for (int i = 0; i < n; ++i)
  {
    // Mostramos SSID y RSSI de cada red encontrada
    st += "<li>";
    st += WiFi.SSID(i);
    st += " (";
    st += WiFi.RSSI(i);
    st += ")";
    st += (WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*";
    st += "</li>";
  }
  st += "</ol>";
  delay(100);
  //Iniciamos el acceso al medidor mediante AP
  WiFi.softAP("Medidor", "");
  Serial.println("softap");
  launchWeb();
}
void createWebServer()
{
  {
    //Si vamos a 192.168.4.1/ econtraremos esta pagina que recibira el ssid y el pass
    server.on("/", []() {
      IPAddress ip = WiFi.softAPIP();
      //Sacamos la ip
      content="";
      String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);
      content += "<html>";
      content += "<div><a href=\"setting\">setting</a></div>";
      content += "<div><a href=\"ESPreset\">ESPreset</a></div>";
      content += "<div><a href=\"ESPrestart\">ESPrestart</a></div>";
      content += "<div><a href=\"listawifi\">listawifi</a></div>";
      content += "<div><a href=\"mode\">mode</a></div>";
      content += "<div><a href=\"encender\">encender</a></div>";
      content += "<div><a href=\"apagar\">apagar</a></div>";
      content += "<div><a href=\"EEPROMborrar\">EEPROMborrar</a></div>";
      content += "<div><a href=\"StaIP\">StaIP</a></div>";
      content += "<div><a href=\"desconectarSTA\">desconectarSTA</a></div>";
      content += "<div><a href=\"mac\">mac</a></div>";
      content += "<div><a href=\"calidad\">calidad</a></div>";
      content += "<div><a href=\"detalles\">detalles</a></div>";
      content += "</html>";
      server.send(200, "text/html", content);
    });
    //Si vamos a 192.168.4.1/scan econtraremos esta pagina que nso mostrara la softAPIP
    server.on("/scan", []() {
      //setupAP();
      IPAddress ip = WiFi.softAPIP();
      String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);

      content = "<!DOCTYPE HTML>\r\n<html>go back";
      server.send(200, "text/html", content);
    });

    server.on("/setting", []() {
      String qsid = server.arg("ssid");
      String qpass = server.arg("pass");
      if (qsid.length() > 0 && qpass.length() > 0) {
        Serial.println("Limpiamos la memmoria EEPROM");
        for (int i = 0; i < 96; ++i) {
          EEPROM.write(i, 0);
        }
        Serial.println(qsid);
        Serial.println("");
        Serial.println(qpass);
        Serial.println("");

        Serial.println("Escribimos en la memoria EEPROM el ssid:");
        for (int i = 0; i < qsid.length(); ++i)
        {
          EEPROM.write(i, qsid[i]);
          Serial.print("Se escribio la letra: ");
          Serial.println(qsid[i]);
        }
        Serial.println("Escribimos en la memoria EEPROM el pass:");
        for (int i = 0; i < qpass.length(); ++i)
        {
          EEPROM.write(32 + i, qpass[i]);
          Serial.print("Se escribio la letra: ");
          Serial.println(qpass[i]);
        }
        EEPROM.commit();
        
        //Ingresamos el usuario y la contrasena que guardamos previamente en la EEPROM
        WiFi.begin(qsid.c_str(), qpass.c_str());
        //Si nos pudimos conectar a la red WiFi cerramos el setup
        if ( testWifi() )
        {
          Serial.println("Conexion exitosa a Wifi con la ip ");
          Serial.println(WiFi.localIP());
          //Cargamos todas las paginas en html
          createWebServer();
          //Iniciamos el servicio web
          server.begin();
        }

      }
      server.sendHeader("Access-Control-Allow-Origin", "*");
      server.send(200, "text/html", WiFi.localIP().toString());
    });
    //Resetear ESP
    server.on("/ESPreset", []() {
      ESP.reset();
    });
    //Reiniciar ESP
    server.on("/ESPrestart", []() {
      server.send(200, "text/html", "1");
      delay(100);
      ESP.restart();
    });

    //Mostrar lista redes wifi
    server.on("/listawifi", []() {
      listawifi();
    });
    //Mostrar el modo si es AP o STA
    server.on("/mode", []() {
      Serial.print("mode:");
      Serial.println(WiFi.getMode());
      if (WiFi.getMode() == WIFI_STA)
      {
        server.send(200, "text/html", "STA");
      }
      if (WiFi.getMode() == 3)
      {
        server.send(200, "text/html", "AP");
      }
    });

    //Mostrar la calidad de conexion del wifi
    server.on("/calidad", []() {
      Serial.print("Calidad de conexion: ");
      Serial.println(WiFi.RSSI());
      char buf[50];      
      ltoa(WiFi.RSSI(), buf, 10);
      server.send(200, "text/html", buf);
    });

    //Mostrar la calidad de conexion del wifi
    server.on("/detalles", []() {
      //char bufCalidad[50];
      //ltoa(WiFi.RSSI(), bufCalidad, 10);
      String bufCalidad = String(WiFi.RSSI(), DEC); 
      String contenidoDetalle;
      contenidoDetalle="";
      contenidoDetalle += "IP estatica:" + WiFi.localIP().toString()+"\\n";
      contenidoDetalle += "MAC:" + WiFi.macAddress()+"\\n";
      contenidoDetalle += "Calidad:" + bufCalidad+"\\n";
      server.send(200, "text/html", contenidoDetalle);
    });
    
    //Si enviamos via web la url /encender encendemos el vibrador
    server.on("/encender", []() {
      encender();
    });
    server.on("/entrenar", []() {
      estadoEntrenar = server.arg("estado");
      entrenar();
    });
    //Si enviamos via web la url /apagar apagamos el vibrador
    server.on("/apagar", []() {
      apagar();
    });
    //Limpiamos la memmoria EEPROM
    server.on("/EEPROMborrar", []() {
      server.send(200, "text/html", "1");
      Serial.println("Limpiamos la memmoria EEPROM");
      for (int i = 0; i < 96; ++i) {
        EEPROM.write(i, 0);
      }
      EEPROM.commit();
      delay(100);
    });
    //Mostrar lista redes wifi
    server.on("/StaIP", []() {
      server.send(200, "text/html", WiFi.localIP().toString());
    });
    server.on("/desconectarSTA", []() {
      WiFi.mode(WIFI_STA);
      WiFi.disconnect();
      delay(100);
      server.send(200, "text/html", "Sta desconectado");
    });
    server.on("/mac", []() {
      //server.send(200, "text/html", WiFi.macAddress().c_str());
      server.send(200, "text/html", WiFi.macAddress());
    });
  }
}
void encender() {
  //ENCENDEMOS EL VIBRADOR
  server.send(200, "text/html", "1");
  Serial.println("encender");
  digitalWrite(pinVibrador, HIGH);
  mWiFiUDP2.beginPacket(ipServidor, 80);
  //Enviamos un paquete para prepara el servidor
  mWiFiUDP.write('1');
  mWiFiUDP2.write('1');
  mWiFiUDP3.write('1');
  mWiFiUDP.endPacket();
  mWiFiUDP2.endPacket();
  mWiFiUDP3.endPacket();
  delay(100);
  //mandamos la macAddress y el estado al al principio del los paquetes
  mWiFiUDP.write(WiFi.macAddress().c_str());
  mWiFiUDP2.write(WiFi.macAddress().c_str());
  mWiFiUDP3.write(WiFi.macAddress().c_str());
  mWiFiUDP.endPacket();
  mWiFiUDP2.endPacket();
  mWiFiUDP3.endPacket();
  estadoVibrador = true;
  //Tomamos el tiempo actual para contar una cuenta regresiva y apagar el dispositivo
  tiempo1 = millis();
}
void entrenar() {
  //ENCENDEMOS EL VIBRADOR
  server.send(200, "text/html", "1");
  Serial.println("entrenar");
  digitalWrite(pinVibrador, HIGH);
  estadoVibradorEntrenar = true;
  //Tomamos el tiempo actual para contar una cuenta regresiva y apagar el dispositivo
  tiempo1 = millis();
  //ip del dispositivo que recibira el audio
  mWiFiUDP2.beginPacket(ipServidor, 8080);
  //Enviamos un paquete para prepara el servidor
  mWiFiUDP.write('1');
  mWiFiUDP2.write('1');
  mWiFiUDP3.write('1');
  mWiFiUDP.endPacket();
  mWiFiUDP2.endPacket();
  mWiFiUDP3.endPacket();
  delay(100);
  //mandamos la macAddress y el estado al al principio del los paquetes
  mWiFiUDP.write(WiFi.macAddress().c_str());
  mWiFiUDP2.write(WiFi.macAddress().c_str());
  mWiFiUDP3.write(WiFi.macAddress().c_str());
  mWiFiUDP.endPacket();
  mWiFiUDP2.endPacket();
  mWiFiUDP3.endPacket();
  //Enviamos el estado (lleno,medio,vacio)
  mWiFiUDP.write(estadoEntrenar.c_str());
  mWiFiUDP2.write(estadoEntrenar.c_str());
  mWiFiUDP3.write(estadoEntrenar.c_str());
  mWiFiUDP.endPacket();
  mWiFiUDP2.endPacket();
  mWiFiUDP3.endPacket();
}
void apagar() {
  //APAGAMOS EL VIBRADOR
  server.send(200, "text/html", "0");
  Serial.println("apagar");
  digitalWrite(pinVibrador, LOW);
  estadoVibrador = false;
  //mandamos la macAddress al final del los paquetes
  mWiFiUDP.write(WiFi.macAddress().c_str());
  mWiFiUDP2.write(WiFi.macAddress().c_str());
  mWiFiUDP3.write(WiFi.macAddress().c_str());
  mWiFiUDP.endPacket();
  mWiFiUDP2.endPacket();
  mWiFiUDP3.endPacket();
}
void apagarEntrenar() {
  //APAGAMOS EL VIBRADOR
  server.send(200, "text/html", "0");
  Serial.println("apagar entrenar");
  digitalWrite(pinVibrador, LOW);
  estadoVibradorEntrenar = false;
}


void listawifi()
{
  int n = WiFi.scanNetworks();
  String contenidoLista;
  contenidoLista = "{\"data\": [";
  for (int i = 0; i < n; ++i)
  {
    // Mostramos contenido
    contenidoLista += "{";
    contenidoLista += "\"ssid\":";
    contenidoLista += "\"" + WiFi.SSID(i) + "\"";
    contenidoLista += "},";
  }
  contenidoLista += "]}";
  server.send(200, "text/html", contenidoLista);
}

void enviarDatosUDP() {
  //Nos mantenemos a la escucha de los que se reciba via web
  server.handleClient();
  //Si la variable estadoVibrador esta en true enviamos datos (audio) hacia la ip del telefono (o dispositivo)
  if (estadoVibrador == true) {
    tiempo2 = millis();
    //Si ha pasado 10 segundos apagamos el dispositivo
    if (tiempo2 > (tiempo1 + 10000)) {
      tiempo1 = millis(); //Actualiza el tiempo actual
      tiempoSegundos = tiempo1 / 1000;
      apagar();
    }

    //ip del dispositivo que recibira el audio
    mWiFiUDP2.beginPacket(ipServidor, 80);
    //Dividimos los paquetes de 1024 en 1024
    for (int i = 0; i < 1024; i++) {
      float analog = analogRead(17);
      //Serial.println(analog);

      analog = ((analog / 1) - 385);
      if (analog > 255) {
        analog = 255;
      }
      
      else if (analog < 0) {
        analog = 0;
      }
      
      mWiFiUDP.write(int(analog));
      mWiFiUDP2.write(int(analog));
      mWiFiUDP3.write(int(analog));
      //Serial.println(int(analog));
    }
    //Serial.println(WiFi.macAddress());
    mWiFiUDP.endPacket();
    mWiFiUDP2.endPacket();
    mWiFiUDP3.endPacket();
  }
}
void enviarDatosUDPEntrenar() {
  //Nos mantenemos a la escucha de los que se reciba via web
  server.handleClient();
  //Si la variable estadoVibrador esta en true enviamos datos (audio) hacia la ip del telefono (o dispositivo)
  if (estadoVibradorEntrenar == true) {
    tiempo2 = millis();
    //Si ha pasado 10 segundos apagamos el dispositivo
    if (tiempo2 > (tiempo1 + 23000)) {
      tiempo1 = millis(); //Actualiza el tiempo actual
      tiempoSegundos = tiempo1 / 1000;
      apagarEntrenar();
    }

    //ip del dispositivo que recibira el audio
    mWiFiUDP2.beginPacket(ipServidor, 8080);
    //Dividimos los paquetes de 1024 en 1024
    for (int i = 0; i < 1024; i++) {
      float analog = analogRead(17);
      //Serial.println(analog);

      analog = ((analog / 1) - 385);
      if (analog > 255) {
        analog = 255;
      }
      else if (analog < 0) {
        analog = 0;
      }
      mWiFiUDP.write(int(analog));
      mWiFiUDP2.write(int(analog));
      mWiFiUDP3.write(int(analog));
      //Serial.println(int(analog));
    }
    //Serial.println(WiFi.macAddress());
    mWiFiUDP.endPacket();
    mWiFiUDP2.endPacket();
    mWiFiUDP3.endPacket();
  }
}

programadornovato/medinako_esp8266: Codigo .ino que administra el enviar audios generados (github.com)

Buscar el puerto de ESP8266

Abrimos el buscador de aplicación y escribimos “administrador de dispositivos” y damos enter

image 17
Abrir “administrador de dispositivos”

Buscamos en la categoría Puertos (COM) el nuevo puerto que se creó. Si no lo ubicamos, desconectamos y conectamos la cámara espía.

Categoría Puertos (COM)
Categoría Puertos (COM)

Vamos a Herramientas-> Puerto->COM5 en nuestro caso quizas el tuyo sea diferente.

image 9

Presionamos en este botón para subir el programa

image 10

Los comentarios están cerrados.