Mostrando entradas con la etiqueta led. Mostrar todas las entradas
Mostrando entradas con la etiqueta led. Mostrar todas las entradas

miércoles, 22 de octubre de 2025

Encender 4 LED con un móvil utilizando ESP32 C3


ESP32C3 MINI
WEB SERVER AP (Punto de acceso)



Hace unos años realicé con el ESP8266 un montaje que hacía encender 4 LED desde un navegador.
http://seta43.duckdns.org/espb.html
En este montaje realizo un servidor en modo Punto de Acceso.
Se conecta directamente el teléfono movil al wifi creado con el ESP32 C3, sin intervención de ningún router.


Probando varias placas y consultando varios tutoriales, encontré mi placa que funcionaba como LOLIN C3 MINI.
El problema que existen muchos ensambladores de placas, y algunos no figuran el modelo.
En mi caso la configuración de pins son:
static const uint8_t TX = 21;
static const uint8_t RX = 20;

static const uint8_t SDA = 8;
static const uint8_t SCL = 10;

static const uint8_t SS = 5;
static const uint8_t MOSI = 4;
static const uint8_t MISO = 3;
static const uint8_t SCK = 2;

static const uint8_t A0 = 0;
static const uint8_t A1 = 1;
static const uint8_t A2 = 2;
static const uint8_t A3 = 3;
static const uint8_t A4 = 4;
static const uint8_t A5 = 5;
Que cada uno mire en su placa la configuración de pins.
Se puede encontrar en:
    /home/usuario/.arduino15/packages/esp32/hardware/esp32/3.3.0/variants/lolin_c3_mini

El primer montaje solo utilizo 4 diodos LED y una resistencia.
El mando de encendido y apagado se hace con un teléfono conectado directamente la Wifi creado con el ESP32 C3.





Me di cuenta que no se proporcionaba ninguna información , por lo que he añado un OLED donde indico el nombre de la red Wifi, la contraseña y la IP.




PROGRAMA

VIDEO

Saludos.
Juan Galaz



Bibliografía:

https://randomnerdtutorials.com/getting-started-esp32-c3-super-mini/
http://seta43.duckdns.org/espb.html
https://github.com/sidharthmohannair/Tutorial-ESP32-C3-Super-Mini
https://www.luisllamas.es/probamos-el-nuevo-esp32-c3-el-sustituto-del-esp8266/
https://www.espressif.com/sites/default/files/documentation/esp32-c3-mini-1_datasheet_en.pdf
https://www.mechatronicstore.cl/conectando-la-esp32-c3-super-mini-a-arduino-paso-a-paso/?srsltid=AfmBOopdSs8GEHCtRzY2aXz168xDNPLSEk_YsHXers0j9pHBz6SHsCk4
https://www.youtube.com/watch?v=0sum5XaOdW0

jueves, 20 de abril de 2023

Tira de LEDS elk-bledom. Bluetooth Control desde Debian 11

  Página principal

Tira de LEDS
elk-bledom bluetooth
Control desde Debian 11



El otro día me compré una tira de LEDS por 2€, no esperaba mucho.

Para hacerla funcionar debías instalar una aplicación en el teléfono.
Instalada la aplicación y alimentada la tira a un cargador, funcionaba bien.
Lo que más me sorprende en estas aplicaciones es que des permisos de ubicación.
Y esto fue lo que me indujo a crear una aplicación en Linux.

Buscando por internet encontré esta página:
https://linuxthings.co.uk/blog/control-an-elk-bledom-bluetooth-led-strip

Explicaba como funcionaba la comunicación entre el ordenador y la tira de LEDS mediante el bluetooth.
Probando todas la instrucciones conseguí manejar la tira de LEDS.

Como quería automatizar un poco el encendido y apagado de los LEDS me dispuse hacer una aplicación mediante comandos bash .
El primer problema es que debemos ser roor para mandar los datos mediante bluetooth.
Para arreglar esto hago lo siguiente:

chown root:root luces5
chown root:root bscan

chmod u+rwx,g+rx,o+rx bscan
chmod u+rwx,g+rx,o+rx luces5
chmod u+rwx,g+rwx tiraLed.py


Lo que hago es dar permisos de ejecución, pero no de escritura, de esta forma queda seguro el sistema, y podemos manejar los LEDS.

En realidad son 2 aplicaciones:
 La primera es bscan, que se encarga de scanear los dispositivos bluetooth existentes, para luego almacenar la dirección de ELK-BLEDOM en un fichero llamado blue.dat .
 La segunda es luces5, que se encarga de mandar los valores RGB a la tira con la dirección almacenada en
