남들이 안해본것을 해서 궁극적인 지식의 완성을 목표로 하는 블로그입니다. 제품리뷰 , IT, 프로그래밍 관련글을 포스팅합니다. 또한 자기만 읽으려고 만든 정리 노트식의 글들을 싫어합니다. 비전공자나 처음 본 사람도 최대한 이해할 수 있도록 프로그래밍 관련 글들을 쉽게 적으려고 노력하고 있습니다. 보안 계통과 컴퓨터의 Low-Level 한 분야에 관심이 많습니다.
//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 센서 신호를 보내는 예제입니다.
확인결과.. 잘 작동하네요.
MQTT + DHT22(AM2302) 센서 신호 보내기(publish)
MQTT에서 DHT22 센서 신호를 string 형태로 publish 하면 오류가 발생합니다.
인터넷에 예제가 다 String 형태로 보내던데 MQTT 라이브러리가 업데이트 되면서 함수가 조금 바뀐거 같습니다.
이 오류를 해결하려면 String 형태의 변수를 char* 형태로 바꿔서 전송해야 합니다.
결론만 말하자면 위 예제처럼 보내면 됩니다.
String 이 아니면 앞에 (String)을 붙여서 강제 형변환 하고 끝에 .c_str()을 붙여줍니다.
그 후 (char*)을 붙여서 char* 형태로 강제 형변환해서 보내면 됩니다.
c_str()에 관한건 인터넷에 찾아보면
위 예제는 1초에 한번씩 DHT22 센서 신호를 보내는 예제입니다.
확인결과.. 잘 작동하네요.
'프로젝트 > 아두이노' 카테고리의 다른 글
COMMENT WRITE