Mi proyecto IOT

Hola a todos!

La semana pasada volvi a retomar un proyecto que tenia pendiente, ya que lo abandone ya hace como 3 años atras.


Un poco de contexto

Toda mi vida tuve problemas para despertarme, la unica forma que funciona es que me pegue el sol directo a la cara, por suerte mi cama esta muy cerca de la ventana.
Otro problema cotidiano es que en verano me cuesta mantener la temperatura de la habitacion, es por esto que decidi tomar accion.
En mi habitacion tengo una persiana electrica junto con su correspondiente cortina de tela que esta sujeta a un riel metalico. Mi idea es hacer un pequeño sistema IOT, que mediante un microcontrolador pueda manipular y programar la cortina y persiana a mi antojo.

Precedentes

Este proyecto se encuentra en la version 3, las dos primeras solo contaban con la capacidad de controlar la persiana electrica, lamentablemente, estas fueron quemandose gracias a mis escasos conocimientos de electronica basica.

Actualidad

El diseño del circuito lo hice ya hace 3 años, pero la plaqueta fue destruida por mi gato nunca segui con el proyecto, asi que ya hace una semana me digne a resoldar la plaqueta y continuar con el proyecto, ahora teniendo mas conocimientos.


Idea y Desarrollo

El proyecto esta separado por tres partes:

  • Hardware
  • Front
  • Back

Hardware

Las primeras 2 versiones utilizaban el chip ESP8266, que cuenta con 4 pines GPIOs, esto me venia bien ya que es un chip barato y facilmente reemplazable para las primeras pruebas, pero no cuenta con la cantidad de pines necesarios para implementar el control de la cortina.
Para la version 3 voy a utilizar el chip ESP8266E que incluye muchos mas GPIO.
El circuito incluye 2 reles para el manejo de la persiana electrica (220 V) y un puente H (L298H) para el control de un motor paso a paso para el manejo de la cortina
El ESP8266E es un chip WiFi y funcionara como WebServer, pero solo como controlador principal del hardware, no voy a implementar ningun tipo de logica extra, solo las funciones abrir/cerrar de cada aparato, todo esto ya que no es tan comodo programar estos microcontroladores y me resulta mas comodo actualizar el backend si es que hay que hacer algun cambio.

Front

El Front consta de una aplicacion movil en React Native muy simple e intuitivo. Este se va a comunicar con Back que se estara ejecutando en mi servidor local de mi casa.

Back/Servidor

El back tendra toda la logica del proyecto y sera encargado de manejar las alarmas, las reglas y enviar al micro todos los comandos necesarios. Tengo planeado desarrollarlo en NestJs o tal vez Express junto con PosgreSQL pero aun no lo tengo claro.


Importante !
La intencion del proyecto es que sea de codigo libre y crear la documentacion necesaria para que cualquiera pueda replicarlo. Esto lleva tiempo y hasta que no haya un minimo de proyecto completado no voy a liberar el repositorio.
La intencion es que este todo disponible, tanto codigo como diagramas.

Fotos

Por ultimo les comparto algunos avances que he tenido en esta ultima semana:

Les pido disculpas por la calidad del soldado y la distribucion del circuito, se que a muchos se les va a caer el pelo al ver estas imagenes.


La idea es que el front se mantenga minimalista y simple.


2 Me gusta

@Tetranovalgina muy buen proyecto. Dices que tienes escasos conocimientos en electrónica. Creo te que podría ayudar el proyecto Arduino. Es un proyecto que intenta acercar la electrónica a personas con excasos o nulos conocimientos de la materia.

Espero quete sea de utilidad.

1 me gusta

Si lo conozco, de hecho el micro justamente lo programe utilizando un arduino uno. Gracias por el comentario!

El proyecto esta interesante. Pero te recomendaría hacer unos cambios.

  • Cambiar los relés por triacs. Los relés se dañan con el uso por el empleo de
    piezas electro-mecánicas. Con un triac y un opto-acoplador obtienes un circuito
    prácticamente eterno.

  • ¿Es necesario el motor de paso? Puedes emplear un motor DC que consume menor y con switch como control para el final de recorrido.

  • El driver L298 esta bien, pero al ser BJT se calientan demasiado, mejor
    emplea un puente H con MOSFET.