blue.dat .
Ejemplo:
    ./luces 255 0 0       Enciende luz roja

    ./luces 0 0 255       Enciende luz azul

Como me parecía poco interactivo, he realizado un pequeño programa en python para manejar los colores.


Espero que os sirva este artículo para vuestros proyectos.

VIDEO


PROGRAMA


Saludos.
Juan Galaz



Bibliografía:

https://linuxthings.co.uk/blog/control-an-elk-bledom-bluetooth-led-strip

lunes, 13 de abril de 2020

Arduino control salidas con JAVA


Arduino
Control salidas

JAVA


En un montaje anterior arseta.html había realizado un controlador de salidas mediante una placa Arduino.
Estaba realizado en Gambas (VB Linux), en esta ocasión lo realizo en JAVA.
Normalmente o trabajo en C, C++, y Basic.
El trabajo que he tenido que realizar para programarlo en JAVA a sido increíble.
Intentar encontrar fuentes donde existan ejemplos sobre la programación de los puertos serie en JAVA a sido muy difícil.
Cuando encontraba algo, estaba semicompletado o no funcionaba realmente.
En una de mis múltiples búsquedas encontré:
    http://josedeveloper.com/2012/01/28/comunicacion-serial-java-y-arduino/
Además de proporcionar los programas completos, enseñaba como compilar los programas sin errores.


Circuito.


Programa JAVA funcionando.


En cuanto al programa realizado para el arduino, los códigos se basan en anteriores montajes míos, son del tipo: petición de dato a través del interface serie, y respuesta por parte del arduino a través del mismo interface serie.
Por ejemplo:
     SET 8,0          Apagar pin 8  

    SET 8,1          Encender pin 8
El que quiera puede mandar los comandos por el teminal y mandarlos con SEND, harán el mismo efecto.
En la parte del Arduino, está preparado para que entienda desde los pin 14 al 19, que corresponden a A0 - A5 , pero no están implementados en la interface JAVA.
El cansancio de programar este programa en JAVA, me hizo que no realizara la comprobación del estado real de las salidas, estaba harto.
Para colmo, en teoría se puede empaquetar todo en un único fichero *.jar, pero yo no lo he conseguido.
Para hacer mas fácil la compilación y ejecución del programa, he realizado dos ficheros de comandos BASH   ./copile y ./run .
Lo que parece fácil de C o C++ , se hace muy complicado en JAVA, como el manejo de ficheros o puertos serie.
Está realizado en el entorno de Debian 10 , por lo cual el arduino debe encontrarse en /dev/ttyUSB0 , lo normal es que  buscase automáticamente donde está conectado el arduino, pero lo he simplificado.
Si por casualidad estuviese en otro sitio, deberemos indicarlo en la línea de comandos. ./run /dev/ttyUSB1 .

Espero que les sirva este programa para vuestros proyectos.

PROGRAMA-JAVA-ARDUINO

Saludos.
Juan Galaz

Bibliografía:
http://josedeveloper.com/2012/01/28/comunicacion-serial-java-y-arduino/

sábado, 18 de enero de 2020

ESP8266 - WebServer - Encender LED desde navegador


ESP8266

WebServer

Encender LED desde navegador


Una de las cosas que mejor puede hacer el ESP8266 es de un mini servidor web.
El montaje que vamos hacer es el de encender 4 LED desde el navegador.





En el programa que proporciono se debe cambiar el nombre de vuesto router y la contraseña Wifi

#ifndef STASSID
#define STASSID "router"
#define STAPSK  "contraseña"
#endif

Veremos en el terminal serie la IP que tiene nuestra placa.
Connected to setamodem3
IP address: 192.168.1.134
MDNS responder started
HTTP server started

Ahora en nuestro navegador tecleamos:
http://192.168.1.134/

En nuestro navegador veremos la siguiente página.


Aquí podemos encender y apagar los 4 LED desde cualquier navegador dentro de nuestra red.

Surgen dos problemas, debemos saber la IP que nos ha dado el router, y el modo texto es poco practico además de ser demasiado espartado.
Lo primero lo arreglamos cambiando en el programa lo siguiente:

IPAddress ip(192,168,1,200);    
IPAddress gateway(192,168,1,1);  
IPAddress subnet(255,255,255,0);

Debemos saber en que rango de direcciones esta nuestro router, en mi caso es 192.168.1.[0-254].
Para mi montaje he indicado la IP 192.168.1.200 , es una dirección lo suficiente alta para que no la dé automáticamente el router.

