Как отправить данные устройства MPU6050 в IoT Hub - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь отправить данные акселерометра из MPU6050, который подключен к ESP8266, в концентратор IoT Azure.Я использую Arduino IDE.

Я следовал этому руководству от Microsoft: https://docs.microsoft.com/en-gb/azure/iot-hub/iot-hub-arduino-huzzah-esp8266-get-started?, в котором используются датчик DHT11 и esp8266.Я также сделал это руководство: http://archicode.be/esp8266-the-iot-prototyping-graal/, которое показывает, какие библиотеки и методы необходимы для подключения ESP8266 к Azure IoTHub.Код, который я использовал для тестирования MPU6050, приведен ниже и указан как https://playground.arduino.cc/Main/MPU-6050/#short

// MPU-6050 Short Example Sketch
// By Arduino User JohnChi
// August 17, 2014
// Public Domain
#include<Wire.h>
const int MPU_addr=0x68;  // I2C address of the MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
void setup(){
  Wire.begin();
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  Serial.begin(9600);
}
void loop(){
  Wire.beginTransmission(MPU_addr);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(MPU_addr,14,true);  // request a total of 14 registers
  AcX=Wire.read()<<8|Wire.read();  // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)    
  AcY=Wire.read()<<8|Wire.read();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ=Wire.read()<<8|Wire.read();  // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
  Tmp=Wire.read()<<8|Wire.read();  // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
  GyX=Wire.read()<<8|Wire.read();  // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
  GyY=Wire.read()<<8|Wire.read();  // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
  GyZ=Wire.read()<<8|Wire.read();  // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
  Serial.print("AcX = "); Serial.print(AcX);
  Serial.print(" | AcY = "); Serial.print(AcY);
  Serial.print(" | AcZ = "); Serial.print(AcZ);
  Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53);  //equation for temperature in degrees C from datasheet
  Serial.print(" | GyX = "); Serial.print(GyX);
  Serial.print(" | GyY = "); Serial.print(GyY);
  Serial.print(" | GyZ = "); Serial.println(GyZ);
  delay(333);
}

Как и где я могу включить этот код?У кого-нибудь может быть хорошая ссылка?Буду признателен за любую помощь!:)

1 Ответ

2 голосов
/ 19 июня 2019

Посмотрите на код здесь: https://github.com/Azure-Samples/iot-hub-feather-huzzah-client-app/blob/ab3d6e46f1b94192f8c8a96fb7b47d714df99439/app/app.ino#L114. Это вызов функции, которая возвращает строку JSON в буфере, переданном в качестве второго параметра. Эта функция определяется здесь: https://github.com/Azure-Samples/iot-hub-feather-huzzah-client-app/blob/ab3d6e46f1b94192f8c8a96fb7b47d714df99439/app/message.ino#L42.

Вам потребуется заменить содержимое readMessage на приведенный выше код, чтобы вернуть данные в форме JSON. Однако вам понадобится немного дополнительного кода. Код в цикле имеет задержку 10 мс и вызывает IoTHubClient_LL_DoWork на каждой итерации. Для надежной работы Azure IoT SDK это необходимо. Поскольку вы только читаете свой датчик каждые 333 мс, вам нужно будет отслеживать время для себя. Например, в цикле вы бы вызывали readMessage только каждый раз, когда цикл был выполнен 33 раза. Примерно так (быстро и грязно только для демонстрации):

static int messageCount = 1;
static int loopCounter = 0;
void loop()
{
    if (++loopCounter == 33)
    {
        if (!messagePending && messageSending)
        {
            char messagePayload[MESSAGE_MAX_LEN];
            bool temperatureAlert = readMessage(messageCount, messagePayload);
            sendMessage(iotHubClientHandle, messagePayload, temperatureAlert);
            messageCount++;
            delay(interval);
        }
        loopCounter = 0;
    }
    IoTHubClient_LL_DoWork(iotHubClientHandle);
    delay(10);
}

Это даст вам чтение каждые 330 мс. Вам также необходимо добавить строку подключения.

...