Pular para o conteúdo principal
note

SenseCAP Platform foi oficialmente renomeada como SenseCraft Data Platform!

Usando XIAO ESP32C3 para se conectar à SenseCraft Data Platform para conselhos de plantio

Durante esse período, a SenseCraft Data platform da Seeed Studio desenvolveu e lançou novos recursos de IA. Atualmente, as principais funções do AI Advisor na SenseCraft Data Platform estão focadas em fornecer conselhos construtivos de plantio para produtores, e serão atualizadas com recursos de IA mais ricos em um futuro próximo!

Este tutorial, então, fará a ponte entre a série XIAO ESP32 e a SenseCraft Data platform, detalhando como usar os sensores Grove e XIAO para enviar dados para a plataforma e obter sugestões construtivas da IA com base nesses valores de sensores.

Primeiros Passos

Preparação de Hardware

As três peças de hardware que serão usadas neste tutorial são o XIAO ESP32C3, o Grove Base para XIAO e o sensor de temperatura e umidade Grove SHT40. Para a conveniência da fiação, usamos a placa de expansão XIAO, que você pode adquirir de acordo com suas necessidades reais.

Seeed Studio XIAO ESP32C3Grove Base for XIAOGrove - Temperature & Humidity Sensor(SHT40)

Preparação de Software

Se esta é a sua primeira vez usando o XIAO ESP32C3, então você precisa ler este Wiki primeiro para aprender a configurar um bom ambiente de desenvolvimento no Arduino.

Além disso, este tutorial é compatível com o XIAO ESP32S3, você também pode usar o XIAO ESP32S3 para concluir o conteúdo deste tutorial.

Como o sensor SHT40 é usado, você também precisa adicionar bem as duas bibliotecas a seguir no Arduino para garantir que o programa possa ser executado sem problemas.

XIAO ESP32C3 Obtendo Dados de Temperatura e Umidade

Como mostrado na figura abaixo, conecte o sensor de temperatura e umidade Grove SHT40 à interface IIC do XIAO.

Em seguida, faça o upload do seguinte programa para o XIAO ESP32C3 para acionar o sensor SHT40 a funcionar e começar a obter os valores de temperatura e umidade do ar.

#include <Arduino.h>
#include <SensirionI2CSht4x.h>
#include <Wire.h>

SensirionI2CSht4x sht4x;

void setup() {

Serial.begin(115200);
while (!Serial) {
delay(100);
}

Wire.begin();

uint16_t error;
char errorMessage[256];

sht4x.begin(Wire);

uint32_t serialNumber;
error = sht4x.serialNumber(serialNumber);
if (error) {
Serial.print("Error trying to execute serialNumber(): ");
errorToString(error, errorMessage, 256);
Serial.println(errorMessage);
} else {
Serial.print("Serial Number: ");
Serial.println(serialNumber);
}
}

void loop() {
uint16_t error;
char errorMessage[256];

delay(1000);

float temperature;
float humidity;
error = sht4x.measureHighPrecision(temperature, humidity);
if (error) {
Serial.print("Error trying to execute measureHighPrecision(): ");
errorToString(error, errorMessage, 256);
Serial.println(errorMessage);
} else {
Serial.print("Temperature:");
Serial.print(temperature);
Serial.print("\t");
Serial.print("Humidity:");
Serial.println(humidity);
}
}

Abra o monitor serial da Arduino IDE, selecione a taxa de transmissão como 115200 e observe o resultado.

Introdução à HTTPS API da SenseCraft Data Platform -- Enviar Dados de Sensor

Agora que sabemos como obter dados do sensor SHT40, vamos começar aprendendo as seguintes regras de chamada de API para a SenseCraft Data Platform. Você pode ler sobre o uso da API da SenseCraft Data Platform clicando no botão abaixo para ir diretamente ao SenseCraft Documentation Center.

O princípio básico da SenseCraft Data Platform para receber dados de sensores é usar EUI e Key como informações de autenticação e relatar os dados do dispositivo por meio de POST.

Endereço do Servidor HTTPS:

https://sensecap.seeed.cc/deviceapi

Sobre o Header

No POST, você precisa adicionar as informações de autenticação no Header, que são os dados criptografados em base64 do EUI e Key do dispositivo no seguinte formato básico.

authorization = Device base64(EUI:Key)

Sobre a Interface

O caminho do servidor a ser usado pelo dispositivo para relatar dados de sensores é: /kit/message_uplink, o modo é POST, e os seguintes parâmetros de requisição estão disponíveis e são permitidos.

