Bienvenido, Invitado
Tienes que registrarte para poder participar en nuestro foro.

Nombre de usuario
  

Contraseña
  





Buscar en los foros

(Búsqueda avanzada)

Estadísticas del foro
» Miembros: 116
» Último miembro: Mike Oakman
» Temas del foro: 53
» Mensajes del foro: 83

Estadísticas totales

Usuarios en línea
Actualmente hay 20 usuarios en línea.
» 0 miembro(s) | 19 invitado(s)
Bing

Últimos temas
very good
Foro: Charla general
Último mensaje por: Frbetsar
30-03-2024, 12:15
» Respuestas: 0
» Vistas: 214
Desempaquetar y empaqueta...
Foro: Android
Último mensaje por: Danielsip
14-02-2024, 12:07
» Respuestas: 16
» Vistas: 30,994
Web scraping con python B...
Foro: Python
Último mensaje por: chujalt
12-09-2023, 20:29
» Respuestas: 2
» Vistas: 4,843
Web scraping con python y...
Foro: Python
Último mensaje por: blackcatiswhite
12-09-2023, 10:32
» Respuestas: 1
» Vistas: 3,854
solicitud tablet Point of...
Foro: Android
Último mensaje por: chujalt
28-03-2022, 21:10
» Respuestas: 3
» Vistas: 8,141
Presentacion
Foro: Presentaciones
Último mensaje por: chujalt
28-03-2022, 17:31
» Respuestas: 1
» Vistas: 5,868
Desempaquetar y empaqueta...
Foro: Android
Último mensaje por: trasnoastur
08-12-2021, 21:00
» Respuestas: 5
» Vistas: 18,756
Presentación
Foro: Presentaciones
Último mensaje por: chujalt
08-12-2021, 20:08
» Respuestas: 1
» Vistas: 5,117
Python, insertar saltos d...
Foro: Python
Último mensaje por: chujalt
03-08-2021, 20:00
» Respuestas: 0
» Vistas: 3,623
Problemas instalar Linux ...
Foro: Linux
Último mensaje por: chujalt
03-08-2021, 19:55
» Respuestas: 1
» Vistas: 6,215

 
  Menú de opciones en bash.
Enviado por: chujalt - 07-03-2021, 21:48 - Foro: Bash - Sin respuestas

Saludos.

Vamos a hacer un menú de opciones en bash, es un menú bastante sencillo, pero demuestra todo el potencial que tiene.

El script es este:

Código:
#!/bin/bash

MENU="SELECCIONAR UNA OPCION DEL MENU: "
while :
do
  echo -e " \e[101;92m MENU PRINCIPAL \e[0m"
  PS3=$MENU

  select option in "Menu 1" "Menu 2" "Menu 3" "salir"
  do
    case $REPLY in 
      1) # menu 1
         echo -e "\e[30;107m Has pulsado la opcion $option \e[0m"
         sleep 2
         clear
         break
         ;;
      2) # menu 2
         echo -e " \e[30;107m Has pulsado la opcion $option \e[0m"
         sleep 2
         clear
         break
         ;;
      3) # menu 3
         echo -e " \e[30;107m Has pulsado la opcion $option \e[0m"
         sleep 2
         clear
         break
         ;;
      4) # salir
         clear
         break 2  #  sale del script
         ;;
      *) # tecla erronea
         echo -e "\e[1;31mHas pulsado una tecla erronea [${REPLY}]\e[0m"
         sleep 2
         clear
         break
         ;;
    esac
  done
done

exit 0
 

Al ejecutarlo nos saldrá este menú en la ventana del terminal

[Imagen: terminal_1.png]



Como vemos tenemos 4 opciones, menú 1, 2, 3 y la opción de salir. Vamos a pulsar la opción 1


[Imagen: terminal_2.png]



Si pulsamos la opción 4 saldremos del programa y si pulsamos cualquier otra tecla que no sea de las cuatro opciones nos informará que hemos pulsado una tecla errónea y tendremos la oportunidad de volver a seleccionar una opción.

Saludos.

Imprimir

  Enumerar - renombrar archivos de directorio en bash.
Enviado por: chujalt - 07-03-2021, 21:46 - Foro: Bash - Sin respuestas

Saludos.

Vamos a ver un script en bash el cual ordena los archivos de un directorio, lo que hace es enumerarlos, es decir, mantiene el nombre del fichero pero le pone delante el número de orden, 1-_-unarchivo, 2-_-otroarchivo... etc.

Primero veamos el script y luego comentamos:

Código:
#!/bin/sh
i=1
for f in *.*
do
  renombrar="$i"-_-"${f#*}"
  mv "$f" "$renombrar"
  i=$((i+1))
done


Este script se debe ejecutar en el directorio donde están los archivos a enumerar.

El script enumera todos los archivos del directorio, pero si queremos que, por ejemplo, sólo enumere los archivos con extensión mp3 deberemos cambiar la línea for f in *.* por for f in *.mp3 

Otro ejemplo, vamos a suponer que en ese directorio hay varios tipos de archivos (mp3, mp4, wav) y queremos enumerarlos por separado. Entonces vamos a reservar la serie 1000 para los archivos mp3, la serie 2000 para mp4... etc. Entonces cambiaremos la línea que hemos comentado antes y donde pone i=1 lo cambiaremos por i=1000, para los archivos mp4 cambiaremos for f in *.* por for f in *.mp4 e i=1 por i=2000 y así sucesivamente.

