第1步:演示
第2步:使用的资源
•DHT22
•4k7欧姆电阻
•帐户(试用30天或已付款)
•Proboardboard
步骤3:MQTT协议
发布和订阅
步骤4:Ubidots IoT平台
要解决的问题
•创建一个新帐户
•创建新的仪表板
•创建ESP32-DHT设备
•获得MQTT数据-设备ID和主题
•获得MQTT数据-令牌
•在Ubidots中创建变量
•创建湿度和温度小部件
步骤5:创建新帐户
要创建帐户,请访问www.ubidots.com并单击在注册后
A。公司名称
B。项目阶段:
B-我们选择了发现阶段,表明它是一个测试项目。
C。创建应用程序
D。您的姓名
您的电子邮件
创建个人资料
E。登录
密码
开始免费试用
步骤6:创建新仪表板
一个。单击创建一个新的仪表板
B。输入仪表板的名称,然后单击
步骤7:创建ESP32-DHT设备
A。单击设备管理和设备
B。单击创建设备或+
C。将打开一个选项卡,列出help.ubidots站点上的教程,以根据各自的制造商对微控制器进行配置和编程。我们将创建一个空白设备。
D。填写字段
1。设备名称
2。标签(它将是MQTT客户端使用的主题的一部分)
3。创建
电子。创建设备后,它将在设备页面上列出,如图所示
1。设备名称
2。上次更新
3。设备创建日期/时间
4。与设备有关的组织
5。添加组织并删除设备
步骤8:获取MQTT数据-设备ID和主题
一个。选择设备
B。设备ID值和主题是根据图像写入的。
使用的端口为1883。
C。根据图像3.1和3.2获得令牌。
步骤9:创建变量
要创建引用设备中变量的窗口小部件,必须已经在设备上创建了它。
注意:变量是在Json上传后由Ubidots自动创建的,但为此,必须至少连接一次ESP32。要引用小部件而不必连接ESP,我们必须遵循以下步骤。
A。在设备中,选择设备
B。单击“添加变量”,然后单击“原始”。
注意:定义相同的源代码标签(在MQTT_Client.h文件中)
C。输入标签(VARIABLE_LABEL_TEMPERATURE)
D。重复湿度变量的步骤
(VARIABLE_LABEL_HUMIDITY)
步骤10:创建小部件
一个。转到仪表板页面
B。单击按钮之一
步骤11:创建小部件-温度
A。选择温度计选项
B。点击添加变量
C。请按照以下步骤选择温度变量
D。单击“确认”
步骤12:创建窗口小部件-湿度
A。添加另一个小部件
B。选择“坦克”选项
C。点击添加变量
D。选择ESP32-DHT,单击湿度,然后确认
E。最后,点击确认
F。湿度小部件将显示在温度G以下。
G。您可以通过拖动窗口来安排
步骤13:汇编
声明和变量
#include
#include //Biblioteca referente ao DHT22
#include “displayESP32LoRa.h” //Arquivo com as funções referentes ao display lora
#include “MQTT_Client.h” //Arquivo com as funções de mqtt
float temperature; //Temperatura que será obtida pelo sensor DHT
float humidity; //Umidade que será obtida pelo sensor DHT
const int pinDHT = 22; //Pino que é ligado no sensor DHT
SimpleDHT22 dht22(pinDHT); //Objeto que possui os métodos de leitura dos valores do sensor DHT
设置
void setup()
{
//Para debug, iniciamos a comunicação serial com 115200 bps
Serial.begin(115200);
//Inicializa display lora
if(!loraDisplayConfig())
ESP.restart();
//Exibe mensagem no display
showDisplay(0, “Setting up mqtt.。.”, true);
Serial.println(“Setting up mqtt.。.”);
//Inicializa mqtt (conecta o esp com o wifi, configura e conecta com o servidor da ubidots)
if(!mqttInit())
{
delay(3000);
showDisplay(0, “Failed!”, false);
Serial.println(“Failed!”);
ESP.restart();
}
showDisplay(0, “OK”, false);
Serial.println(“OK”);
}
循环
void loop()
{
//Se o esp foi desconectado do ubidots, tentamos reconectar
if(!client.connected())
reconnect();
//Lê a temperatura e umidade e exibimos no display passando uma flag (que sinaliza sucesso na leitura)
if(getClimate())
showClimate(true);
else
showClimate(false);
//Esperamos 2.5s antes de exibir o status do envio para dar efeito de pisca no display
delay(2500);
if(sendValues(temperature, humidity))
{
Serial.println(“Successfully sent data”);
showDisplay(4,“Successfully sent data”, false);
}
else
{
Serial.println(“Failed to send sensor data”);
showDisplay(4,“Failed to send sensor data”, false);
}
//Esperamos 2.5s para dar tempo de ler as mensagens acima
delay(2500);
}
循环-从DHT22读取值
//Obtém temperatura e umidade do sensor
bool getClimate()
{
int err = SimpleDHTErrSuccess;
//Passamos as variáveis ‘temperature’ e ‘humidity’ por parâmetro na função chamada ‘read2’, elas serão retornadas por referência
//Se não for retornado o código de SimpleDHTErrSuccess (sucesso), exibimos o valor de erro obtido
if ((err = dht22.read2(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess)
{
Serial.print(“Read DHT22 failed, err=”);
Serial.println(err);
//Zera valores
temperature = humidity = 0;
return false;
}
return true;
}
循环-在显示屏上显示值
//Essa função exibe os valores com suas respectivas unidades de medida para caso a flag ‘success’ seja true
//Caso a flag ‘success’ seja false, exibimos apenas um traço ‘-’
void showClimate(bool success)
{
if(success)
{
showDisplay(0, “Temperature: ”+String(temperature)+“ °C”, true);
showDisplay(1, “Humidity: ”+String(humidity)+“ %”, false);
Serial.println(“Temperature: ”+String(temperature)+“ °C”);
Serial.println(“Humidity: ”+String(humidity)+“ %”);
}
else
{
showDisplay(0, “Temperature: -”, true);
showDisplay(1, “Humidity: -”, false);
Serial.println(“Temperature: -”);
Serial.println(“Humidity: -”);
}
}
MQTT_Client-声明和变量
#include
#include //Biblioteca para as publicações via mqtt
#include “displayESP32LoRa.h” //Arquivo com as funções referentes ao display lora
#define WIFISSID “MEU_SSID” //Coloque seu SSID de WiFi aqui
#define PASSWORD “MEU_PASSWORD” //Coloque seu password de WiFi aqui
#define TOKEN “xxxxxx” //Coloque seu TOKEN do Ubidots aqui
#define VARIABLE_LABEL_TEMPERATURE “temperature” //Label referente a variável de temperatura criada no ubidots
#define VARIABLE_LABEL_HUMIDITY “humidity” //Label referente a variável de umidade criada no ubidots
#define DEVICE_ID “xxxxxx” //ID do dispositivo (Device id, também chamado de client name)
#define SERVER “things.ubidots.com” //Servidor do Ubidots (broker)
//Porta padrão
#define PORT 1883
//Tópico aonde serão feitos os publish, “esp32-dht” é o DEVICE_LABEL
#define TOPIC “/v1.6/devices/esp32-dht”
//Objeto WiFiClient usado para a conexão wifi
WiFiClient ubidots;
//Objeto PubSubClient usado para publish–subscribe
PubSubClient client(ubidots);
MQTT_Client-引导
bool mqttInit()
{
//Inicia WiFi com o SSID e a senha
WiFi.begin(WIFISSID, PASSWORD);
//Loop até que o WiFi esteja conectado
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.println(“Establishing connection to WiFi.。”);
}
//Exibe no monitor serial
Serial.println(“Connected to network”);
//Seta servidor com o broker e a porta
client.setServer(SERVER, PORT);
//Conecta no ubidots com o Device id e o token, o password é informado como vazio
while(!client.connect(DEVICE_ID, TOKEN, “”))
{
Serial.println(“MQTT - Connect error”);
return false;
}
Serial.println(“MQTT - Connect ok”);
return true;
}
MQTT_Client-重新连接
void reconnect()
{
//Loop até que o MQTT esteja conectado
while (!client.connected())
{
//sinaliza desconexão do mqtt no display
showDisplay(0,“Disconnected”, true);
showDisplay(1, “Trying to reconnect mqtt.。.”, false);
Serial.println(“Attempting MQTT connection.。.”);
//Tenta conectar
if (client.connect(DEVICE_ID, TOKEN,“”))
Serial.println(“connected”);
else
{
Serial.print(“failed, rc=”);
Serial.print(client.state());
Serial.println(“ try again in 2 seconds”);
//Aguarda 2 segundos antes de retomar
delay(2000);
}
}
//Sinaliza reconexão do mqtt no display
showDisplay(4,“Reconnected”, false);
}
MQTT_Client-提交(发布)
//Envia valores por mqtt
//Exemplo: {“temperature”:{“value”:24.50, “context”:{“temperature”:24.50, “humidity”:57.20}}}
bool sendValues(float temperature, float humidity)
{
char json[250];
//Atribui para a cadeia de caracteres “json” os valores referentes a temperatura e os envia para a variável do ubidots correspondente
sprintf(json, “{”%s“:{”value“:%02.02f, ”context“:{”temperature“:%02.02f, ”humidity“:%02.02f}}}”, VARIABLE_LABEL_TEMPERATURE, temperature, temperature, humidity);
if(!client.publish(TOPIC, json))
return false;
//Atribui para a cadeia de caracteres “json” os valores referentes a umidade e os envia para a variável do ubidots correspondente
sprintf(json, “{”%s“:{”value“:%02.02f, ”context“:{”temperature“:%02.02f, ”humidity“:%02.02f}}}”, VARIABLE_LABEL_HUMIDITY, humidity, temperature, humidity);
if(!client.publish(TOPIC, json))
return false;
//Se tudo der certo retorna true
return true;
}
步骤14:ESP32代码
Json
(图像)
显示LoRa
#ifndef _DISPLAY_LORA_
#define _DISPLAY_LORA_
#include “SSD1306.h”
//Define os pinos que serão utilizados pelo display LoRa
#define SCK 5 // GPIO5 -- SX127x‘s SCK
#define MISO 19 // GPIO19 -- SX127x’s MISO
#define MOSI 27 // GPIO27 -- SX127x‘s MOSI
#define SS 18 // GPIO18 -- SX127x’s CS
#define RST 14 // GPIO14 -- SX127x‘s RESET
#define DI00 26 // GPIO26 -- SX127x’s IRQ(Interrupt Request)
SSD1306 display(0x3c, 4, 15); //Construtor do objeto do display LoRa
显示LoRa-loraDisplayConfig
//Configura Display LoRa
bool loraDisplayConfig()
{
//Configura RST do oled como saida
pinMode(16,OUTPUT);
//Reseta o OLED
digitalWrite(16, LOW);
//Aguarda 50ms
delay(50);
//Enquanto o OLED estiver ligado, GPIO16 deve estar HIGH
digitalWrite(16, HIGH);
//Inicializa display
if(!display.init())
return false;
//Inverte a tela verticalmente (de ponta cabeça)
display.flipScreenVertically();
//Configura a fonte do display
display.setFont(ArialMT_Plain_10);
//Aguarda 200ms
delay(200);
//Limpa display
display.clear();
return true;
}
#endif
Display LoRa-showDisplay
//Exibe mensagem recebida como parâmetro
void showDisplay(int line, String msg, bool clear)
{
//Limpa o display
if(clear)
{
display.clear();
//Configura alinhamento de texto à esquerda
display.setTextAlignment(TEXT_ALIGN_LEFT);
//Configura fonte do texto
display.setFont(ArialMT_Plain_10);
}
//Escreve na pos 0,25 a mensagem
display.drawString(0 , line*10 , msg);
//Exibe no display
display.display();
}
步骤15:安装库
SimpleDHT
https://github.com/winlinvip/SimpleDHT
Pubsubclient
https://github.com/knolleary/pubsubclient
*显示LoRa附加到项目中的
责任编辑:wv
-
MQTT
+关注
关注
5文章
649浏览量
22425 -
Ubidots
+关注
关注
0文章
10浏览量
3850
发布评论请先 登录
相关推荐
评论