Para hacer nuestro interface mas agradable, he utilizado botones de colores para encender y apagar nuestros LED.



Como podemos ver la página es ahora bastante mas atractiva.

Y ya si queremos utilizar gráficos para representar a los LED.



Espero que les guste este montaje.

PROGRAMA

Saludos.
Juan Galaz

Bibliografía:

https://polaridad.es/
https://www.luisllamas.es/encender-y-apagar-un-led-en-el-esp8266-con-un-formulario-web/
https://www.instructables.com/id/Quick-Start-to-Nodemcu-ESP8266-on-Arduino-IDE/

https://randomnerdtutorials.com/projects/#esp8266
https://randomnerdtutorials.com/getting-started-with-esp8266-wifi-transceiver-review/
https://www.prometec.net/esp8266-pluggin-arduino-ide/


miércoles, 19 de diciembre de 2012

Arduino-red-webserver 6 entradas analógicas y 7 salidas digitales.

Página principal


Arduino-red-webserver
6 entradas analógicas y 7 salidas digitales.

xsetaseta@gmail.com

Este segundo montaje con la tarjeta de red para arduino, tiene como finalidad controlar 7 salidas digitales y 6 entradas analógicas.
La tarjeta Arduino Ethernet Shield se puede encontrar en el mercado entre 9€ y 25€ depende del suministrador.
Para mas detalles visitar la página oficial http://www.arduino.cc/en/Main/ArduinoEthernetShield.
La comunicación con el chip W5100 y con la tarjeta SD se hace a través del bus SPI.
La activación del chip de red se efectúa con el pin 10 del arduino, y la activación tarjeta SD se realiza con el pin 4.
He realizado dos programas, el primero es más fácil de comprender. El segundo esta optimizado para ocupar menos memoria, se intenta reducir lo mas posible la repetición de funciones iguales. El resultado es 1k menos de memoria, pero menos comprensible su estudio.
Si se quiere controlar desde fuera de tu red interna, debes de modificar en el router los el direccionamiento del puerto, para que si tu arduino  tiene la dirección 192,168,2, 177  y con el puerto 80, las peticiones al puerto 80 se dirijan a la dirección  IP del arduino.


Controlando el encendido de led mediante una tableta android.


Visualización del control de circuito en un navegador.


// SETA43
// Modificacion 19-12-2012
// webserver

#include <SPI.h>
#include <Ethernet.h>

//numero de MAC
//numero de ip, depende de tu red

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,2, 177);

String readString = String(20);
byte bandera=0;
byte z;
char c;
int sensorReading;

EthernetServer server(80);

void setup() {
  Serial.begin(9600);
   while (!Serial) {  }

  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);  
}

void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");

    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        c = client.read();
        Serial.write(c);
        if(c=='?' && bandera==0)
          {
           readString="";
           for(z=0;z<14;z++)  
             {
               c = client.read();
               readString +=c;
             }
           Serial.println(readString);
           colocar();
           bandera=1;
          }
                      
        if (c == '\n' && currentLineIsBlank) {

          // Manda la cabecera del http
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connnection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // Refresca cada 3 segundos
          client.println("<meta http-equiv=\"refresh\" content=\"3\">");
          client.println("<big><b>Seta43_Arduino</b></big><br>");
          client.print("xsetaseta@gmail.com <br>");
          client.print("Control de LEDS <br>");
          client.println("<hr>");

          client.print("<form method=get><input type=submit name=valor value=Encender_Todos>");
          client.println("<input type=submit  name=valor value=Apagar_todos></form>");    
          client.println("<hr>");             
          client.print("<form method=get><input type=submit name=valor value=1DIG2>");
          client.println("<input type=submit  name=valor value=0DIG2> DIG2=");
          client.println(digitalRead(2));
          client.println("</form>");
          client.print("<form method=get><input type=submit name=valor value=1DIG3>");
          client.println("<input type=submit  name=valor value=0DIG3> DIG3=");
          client.println(digitalRead(3));
          client.println("</form>");
          client.print("<form method=get><input type=submit name=valor value=1DIG5>");
          client.println("<input type=submit  name=valor value=0DIG5> DIG5=");
          client.println(digitalRead(5));
          client.println("</form>");   
          client.print("<form method=get><input type=submit name=valor value=1DIG6>");
          client.println("<input type=submit  name=valor value=0DIG6> DIG6=");
          client.println(digitalRead(6));
          client.println("</form>");   
          client.print("<form method=get><input type=submit name=valor value=1DIG7>");
          client.println("<input type=submit  name=valor value=0DIG7> DIG7=");
          client.println(digitalRead(7));
          client.println("</form>");    
          client.print("<form method=get><input type=submit name=valor value=1DIG8>");
          client.println("<input type=submit  name=valor value=0DIG8> DIG8=");
          client.println(digitalRead(8));
          client.println("</form>");    
          client.print("<form method=get><input type=submit name=valor value=1DIG9>");
          client.println("<input type=submit  name=valor value=0DIG9> DIG9=");
          client.println(digitalRead(9));
          client.println("</form>");            
          client.println("<hr>");   
                    
          for ( z = 0; z < 6; z++) {
            sensorReading = analogRead(z);                     
            client.print("Analog input ");            
            client.print("<font color=red>");
            client.print(z);
            client.print("</font>");            
            client.print(" is ");            
            client.print("<font color=blue>");   
            client.print(sensorReading);
            client.print("</font>");            
            client.println("<br />");       
          }
          
           client.println("<hr>");          
          
          client.println("</html>");
          break;
         }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
          }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
          }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
            
  }
     bandera=0;  
}