Ahora vamos a suponer que por cualquier razón, por ejemplo que tenemos archivos nuevos y hay que borrar la numeración para luego volver a enumerarlos, entonces ejecutaremos este script:

Código:
#!/bin/sh
for f in *.*
do
  renombrar=${f##*-_-}
  mv "$f" "$renombrar"
done


Esto dejará el archivo con su nombre original, sin la numeración. Acordaros que como está el script quitará la numeración a todos los archivos, si queréis hacerlo en una extensión en concreto deberéis ponerla.

Bueno, ya está, espero que le sirva a alguien.

Saludos.

Imprimir

  Web scraping con python y selenium.
Enviado por: chujalt - 07-03-2021, 21:44 - Foro: Python - Respuestas (1)

Saludos.

Vamos a utilizar python y selenium (que es una librería de python) para loguearnos y escribir un post en un foro, todo ello de manera automática.

El script está probado en este mismo foro y funciona perfectamente, aunque en el que se publica aquí he puesto una dirección ficticia.

Lo que vamos a necesitar es, además de tener python instalado, instalarnos la librería selenium

Código:
sudo pip install selenium

y tener el controlador geckodriver, lo podeís bajar de AQUÍ.

Este trabajo está hecho bajo entorno linux y hay que tener ciertas nociones de html porque selenium busca entre los tags para poder trabajar. Lo que busca son elementos por name, id, texto del enlace, texto parcial del enlace, xpath, CSS, tagname y Classname.

Voy a poner en script completo y luego iremos linea por linea.

Código:
#!/usr/bin/env python    
from selenium import webdriver
import time
driver = webdriver.Firefox(executable_path='/home/chujalt/geckodriver')
driver.get('https://paginaweb.com')
link = driver.find_element_by_link_text('Iniciar sesión').click()
time.sleep(2)
driver.find_element_by_id('quick_login_username').send_keys("Pepito")
driver.find_element_by_id('quick_login_password').send_keys("contraseña_de_Pepito")
driver.find_element_by_name('submit').click()
time.sleep(5)
driver.find_element_by_link_text('Chistes').click()
time.sleep(2)
driver.find_element_by_class_name('new_thread_button').click()
time.sleep(5)
driver.find_element_by_name('subject').send_keys("Chiste de Pepito")
driver.find_element_by_xpath("//iframe").send_keys("Hola, este es mi primer chiste")
driver.find_element_by_name('submit').click()
time.sleep(2)
driver.close()

Importamos webdriver de selenium
Código:
from selenium import webdriver

Importamos Time
Código:
import time

Vamos a trabajar con Firefox y le decimos donde está el ejecutable geckodriver
Código:
driver = webdriver.Firefox(executable_path='/home/chujalt/geckodriver')

Le decimos la página web a abrir
Código:
driver.get('https://paginaweb.com')

Buscamos un enlace que tenga el texto "Iniciar sesión" y que lo pulse
Código:
link = driver.find_element_by_link_text('Iniciar sesión').click()

Esperamos 2 segundos a que se cargue la página de autentificación
Código:
time.sleep(2)

En el formulario, la id de la caja de texto donde va el usuario es "quick_login_username" y le enviamos nuestro usuario
Código:
driver.find_element_by_id('quick_login_username').send_keys("Pepito")

En el formulario, la id de la caja de texto donde va la contraseña es "quick_login_password" y le enviamos nuestra contraseña
Código:
driver.find_element_by_id('quick_login_password').send_keys("contraseña_de_Pepito")

En el formulario, el botón de enviar el name es "submit" y hacemos click en él
Código:
driver.find_element_by_name('submit').click()

Esperamos 5 segundos a que la autentificación se realice y se vuelva a cargar la página
Código:
time.sleep(5)

Vamos a postear un chiste, por lo que vamos a ir a la sección chistes, buscamos un enlace con el texto "Chistes" y hacemos click en él
Código:
driver.find_element_by_link_text('Chistes').click()

Esperamos 2 segundos a que se cargue la sección chistes
Código:
time.sleep(2)

El botón para crear un nuevo hilo es una class con el nombre "new_thread_button" lo buscamos y hacemos click en él
Código:
driver.find_element_by_class_name('new_thread_button').click()

Esperamos 5 segundos a que se cargue la caja para hacer los post
Código:
time.sleep(5)

En la caja para hacer posts, la caja de texto para poner el título del post tiene el name "subject", lo buscamos y enviamos el título
Código:
driver.find_element_by_name('subject').send_keys("Chiste de Pepito")

El post en si está en un iframe, lo buscamos por el path, que puede ser absoluto o relativo (es este caso relativo), y le enviamos el texto
Código:
driver.find_element_by_xpath("//iframe").send_keys("Hola, este es mi primer chiste")

Hacemos click en el botón de envío cuyo name es submit
Código:
driver.find_element_by_name('submit').click()

Esperamos 2 segundos para que se realice la grabación del post
Código:
time.sleep(2)

Y cerramos el navegador y la aplicación
Código:
driver.close()

Con esto habremos conseguido identificarnos y realizar un post.
Saludos.

Imprimir

  Web scraping con python BeautifulSoup y MySql.
Enviado por: chujalt - 07-03-2021, 21:43 - Foro: Python - Respuestas (2)

Saludos.

Vamos a recoger los datos que nos interesan de una página web y los vamos a meter en una base de datos MySql para su almacenamiento y posteriormente tratar esos datos como mas nos convenga.

Yo trabajo en entorno linux, pero bajo Windows o MAc debería funcionar igual.

Para poder realizar este trabajo necesitaremos tener instalado MySql en nuestro PC. Además, entre otras librerías tenemos que tener instalada la de BeautifulSoup y el conector a la base de datos MySql

Código:
sudo pip install beautifulsoup4

sudo pip install mysql-connector

En este ejemplo vamos a trabajar con la página de la Bolsa de Madrid, si la quieres ver PULSA AQUI, concretamente en la sección donde nos da la información de las cotizaciones de las empresas del Ibex 35. Esta información se actualiza cada 15 minutos, pero nosotros vamos a ejecutar nuestro script a la hora de cierre para saber como han cerrado las cotizaciones día por día.

Yo he creado una base de datos llamada "ibex35" con una tabla llamada "diario" y en esta tabla 9 campos, id, nombre, fecha, ultimo, diferencia, max, min, volumen y efectivo.

Voy a poner el script completo y luego comentaremos por bloques.

Código:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
from bs4 import BeautifulSoup
import requests
from functools import reduce
import os
import mysql.connector
import datetime
website_url = requests.get("http://www.bolsamadrid.es/esp/aspx/Mercados/Precios.aspx?indice=ESI100000000&punto=indice").text
soup = BeautifulSoup(website_url,'lxml')
soup = soup.find('table',{'id':'ctl00_Contenido_tblAcciones'})
rows = soup.findAll("tr")[1:]
headers = {}
thead = soup.findAll("th")
for i in range(len(thead)):
   headers[i] = thead[i].text.strip().lower()
data = []
for row in rows:
   cells = row.find_all("td")
   item = {}    
   for i in headers:
       item[headers[i]] = cells[i].text  
   data.append(item)
pepe = json.dumps (data, indent=4)
diccionario = [
("\\u00fa", "u"),
("\\u00ed", "i"),
("\\u00e1", "a"),
("\\u20ac", "€")  
]
salida = reduce(lambda a, kv: a.replace(*kv), diccionario, pepe)
data = json.loads(salida)
mydb = mysql.connector.connect(
 host="localhost",
 user="usuario",
 passwd="contraseña",
 database="ibex35"
)
mycursor = mydb.cursor()
for device in data:
  fecha = datetime.datetime.strptime(device["fecha"], '%d/%m/%Y')
  sql = "INSERT INTO diario (nombre, fecha, ultimo, diferencia, max, min, volumen, efectivo) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"
  val = (device["nombre"], fecha, device["ult."].replace(".", "").replace(",", "."), device["% dif."].replace(".", "").replace(",", "."), device["max."].replace(".", "").replace(",", "."), device["min."].replace(".", "").replace(",", "."), device["volumen"].replace(".", "").replace(",", "."), device["efectivo (miles €)"].replace(".", "").replace(",", "."))
  mycursor.execute(sql, val)
  mydb.commit()
  print(mycursor.rowcount, "Datos de ",device["nombre"]," introducidos correctamente")
print ("Todos los datos han sido introducidos correctamente")



BLOQUE 1

Código:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import json
from bs4 import BeautifulSoup
import requests
from functools import reduce
import os
import mysql.connector
import datetime
website_url = requests.get("http://www.bolsamadrid.es/esp/aspx/Mercados/Precios.aspx?indice=ESI100000000&punto=indice").text
soup = BeautifulSoup(website_url,'lxml')
soup = soup.find('table',{'id':'ctl00_Contenido_tblAcciones'})

En este bloque cargamos todas las librerías necesarias, cargamos la página y metemos en una variable la tabla que nos interesa, concretamente la que tiene id = ctl00_Contenido_tblAcciones.



BLOQUE 2 

Código:
rows = soup.findAll("tr")[1:]
headers = {}
thead = soup.findAll("th")
for i in range(len(thead)):
   headers[i] = thead[i].text.strip().lower()
data = []
for row in rows:
   cells = row.find_all("td")
   item = {}    
   for i in headers:
       item[headers[i]] = cells[i].text  
   data.append(item)
pepe = json.dumps (data, indent=4)  

En este bloque con todos los datos almacenados de la tabla creamos un json con la estructura cabecera tabla / valor, eso por cada fila de la tabla.



BLOQUE 3 

Código:
diccionario = [
("\\u00fa", "u"),
("\\u00ed", "i"),
("\\u00e1", "a"),
("\\u20ac", "€")  
]
salida = reduce(lambda a, kv: a.replace(*kv), diccionario, pepe)
data = json.loads(salida)
mydb = mysql.connector.connect(
 host="localhost",
 user="usuario",
 passwd="contraseña",
 database="ibex35"
)
mycursor = mydb.cursor()
for device in data:
  fecha = datetime.datetime.strptime(device["fecha"], '%d/%m/%Y')
  sql = "INSERT INTO diario (nombre, fecha, ultimo, diferencia, max, min, volumen, efectivo) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"
  val = (device["nombre"], fecha, device["ult."].replace(".", "").replace(",", "."), device["% dif."].replace(".", "").replace(",", "."), device["max."].replace(".", "").replace(",", "."), device["min."].replace(".", "").replace(",", "."), device["volumen"].replace(".", "").replace(",", "."), device["efectivo (miles €)"].replace(".", "").replace(",", "."))
  mycursor.execute(sql, val)
  mydb.commit()
  print(mycursor.rowcount, "Datos de ",device["nombre"]," introducidos correctamente")
print ("Todos los datos han sido introducidos correctamente")

En este bloque lo primero que hacemos, como la página web tiene acentos y python no es amigo de ellos, ha escrito símbolos raros en las palabras que tenían acentos, cambiamos esos símbolos por las sílabas pero sin los acentos.
Volvemos a cargar en json, conectamos con la base de datos y hacemos un bucle for para hacer insert por cada fila de la tabla.

Nótese que debemos de hacer varios "replace" pues la información de la página nos da los miles en puntos y los decimales con comas, cosa que no admite la base de datos mysql, por lo que quitamos los puntos y las comas las transformamos en puntos. También transformamos el campo fecha en tipo "date".

Bueno, ya está, espero que le sirva a alguien.

Saludos.

Imprimir

  Wemos mini, controlar servo via wifi.
Enviado por: chujalt - 06-03-2021, 13:16 - Foro: Anduino, Nodemcu, Wemos - Sin respuestas

Saludos.

Recientemente he adquirido una placa Wemos mini D1 y me parece increíble que con lo pequeña que es, lo funcional que resulta, con wifi integrado y todo (ESP8266). Fijaros en la foto de mas abajo su tamaño, el cable conectado a ella es un micro-usb. El precio también es muy atractivo, por unos 3 € la podéis encontrar.

Con ella vamos a controlar el giro de un servo vía wifi desde una página web.


Material necesario:

  • Una placa Wemos mini D1.
  • Un Micro Servo 9G

[Imagen: wemosmini.jpg]


[Imagen: servo.jpg]




Conexiones:

  • Pin cable amarillo del servo al pin D7 de la Wemos mini.
  • Pin cable rojo del servo al pin 5v de la Wemos mini.
  • Pin cable marrón del servo al pin GND de la Wemos mini.


Página web para controlar el servo:
Código:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//ES" "http://www.w3.org/TR/html4/strict.dtd">
<html>
 <head>
   <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
   <title>Control servo</title>
<style type="text/css">
#juan {
   position: absolute;
   left: 50%;
   top: 50%;
   transform: translate(-50%, -50%);
   -webkit-transform: translate(-50%, -50%);
}
</style>
 </head>
 <body>
