Как связать MPU9250 и NodeMcu?
Я пытаюсь отправить данные датчика MPU на платформу Pubnub IOT, но не могу этого сделать, так как возникла какая-то неизвестная проблема. В коде нет ошибки, но в com-порте появляется следующая проблема:-
Похоже, показания датчика должны быть в формате JSON, но я не знаю, как это сделать. Мне просто нужно это в необработанном чтении датчика imu на данный момент, так как я могу его получить.
Вот код:
#include <ESP8266WiFi.h>
#define PubNub_BASE_CLIENT WiFiClient
#include <PubNub.h>
#define PUBNUB_DEFINE_STRSPN_AND_STRNCASECMP
#include "MPU9250.h"
const char *ssid = "mym404"; // замените на ваш Wi-Fi ssid и ключ wpa2
const char *pass = "786110786";
const char * pubkey = "my key";
const char * subkey = "my key";
const char * pubchannel = "demo_keyset";
const char * subchannel = "demo_keyset";
MPU9250 IMU(Wire,0x68);
int status;
void setup() {
/* For debugging, set to speed of your choice */
Serial.begin(115200);
Serial.println("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
/* Start the Pubnub library by giving it a publish and subscribe
keys */
PubNub.begin(pubkey, subkey);
while(!Serial) {}
// начинаем общение с IMU
status = IMU.begin();
if (status < 0) {
Serial.println("IMU initialization unsuccessful");
Serial.println("Check IMU wiring or try cycling power");
Serial.print("Status: ");
Serial.println(status);
while(1) {}
}
}
void loop() {
// читаем датчик
IMU.readSensor();
// отображаем данные
Serial.print(IMU.getAccelX_mss(),6);
Serial.print("\t");
/* Publish message. You could use `auto` here... */
PubNonSubClient *pclient = PubNub.publish(pubchannel, "String(IMU.getAccelX_mss())");
if (!pclient) return;
PublishCracker cheez;
cheez.read_and_parse(pclient);
/** You're mostly interested in `outcome()`, and,
if it's "failed", then `description()`.
*/
Serial.print("Outcome: "); Serial.print(cheez.outcome());
Serial.print(' '); Serial.println(cheez.to_str(cheez.outcome()));
Serial.print("description: "); Serial.println(cheez.description());
Serial.print("timestamp: "); Serial.println(cheez.timestamp());
Serial.print("state: "); Serial.print(cheez.state());
Serial.print(' '); Serial.println(cheez.to_str(cheez.state()));
pclient->stop();
/* Wait for news. */
PubSubClient *sclient = PubNub.subscribe(subchannel);
if (!sclient) return; // ошибка
String msg;
SubscribeCracker ritz(sclient);
while (!ritz.finished()) {
ritz.get(msg);
if (msg.length() > 0) {
Serial.print("Received: "); Serial.println(msg);
}
}
sclient->stop();
delay(1000);
}
Что вы думаете, ребята?
1 ответ
Ошибка, о которой вы сообщаете, связана с вашим вызовом PubNub.publish()
. Вы могли бы диагностировать проблему, взяв вывод и проверив то, что вы ему передавали.
Ваша линия:
PubNonSubClient *pclient = PubNub.publish(pubchannel, "String(IMU.getAccelX_mss())");
не будет работать. Вы отправляете строку "String(IMU.getAccelX_mss())"
в PubNub, а не значение IMU.getAccelX_mss()
как String
код>. Убери кавычки:
PubNonSubClient *pclient = PubNub.publish(pubchannel, String(IMU.getAccelX_mss()));
Если по какой-то причине число должно быть возвращено в виде строки, код будет выглядеть так:
PubNonSubClient *pclient = PubNub.publish(pubchannel, "\"" + String(IMU.getAccelX_mss()) + "\"");
Я пытался, но это не работает. В документации Pubnub написано, что эти данные отправляются в формате JSON. например - "\"сообщение\"" . Я знаю о загрузке строки, но не знаю о загрузке данных в качестве переменной. Вы знаете, как загрузить переменную в формате JSON., @Sultan Morbiwala
Вам понадобится ArduinoJson, чтобы упростить JSON — но если данные, которые вы отправляете, очень простые, то, вероятно, нет необходимости в библиотеке ArduinoJson — пожалуйста, добавьте к вопросу ожидаемый формат данных, которые вы отправляете., @Jaromanda X
Мне просто нужно необработанное чтение датчика на данный момент, @Sultan Morbiwala
Ответ, который я вам дал, отправляет необработанные показания датчика на сервер. Вы продолжаете говорить, что вам нужно отправить JSON. Как должен выглядеть JSON?, @romkey
Ожидаемый формат должен быть "\"IMU.getAccelX_mss()\"". Просто imu.get должен показать фактическое чтение., @Sultan Morbiwala
Странно, что число должно быть возвращено в виде строки. Я обновил ответ, чтобы опубликовать строку вместо числа., @romkey
- NodeMCU не может подключиться к мобильной точке доступа, когда я включаю коды для считывания датчика температуры
- Как загрузить данные датчиков в pubnub IOT в формате JSON?
- ESP8266 не подключается к Wi-Fi
- Простой запрос GET с ESP8266HTTPClient
- Каково использование зарезервированных контактов и контактов SDD2, SDD3 NodeMCU?
- NodeMCU (Arduino IDE) «DynamicJsonBuffer» не был объявлен в этой области
- Чтение файла из SPIFFS в nodemcu с использованием ArduinoJson
- Обнаружение ESP8266 в сети
Я надеюсь, что ваш
pubkey
иsubkey
не являются конфиденциальными данными, @Jaromanda Xнет, это просто демонстрационный ключ. но на всякий случай поменяю., @Sultan Morbiwala