NameTypeDescription
- requestIdstringO uuidv4 é gerado no lado do dispositivo cada vez que os dados são relatados, garantindo que o valor seja diferente para cada mensagem.
- timestampstringTimestamp em milissegundos quando a mensagem foi enviada.
- intentstringAtualmente fixado em "event".
- deviceEuistringEUI do dispositivo.
- deviceKeystringKey do dispositivo.
- events[object]Um array de eventos onde a coleta de dados e o status do dispositivo são relatados.
-- namestringNome do Evento.
-- value[object]Valor do Evento.
-- timestampstringTimestamp em milissegundos no momento da coleta de dados.

A seguir está um exemplo de envio de dados de upload de sensor.

{
"requestId": "aaaa-aaaa-aaaa-aaaa",
"timestamp": "1691026791405",
"intent": "event",
"deviceEui": "2CF7xxxxxxx00002",
"deviceKey": "38xxxxxxxxxxxxxxxxxxxxC0EE76C3CD",
"events": [
{
"name": "measure-sensor",
"value": [
{
"channel": "1",
"measurements": {
"4097": "31.38",
"4098": "59.60"
},
"measureTime": "1691026791405"
}
]
},
{
"name": "update-channel-info",
"value": [
{
"channel": "1",
"sensorType": "1001",
"status": "normal"
}
],
"timestamp": "1691026791405"
}
]
}

Enviar dados de temperatura e umidade para a SenseCraft Data Platform

Depois que entendermos as regras acima, podemos começar a escrever o programa HTTPS para enviar os dados de temperatura e umidade do nosso SHT40 para a SenseCraft Data Platform.

Passo 1. Registrar e fazer login na SenseCraft Data Platform

Você pode clicar no link abaixo para ir diretamente ao site internacional da SenseCraft Data Platform. Se esta é a sua primeira vez usando os serviços da SenseCraft, talvez seja necessário registrar uma conta.

Ao fazer login na SenseCraft Data Platform, você será levado para a tela do console. Precisamos adicionar um kit próprio, clique em DevelopKit na barra de menu à esquerda.

Em seguida, clique em Create DevelopKit no canto superior esquerdo.

Depois, basta selecionar o MIG Develop Kit e clicar no botão Confirm.

Em seguida, você poderá ver o dispositivo que criou no painel, geralmente o primeiro. Clicar no botão "Connect" para esse dispositivo exibirá as informações de EUI e KEY desse dispositivo. Salve-as, pois iremos usá‑las nas próximas etapas.

Etapa 2. Obter as informações de autenticação

A interface da SenseCraft para informações de autenticação requer criptografia EUI:KEY baseada em Base64.

Por exemplo, seu EUI é 2CF7F11003900000 e a Key é 06C42483D7155E7006C42483D7155E70. então você pode obter as informações de autenticação criptografadas em Base64 com os seguintes comandos no terminal.

echo -n 2CF7F11003900000:06C42483D7155E7006C42483D7155E70 |base64

>>> MkNGN0YxMTAwMzkwMDAwMDowNkM0MjQ4M0Q3MTU1RTcwMDZDNDI0ODNENzE1NUU3MA==

Por favor, mantenha as informações de autenticação, iremos usá‑las como apiKey no programa mais tarde.

Etapa 3. Obter o número do tipo de sensor

Na carga enviada está incluído o número do tipo de sensor e o nome do sensor que estamos reportando. Isso é para que a SenseCraft saiba de qual sensor estamos enviando dados e em quais unidades os dados estão.

Para esta seção, consulte a tabela numerada de referência cruzada de sensores e valores fornecida no SenseCraft Documentation Center.

Para explicar como usar esses dois documentos, vamos usar o sensor SHT40 utilizado neste artigo como exemplo, para fazer uma breve introdução. O sensor SHT40 é um sensor que pode medir dados de temperatura e umidade. Portanto, ele possui um código para o tipo de sensor e dois códigos para os valores (temperatura, umidade).

O código para um tipo de sensor precisamos buscar em List of Sensor Types. Encontramos um sensor de temperatura e umidade com o código 1001.

Os códigos para os valores do sensor de que estamos falando são na verdade os Measurement IDs no diagrama, 4097 e 4098. você também pode encontrá‑los em List of Measurement IDs e verificar se as unidades desses valores correspondem ao seu sensor.

nota