<div id="juan">
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=000';" value="000" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=005';" value="005" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=010';" value="010" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=015';" value="015" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=020';" value="020" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=025';" value="025" /></br>
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=030';" value="030" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=035';" value="035" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=040';" value="040" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=045';" value="045" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=050';" value="050" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=055';" value="055" /></br>
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=060';" value="060" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=065';" value="065" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=070';" value="070" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=075';" value="075" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=080';" value="080" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=085';" value="085" /></br>
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=090';" value="090" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=095';" value="095" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=100';" value="100" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=105';" value="105" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=110';" value="110" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=115';" value="115" /></br>
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=120';" value="120" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=125';" value="125" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=130';" value="130" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=135';" value="135" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=140';" value="140" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=145';" value="145" /></br>
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=150';" value="150" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=155';" value="155" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=160';" value="160" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=165';" value="165" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=170';" value="170" />
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=175';" value="175" /></br>
  <input type="button" onclick="location.href='http://192.168.1.111/angulo=180';" value="180" />
</div>

</body>
</html>



Imagen de la página web:

[Imagen: grados.png]



Código Wemos mini:
Código:
//Conexiones
//Amarillo: D7
//Rojo: 3V
//Marrón: GND
#include <Servo.h>
#include <ESP8266WiFi.h>
const int servo_pin = D7;
Servo myservo;  
unsigned int old_value;
const char* ssid = "Tu_ssid";
const char* password = "Tu_contraseña";
IPAddress ip(192,168,1,111);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
WiFiServer server(80);

