{"id":15163023,"url":"https://github.com/potier97/telemetry-node","last_synced_at":"2026-02-22T14:12:41.124Z","repository":{"id":252699922,"uuid":"840798311","full_name":"potier97/telemetry-node","owner":"potier97","description":"Simple iot Node - Environmental Factors: Light, Temperature \u0026 Humidity","archived":false,"fork":false,"pushed_at":"2024-08-11T21:17:49.000Z","size":1436,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-08T08:18:37.926Z","etag":null,"topics":["easyeda","esp32","firebase","iot","micropython","micropython-esp32","real-time","weather-app"],"latest_commit_sha":null,"homepage":"https://iot.nipoanz.com/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/potier97.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-10T18:02:47.000Z","updated_at":"2024-08-11T21:17:08.000Z","dependencies_parsed_at":"2024-08-11T22:28:36.603Z","dependency_job_id":"eadec83e-c45f-4f3f-9c4f-56427a027e32","html_url":"https://github.com/potier97/telemetry-node","commit_stats":null,"previous_names":["potier97/telemetry-node"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/potier97/telemetry-node","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/potier97%2Ftelemetry-node","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/potier97%2Ftelemetry-node/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/potier97%2Ftelemetry-node/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/potier97%2Ftelemetry-node/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/potier97","download_url":"https://codeload.github.com/potier97/telemetry-node/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/potier97%2Ftelemetry-node/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263540615,"owners_count":23477454,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["easyeda","esp32","firebase","iot","micropython","micropython-esp32","real-time","weather-app"],"created_at":"2024-09-27T02:02:27.625Z","updated_at":"2025-10-19T15:44:38.483Z","avatar_url":"https://github.com/potier97.png","language":"Python","readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"http://iot.nipoanz.com/\" target=\"blank\"\u003e\u003cimg src=\"./assets/image.png\" width=\"300\" alt=\"NPA Logo\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n# Nodos de Telemetría - IOT\n\nVer el proyecto en [http://iot.nipoanz.com/](http://iot.nipoanz.com/)\n\n## Descripción del Proyecto\nEste proyecto de telemetría de variables ambientales está diseñado para monitorear en tiempo real factores como la luz, la humedad, y la temperatura, este se encuentra desarrollado en MicroPython y se ejecuta en un microcontrolador ESP32. Esta es una mejora y modernización del script desarrolado sobre Arduino, el cual se puede encontrar en este [enlace](main.ino), el cual se encuentra en el repositorio de este proyecto.\n\nEste proyecto tambien cuenta con un frontend desarrollado en Next.js, el cual se puede acceder en el siguiente [link](https://iot.nipoanz.com), y este tambien cuenta con un repositorio el cual se llama [next-weather-station](https://github.com/potier97/next-wheather-station).\n\nLa solución es fundamental para entornos que dependen de condiciones ambientales óptimas, como invernaderos, laboratorios, y almacenamiento de productos sensibles. \n\nEl sistema recopila datos de sensores como DHT21 y VEML6070, los cuales almacena de manera segura en la base de datos de tiempo real de Firebase, y además de guardarlos en una tarjeta SD local para persistencia de la información en caso de fallos de conexión.\n\n## Tarjeta y Dispositivo desarrollado\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./assets/image-6.jpeg\" width=\"100%\" alt=\"NPA Logo\" /\u003e\n\u003c/p\u003e\n\nEste proyecto se basa en una tarjeta de desarrollo personalizada que integra un microcontrolador ESP32, sensores de luz, temperatura y humedad, y una ranura para tarjeta SD. La tarjeta está diseñada para ser compacta y fácil de usar, lo que la hace ideal para aplicaciones de IoT y telemetría en entornos industriales y comerciales.\n\n### Dispositivo final\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./assets/image-7.jpeg\" width=\"100%\" alt=\"NPA Logo\" /\u003e\n\u003c/p\u003e\n\n\n### Conexionado de la tarjeta\n\nEl siguiente es el esquematico de pinout de la tarjeta ESP32\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./assets/image-8.png\" width=\"100%\" alt=\"NPA Logo\" /\u003e\n\u003c/p\u003e\n\nLas conexiónes al dispositivo correponde a la siguiente tabla:\n\n| Sensor | ESP32 Pin (GPIO) |\n| ------ | --------- |\n| DHT21  | 17 Salida Digital |\n| VEML6070 | 16 (power) 21 (SDA) 22 (SCL) |\n| SD Card | 18 (SCK) 23 (MOSI) 19 (MISO) 5 (CS) |\n| LED     | 12 Salida Digital |\n\n - **DHT21**: Sensor de temperatura y humedad\n - **VEML6070**: Sensor de luz UV\n - **SD Card**: Tarjeta SD para almacenamiento local\n - **LED**: Indicador de estado\n\nEsta tarjeta se ha desarrollado mediante `EasyEDA` y se ha fabricado en `JLCPCB`. Puede encontrar el diseño compartido [aqui](https://oshwlab.com/nicolaspotier97/iot-node-2).\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./assets/image-5.png\" width=\"500\" alt=\"NPA Logo\" /\u003e\n\u003c/p\u003e\n\n## Funcionalidades\n\n - **Monitoreo Continuo**: Permite un control constante de las condiciones ambientales, crucial para mantener la calidad y la estabilidad de los productos o experimentos.\n - **Automatización de Alertas**: Genera alertas automáticas en caso de que las variables ambientales superen los límites definidos, ayudando a prevenir pérdidas y mantener la conformidad con las normas.\n - **Acceso Remoto a Datos**: Con la integración en la nube, los datos pueden ser monitoreados desde cualquier lugar, facilitando la gestión descentralizada de los activos.\n - **Escalabilidad**: El sistema puede ser expandido fácilmente para monitorear otras variables o para implementar en múltiples ubicaciones sin necesidad de cambios significativos.\n\n## Características Clave\n - **Recopilación de Datos Ambientales**: Medición precisa de luz, temperatura, y humedad utilizando sensores avanzados conectados a un microcontrolador (ESP32 de Espressif).\n - **Almacenamiento Local y en la Nube**: Los datos se guardan en una tarjeta SD y se sincronizan con una base de datos en Firebase para su análisis posterior.\n - **Conectividad Wi-Fi**: Permite la transmisión de datos en tiempo real a través de Wi-Fi, asegurando que la información esté siempre disponible.\n - **Manejo de Energía Eficiente**: El dispositivo está optimizado para operar en modo de bajo consumo, maximizando la vida útil del dispositivo en ubicaciones remotas.\n\n## Instalación\n\nRequisitos Previos\n- Hardware Necesario:\n  - Microcontrolador ESP32.\n  - Sensor de humedad, temperatura (DHT21)\n  - Sensor de luz UV (Adafruit VEML6070).\n  - Tarjeta SD y módulo lector.\n\n- Conexión Wi-Fi disponible.\n\n- Software Necesario:\n - Python: Para ejecutar y modificar el código del proyecto.\n - MicroPython: Firmware necesario para correr el código en el ESP32.\n - ampy: Herramienta para cargar el código al microcontrolador.\n\n## Configuración del Entorno\nInstalación del Firmware MicroPython en el ESP32:\n 1. Descarga la última versión del firmware de MicroPython para ESP32.\n 2. Flashea el firmware al ESP32 usando esptool.py. - Lo puede hacer siguiendo las instrucciones en el siguiente [reposirotio](https://github.com/potier97/micropython-config).\n\n### Instalación de Dependencias:\n\n - Instala ampy para cargar los scripts en el ESP32.\n\n```bash\npip install adafruit-ampy\n\n```\n- Cargar el Código al ESP32:\n\n```bash\nampy --port  put main.py\nampy --port COM3 put config.py\n```\n\n### Configuración del Sistema\n\n - Configuración de archivo config.py:\n\nEste archivo contiene las credenciales de Wi-Fi y Firebase necesarias para la conexión y el almacenamiento de datos, además el api key de google para poder consumir el api de geolocalización. Asegúrate de que la configuración de la red Wi-Fi está correctamente especificada en config.py:\n\n \u003e **Importante**: Puede ver la sigueinte documentación de google para ver como funciona el api de  [geo-localización](https://developers.google.com/maps/documentation/geolocation/requests-geolocation?hl=es-419#java)\n\n \u003e Es importante tener un proyecto de Firebase y una cuenta de Google GCP para poder consumir el api de geolocalización.\n\n```python\nssid = 'XXXXXX'\npassword = 'XXXXXX'\napi_key = 'XXXXXX'\nfirebase_api_key = 'XXXXXX'\nfirebase_email = 'XXXXXX'\nfirebase_password = 'XXXXXX'\nfirebase_database_url = 'XXXXXX'\nsleep_time = 600 \nsensor_name = \"sensor1\"\n```\n \u003e Este archivo debe ser cargado al ESP32 junto con el archivo main.py.\n\nLas variables `api_key`, `firebase_api_key`, `firebase_email`, `firebase_password`, `firebase_database_url`, `sleep_time`, `sensor_name` deben ser reemplazadas con los valores correspondientes.\n\n - ssid: Nombre de la red Wi-Fi.\n - password: Contraseña de la red Wi-Fi.\n - api_key: Api key de google para consumir el api de geolocalización.\n - firebase_api_key: Api key de Firebase.\n - firebase_email: Correo electrónico de la cuenta creada en Firebase en el servicio de authentication\n - firebase_password: Contraseña de la cuenta creada en Firebase en el servicio de authentication\n - firebase_database_url: URL de la base de datos en Firebase (tiempo real).\n - sleep_time: Tiempo en segundos que el dispositivo estará en modo de inactivo (deep sleep) y despertará para tomar una nueva lectura.\n - sensor_name: Nombre del sensor, este se utiliza para identificar el sensor en la base de datos.\n\n\n## Carga de Scripts al ESP32\n\nTeniendo el firmware de MicroPython instalado en el ESP32 y las dependencias necesarias configuradas, puedes cargar los scripts al microcontrolador utilizando ampy:\n\n```bash\nampy --port COM3 put .\\module\\boot.py boot.py\nampy --port COM3 put .\\module\\sdcard.py sdcard.py\nampy --port COM3 put .\\scripts\\config.py config.py\nampy --port COM3 put .\\scripts\\dht_sensor.py dht_sensor.py\nampy --port COM3 put .\\scripts\\firebase.py firebase.py\nampy --port COM3 put .\\scripts\\geolocation.py geolocation.py\nampy --port COM3 put .\\scripts\\node.py node.py\nampy --port COM3 put .\\scripts\\ntp.py ntp.py\nampy --port COM3 put .\\scripts\\sd.py sd.py\nampy --port COM3 put .\\scripts\\uv.py uv.py\nampy --port COM3 put .\\scripts\\main.py main.py\n```\n\n\u003e De acuerdo a la estructura de este proyecto, todos los scripts ubicados en la carpeta `scripts` se deben cargar al ESP32.\n\n\u003e El script `main.py` es el script principal que se ejecutará en el ESP32 y este debe ser cargado de ultimo para evitar bloqueos en el microcontrolador.\n\n## Funcionamiento\n\n### DHT sensor\n\nCorresponde al Script [`dht_sensor.py`](./scripts/dht_sensor.py)\n\nEste script se encarga de manejar la lectura de los sensores de temperatura y humedad DHT22. El sensor mide la temperatura y la humedad, y también calcula la sensación térmica (heat index) basada en estos valores.\n\n**Funcionamiento**:\n - DHTSensor Clase: Inicializa el sensor DHT22 y define los métodos para leer los valores de temperatura y humedad.\n - read() Método: Lee los valores del sensor y calcula la sensación térmica.\n - compute_heat_index() Método: Calcula la sensación térmica (heat index) usando una fórmula empírica simplificada.\n\n```python\t\nsensor = DHTSensor(pin=14)\ntemperature, humidity, heat_index = sensor.read()\nprint(\"Temperature:\", temperature, \"C\")\nprint(\"Humidity:\", humidity, \"%\")\nprint(\"Heat Index:\", heat_index, \"C\")\n```\n\n### UV sensor\n\nCorresponde al Script [`uv.py`](./scripts/uv.py)\n\nLeer el índice de radiación UV utilizando un sensor de UV conectado al pin especificado del microcontrolador.\n\n\n**Funcionamiento**:\n - UVSensor Clase: Inicializa el sensor UV y define el método para leer el índice UV.\n - read_uv_index() Método: Lee el valor del sensor UV, lo convierte a un índice UV y lo devuelve.\n \n\n\n```python\nveml6070Pin = Pin(16, Pin.OUT)\nveml6070Pin.value(1)\ni2c = SoftI2C(scl=Pin(22), sda=Pin(21))\nuv_sensor = VEML6070(i2c)\nuv_index = uv_sensor.read_uv_index()\nprint(\"UV Index:\", uv_index)\n```\n\n### Geolocalización\n\nCorresponde al Script [`geolocation.py`](./scripts/geolocation.py)\n\nEste script se encarga de obtener la geolocalización del dispositivo utilizando la API de Google Maps. La geolocalización se obtiene a partir de la dirección IP del dispositivo y se almacena en la base de datos de Firebase.\n\n**Funcionamiento**:\n - Geolocation Clase: Define el método para obtener la geolocalización del dispositivo utilizando la API de Google Maps.\n - get_geolocation() Método: Obtiene la dirección IP del dispositivo, la envía a la API de Google Maps y almacena la geolocalización en la base de datos de Firebase.\n\n```python\ngeolocation = Geolocation()\nlat, lng = geolocation.get_coordinates()\nprint(f\"Latitude: {lat}, Longitude: {lng}\")\n```\n\n### Firebase\n\nCorresponde al Script [`firebase.py`](./scripts/firebase.py)\n\nEste script se encarga de manejar la conexión con la base de datos de Firebase y de almacenar los datos de los sensores en tiempo real.\n\n**Funcionamiento**:\n - Firebase Clase: Inicializa la conexión con la base de datos de Firebase y define los métodos para almacenar y recuperar datos.\n - authenticate() Método: Autentica el usuario en Firebase utilizando el correo electrónico y la contraseña.\n- save_data() Método: Almacena los datos de los sensores en la base de datos de Firebase.\n\n```python\nnode_name = \"sensor1\"\ndata = {\n    \"temperature\": 25.0,\n    \"humidity\": 60.0,\n    \"heat_index\": 26.0,\n    \"uv_index\": 5.0,\n    \"latitude\": 37.7749,\n    \"longitude\": -122.4194\n}\nfirebase = Firebase(api_key, email, password, database_url)\ntoken = firebase.authenticate()\nfirebase.save_data(token, node_name, data)\n```\n\n### Node\n\nCorresponde al Script [`node.py`](./scripts/node.py)\n\nEste script se encarga de coordinar la lectura de los sensores, la geolocalización y el almacenamiento de los datos en la base de datos de Firebase. El nodo se encarga de manejar el ciclo de lectura de los sensores y de enviar los datos a la base de datos.\n\n**Funcionamiento**:\n - Node Clase: Inicializa los sensores, la geolocalización y la conexión con Firebase, y define el método para ejecutar el ciclo de lectura y almacenamiento de datos.\n - run() Método: Ejecuta el ciclo de lectura de los sensores y el almacenamiento de datos en la base de datos.\n\n```python\nsensor_name = \"sensor1\"\nled = 2\nsleep_time = 600\nnode = Node(sensor_name, led, sleep_time)\nnode.run()\n```\n\n### NTP\n\nCorresponde al Script [`ntp.py`](./scripts/ntp.py)\n\nEste script se encarga de sincronizar el reloj del ESP32 con un servidor NTP para asegurar la precisión de las marcas de tiempo en los datos almacenados en la base de datos.\n\n**Funcionamiento**:\n - NTP Clase: Define el método para sincronizar el reloj del ESP32 con un servidor NTP.\n - sync_time() Método: Sincroniza el reloj del ESP32 con un servidor NTP.\n\n```python\nntp = NTP()\nntp.sync_time()\n```\n\n### SD\n\nCorresponde al Script [`sd.py`](./scripts/sd.py)\n\nEste script se encarga de manejar la lectura y escritura de datos en una tarjeta SD conectada al ESP32. Los datos se almacenan en un archivo CSV en la tarjeta SD para su persistencia en caso de fallos de conexión.\n\n**Funcionamiento**:\n - SD Clase: Inicializa la tarjeta SD y define los métodos para leer y escribir datos en un archivo CSV.\n - write_data() Método: Escribe los datos de los sensores en un archivo CSV en la tarjeta SD.\n - read_data() Método: Lee los datos de un archivo CSV en la tarjeta SD.\n\n```python\nsd = SDCard(spi_sck=18, spi_mosi=23, spi_miso=19, cs_pin=5)\nfile_name = \"data.csv\"\ndata = {\n    \"temperature\": 25.0,\n    \"humidity\": 60.0,\n    \"heat_index\": 26.0,\n    \"uv_index\": 5.0,\n    \"latitude\": 37.7749,\n    \"longitude\": -122.4194\n}\nsd.write_data(file_name, data)\n```\n\n### Main\n\nCorresponde al Script [`main.py`](./scripts/main.py)\n\nEste script es el script principal que se ejecuta en el ESP32 y coordina la lectura de los sensores, la geolocalización y el almacenamiento de los datos en la base de datos de Firebase y en la tarjeta SD.\n\n**Funcionamiento**:\n - Configuración de los pines y la conexión Wi-Fi.\n - Inicialización de los sensores, la geolocalización, la conexión con Firebase y la tarjeta SD.\n - Ciclo de lectura de los sensores, la geolocalización y el almacenamiento de los datos en la base de datos y la tarjeta SD.\n\n```python\nimport config\nfrom node import Node\nsleep_time = config.sleep_time\nsensor_name = config.sensor_name\nled = 12\nnode = SensorNode(sensor_name, led, sleep_time)\nnode.run()\n```\n\n### Purebas\n\nDatos sensados en la base de datos de Firebase:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./assets/image-2.png\" width=\"400\" alt=\"NPA Logo\" /\u003e\n\u003c/p\u003e\n\nDatos Mostrados en la plataforma web:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./assets/image-3.png\" width=\"400\" alt=\"NPA Logo\" /\u003e\n\u003c/p\u003e\n\nVisualización de la terminal:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./assets/image-4.png\" width=\"400\" alt=\"NPA Logo\" /\u003e\n\u003c/p\u003e\n¿\n\n\n## Uso\n\nEste proyecto es esencial para cualquier organización que necesite monitorear condiciones ambientales de manera continua y fiable. La estructura del código basada en MicroPython y orientada a objetos asegura una solución escalable y fácil de mantener, lo que permite a las empresas adaptarse rápidamente a nuevas necesidades o regulaciones.\n\n## Contribuir\n\n1. Hacer un fork del repositorio.\n2. Crear una nueva rama (`git checkout -b feature-nueva-funcionalidad`).\n3. Hacer commit de los cambios (`git commit -am 'Agregar nueva funcionalidad'`).\n4. Hacer push a la rama (`git push origin feature-nueva-funcionalidad`).\n5. Crear un Pull Request.\n\n## Licencia\n\nEste proyecto está bajo la Licencia MIT.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpotier97%2Ftelemetry-node","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpotier97%2Ftelemetry-node","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpotier97%2Ftelemetry-node/lists"}