Se você não conseguir encontrar na tabela o tipo de sensor adequado para você, talvez precise usar um tipo personalizado com um número de sensor de 4165 a 4174. o valor do sensor pode não ter unidade.

Etapa 4. Instalar as bibliotecas necessárias

Primeiro está a biblioteca NTPClient, que pode usar a rede do XIAO para obter o carimbo de data e hora atual.

Em seguida vem a biblioteca ArduinoJson, que facilita para nos ajudar a analisar o que a SenseCraft nos retorna.

Etapa 5. Enviar dados do sensor por meio do programa

A seguir está o procedimento para enviar os dados do SHT40. Observe que as seguintes definições de macro só devem ser usadas se forem modificadas para se adequarem à sua situação.

const char* ssid = "YOUR-WIFI-NAME";
const char* password = "YOUR-WIFI-PASSWORD";
const char* apiKey = "YOUR-DEVICE-EUI&KEY-BASE64";
const char* deviceEUI = "YOUR-DEVICE-EUI";
const char* deviceKey = "YOUR-DEVICE-KEY";
const char* dataNum_1 = "4097"; // Air temperature
const char* dataNum_2 = "4098"; // Air humidity
const char* sensorType = "1001"; // Air temperature and humidity sensors

Onde ssid e password se referem ao nome e à senha da sua rede. apiKey se refere às informações de autenticação que obtivemos na Etapa 2. deviceEUI e deviceKey são o EUI e a Key do seu dispositivo, que também foram obtidos na Etapa 2.

#include <Arduino.h>
#include <SensirionI2CSht4x.h>
#include <Wire.h>
#include "WiFi.h"
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include <WiFiUdp.h>
#include <NTPClient.h>

// Replace with your devive content
const char* ssid = "YOUR-WIFI-NAME";
const char* password = "YOUR-WIFI-PASSWORD";
const char* apiKey = "YOUR-DEVICE-EUI&KEY-BASE64";
const char* deviceEUI = "YOUR-DEVICE-EUI";
const char* deviceKey = "YOUR-DEVICE-KEY";
const char* dataNum_1 = "4097"; // Air temperature
const char* dataNum_2 = "4098"; // Air humidity
const char* sensorType = "1001"; // Air temperature and humidity sensors

const char* ntpServer = "pool.ntp.org";

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, ntpServer);

char sensecapServer[] = "https://sensecap.seeed.cc/deviceapi/kit/message_uplink";

SensirionI2CSht4x sht4x;

void wifiConnect(){
WiFi.begin(ssid, password);
Serial.print("Connecting to ");
Serial.println(ssid);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected!");
Serial.println(WiFi.localIP());
}

void setup() {
Serial.begin(115200);
while (!Serial) {
delay(100);
}

Wire.begin();

uint16_t error;
char errorMessage[256];

sht4x.begin(Wire);

uint32_t serialNumber;
error = sht4x.serialNumber(serialNumber);
if (error) {
Serial.print("Error trying to execute serialNumber(): ");
errorToString(error, errorMessage, 256);
Serial.println(errorMessage);
} else {
Serial.print("Serial Number: ");
Serial.println(serialNumber);
}

wifiConnect();

timeClient.begin(); // Initialize the NTP client
timeClient.update(); // update timestamp
}

void loop() {
uint16_t error;
char errorMessage[256];

delay(1000);

float temperature;
float humidity;
error = sht4x.measureHighPrecision(temperature, humidity);
if (error) {
Serial.print("Error trying to execute measureHighPrecision(): ");
errorToString(error, errorMessage, 256);
Serial.println(errorMessage);
} else {
Serial.print("Temperature:");
Serial.print(temperature);
Serial.print("\t");
Serial.print("Humidity:");
Serial.println(humidity);
}

HTTPClient https;
if (https.begin(sensecapServer)) { // HTTPS
https.addHeader("Content-Type", "application/json");
String author = String("Device ") + apiKey;
https.addHeader("authorization", author);
String payload = String("{\"requestId\": \"aaaa-aaaa-aaaa-aaaa\", \"timestamp\": \"");
timeClient.update(); // update timestamp
uint64_t timestamp = timeClient.getEpochTime() * 1000ULL; // GET timestamp
payload += String(timestamp);
payload += String("\", \"intent\": \"event\", \"deviceEui\": \"");
payload += deviceEUI;
payload += String("\", \"deviceKey\": \"");
payload += deviceKey;
payload += String("\", \"events\": [{\"name\": \"measure-sensor\", \"value\": [{\"channel\": \"1\", \"measurements\": {\"");
payload += dataNum_1;
payload += String("\": \"");
payload += String(temperature);
payload += String("\", \"");
payload += dataNum_2;
payload += String("\": \"");
payload += String(humidity);
payload += String("\"}, \"measureTime\": \"");
payload += String(timestamp);
payload += String("\"}]}, {\"name\": \"update-channel-info\", \"value\": [{\"channel\": \"1\", \"sensorType\": \"");
payload += sensorType;
payload += String("\", \"status\": \"normal\"}], \"timestamp\": \"");
payload += String(timestamp);
payload += String("\"}]}");
Serial.println(payload);
int httpCode = https.POST(payload); // start connection and send HTTP header
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
String payload = https.getString();
Serial.println(payload);
}
else{
Serial.print("[HTTP] ERROR: ");
Serial.println(httpCode);
}
}
else{
Serial.println("[HTTPS] Unable to connect");
delay(1000);
}
delay(300000);
}

