This week we were determined to finish the few remaining electronics assingments. We tried to find help, without much success, to mill a new board that could be used with the XIAO RP2040 and ESP32C3 XIAO microcontrollers. So, we decided to buy a board milling machine.👏👏 Now we are on our way to completion!. Now I will start with the individual task and then the group task.
In this new stage I decided to use the XIAO ESP32C3 which is like a pocket superhero in the world of microcontrollers. It's tiny, but super-powerful because it has a RISC-V processor, built-in Wi-Fi and Bluetooth connectivity, and way more memory than most basic microcontrollers. Now, the ATtiny1614 is more like the minimalist cousin that does basic things but without a lot of show. It's ideal for simple projects.
The first thing is to design in Eagle, I have used this software before. As usual I designed the schematic first, then I arranged the components, I tried to use the autorouter, but it was not so efficient, then I designed the traces, and finally I customized the board with a name and that's it.
To develop the G-code, I used ArtCAM. I imported the necessary design in scaled black and white, making sure to adjust the dimensions. Then, I set up the machining tools, selecting the appropriate cutters and defining parameters such as cutting speed, depth and steps per layer. I initially tried just marking the traces, and then used the area clearence tool. Finally, I generated the G-code.
As a first option I tried to manufacture the board without removing the copper that is outside the traces, it came out very well, but to ensure the correct operation of the board after several tests, the board to which I removed the excess copper was very well done. To manufacture the board with our new machine. We used the free program called Candle recommended by the brand of the CNC router which is a Twotrees TTC3018 CNC Router Machine.
At first it was complicated to solder my PCB board but with effort and dedication I was able to do it.
It is time to test my PCB board with the XIAO ESP32C3 microcontroller, for this test I will connect a LED and do a blink test. First I will install the microcontroller in the arduino IDE according to SEEED STUDIO instructions.
For this exercise, I used an infrared sensor TCRT5000 which is very accurate and was connected on the board that published the information on the web via WiFI and when this sensor detects the movement of my hand, it would turn on the LED that was connected on the other board.
First I had to create a user on the EMQX platform EMQX platform, which is a messaging platform based on the MQTT (Message Queuing Telemetry Transport) protocol designed to facilitate communication between devices in the context of the Internet of Things (IoT). Its main function is to act as an MQTT broker, i.e. as a mediator that allows devices to publish (send) and subscribe (receive) messages efficiently, securely and in real time.
#include#include int sensor; // Configuración WiFi const char* ssid = "OTTORTUGA"; // Cambia por el nombre de tu red WiFi const char* password = "******"; // Cambia por la contraseña de tu red WiFi // Configuración del broker MQTT const char* mqtt_server = "yaqua.cidemec.pe"; // Cambia por la dirección de tu broker MQTT const int mqtt_port = 1883; // Puerto MQTT (default es 1883) const char* mqtt_topic = "test/topic"; // Tema donde publicarás datos // Credenciales MQTT const char* mqtt_user = "stef"; // Cambia por tu usuario MQTT const char* mqtt_password = "******"; // Cambia por tu contraseña MQTT const char* client_id = "XIAOESP32C3_Stef"; // Cambia por un identificador único WiFiClient espClient; PubSubClient client(espClient); // Función para conectarse a WiFi void setupWiFi() { delay(10); Serial.println(); Serial.print("Conectando a "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi conectado"); Serial.print("Dirección IP: "); Serial.println(WiFi.localIP()); } // Función para conectarse al broker MQTT void reconnect() { while (!client.connected()) { Serial.print("Intentando conexión MQTT..."); // Intentamos conectar con usuario y contraseña if (client.connect(client_id, mqtt_user, mqtt_password)) { Serial.println("Conectado al broker MQTT"); } else { Serial.print("Falló, rc="); Serial.print(client.state()); Serial.println(" Intentando de nuevo en 5 segundos..."); delay(5000); } } } void setup() { Serial.begin(115200); pinMode(3,INPUT); setupWiFi(); client.setServer(mqtt_server, mqtt_port); // Intentamos conectar al broker reconnect(); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); /* // Subir un dato al broker String payload = "Hola desde XIAO ESP32-C3"; Serial.print("Enviando mensaje: "); Serial.println(payload); */ sensor=digitalRead(3); if (sensor==1) { if (client.publish(mqtt_topic, "1")) { Serial.println("Mensaje publicado correctamente"); } else { Serial.println("Error al publicar el mensaje"); }} else{ if (client.publish(mqtt_topic, "0")) { Serial.println("Mensaje publicado correctamente"); } else { Serial.println("Error al publicar el mensaje"); } } delay(1000); // Espera 5 segundos antes de enviar el siguiente mensaje }
#include#include int sensor; // Configuración WiFi const char* ssid = "OTTORTUGA"; // Cambia por el nombre de tu red WiFi const char* password = "******"; // Cambia por la contraseña de tu red WiFi // Configuración del broker MQTT const char* mqtt_server = "yaqua.cidemec.pe"; // Cambia por la dirección de tu broker MQTT const int mqtt_port = 1883; // Puerto MQTT (default es 1883) const char* mqtt_topic = "test/topic"; // Tema donde publicarás datos // Credenciales MQTT const char* mqtt_user = "stef"; // Cambia por tu usuario MQTT const char* mqtt_password = "******"; // Cambia por tu contraseña MQTT const char* client_id = "XIAOESP32C3_Stef_recibir"; // Cambia por un identificador único WiFiClient espClient; PubSubClient client(espClient); // Función para conectarse a WiFi // Definición del pin que vamos a controlar const int controlPin = 2; // Función para conectarse a WiFi void setupWiFi() { delay(10); Serial.println(); Serial.print("Conectando a "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi conectado"); Serial.print("Dirección IP: "); Serial.println(WiFi.localIP()); } // Callback que se ejecuta cuando llega un mensaje al tema suscrito void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Mensaje recibido en el tema: "); Serial.println(topic); Serial.print("Mensaje: "); // Convertir el payload en un String String message; for (unsigned int i = 0; i < length; i++) { message += (char)payload[i]; } Serial.println(message); // Controlar el pin en función del mensaje recibido if (message == "1") { digitalWrite(controlPin, HIGH); Serial.println("Pin 2 en HIGH"); } else if (message == "0") { digitalWrite(controlPin, LOW); Serial.println("Pin 2 en LOW"); } else { Serial.println("Comando no reconocido"); } } // Función para conectarse al broker MQTT void reconnect() { while (!client.connected()) { Serial.print("Intentando conexión MQTT..."); if (client.connect(client_id, mqtt_user, mqtt_password)) { Serial.println("Conectado al broker MQTT"); // Suscribirse al tema if (client.subscribe(mqtt_topic)) { Serial.println("Suscripción exitosa al tema: "); Serial.println(mqtt_topic); } else { Serial.println("Error al suscribirse al tema"); } } else { Serial.print("Falló, rc="); Serial.print(client.state()); Serial.println(" Intentando de nuevo en 5 segundos..."); delay(5000); } } } void setup() { Serial.begin(115200); // Configurar el pin como salida pinMode(controlPin, OUTPUT); digitalWrite(controlPin, LOW); // Inicialmente en LOW setupWiFi(); client.setServer(mqtt_server, mqtt_port); client.setCallback(callback); // Intentamos conectar al broker reconnect(); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); }
For this group exercise I did it with Mayra Ascencio, each one had her board with the XIAO ESP32C3 microcontroller connected to the MQTT platform, we used again the platform called “EMQX” that Juan lent us to perform this exercise.
In this exercise we made a communication system based on the MQTT protocol using infrared sensors and buzzers. There are two configurations, one from Stefany and the other from Mayra, which interact with each other through an MQTT platform, using a “broker” (mediator) called EMQX.
Process:
We both log in to our users in the broker. We also configure a “Topic” to be able to visualize when we receive the signal from the boards. We also upload the schedules to our boards and check the connectivity.
// PUBLISH CODE stefany board #include#include int sensor; // Configuración WiFi const char* ssid = "OTTORTUGA"; // Cambia por el nombre de tu red WiFi const char* password = "*****"; // Cambia por la contraseña de tu red WiFi // Configuración del broker MQTT const char* mqtt_server = "yaqua.cidemec.pe"; // Cambia por la dirección de tu broker MQTT const int mqtt_port = 1883; // Puerto MQTT (default es 1883) const char* mqtt_topic = "test/topic"; // Tema donde publicarás datos // Credenciales MQTT const char* mqtt_user = "stef"; // Cambia por tu usuario MQTT const char* mqtt_password = "*****"; // Cambia por tu contraseña MQTT const char* client_id = "XIAOESP32C3_Stef"; // Cambia por un identificador único WiFiClient espClient; PubSubClient client(espClient); // Función para conectarse a WiFi void setupWiFi() { delay(10); Serial.println(); Serial.print("Conectando a "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi conectado"); Serial.print("Dirección IP: "); Serial.println(WiFi.localIP()); } // Función para conectarse al broker MQTT void reconnect() { while (!client.connected()) { Serial.print("Intentando conexión MQTT..."); // Intentamos conectar con usuario y contraseña if (client.connect(client_id, mqtt_user, mqtt_password)) { Serial.println("Conectado al broker MQTT"); } else { Serial.print("Falló, rc="); Serial.print(client.state()); Serial.println(" Intentando de nuevo en 5 segundos..."); delay(5000); } } } void setup() { Serial.begin(115200); pinMode(3,INPUT); setupWiFi(); client.setServer(mqtt_server, mqtt_port); // Intentamos conectar al broker reconnect(); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); /* // Subir un dato al broker String payload = "Hola desde XIAO ESP32-C3"; Serial.print("Enviando mensaje: "); Serial.println(payload); */ sensor=digitalRead(3); if (sensor==1) { if (client.publish(mqtt_topic, "0")) { Serial.println("Mensaje publicado correctamente"); } else { Serial.println("Error al publicar el mensaje"); }} else{ if (client.publish(mqtt_topic, "1")) { Serial.println("Mensaje publicado correctamente"); } else { Serial.println("Error al publicar el mensaje"); } } delay(1000); // Espera 5 segundos antes de enviar el siguiente mensaje }
// SUSCRIBE MAYRA BOARD #include#include int sensor; // Configuración WiFi const char* ssid = "OTTORTUGA"; // Cambia por el nombre de tu red WiFi const char* password = "*****"; // Cambia por la contraseña de tu red WiFi // Configuración del broker MQTT const char* mqtt_server = "yaqua.cidemec.pe"; // Cambia por la dirección de tu broker MQTT const int mqtt_port = 1883; // Puerto MQTT (default es 1883) const char* mqtt_topic = "test/topic"; // Tema donde publicarás datos // Credenciales MQTT const char* mqtt_user = "mayra"; // Cambia por tu usuario MQTT const char* mqtt_password = "*****"; // Cambia por tu contraseña MQTT const char* client_id = "XIAOESP32C3_mayra"; // Cambia por un identificador único WiFiClient espClient; PubSubClient client(espClient); // Función para conectarse a WiFi // Definición del pin que vamos a controlar const int controlPin = 3; // Función para conectarse a WiFi void setupWiFi() { delay(10); Serial.println(); Serial.print("Conectando a "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi conectado"); Serial.print("Dirección IP: "); Serial.println(WiFi.localIP()); } // Callback que se ejecuta cuando llega un mensaje al tema suscrito void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Mensaje recibido en el tema: "); Serial.println(topic); Serial.print("Mensaje: "); // Convertir el payload en un String String message; for (unsigned int i = 0; i < length; i++) { message += (char)payload[i]; } Serial.println(message); // Controlar el pin en función del mensaje recibido if (message == "1") { digitalWrite(controlPin, HIGH); Serial.println("Pin 3 en HIGH"); } else if (message == "0") { digitalWrite(controlPin, LOW); Serial.println("Pin 3 en LOW"); } else { Serial.println("Comando no reconocido"); } } // Función para conectarse al broker MQTT void reconnect() { while (!client.connected()) { Serial.print("Intentando conexión MQTT..."); if (client.connect(client_id, mqtt_user, mqtt_password)) { Serial.println("Conectado al broker MQTT"); // Suscribirse al tema if (client.subscribe(mqtt_topic)) { Serial.println("Suscripción exitosa al tema: "); Serial.println(mqtt_topic); } else { Serial.println("Error al suscribirse al tema"); } } else { Serial.print("Falló, rc="); Serial.print(client.state()); Serial.println(" Intentando de nuevo en 5 segundos..."); delay(5000); } } } void setup() { Serial.begin(115200); // Configurar el pin como salida pinMode(controlPin, OUTPUT); digitalWrite(controlPin, LOW); // Inicialmente en LOW setupWiFi(); client.setServer(mqtt_server, mqtt_port); client.setCallback(callback); // Intentamos conectar al broker reconnect(); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); }
// PUBLISH Mayra Board #include#include int sensor; // Configuración WiFi const char* ssid = "OTTORTUGA"; // Cambia por el nombre de tu red WiFi const char* password = "*****"; // Cambia por la contraseña de tu red WiFi // Configuración del broker MQTT const char* mqtt_server = "yaqua.cidemec.pe"; // Cambia por la dirección de tu broker MQTT const int mqtt_port = 1883; // Puerto MQTT (default es 1883) const char* mqtt_topic = "test/topic"; // Tema donde publicarás datos // Credenciales MQTT const char* mqtt_user = "mayra"; // Cambia por tu usuario MQTT const char* mqtt_password = "*****"; // Cambia por tu contraseña MQTT const char* client_id = "XIAOESP32C3_mayra"; // Cambia por un identificador único WiFiClient espClient; PubSubClient client(espClient); // Función para conectarse a WiFi void setupWiFi() { delay(10); Serial.println(); Serial.print("Conectando a "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi conectado"); Serial.print("Dirección IP: "); Serial.println(WiFi.localIP()); } // Función para conectarse al broker MQTT void reconnect() { while (!client.connected()) { Serial.print("Intentando conexión MQTT..."); // Intentamos conectar con usuario y contraseña if (client.connect(client_id, mqtt_user, mqtt_password)) { Serial.println("Conectado al broker MQTT"); } else { Serial.print("Falló, rc="); Serial.print(client.state()); Serial.println(" Intentando de nuevo en 5 segundos..."); delay(5000); } } } void setup() { Serial.begin(115200); pinMode(2,INPUT); setupWiFi(); client.setServer(mqtt_server, mqtt_port); // Intentamos conectar al broker reconnect(); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); /* // Subir un dato al broker String payload = "Hola desde XIAO ESP32-C3"; Serial.print("Enviando mensaje: "); Serial.println(payload); */ sensor=digitalRead(2); if (sensor==1) { if (client.publish(mqtt_topic, "1")) { Serial.println("Mensaje publicado correctamente"); } else { Serial.println("Error al publicar el mensaje"); }} else{ if (client.publish(mqtt_topic, "0")) { Serial.println("Mensaje publicado correctamente"); } else { Serial.println("Error al publicar el mensaje"); } } delay(1000); // Espera 5 segundos antes de enviar el siguiente mensaje }
// SUSCRIBE STEFANY BOARD #include#include int sensor; // Configuración WiFi const char* ssid = "OTTORTUGA"; // Cambia por el nombre de tu red WiFi const char* password = "*****"; // Cambia por la contraseña de tu red WiFi // Configuración del broker MQTT const char* mqtt_server = "yaqua.cidemec.pe"; // Cambia por la dirección de tu broker MQTT const int mqtt_port = 1883; // Puerto MQTT (default es 1883) const char* mqtt_topic = "test/topic"; // Tema donde publicarás datos // Credenciales MQTT const char* mqtt_user = "stef"; // Cambia por tu usuario MQTT const char* mqtt_password = "*****"; // Cambia por tu contraseña MQTT const char* client_id = "XIAOESP32C3_Stef_recibir"; // Cambia por un identificador único WiFiClient espClient; PubSubClient client(espClient); // Función para conectarse a WiFi // Definición del pin que vamos a controlar const int controlPin = 3; // Función para conectarse a WiFi void setupWiFi() { delay(10); Serial.println(); Serial.print("Conectando a "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi conectado"); Serial.print("Dirección IP: "); Serial.println(WiFi.localIP()); } // Callback que se ejecuta cuando llega un mensaje al tema suscrito void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Mensaje recibido en el tema: "); Serial.println(topic); Serial.print("Mensaje: "); // Convertir el payload en un String String message; for (unsigned int i = 0; i < length; i++) { message += (char)payload[i]; } Serial.println(message); // Controlar el pin en función del mensaje recibido if (message == "1") { digitalWrite(controlPin, HIGH); Serial.println("Pin 2 en HIGH"); } else if (message == "0") { digitalWrite(controlPin, LOW); Serial.println("Pin 2 en LOW"); } else { Serial.println("Comando no reconocido"); } } // Función para conectarse al broker MQTT void reconnect() { while (!client.connected()) { Serial.print("Intentando conexión MQTT..."); if (client.connect(client_id, mqtt_user, mqtt_password)) { Serial.println("Conectado al broker MQTT"); // Suscribirse al tema if (client.subscribe(mqtt_topic)) { Serial.println("Suscripción exitosa al tema: "); Serial.println(mqtt_topic); } else { Serial.println("Error al suscribirse al tema"); } } else { Serial.print("Falló, rc="); Serial.print(client.state()); Serial.println(" Intentando de nuevo en 5 segundos..."); delay(5000); } } } void setup() { Serial.begin(115200); // Configurar el pin como salida pinMode(controlPin, OUTPUT); digitalWrite(controlPin, LOW); // Inicialmente en LOW setupWiFi(); client.setServer(mqtt_server, mqtt_port); client.setCallback(callback); // Intentamos conectar al broker reconnect(); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); }
- Using EMQX as an MQTT broker: I learned that EMQX is an essential tool for managing communication between IoT devices, enabling real-time data exchange through a lightweight protocol such as MQTT. This is key to develop scalable and efficient solutions in digital manufacturing or automation projects.
- Interaction between sensors and actuators: I understood how infrared sensors, when detecting objects, can publish information in an MQTT broker, and how other devices, such as buzzers, can act accordingly by subscribing to those messages, showing a practical IoT application.
- The implementation of EMQX demonstrates that MQTT-based systems are highly efficient and reliable for real-time communication between devices, making them an ideal solution for automation and monitoring projects.
- The use of platforms such as EMQX together with basic components such as sensors and actuators shows that it is possible to develop functional IoT systems without complex hardware, which favors accessibility and expansion to larger projects.