
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.
- Dispositivo ESP8266
- Módulo De Vibración Arduino
- Ky-037 Microfono Sensor De Sonido Arduino
- Arduino IDE
Diagrama de Circuito de MediNako
Los cuales se conectan como se muestra en el siguiente diagrama:
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
Conectamos ESP32 vía USB a la computadora:
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
Vamos a Herramientas -> Placa: “Arduino” -> Gestor de tarjetas
Buscamos esp82 e instalamos la versión 1.0.4 y damos click en instalar
Ahora vamos a Herramientas-> Placa Generic ESP8266 -> ESP8266 board -> Generic ESP8266 Module
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();
}
}
Buscar el puerto de ESP8266
Abrimos el buscador de aplicación y escribimos “administrador de dispositivos” y damos enter
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.
Vamos a Herramientas-> Puerto->COM5 en nuestro caso quizas el tuyo sea diferente.
Presionamos en este botón para subir el programa
Ave que vuela, a la cazuela.