void setup()
{
 Serial.begin(115200);
 delay(10);
myservo.attach(servo_pin);
  old_value = 90;
WiFi.begin(ssid, password);
 WiFi.config(ip, gateway, subnet);
 
 server.begin();
}

String f = "";
void loop() {

 WiFiClient client = server.available();
 if (!client) {
   return;
 }


 Serial.println("new client");
 while(!client.available()){
   delay(1);
 }

 String request = client.readStringUntil('\r');
 client.flush();


  char i1 = request.indexOf("GET /angulo="), i2;
  if (i1 != -1)
    i2 = request.indexOf(" ", i1+12);
    f = request.substring(i1+12, i2);
int g = f.toInt();

   
  if ((0 <= g) && (g <= 180)) {
       
     if (g < old_value)
      {  
     for(int i = old_value ; i > g ; i -= 1)
        {
        myservo.write(i);
        delay(15);
        }
        old_value = g;
      }
     
    if (g > old_value)
      {
      for(int i = old_value ; i < g ; i += 1)
        {
        myservo.write(i);
        delay(15);
        }
        old_value = g;
     }

  }  


delay(100);
client.println("HTTP/1.1 200 OK");
 client.println("Content-Type: text/html");
 client.println("");
 client.println("<!DOCTYPE HTML>");
 client.println("<html>");
 client.print("<body onload='history.back();'>\n");
 client.println("</body>");
 client.println("</html>");

 delay(1);
}



