//DHT_HUMIDITY
#include "DHTesp.h"
DHTesp dht;
String packet;
unsigned long lastSend = 0;
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <PubSubClient.h>
// MQTT 설정
const char* ssid = "SSID";
const char* password = "PW";
const char* mqtt_server = "server_host";
const char* mqtt_topic = "URTOPIC";
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long lastMsg = 0;
#define MSG_BUFFER_SIZE (50)
char msg[MSG_BUFFER_SIZE];
int value = 0;
////////////////////////////////////
void setup_wifi() {
delay(10);
// We start by connecting to a WiFi network
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
randomSeed(micros());
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
String msg = "";
for (int i = 0; i < length; i++) {
msg +=(char)payload[i];
}
Serial.println(msg);
}
void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// Create a random client ID
String clientId = "ESP8266Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println("connected");
// Once connected, publish an announcement...
client.publish("outTopic", "hello world");
// ... and resubscribe
client.subscribe(mqtt_topic);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void setup() {
dht.setup(D5, DHTesp::DHT22); // D5
//SERIAL BAUDRATE
/*
pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output
#if ESP8266
Serial.begin(115200, SERIAL_8N1, SERIAL_TX_ONLY);
#else // ESP8266
Serial.begin(115200, SERIAL_8N1);
#endif // ESP8266
*/
Serial.begin(115200);
// MQTT SETUP
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
}
void Get_th(){
delay(dht.getMinimumSamplingPeriod());
float humidity = dht.getHumidity();
float temperature = dht.getTemperature();
packet = "온도 : " + String(temperature) + "*C \n" + "습도 : " + String(humidity) + "%" ;
client.publish("sensor/th", (char*) packet.c_str());
client.publish("sensor/t", (char*) String(temperature).c_str());
client.publish("sensor/h", (char*) String(humidity).c_str());
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
if ( millis() - lastSend > 1000 ) { // Update and send only after 1 seconds
Get_th();
lastSend = millis();
}
}
MQTT에서 DHT22 센서 신호를 string 형태로 publish 하면 오류가 발생합니다.
인터넷에 예제가 다 String 형태로 보내던데 MQTT 라이브러리가 업데이트 되면서 함수가 조금 바뀐거 같습니다.
이 오류를 해결하려면 String 형태의 변수를 char* 형태로 바꿔서 전송해야 합니다.
결론만 말하자면 위 예제처럼 보내면 됩니다.
String 이 아니면 앞에 (String)을 붙여서 강제 형변환 하고 끝에 .c_str()을 붙여줍니다.
그 후 (char*)을 붙여서 char* 형태로 강제 형변환해서 보내면 됩니다.
c_str()에 관한건 인터넷에 찾아보면
위 예제는 1초에 한번씩 DHT22 센서 신호를 보내는 예제입니다.
확인결과.. 잘 작동하네요.
'프로젝트 > 아두이노' 카테고리의 다른 글
ESP-01로 MQTT 프로토콜 사용하기 (3) | 2021.11.21 |
---|---|
DJ MAX Respect V 리듬 게임 컨트롤러 자작기 - 1편 [재료구비] (0) | 2021.08.09 |
MQTT + Wemos D1 Mini로 에어컨 무선 원격제어하기 (0) | 2020.07.17 |
BLYNK로 ESP8266 여러개 제어하기 (Multiple Device) (0) | 2020.07.05 |
마인크래프트 RGB LED 무드등 DIY (0) | 2020.03.08 |