Ligue o monitor serial, quando você o ligar, o programa começará a ser executado; quando receber a resposta como mostrado na figura, isso significa que a SenseCraft recebeu com sucesso um dos seus envios de dados.

dica

O intervalo mínimo de tempo para a SenseCraft receber envios de dados é de cinco minutos.

Introdução à API HTTP da SenseCraft Data Platform -- Obtendo recomendações de IA

Em seguida, vamos aprender como usar a API da SenseCraft Data Platform abaixo. Use nossos dados de sensores ao longo do tempo como referência para obter sugestões da IA.

O processo de chamada de interface para a SenseCraft AI é aproximadamente o seguinte.

  • Obtenha os IDs de dispositivo e de valor de medição da conta que são suportados para uso em AIGC por meio da Interface I.
  • Usando o resultado obtido pela Interface I como um dos parâmetros, a Interface II é chamada para obter o resultado de AIGC.
    • Como o tempo de geração do AIGC pode ser longo, a Interface I retornará um resource_id quando for chamada pela primeira vez, e então o front-end usará o resource_id para consultar em polling o resultado da resposta. Quando o código da resposta for 11338, isso significa que o AIGC ainda está em processo de inferência, e a Interface II precisa ser chamada novamente com o resource_id até que o resultado final seja retornado.
    • A Interface II tem um limite de fluxo de até dez requisições em cinco minutos para a mesma conta.

Endereço do servidor HTTPS:

https://sensecap.seeed.cc/openapi

Sobre a Interface I

O caminho do servidor a ser usado pelo dispositivo para reportar dados do sensor é: /ai/view_suggestion_by_measurements, o modo é POST, e os seguintes parâmetros de requisição estão disponíveis e são permitidos.

NameDescriptionNote
- langSelecionar idioma1:Chinese, 2:English. Padrão: Chinese.
- locationLocalizaçãoLocalização, por exemplo, "Shenzhen".
- cropCultura ou animalCultura ou animal a ser consultado, por exemplo, "apple".
- time_rangeTempo de consulta dos dados do dispositivo1: 30 dias 2: 180 dias 3: 360 dias. Padrão: 30 dias
- measurementsTipos de medições do dispositivoAté seis
-- dev_euiEUI do dispositivo
-- channel_measurement
--- channel_indexNúmero do canalEsse valor está atualmente fixo em 1.
--- measurement_idsNúmero do valor de medição

A seguir está um exemplo de chamada da Interface I.

{
"lang": "2",
"crop": "apple",
"location": "Shenzhen",
"time_range": "1",
"measurements": [
{
"dev_eui": "2CF7F18215100010",
"channel_measurement": [
{
"channel_index": "1",
"measurement_ids": [
"4097",
"4098"
]
}
]
},
{
"dev_eui": "2CF7F1C043400103",
"channel_measurement": [
{
"channel_index": "1",
"measurement_ids": [
"4097"
]
}
]
}
]
}

Sobre a Interface II

A estrutura e o framework da Interface I são em grande parte iguais aos da Interface II, com a única diferença sendo a adição de um resource_id extra no final. Os seguintes parâmetros de requisição estão disponíveis e são permitidos.

