kharlashkin
New member
Добрый день.
Есть проблема- второй день бьюсь над решением, гугль молчит (никакого решения найти не могу), сам пока что не могу додуматься.
Есть плата Wemos D1 mini, к нему контроллер аккумулятора и датчик MPU-9250 распаенный на макетке. Контроллер считывает показания датчика и отправляет их на ПК протоколом MQTT.
Что хочу сделать - отправлять команды на контроллер о начале передачи, окончании передачи, глубокого сна (экономить заряд).
При загрузке контроллера я вижу по индикации светодиода, что данные считываются, отправляю "start", начинается отправка и прием данных, но после этого никакими другими командами ничего сделать не получается. Если же после загрузки отправляю "sleep" датчик засыпает. Может кто сталкивался с похожей проблемой или укажет в какую сторону смотреть.
Есть проблема- второй день бьюсь над решением, гугль молчит (никакого решения найти не могу), сам пока что не могу додуматься.
Есть плата Wemos D1 mini, к нему контроллер аккумулятора и датчик MPU-9250 распаенный на макетке. Контроллер считывает показания датчика и отправляет их на ПК протоколом MQTT.
Что хочу сделать - отправлять команды на контроллер о начале передачи, окончании передачи, глубокого сна (экономить заряд).
Код:
#include <I2Cdev.h>
#include <MPU9250_9Axis_MotionApps41.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <ArduinoOTA.h>
MPU9250 mpu;
#define SDA 4
#define SCL 5
#define LED_PIN 2
IPAddress ip(192, 168, 50, 24);
IPAddress gateway(192, 168, 50, 1);
IPAddress subnet(255, 255, 255, 0);
const char* ssid = "ссид";
const char* password = "пароль";
const char* mqtt_server = "192.168.50.10";
String messageMQTT;
WiFiClient espClient;
PubSubClient client(espClient);
uint16_t packetSize; // expected DMP packet size (default is 42 bytes)
uint16_t fifoCount; // count of all bytes currently in FIFO
uint8_t fifoBuffer[64]; // FIFO storage buffer
bool blinkState = false;
bool sendData = false;
int good = 1;
Quaternion q; // [w, x, y, z] quaternion container
void setup_wifi() {
delay(10);
WiFi.setSleepMode(WIFI_NONE_SLEEP);
WiFi.config(ip, gateway, subnet);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(50);
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived ");
Serial.print(topic);
Serial.print(" ");
for (int i = 0; i < length; i++) {
Serial.print((char)payload[i]);
messageMQTT += (char)payload[i];
}
if (messageMQTT == "start"){
Serial.println(messageMQTT);
sendData = !sendData;
}
if (messageMQTT == "sleep"){
Serial.println(messageMQTT);
mpu.setSleepEnabled(true);
ESP.deepSleep(-1);
}
Serial.println();
}
void reconnect() {
while (!client.connected()) {
String clientId = "head-";
clientId += String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
client.subscribe("main");
}
}
}
void setup() {
Wire.begin(SDA, SCL);
Wire.setClock(400000);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
mpu.initialize();
mpu.dmpInitialize();
mpu.setDMPEnabled(true);
packetSize = mpu.dmpGetFIFOPacketSize();
fifoCount = mpu.getFIFOCount();
ArduinoOTA.onStart([]() {
Serial.println("Start"); // "Начало OTA-апдейта"
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd"); // "Завершение OTA-апдейта"
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
// "Ошибка при аутентификации"
else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
// "Ошибка при начале OTA-апдейта"
else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
// "Ошибка при подключении"
else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
// "Ошибка при получении данных"
else if (error == OTA_END_ERROR) Serial.println("End Failed");
// "Ошибка при завершении OTA-апдейта"
});
ArduinoOTA.begin();
pinMode(LED_PIN, OUTPUT);
}
void loop() {
ArduinoOTA.handle();
if (!client.connected()) {
reconnect();
}
client.loop();
if (fifoCount < packetSize) {
fifoCount = mpu.getFIFOCount();
}
else if (fifoCount == 1024) {
mpu.resetFIFO();
}
else if (fifoCount % packetSize != 0) {
mpu.resetFIFO();
}
else if (fifoCount >= packetSize) {
mpu.getFIFOBytes(fifoBuffer, packetSize);
fifoCount -= packetSize;
mpu.dmpGetQuaternion(&q, fifoBuffer);
if (sendData == true) {
client.publish("adam/head", (uint8_t*)&q, sizeof(q));
good = good + 1;
Serial.println(good);
yield();
}
blinkState = !blinkState;
digitalWrite(LED_PIN, blinkState);
mpu.resetFIFO();
}
}