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.