NameDescriptionNote
- langSelecionar idioma1:Chinese, 2:English. Padrão: Chinese.
- locationLocalizaçãoLocalização, por exemplo, "Shenzhen".
- cropCultura ou animalCultura ou animal a ser consultado, por exemplo, "apple".
- time_rangeTempo de consulta dos dados do dispositivo1: 30 dias 2: 180 dias 3: 360 dias. Padrão: 30 dias
- measurementsTipos de medições do dispositivoAté seis
-- dev_euiEUI do dispositivo
-- channel_measurement
--- channel_indexNúmero do canalEsse valor está atualmente fixo em 1.
--- measurement_idsNúmero do valor de medição
- resource_idCredenciais em cacheNo caso em que uma pergunta já foi feita e o resultado retornado é obtido, leve esse parâmetro para fazer polling no backend até que o resultado da IA seja retornado.

A seguir está um exemplo de obtenção de conselhos da IA.

{
"lang": "2",
"crop": "apple",
"location": "Shenzhen",
"time_range": "1",
"measurements": [
{
"dev_eui": "2CF7F18215100010",
"channel_measurement": [
{
"channel_index": "1",
"measurement_ids": [
"4097",
"4098"
]
}
]
},
{
"dev_eui": "2CF7F1C043400103",
"channel_measurement": [
{
"channel_index": "1",
"measurement_ids": [
"4097"
]
}
]
}
],
"resource_id": "openAi:ask:424326279298784:1691053698953"
}

XIAO ESP32C3 Obtendo o SenseCraft AI Advisor

Etapa 6. Criar acesso à API

Se você quiser chamar a interface AIGC do SenseCraft, então precisa preparar o API ID e o API Access Key no SenseCraft. Selecione Access API keys na barra de menu esquerda do painel. Em seguida, clique em Create Access Key na parte superior.

Copie o Access Key ID e o Access API Key criados. Por favor, mantenha-os em segurança e iremos usá-los nas etapas a seguir.

Etapa 7. Escrever e enviar programas

Seguindo as diretrizes de interface acima, podemos então escrever um programa que permita ao SenseCraft usar os dados de temperatura e umidade do nosso SHT40 para nos retornar recomendações de plantio.

#include <Arduino.h>
#include <Wire.h>
#include "WiFi.h"
#include <HTTPClient.h>
#include <base64.h>
#include <ArduinoJson.h>

//#define DEBUG 1

// Replace with your devive content
const char* ssid = "YOUR-WIFI-NAME";
const char* password = "YOUR-WIFI-PASSWORD";
const char* username = "YOUR-API-ID";
const char* accesskey = "YOUR-ACCESS-API-KEY";
const char* deviceEUI = "YOUR-DEVICE-EUI";

const char* crop = "apple";
const char* location = "Shenzhen";
const char* timerange = "1";
const char* dataNum_1 = "4097"; //Air temperature
const char* dataNum_2 = "4098"; //Air humidity

char sensecapAIServer[] = "https://sensecap.seeed.cc/openapi/ai/view_suggestion_by_measurements";

void wifiConnect(){
WiFi.begin(ssid, password);
Serial.print("Connecting to ");
Serial.println(ssid);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected!");
Serial.println(WiFi.localIP());
}

void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
while (!Serial) {
delay(100);
}
wifiConnect();
}

String splicePayload(int mode, String resource_id = ""){
String payload = String("{\"lang\": \"2\", \"crop\": \""); // 1:Chinese 2:English
payload += crop;
payload += String("\", \"location\": \"");
payload += location;
payload += String("\", \"time_range\": \""); // 1:30 days, 2:180 days, 3:360 days
payload += timerange;
payload += String("\", \"measurements\": [{\"dev_eui\": \"");
payload += deviceEUI;
payload += String("\", \"channel_measurement\": [{\"channel_index\": \"1\", \"measurement_ids\": [\"");
payload += dataNum_1;
payload += String("\", \"");
payload += dataNum_2;
payload += String("\"]}]}");

//If you need values for other sensors
// payload += String(", {\"dev_eui\": \"");
// payload += deviceEUI_2;
// payload += String("\", \"channel_measurement\": [{\"channel_index\": \"1\", \"measurement_ids\": [\"");
// payload += dataNum_3;
// payload += String("\"]}]}");

if(mode == 1){
payload += String("]}");
}
else if(mode == 2){
// If a query code has been obtained. mode = 2
payload += String("], \"resource_id\": \"");
payload += resource_id;
payload += String("\"}");
}

Serial.println(payload);
return payload;
}