Comentario del código:
  • Se incluyen las librerías necesarias.
  • Se indica el pin del servo.
  • Se dan todos los parámetros para la conexión wifi. En este caso a la placa le hemos asignado la dirección IP 192.168.1.111.
  • Se inicia el servo y la conexión wifi.
  • Se recibe mediante el método GET los parámetros enviados desde la página web y se desecha todo menos lo que nos interesa, que es el número de grados.
  • Una vez captado ese número, se envía al servo para que gire esos grados.
  • La placa envía al navegador una pequeña página web con un "history.back()" para que nos vuelva a mostrar el teclado de manera inmediata.

Bueno, ya está, espero que a alguien le sirva.


Saludos

Imprimir

  Instalar micropython en Wemos Mini.
Enviado por: chujalt - 06-03-2021, 13:14 - Foro: Anduino, Nodemcu, Wemos - Sin respuestas

Saludos.

Vamos a explicar como instalar una versión de micropython en nuestro Wemos Mini. Este tutorial está explicado para hacerlo en un sistema operativo LINUX.

Yo he utilizado un Wemos Mini D1.

[Imagen: wemosmini.jpg]


En primer lugar tenemos que bajarnos una herramienta que se llama esptool mediante el comando pip. Abrimos un terminal y escribimos:

Código:
sudo pip install esptool

En muchos sitios de internet pone que esta herramienta funciona bajo python 2.7, pero eran las versiones antiguas, ahora funciona en cualquier versión de python, yo trabajo con la 3.5

Una vez instalado esptool conectamos nuestro Wemos Mini al PC y tecleamos:

Código:
sudo esptool.py flash_id


[Imagen: micropython_1.png]

Como veis, sale varia información, entre ellas el tamaño de la memoria y el puerto serie al que está conectado, en mi caso /dev/ttyUSB0

Opcionalmente le doy permisos a ese puerto serie para luego no estar logeándome como sudo en todos los pasos siguientes:

Código:
sudo chmod 777 /dev/ttyUSB0

Vamos a bajarnos la versión de micropython de la siguiente dirección http://micropython.org/download#esp8266, yo me bajé la que pone entre paréntesis latest, que es la última.

Ahora vamos a flashear la memoria del Wemos Mini, tecleamos:

Código:
esptool.py --port /dev/ttyUSB0 erase_flash

Si todo ha ido bien no os dará ningún mensaje de error y os informará que la memoria ha sido flasheada. El proceso dura poco, unos 10 segundos.

Seguidamente cargamos micropython en nuestro Wemos Mini (el archivo que nos hemos bajado antes) tecleamos:

Código:
esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 /home/chujalt/esp8266-20180511-v1.9.4.bin

Lógicamente cambiar la ruta donde tenéis vuestro archivo. OJO este comando es el que sale en la página oficial de micropython, si carga correctamente, pero luego, a la hora de comprobar por consola si funcionaba micropython (último paso de este tutorial), no sale nada, volved a flashear la memoria y probad con estos comandos:

Código:
esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash --flash_mode=dout --flash_size=detect 0 /home/chujalt/esp8266-20180511-v1.9.4.bin

Si no os da errores os dirá que ya está cargado micropython.

Ahora toca comprobar que funciona correctamente, hay varios programas para comunicarnos con el puerto serie, screen, minicom, picocom..... Yo he utilizado screen. Si no lo tenéis instalado:

Código:
sudo apt install screen

 
Una vez instalado, tecleamos:
Código:
screen /dev/ttyUSB0 115200

Se quedará la pantalla en negro, pulsamos el botón reset de nuestro Wemos Mini para que se reseté, y si todo ha ido bien nos saldrá el promt de micropyton.

[Imagen: micropython_2.png]

Bueno, ya está, espero que le sirva a alguien.
Saludos.

Imprimir

  Controlar color de led rgb vía wifi con Nodemcu.
Enviado por: chujalt - 06-03-2021, 13:11 - Foro: Anduino, Nodemcu, Wemos - Sin respuestas

Saludos....

En esta ocasión vamos a realizar un sistema para controlar desde una página web el color que mostrará un led rgb. Para ello necesitaremos dos tipos de código, el de la página web y el del Nodemcu (que al estar hecho para cargar con la Arduino IDE también sirve para Arduino).


Materiales utilizados

  • Una placa Nodemcu (yo he utilizado la V2).
  • 4 Cables dupont.
  • Un led rgb Keyes

[Imagen: nodemcu.jpg]


[Imagen: led_rgb.jpg]



Conexiones
  • Pin GND del Nodemcu al pin V/G del led rgb.
  • Pin D1 del Nodemcu al pin R del led rgb.
  • Pin D2 del Nodemcu al pin G del led rgb.
  • Pin D3 del Nodemcu al pin B del led rgb.


Código página Web:
Código:
<!DOCTYPE html>
<html lang="es"><head>

<meta charset="utf-8">
<title>Tabla colores</title>



<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style>
table {
   width: 50%;
   height: 200px;
      text-align: left;
      margin-left: auto;
      margin-right: auto;
}
.link a{
display:block;
height:100%;
}
</style>
</head><body><br>
<div style="text-align: center;">
<h4><big><big>TABLA DE COLORES</big></big></h4>
<br>
</div>

<table border="1" cellpadding="0" cellspacing="0">