void colocar()
{         
    if(readString.indexOf("1DIG2") >0){ digitalWrite(2, HIGH); goto salir;}
    if(readString.indexOf("0DIG2") >0){ digitalWrite(2, LOW); goto salir;}
    
    if(readString.indexOf("1DIG3") >0){ digitalWrite(3, HIGH);goto salir;}
    if(readString.indexOf("0DIG3") >0){ digitalWrite(3, LOW);goto salir;}
  
    if(readString.indexOf("1DIG5") >0){ digitalWrite(5, HIGH);goto salir;}
    if(readString.indexOf("0DIG5") >0){ digitalWrite(5, LOW);goto salir;}
    
    if(readString.indexOf("1DIG6") >0){ digitalWrite(6, HIGH);goto salir;}
    if(readString.indexOf("0DIG6") >0){ digitalWrite(6, LOW);goto salir;}
    
    if(readString.indexOf("1DIG7") >0){ digitalWrite(7, HIGH);goto salir;}
    if(readString.indexOf("0DIG7") >0){ digitalWrite(7, LOW);goto salir;}
    
    if(readString.indexOf("1DIG8") >0){ digitalWrite(8, HIGH);goto salir;}
    if(readString.indexOf("0DIG8") >0){ digitalWrite(8, LOW);goto salir;}
    
    if(readString.indexOf("1DIG9") >0){ digitalWrite(9, HIGH);goto salir;}
    if(readString.indexOf("0DIG9") >0){ digitalWrite(9, LOW);goto salir;}
    
    if(readString.indexOf("Encende") >0){ encender(); goto salir;}
    if(readString.indexOf("Apagar") >0){ apagar();goto salir;}
salir:
;
}


void encender()
{
  digitalWrite(2, HIGH); digitalWrite(3, HIGH); digitalWrite(5, HIGH);digitalWrite(6, HIGH);
  digitalWrite(7, HIGH);digitalWrite(8, HIGH);digitalWrite(9, HIGH);
}

void apagar()
{
  digitalWrite(2, LOW);digitalWrite(3, LOW);digitalWrite(5, LOW);digitalWrite(6, LOW);
  digitalWrite(7, LOW);digitalWrite(8, LOW);digitalWrite(9, LOW);
}
Programa sin optimizar.


// SETA43
// Modificacion 19-12-2012
//webserver v2mini

#include <SPI.h>
#include <Ethernet.h>

//numero de MAC
//numero de ip, depende de tu red

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,2, 177);


String readString = String(20);
byte bandera=0;
byte z;
char c;
int sensorReading;
EthernetClient client;

const byte PinOut[] = { 2, 3, 5, 6, 7, 8, 9};


EthernetServer server(80);

void setup() {
  Serial.begin(9600);
   while (!Serial) {  }

  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
  for(z=0;z<7;z++) pinMode(PinOut[z],OUTPUT);
}