void loop() {
// put your main code here, to run repeatedly:
HTTPClient https;
if (https.begin(sensecapAIServer)) { // HTTPS
https.addHeader("Content-Type", "application/json");
String base64Credentials = base64::encode("YOUR-API-ID:YOUR-ACCESS-API-KEY");
https.addHeader("Authorization", "Basic " + base64Credentials);

String payload = splicePayload(1);

int httpCode = https.POST(payload); // start connection and send HTTP header
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
String response = https.getString();
#ifdef DEBUG
Serial.println(response);
#endif

// get resource_id
DynamicJsonDocument doc(1024);
deserializeJson(doc, response);
String resource_id = doc["data"]["resource_id"].as<String>();
Serial.println("resource_id: " + resource_id);

String payload = splicePayload(2, resource_id);

do{
delay(2000);
https.addHeader("Content-Type", "application/json");
String base64Credentials = base64::encode("YOUR-API-ID:YOUR-ACCESS-API-KEY");
https.addHeader("Authorization", "Basic " + base64Credentials);

int httpCode = https.POST(payload); // start connection and send HTTP header
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
String response = https.getString();
#ifdef DEBUG
Serial.println(response);
#endif

// Parsing JSON Responses
DynamicJsonDocument doc(1024);
deserializeJson(doc, response);
String code = doc["code"].as<String>();
Serial.println("status: " + code);
if(code == "0"){
DynamicJsonDocument doc(1024);
deserializeJson(doc, response);
String suggest = doc["data"].as<String>();
Serial.println("SenseCraft AI gives the following planting advice: ");
Serial.println(suggest);
break;
}
else if(code == "11396"){
Serial.println("Timeout. Please wait five minutes.");
break;
}
else Serial.println("Waiting for a reply...");
}
}while(1);
}
else{
Serial.print("[HTTP] ERROR: ");
Serial.println(httpCode);
}
}
else{
Serial.println("[HTTPS] Unable to connect");
delay(1000);
}
Serial.println("The next query will be in five minutes, so please do not query too often to avoid having your account restricted from use!");
delay(300000);
}

Aqui, há alguns parâmetros para ficar de olho. No início do código, uma definição de macro DEBUG está comentada. Se essa linha for descomentada, então o programa pode ser executado para imprimir a mensagem retornada cada vez que o SenseCraft retornar.

Abaixo de DEBUG estão as informações que precisam ser alteradas dependendo da sua conta e do seu dispositivo. Por exemplo, se você não estiver cultivando maçãs e o local não for Shenzhen, então você precisa alterá-las para se adequarem à sua situação.

// Replace with your devive content
const char* ssid = "YOUR-WIFI-NAME";
const char* password = "YOUR-WIFI-PASSWORD";
const char* deviceEUI = "YOUR-DEVICE-EUI";

const char* crop = "apple";
const char* location = "Shenzhen";
const char* timerange = "1";
const char* dataNum_1 = "4097"; //Air temperature
const char* dataNum_2 = "4098"; //Air humidity

Além disso, há duas linhas no código que fazem o parse da Access API.

String base64Credentials = base64::encode("YOUR-API-ID:YOUR-ACCESS-API-KEY");

Por exemplo, o API ID e a API Key que você obteve na etapa 6 são, respectivamente, N0AV094KBPH1J9PX e 5DFA8167D23C499C86F61BDEFB901D4995B896A267054D7DAD590BF67FB9A219. Então esta linha de código você deve alterar para:

String base64Credentials = base64::encode("N0AV094KBPH1J9PX:5DFA8167D23C499C86F61BDEFB901D4995B896A267054D7DAD590BF67FB9A219");

Envie (upload) este programa e você verá a mensagem ser enviada e continuar em loop pelos resultados das respostas retornadas pela IA até que os resultados sejam retornados.

Neste ponto, parabéns, você dominou todo o conhecimento e conteúdo de acesso do XIAO ao SenseCraft, damos as boas-vindas para que você use nosso XIAO e SenseCraft para aproveitar ainda mais a sua criatividade!

Solução de Problemas

P1: Por que estou obtendo resultados nulos depois de receber respostas da IA?

Isso pode ser devido a um tempo limite (timeout) da interface. Você pode esperar até que a próxima consulta seja enviada antes de verificar os resultados. Observe que esse resultado só pode ser buscado uma vez; depois disso, o resultado é imediatamente apagado e não pode mais ser consultado.

Suporte Técnico e Discussão de Produtos

Obrigado por escolher nossos produtos! Estamos aqui para lhe fornecer diferentes tipos de suporte para garantir que sua experiência com nossos produtos seja a mais tranquila possível. Oferecemos vários canais de comunicação para atender a diferentes preferências e necessidades.

Loading Comments...