Si se quemaron fue por la falta de conocimientos de electrónica, basicamente
mal dimensionamiento, publica tus diagramas o tu git con ellos y te puedo ayudar a mejorarlos.

2 Me gusta

Excelente!! Te respondo en orden

  • Es buena idea usar los triacs y voy a tratar de informarme mas acerca de eso
  • El problema de usar un DC es que la cortina utiliza una cuerda para abrirse y lo unico que se me ocurrio es hacer un adaptador que se inserta en el riel, hice pruebas con el motor paso a paso y teoricamente anda bastante bien, el unico inconveniente como decis es el consumo, pero en mis pruebas no supera el A
  • Eso note con las pruebas que hice, el L298 y el LM317 se calientan un poco, aunque sinceramente esto no lo considero un problema porque el funcionamiento de todo esto no va a exceder los 20 segundos.

Quiero aclarar que en las anteriores versiones, lo estaba alimentando con una fuente variable, y practicamente se me quemaron porque lo conecte al reves (xd), esta ves le puse diodos para evitar este problema
Los diagramas todavia no los tengo hechos y el git lo voy a publicar a la brevedad cuanto ya tenga una base y funcionamiento basico, no le encuentro sentido subir todo ahora que solo tengo archivos vacios.

Muchas gracias de nuevo por tu comentario! Un saludo.

2 Me gusta

Update #1

Les comparto el avance de mi proyecto, no estuve haciendo mucho estos dias pero algo es algo.

Como anecdota, hablando sobre el proyecto con un amigo, este me recomendo llamar Windows al proyecto, me dio gracia asi que lo voy a dejar con ese nombre, ya que pega bien con el hecho de que todo esto es para una simple ventana de mi habitacion.


Backend

Tuve muchas complicaciones para optar que tecnologia utilizar, ya que no es un proyecto tan grande. Sabiendo que nunca va a manejar un gran volumen de datos ni actualizaciones importantes, descarte NestJs e incluso utilizar cualquier tipo de DB relacional. Al final decante por utilizar Express por su extremada simplicidad y LowDB, que personalmente no lo conocia, que me resulto util para que el proyecto siga minimalista y simple.
En fin, con 5 files y unas lineas de codigo ya tenia un CRUD basico con el que podia seguir avanzando en el Frontend.

Frontend

Termine la seccion de alarmas, que sinceramente no me termina de convencer la seccion de creacion, siento que tiene poca legibilidad, por ahi ustedes me podrian dar su opinion.
Tambien tuve que hacer a mano el TimePicker, ya que no hay ninguna libreria que realmente encaje con el diseño de la app.
Ademas de todo esto, estuve jugando con la API de OpenWeather para hacer el panel principal y luego implementar en el backend la logica correspondiente.

Fotos


Hardware

Le hice una cajita al circuito :D, pero tiene un problema, por apurado me olvide de hacerle la mayoria de agujeros (xd) de entradas, de todas formas voy a aprovechar para tambien hacerle ventilaciones por las dudas no empeore el problema de temperatura.

Fotos


Sobre GitHub

No avance nada sobre la documentacion, no hice los diagramas ni ningun README, supongo que a la brevedad lo hare. De todas formas considero que ya el proyecto tiene la suficiente estructura para abrirlo.

Este es el repositorio

Un Saludo, Joaquin

2 Me gusta

Update #2

Hoy a la mañana termine de arreglar algunos errores minimos, asi que logre que todo funcione correctamente!!


Voy a seguir con el formato de separar cada avance en 3 categorias.

Backend

Anoche termine de instalar el back en el servidor local, me asegure de tener los puertos abiertos y prosegui con la configuracion de pm2, el cual recomiendo mucho para organizar sus proyectos de backend, es facil y comodo de usar, ademas que me parece inecesario dockerizar por la nula complejidad del proyecto.
Ademas de todo esto tambien configure una DNS para mayor comodidad (recomiendo duckdns).
Sin mas complicaciones seguimos