<tbody>
  <tr>
    <td style="vertical-align: top; background-color: rgb(255,255,255);" class="link"><a href="http://192.168.1.222/color=255255255"> </a><br>
    </td>
    <td style="vertical-align: top; background-color: rgb(153,153,153);" class="link"><a href="http://192.168.1.222/color=153153153"> </a><br>
    </td>
    <td style="vertical-align: top; background-color: rgb(0,0,0);" class="link"><a href="http://192.168.1.222/color=000000000"> </a><br>
    </td>
    <td style="vertical-align: top; background-color: rgb(255,0,0);" class="link"><a href="http://192.168.1.222/color=255000000"> </a><br>
    </td>
    <td style="vertical-align: top; background-color: rgb(102,0,0);" class="link"><a href="http://192.168.1.222/color=102000000"> </a><br>
    </td>
  </tr>
  <tr>
    <td style="vertical-align: top; background-color: rgb(255,153,0);" class="link"><a href="http://192.168.1.222/color=255153000"> </a><br>
    </td>
    <td style="vertical-align: top; background-color: rgb(153,51,0);" class="link"><a href="http://192.168.1.222/color=153051000"> </a><br>
    </td>
    <td style="vertical-align: top; background-color: rgb(255,204,102);" class="link"><a href="http://192.168.1.222/color=255204102"> </a><br>
    </td>
    <td style="vertical-align: top; background-color: rgb(153,102,51);" class="link"><a href="http://192.168.1.222/color=153102051"> </a><br>
    </td>
    <td style="vertical-align: top; background-color: rgb(255,255,0);" class="link"><a href="http://192.168.1.222/color=255255000"> </a><br>
    </td>
  </tr>
  <tr>
    <td style="vertical-align: top; background-color: rgb(102,102,0);" class="link"><a href="http://192.168.1.222/color=102102000"> </a><br>
    </td>
    <td style="vertical-align: top; background-color: rgb(51,255,51);" class="link"><a href="http://192.168.1.222/color=051255051"> </a><br>
    </td>
    <td style="vertical-align: top; background-color: rgb(0,102,0);" class="link"><a href="http://192.168.1.222/color=000102000"> </a><br>
    </td>
    <td style="vertical-align: top; background-color: rgb(102,204,204);" class="link"><a href="http://192.168.1.222/color=102204204"> </a><br>
    </td>
    <td style="vertical-align: top; background-color: rgb(51,102,102);" class="link"><a href="http://192.168.1.222/color=051102102"> </a><br>
    </td>
  </tr>
  <tr>
    <td style="vertical-align: top; background-color: rgb(51,102,255);" class="link"><a href="http://192.168.1.222/color=051102255"> </a><br>
    </td>
    <td style="vertical-align: top; background-color: rgb(0,0,153);" class="link"><a href="http://192.168.1.222/color=000000153"> </a><br>
    </td>
    <td style="vertical-align: top; background-color: rgb(255,153,255);" class="link"><a href="http://192.168.1.222/color=255153255"> </a><br>
    </td>
    <td style="vertical-align: top; background-color: rgb(204,51,204);" class="link"><a href="http://192.168.1.222/color=204051204"> </a><br>
    </td>
    <td style="vertical-align: top; background-color: rgb(102,51,102);" class="link"><a href="http://192.168.1.222/color=102051102"> </a><br>
    </td>
  </tr>
</tbody>
</table>

<br>

<br>
</body></html>


Este código lo que nos muestra es una página web sencilla con una tabla de unos cuantos colores, que enlaza con la dirección ip que le daremos al Nodemcu.


[Imagen: tabla_colores.png]



Código Arduino:
Código:
#include <ESP8266WiFi.h>

const char* ssid = "Tu_red";
const char* password = "Tu_Contraseña";
IPAddress ip(192,168,1,222);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
       int pinLedR = D1;  
       int pinLedV = D2;  
       int pinLedA = D3;  
WiFiServer server(80);

void setup() {
Serial.begin(115200);
delay(10);

         pinMode(pinLedR, OUTPUT);    
         pinMode(pinLedV, OUTPUT);  
         pinMode(pinLedA, OUTPUT);  

WiFi.begin(ssid, password);
WiFi.config(ip, gateway, subnet);

server.begin();
}
String f = "";
void loop() {

WiFiClient client = server.available();
if (!client) {
  return;
}


Serial.println("new client");
while(!client.available()){
  delay(1);
}

String request = client.readStringUntil('\r');
client.flush();


 char i1 = request.indexOf("GET /color="), i2;
 if (i1 != -1)
   i2 = request.indexOf(" ", i1+11);
   f = request.substring(i1+11, i2);

String pepe = f.substring(0,2);
 String juan = f.substring(3,5);
 String pedro = f.substring(6,8);


 
analogWrite(pinLedR, pepe.toInt());
analogWrite(pinLedV, juan.toInt());
analogWrite(pinLedA, pedro.toInt());  


client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("");
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.print("<body onload='history.back();'>\n");
client.println("</body>");
client.println("</html>");

delay(1);

 }



El código lo que hace en primer lugar es recibir todos los datos de red y asignarle una ip fija al Nodemcu (en este caso la 192.168.1.222).

 
Luego le asignamos los pines al led y los iniciamos como salida.
 
Luego inicia la comunicación wifi y recibe los datos del enlace que pulsemos en la página, esos datos son los valores para que muestre un color u otro.
 
Por último desde el Nodemcu enviamos una pequeña página con un javascript para que el navegador vuelva a mostrar la tabla de colores.
 
 
Bueno... espero que le sirva a alguien..... Saludos

Imprimir

  Nodemcu, alarma nivel agua via wifi.