void loop() {
  client = server.available();
  if (client) {
    Serial.println("new client");

    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        c = client.read();
        Serial.write(c);
        if(c=='?' && bandera==0)
          {
           readString="";
           for(z=0;z<14;z++)  
             {
               c = client.read();
               readString +=c;
             }
           Serial.println(readString);
           colocar();
           bandera=1;
          }
               
        if (c == '\n' && currentLineIsBlank) {

          // Manda la cabecera del http
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connnection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // Refresca cada 3 segundos
          client.println("<meta http-equiv=\"refresh\" content=\"3\">");
          client.println("<big><b>Seta43_Arduino</b></big><br>");
          client.print("xsetaseta@gmail.com <br>");
          client.print("Control 6 salidas digitales y 6 entradas analogicas <br>");
          client.println("<hr>");

          FormSubmit();  client.print("Encender_Todos>");
          PrintSubmit();    client.println("Apagar_todos></form>");    
          client.println("<hr>");
                 
         for(z=0;z<7;z++)
                        {
                        FormSubmit();  client.print("1DIG");
                        client.print(PinOut[z]);  client.print(">");
                        PrintSubmit();  client.print("0DIG");
                        client.print(PinOut[z]); client.print(">");
                        client.print(" DIG");client.print(PinOut[z]); client.print("=");
                        client.print(digitalRead(PinOut[z]));
                        PrintForm();
                        }

          client.println("<hr>");   
                    
          for ( z = 0; z < 6; z++)
                        {
                        sensorReading = analogRead(z);                     
                        client.print("Analog input ");            
                        client.print("<font color=red>");
                        client.print(z);
                        client.print("</font>");            
                        client.print(" is ");            
                        client.print("<font color=blue>");   
                        client.print(sensorReading);
                        client.print("</font>");            
                        client.println("<br />");       
                        }  
           
          client.println("<hr>");                   
          client.println("</html>");
          break;
         }
        if (c == '\n')       currentLineIsBlank = true;
            else
              if (c != '\r')  currentLineIsBlank = false;
      }
    }
    delay(1);
    client.stop();
    Serial.println("client disonnected");            
  }
  bandera=0;  
}


void FormSubmit()
{
 PrintFormIn();
 PrintSubmit();
}

void PrintSubmit()
{
 client.print("<input type=submit  name=valor value=");  
}

void PrintFormIn()
{
  client.print("<form method=get>");
}  

void PrintForm()
{
  client.println("</form>");
}

void colocar()
{         
    if(readString.indexOf("1DIG2") >0){ digitalWrite(2, HIGH); goto salir;}
    if(readString.indexOf("0DIG2") >0){ digitalWrite(2, LOW); goto salir;}
    
    if(readString.indexOf("1DIG3") >0){ digitalWrite(3, HIGH);goto salir;}
    if(readString.indexOf("0DIG3") >0){ digitalWrite(3, LOW);goto salir;}
  
    if(readString.indexOf("1DIG5") >0){ digitalWrite(5, HIGH);goto salir;}
    if(readString.indexOf("0DIG5") >0){ digitalWrite(5, LOW);goto salir;}
    
    if(readString.indexOf("1DIG6") >0){ digitalWrite(6, HIGH);goto salir;}
    if(readString.indexOf("0DIG6") >0){ digitalWrite(6, LOW);goto salir;}
    
    if(readString.indexOf("1DIG7") >0){ digitalWrite(7, HIGH);goto salir;}
    if(readString.indexOf("0DIG7") >0){ digitalWrite(7, LOW);goto salir;}
    
    if(readString.indexOf("1DIG8") >0){ digitalWrite(8, HIGH);goto salir;}
    if(readString.indexOf("0DIG8") >0){ digitalWrite(8, LOW);goto salir;}
    
    if(readString.indexOf("1DIG9") >0){ digitalWrite(9, HIGH);goto salir;}
    if(readString.indexOf("0DIG9") >0){ digitalWrite(9, LOW);goto salir;}
    
    if(readString.indexOf("Encende") >0){ for(z=0;z<7;z++) digitalWrite(PinOut[z],HIGH);  goto salir; }
    if(readString.indexOf("Apagar") >0) { for(z=0;z<7;z++) digitalWrite(PinOut[z],LOW);   goto salir; }
salir:
;
}


Programa optimizado.


Saludos
Juan Galaz


Bibliografía:

Libro: Arduino Cookbook
http://unicarlos.com/pezazul/index.php?articulo=4
http://blogdoje.com.br/2010/04/11/teste-do-shield-ethernet-seeeduino/
http://www.scienceprog.com/getting-hands-on-arduino-ethernet-shield/
http://rickymoga.blogspot.com.es/search/label/ARDUINO
https://docs.google.com/document/d/1VR8dHVNQ6LbWGyyi4mTJv6mF8QK7xVD_lj4r6pWevZc/edit?pli=1
http://pepechorva.com/wordPress/domotica/
http://www.htmlquick.com/es/reference/tags/input.html#hidden