Hola a todos.
Estoy realizando un proyecto de mesa sísmica utilizando una placa ESP32 D1 R32.
Consiste en utilizar un motor NEMA17 que mueve una estructura, a la cual se le conectan unos acelerómetros MPU9250 para tomar algunas medidas y enviarlas a Thingspeak.
Creo que tanto el montaje como el conexionado de los componentes lo tengo bien hecho, pero el problema lo tengo en el código que es donde menos conocimiento tengo, la verdad.
Al principio he creado los códigos de los distintos actuadores y sensores por separado para probar y que funcionen de la manera que quiero y todo bien. Sin embargo cuando uno todo en el mismo código comienza a darme problemas.
Añado código y os comento:
//Librerías
#include <AccelStepper.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <MPU9250.h>
#include <WiFi.h>
#include <ThingSpeak.h>
//Pines de la placa y constantes
#define pinDIR 26
#define pinPUL 25
#define tipoMotor 1
#define FREC 1 //Valor de Frecuencia a introducir en Hz
//WiFi
const char* ssid = "xxxxxx"; //const char para que estos valores no se puedan modificar
const char* password = "xxxxxx";
//ThingSpeak
unsigned long channelID = xxxxxx;
const char* WriteAPIKey = "xxxxxx";
//Objetos
AccelStepper motor = AccelStepper(tipoMotor, pinPUL, pinDIR);
LiquidCrystal_I2C lcd(0x27,16,2);
MPU9250 IMU1(Wire , 0x68);
MPU9250 IMU2(Wire , 0x69);
WiFiClient Client;
void setup() { //Código que se ejecuta una vez
motor.setMaxSpeed(1000); //Velocidad máxima
motor.setSpeed(FREC*200); //Velocidad en pps (pulsos por segundo) 2Hz*200 pulsos/vuelta = 400
lcd.init();
lcd.backlight();
Serial.begin(9600); //Inicializa puerto serie a 9600 baudios
IMU1.begin(); //Inicializa el acelerómetro (objeto llamado IMU)
IMU2.begin();
WiFi.begin(ssid,password);
while (WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print("Conectando...");
}
Serial.println("WiFi conectado");
ThingSpeak.begin(Client);
}
void loop() { //Código que se repite
motor.runSpeed();
lcd.setCursor(0,0); //Pone el cursor en la posición indicada. La pantalla es de 16x2 (Fila 0-15, Columna 0-1).
lcd.print("Frecuencia:");
lcd.setCursor(11,0);
lcd.print(FREC);
lcd.setCursor(14,0);
lcd.print("Hz");
IMU1.readSensor(); //Lee todos los valores de los sensores del MPU1
IMU2.readSensor(); //Lee todos los valores de los sensores del MPU2
//Código que muestra los valores del acelerómetro en los tres ejes en m/s^2
Serial.print("Acelerómetro1 Eje X: ");
Serial.print(IMU1.getAccelX_mss(), 3); // el 3 indica el número de decimales
Serial.print("Acelerómetro1 Eje Y: ");
Serial.print(IMU1.getAccelY_mss(), 3);
Serial.print("Acelerómetro1 Eje Z: ");
Serial.println(IMU1.getAccelZ_mss(), 3);
Serial.print("Acelerómetro2 Eje X: ");
Serial.print(IMU2.getAccelX_mss(), 3); // el 3 indica el número de decimales
Serial.print("Acelerómetro2 Eje Y: ");
Serial.print(IMU2.getAccelY_mss(), 3);
Serial.print("Acelerómetro2 Eje Z: ");
Serial.println(IMU2.getAccelZ_mss(), 3);
//Para enviar los valores a Thingspeak (NO FUNCIONA. VER COMO ENVIAR VALORES DE LAS FUNCIONES A VARIABLES)
//float Acel_X = (IMU.getAccelX_mss(), 3);
//float Acel_Y = (IMU.getAccelY_mss(), 3);
//float Acel_Z = (IMU.getAccelZ_mss(), 3);
//ThingSpeak.setField(1,Acel_X);
//ThingSpeak.setField(2,Acel_Y);
//ThingSpeak.setField(3,Acel_Z);
//Código que muestra los valores del magnetómetro en los tres ejes en microTeslas
Serial.println(" "); //Espacios para separar los valores en el monitor serie
Serial.println(" ");
delay(3000); //Retardo para tomar las muestras del sensor cada 3 segundos
ThingSpeak.writeFields(channelID,WriteAPIKey);
Serial.println("Datos enviados a ThingSpeak");
//delay(14000); //Retardo ya que thingspeak recoge los datos cada 14seg ¿necesario?
}
El problema principal es que al ejecutar todo el motor no gira correctamente. Sé que el problema está en el delay (que podría omitir) pero también debido a los serial. Eliminando el delay y sustituyendo la parte del código del lcd que hay en el loop() en el setup() me funcionaba bien (esto antes de añadir la parte de WiFi y ThingSpeak).
¿Hay alguna opción de "independizar" el motor.runSpeed(); para que no interfiera en el bucle del loop()? He probado a meterlo en un bulce infinito con while(1) pero con esto se detiene todo el programa.
Por favor, ¿alguien puede arrojarme un poco de luz en el tema? Gracias!!