Enviado por: chujalt - 06-03-2021, 13:09 - Foro: Anduino, Nodemcu, Wemos - Sin respuestas

Saludos.

En esta ocasión vamos a crear una alarma de nivel de agua. Una página web creada al efecto nos informará si el agua no ha llegado al nivel o, si por el contrario, si que ha llegado.

Para ello necesitamos 2 tipos de código, el de la página web (con php) y el del Nodemcu, al cual le cargaremos el programa con la Arduino ID.


Materiales utilizados:

  • Una placa Nodemcu (yo he utilizado la V2).
  • Un módulo sensor de agua para Arduino.
  • 3 cables Dupont.

[Imagen: nodemcu.jpg]


[Imagen: sensoragua.jpg]




Conexiones:
  • Pin S del sensor de líquidos al pin A0 del Nodemcu.
  • Pin + del sensor de líquidos al pin 3.3V del Nodemcu.
  • Pin - del sensor de líquidos al pin GND del Nodemcu.


Código página web:
Código PHP:
<?php
    
// this refreshes current page after 5 seconds.
 
   header"refresh:5;" );
?>
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Sensor agua</title>
<style>
.normal
    {
        background: green;
        color: yellow;
        border-radius: 1em;
        padding: 1em;
        position: absolute;
        top: 50%;
        left: 50%;
        margin-right: -50%;
        transform: translate(-50%, -50%);
        text-align:center
    }
.anormal
    {
        background: red;
        color: yellow;
        border-radius: 1em;
        padding: 1em;
        position: absolute;
        top: 50%;
        left: 50%;
        margin-right: -50%;
        transform: translate(-50%, -50%);
        text-align:center
    }