Frontend

Sinceramente no recomiendo a nadie nunca utilizar Expo con React Native, el sistema de build EAS es demasiado lento y me demore muchas iteraciones en hacer que ande correctamente el .ENV, al final utilice la forma “insegura”, justamente en la documentacion dice algo como:

Do not store sensitive info, such as private keys, in EXPO_PUBLIC_ variables. These variables will be visible in plain-text in your compiled application.

Pero como no voy a compartir el build a nadie, asi que no le encuentro problema.
Tambien estuve pensando que sigue para el futuro y se me ocurrieron unas cuantas cosas que las ire desarrollando dependiendo la necesidad que tenga:

  • Control sobre el amanecer/anochecer
  • Notificaciones (Expo tiene su sistema incluido)
  • Soporte para multiples cortinas y persianas

Esto ultimo en concreto es facil de desarrollar gracias al backend que es capaz de controlar multiples IPS de hardware

Hardware

No hice ningun cambio, solo reajuste la caja impresa en 3D y le hice ventilaciones y las entradas de cables.

Fotos

Les comparto algunas fotos


Soporte para reglas especificas del clima local


Github

Finalmente me puse a escribir documentacion en el repositiorio que pueden encontrar aqui. Recomiendo entrar porque subi un GIF y algunas imagenes mas.
Todavia tengo que subir el diagrama y algunas aclaraciones sobre el hardware.

Saludos, Joaquin.

1 me gusta

Update #3

En mi computadora principal utilizo una status bar hecha con ags el cual recomiendo y por supuesto es codigo libre. Como a veces no tengo el celular a mano, necesito poder controlar la persiana aunque sea lo basico para esas circunstancias. Me pareceria incomodo tener que usar un programa para solo abrir o cerrar la persiana, podria hacer un simple alias con un curl… pero eso no es de gangsters.
Aca quiero hacer hincapie en la inmportancia del codigo libre, gracias a la posibilidad de leer y modificar codigo pude extender la funcionalidad de la status bar para poder implementar unos pequeños botones
imagen

Esto no es parte del proyecto pero por las dudas publico por este medio el widget por ahi a alguien le sirve o simplemente para aprender.

Ags utiliza GJS, todo seria mas simple si se pudiera usar fetch :rofl:

async function curtain(value: number) {
  const data = {
    curtain: value,
    blind: 0,
  };

  const url = "...";
  const body: any = JSON.stringify(data);

  const message = Soup.Message.new("POST", url);
  const inputStream = Gio.MemoryInputStream.new_from_bytes(
    new GLib.Bytes(body),
  );

  message.set_request_body("application/json", inputStream, body.length);
  const session = new Soup.Session();
  session.send(message, null);
}

const values = [0, 0.25, 0.5, 0.75, 1];

const icons = (value: number) => {
  switch (value) {
    case 0:
      return "circle-empty";
    case 0.25:
      return "circle-quarter-reverse";
    case 0.5:
      return "circle-half";
    case 0.75:
      return "circle-quarter";
    case 1:
      return "circle";
    default:
      return "circle";
  }
};

const btns = values.map((value) =>
  Widget.MenuItem({
    child: Widget.Box({
      hexpand: true,
      children: [
        Widget.Icon({
          icon: icons(value),
          hexpand: true,
          hpack: "start",
        }),
        Widget.Label({
          label: value * 100 + "%",
          hexpand: true,
          css: `font-weight: bold;`,
        }),
      ],
    }),
    on_activate: () => {
      curtain(value);
    },
  }),
);

export default () => {
  const menu = Widget.Menu({
    class_name: "persiana_menu",
    children: btns,
  });

  return PanelButton({
    class_name: "persiana_icon",
    child: Widget.Icon("chip-symbolic"),
    on_clicked: (self) => {
      if (colorpicker.colors.length === 0) return;

      menu.popup_at_widget(self, Gdk.Gravity.SOUTH, Gdk.Gravity.NORTH, null);
    },
  });
};

4 Me gusta