</style>
</head>
<body>
<?
$url 
'http://192.168.1.222';
$content file_get_contents($url);
$doc = new DOMDocument();
$doc->loadHtml($content);
$contenido explode("\n"trim($doc->getElementById('nivel')->nodeValue))[0];
if (
$contenido 200)
{
echo
"<div class='normal'>";
echo
"En estos momentos no ocurre nada.<br/>TODO CORRECTO";
echo
"</div>";
}
else
{
echo
"<div class='anormal'>";
echo
"ATENCION.... ATENCION.... ALARMA..... ALARMA<br/>La cosa no va bien";
echo
"</div>";

?>
</body>
</html> 


La página lo que realiza es conectar cada 5 segundos con la dirección ip del Nodemcu y leer las lecturas del sensor, en nuestro caso le hemos dado un límite de 200, si no llega a ese límite nos dará una información, si llega o lo sobrepasa nos dará otra.


Si no llega a la lectura límite:

[Imagen: aguabien.png]



Si llega a la lectura límite:

[Imagen: aguamal.png]




Código Nodemcu:
Código:
#include <ESP8266WiFi.h>
const char* ssid = "Tu_ssid";
const char* password = "Tu_contraseña";
IPAddress ip(192,168,1,222);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
const int analogInPin = A0;
int sensorValue = 0;
WiFiServer server(80);
void setup() {
WiFi.begin(ssid, password);
 WiFi.config(ip, gateway, subnet);
 server.begin();
}
void loop() {
WiFiClient client = server.available();
 if (!client) {
   return;
 }
 while(!client.available()){
   delay(1);
 }
 String request = client.readStringUntil('\r');
 client.flush();
client.println("HTTP/1.1 200 OK");
 client.println("Content-Type: text/html");
 client.println("");
 client.println("<!DOCTYPE HTML>");
 client.println("<html>");
 client.print("<body>");  
  client.print("<div id='nivel'>");
 client.print(analogRead(analogInPin));
  client.print("</div>");
 client.println("</body>");
 client.println("</html>");

 delay(1);

}


Explicación del código:
  • Cargamos las librerías necesarias.
  • Le damos los parámetros de nuestra red wifi y le asignamos una dirección ip, en este caso la 192.168.1.222
  • Asignamos el pin de lectura del sensor.
  • Iniciamos el sensor y la comunicación wifi.
  • Creamos una página web que contiene la lectura del sensor de líquidos.

Bueno, ya está, espero que le sirva a alguien.

Saludos.


Imprimir

  Instalar micropython en Nodemcu.
Enviado por: chujalt - 06-03-2021, 13:07 - Foro: Anduino, Nodemcu, Wemos - Sin respuestas

Saludos.

Vamos a explicar como instalar una versión de micropython en nuestro Nodemcu. Este tutorial está explicado para hacerlo en un sistema operativo LINUX.

Yo he utilizado un Nodemcu V2.


[Imagen: nodemcu.jpg]
En primer lugar tenemos que bajarnos una herramienta que se llama esptool mediante el comando pip. Abrimos un terminal y escribimos:

Código:
sudo pip install esptool

En muchos sitios de internet pone que esta herramienta funciona bajo python 2.7, pero eran las versiones antiguas, ahora funciona en cualquier versión de python, yo trabajo con la 3.5

Una vez instalado esptool conectamos nuestro nodemcu al PC y tecleamos:

Código:
sudo esptool.py flash_id


[Imagen: micropython_1.png]

Como veis, sale varia información, entre ellas el tamaño de la memoria y el puerto serie al que está conectado, en mi caso /dev/ttyUSB0

Opcionalmente le doy permisos a ese puerto serie para luego no estar logeándome como sudo en todos los pasos siguientes:

Código:
sudo chmod 777 /dev/ttyUSB0

Vamos a bajarnos la versión de micropython de la siguiente dirección http://micropython.org/download#esp8266, yo me bajé la que pone entre paréntesis latest, que es la última.

Ahora vamos a flashear la memoria del nodemcu, tecleamos:

Código:
esptool.py --port /dev/ttyUSB0 erase_flash

Si todo ha ido bien no os dará ningún mensaje de error y os informará que la memoria ha sido flasheada. El proceso dura poco, unos 10 segundos.

Seguidamente cargamos micropython en nuestro nodemcu (el archivo que nos hemos bajado antes) tecleamos:

Código:
esptool.py --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 /home/chujalt/esp8266-20180511-v1.9.4.bin

Lógicamente cambiar la ruta donde tenéis vuestro archivo. OJO este comando es el que sale en la página oficial de micropython, me cargaba correctamente, pero luego, a la hora de comprobar por consola si funcionaba micropython (último paso de este tutorial), no salía nada. Si es así, volver a flashear la memoria y probad con estos comandos:

Código:
esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash --flash_mode=dout --flash_size=detect 0 /home/chujalt/esp8266-20180511-v1.9.4.bin

Si no os da errores os dirá que ya está cargado micropython.

Ahora toca comprobar que funciona correctamente, hay varios programas para comunicarnos con el puerto serie, screen, minicom, picocom..... Yo he utilizado screen. Si no lo tenéis instalado:

Código:
sudo apt install screen

 
Una vez instalado, tecleamos:
Código:
screen /dev/ttyUSB0 115200

Se quedará la pantalla en negro, pulsamos el botón reset de nuestro Nodemcu para que se reseté, y si todo ha ido bien nos saldrá el promt de micropyton.

[Imagen: micropython_2.png]

Bueno, ya está, espero que le sirva a alguien.
Saludos.

Imprimir

  Nodemcu, controlar encendido / apagado de led via wifi
Enviado por: chujalt - 06-03-2021, 13:05 - Foro: Anduino, Nodemcu, Wemos - Sin respuestas

Saludos.

Vamos a controlar el encendido / apagado  de un led vía wifi con Nodemcu. La página web que nos proporcionará el Nodemcu nos dirá si en led está encendido o apagado y nos mostrará un botón para realizar una acción según sea el caso. 
El programa lo cargaremos al Nodemcu con el Arduino IDE.


Materiales necesarios:

  • Una placa Nodemcu (yo he utilizado la V2).
  • 2 cables dupont.
  • Un led.

[Imagen: nodemcu.jpg]

[Imagen: led.gif]




Conexiones:
  • Pin D7 del Nodemcu al polo positivo del led
  • Pin GND del Nodemcu al polo negativo del led


Código para Nodemcu:

Código:
#include <ESP8266WiFi.h>

const char* ssid = "Tu_ssid";
const char* password = "Tu_contraseña";
IPAddress ip(192,168,1,222);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
int ledPin = 13; //Lo conectamos a D7
WiFiServer server(80);

void setup() {
 Serial.begin(115200);
 delay(10);

 pinMode(ledPin, OUTPUT);
 digitalWrite(ledPin, LOW);

 WiFi.begin(ssid, password);
 WiFi.config(ip, gateway, subnet);
 
 server.begin();
}

void loop() {

 WiFiClient client = server.available();
 if (!client) {
   return;
 }


 Serial.println("new client");
 while(!client.available()){
   delay(1);
 }

 String request = client.readStringUntil('\r');
 client.flush();


 int value = digitalRead(ledPin);
 if (request.indexOf("/LED=ON") != -1)  {
   digitalWrite(ledPin, HIGH);
   value = HIGH;
 }
 if (request.indexOf("/LED=OFF") != -1)  {
   digitalWrite(ledPin, LOW);
   value = LOW;
 }


 client.println("HTTP/1.1 200 OK");
 client.println("Content-Type: text/html");
 client.println("");
 client.println("<!DOCTYPE HTML>");
 client.println("<html>");

 client.print("El led esta ahora: ");

 if(value == HIGH) {
   client.print("Encendido");
   client.println("<br><br>");
   client.println("<a href=\"/LED=OFF\"\"><button>Apagar</button></a><br />");  
 } else {
   client.print("Apagado");
client.println("<br><br>");
 client.println("<a href=\"/LED=ON\"\"><button>Encender</button></a>");
 }
 client.println("</html>");

 delay(1);

}




Comentario del código:

En primer lugar está la configuración de la red wifi. Deberás cambiar la sidd y la contraseña por la de tu router. En este script le asignamos la dirección IP 192.168.1.222, la puedes cambiar a tu gusto siempre que esté en el rango de ips de tu router.

Le asignamos el pin 13 al led, que en la placa Nodemcu es el D7, le indicamos que es de salida y lo iniciamos en LOW (apagado).

Comenzamos la comunicación Wifi.

Recién encendida la placa Nodemcu, el led estará apagado, al pone en el navegador la dirección IP 192.168.1.222 nos mostrará lo siguiente:

[Imagen: nodemculed1.png]


Si le damos al botón de encender, el led se encenderá y el navegador nos mostrará:

[Imagen: nodemculed2.png]


Si le damos al botón de apagar, el led se apagará y nos mostrará el navegador:


[Imagen: nodemculed3.png]



Y ya está. Como habéis visto la página que muestra es muy sencilla, pero era para que vierais como funciona.

Bueno, espero que le sirva a alguien.

Saludos.

Imprimir