이전 글에서 회사내 외부 온도를 DHT12 온도센서를 이용하여 측정한후
WeMOS D1 mini 를 통해 WiFi 접속으로 ThingSpeak 서버로 전송.
웹상에서 온도를 실시간으로 확인하는 방법에 대해 포스팅하였습니다.
차후 저도 찾아 보기 위하여 몇가지 추가해 둡니다.
WeMOS D1 mini는
ESP8266 과 ESP32 무선통신 모듈을 이용하는 보드 중 가장 작은 사이즈를 자랑합니다.
최신 버전인 4.0.0 에는 micro USB 5핀이 아닌 USB C타입의 커넥터가 달려 있으며,
동일한 핀맵에 리셋버튼과 i2c 커넥터가 별도로 존재합니다.
D1 mini는 11개의 디지털 입출력 핀이 있으며 인터럽트, PWM, i2C 그리고 1-wire 통신을 지원합니다.
그리고 가장 중요한 부분이 D1 mini는 3.3v 기반 보드이기에 절대적으로 5V를 입력하면 보드가 사망할 수 있으니 주의해야 한다.
GPIO0(D3)과 GPIO2(D4)는 부팅시에 HIGH 상태를 유지해야 합니다.
따라서 이 두 핀은 10K 저항으로 풀업되어 있는데 이 두 핀에 푸시 버튼을 연결할 때는 버튼의 나머지 단자는 GND에 연결해야 합니다. 이 경우 푸시 버튼을 누르면 LOW값이 읽힙니다.
(이 두 핀에는 ON/OFF 상태를 유지하는 스위치는 연결하면 안됩니다.)
아무튼 ESP8266 과 DHT22 등의 센서를 이용하여 영하온도를 측정하고자 하였지만
그런데... 결과는 폭망입니다. ㅠㅠ
폭망한 원인으로는,
1. 온도센서를 짝퉁을 구입했다.
2. 사용된 라이브러리가 잘 못 되었다.
이렇게 두가지 이유를 들 수 있을듯 한다.
둘다 어느정도 가능성을 내포하고 있기에 정확한 원인을 찾기는 어렵네요.
다만 DHT12 온도센서가 영하 온도까지 처리가 가능한 센서이지만 실제 결과는 그러하지 못 했기에
원인 파악을 한 후, 해결을 하기에는 너무 많은 시간이 소요 될 것으로 예상되어 과감히 포기 합니다. ㅠㅠ
비트단위 쉬프트 연산을 해서 ... 다시 예전 프로그래밍 함수 공부하기는 싫다는게 핑게거립니다. ㅋ
0000 0010 1000 1100 0000 0001 0101 1111 1110 1110
16 bits RH data 16 bits T data check sum
Check sum=0000 0010+1000 1100+0000 0001+0101 1111=1110 1110
RH= (0000 0010 1000 1100)/10=65.2%RH T=(0000 0001 0101 1111)/10=35.1
보기만 해도 머리가 지끈거려요 ㅎㅎㅎ
어제 만든 DHT12의 결과는 아래와 같습니다.
아래 첨부 이미지를 보면 맨 아래 그래트가 상온을 가리치고 있는데
실제로는 영하상태였습니다. ㅋㅋ
아마도 영항 3-4도 전후였을것으로 생각되지만...
이에 예비로 함께 구입한 DHT22 온도센서를 이용하여 다시 제작해 보기로 하였습니다.
(설마 얘도 ... 짝퉁 ???)
DHT22 의 스펙은 아래와 같습니다.
기본적으로 입력 전압은 3.3V 와 5V 모두 사용 가능합니다.
온도는 -40도 ~ 80도까지 확인 가능합니다.
0.1도 단위로 분해가 가능한 것 또한 장점이네요.
습도는 사용하지 않을 것이기에 패스합니다. ㅎㅎ
DHT22 의 각 핀맵은 아래와 같습니다.
인터넷에 돌아 다니는 일반인들의 정보를 참고해서
배선을 했다가 똥작하지 않는 패배를 맛 보았기에
공식 채널(/0을 통해 기본 정보를 습득하는게 맞다고 느낍니다.
아래 핀맵은 sparkfun 에서 가져 왔습니다.
필요하신 분은 참고하세요.
http://cdn.sparkfun.com/datasheets/Sensors/Weather/RHT03.pdf
핀이 아래로 향하게 한 후 구멍 뚫린 면을 정면에서 바라보면 맨 좌측 핀이 1번 핀입니다.
1번 핀이 VDD, 2번 핀이 DATA, 3번 핀은 사용하지 않고 4번 핀이 GND 입니다.
회로도는 아래와 같이
2번 핀에 VDD를 저항 1K짜리로 연결 해주고
WeMOS D0과 RESER 핀을 연결해 줄 것입니다.
리부팅을 위해서...
DHJT22 라이브러리는
https://github.com/RobTillaart/DHTstable
에서 다운할 수 있습니다.
// ESP8266_DHT12_WiFi_WeMos.ino (2017.8.24) --> WeMos D1 Mini version
//
// https://playground.arduino.cc/Main/Dht
// DHT12 Library --> https://github.com/Bobadas/DHT12_library_Arduino
//
// Absolute Humidity --> http://biomet.ucdavis.edu/conversions/HumCon.pdf
// Wet-bulb Temperature --> http://journals.ametsoc.org/doi/pdf/10.1175/JAMC-D-11-0143.1
// Dew-point Temperature --> http://wahiduddin.net/calc/density_algorithms.htm
//
#include <math.h>
#include "DHTStable.h"
#include <Wire.h> // DHT12 uses I2C (GPIO4 = SDA, GPIO5 = SCL)
DHTStable DHT;
#define DHT22_PIN 2
#include <ESP8266WiFi.h>
WiFiClient client;
String apiKey = "API KEY"; // your ThingSpeak API key
const char* ssid = "110_xx"; // your ssid
const char* password = "xxxxxxxxx"; // your password
const char* server = "api.thingspeak.com";
const int VccPin = 0; // Vcc pin for the Power of DHT12
const int recordPeriod = 600; // Recording Period (seconds)
long sumVoltage = 0;
struct
{
uint32_t total;
uint32_t ok;
uint32_t crc_error;
uint32_t time_out;
uint32_t connect;
uint32_t ack_l;
uint32_t ack_h;
uint32_t unknown;
} counter = { 0,0,0,0,0,0,0,0};
void setup() {
pinMode(VccPin, OUTPUT);
digitalWrite(VccPin, HIGH); // DHT12 ON
Wire.begin();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) delay(500);
Serial.begin(115200);
Serial.println(__FILE__);
Serial.print("LIBRARY VERSION: ");
Serial.println(DHTSTABLE_LIB_VERSION);
Serial.println();
Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)\tTime (us)");
}
void loop() {
// READ DATA
Serial.print("DHT22, \t");
uint32_t start = micros();
int chk = DHT.read22(DHT22_PIN);
uint32_t stop = micros();
counter.total++;
switch (chk)
{
case DHTLIB_OK:
counter.ok++;
Serial.print("OK,\t");
break;
case DHTLIB_ERROR_CHECKSUM:
counter.crc_error++;
Serial.print("Checksum error,\t");
break;
case DHTLIB_ERROR_TIMEOUT:
counter.time_out++;
Serial.print("Time out error,\t");
break;
default:
counter.unknown++;
Serial.print("Unknown error,\t");
break;
}
// DISPLAY DATA
Serial.print(DHT.getHumidity(), 1);
Serial.print(",\t");
Serial.print(DHT.getTemperature(), 1);
Serial.print(",\t");
Serial.print(stop - start);
Serial.println();
// DISPLAY COUNTERS
if (counter.total % 20 == 0)
{
Serial.println("\nTOT\tOK\tCRC\tTO\tUNK");
Serial.print(counter.total);
Serial.print("\t");
Serial.print(counter.ok);
Serial.print("\t");
Serial.print(counter.crc_error);
Serial.print("\t");
Serial.print(counter.time_out);
Serial.print("\t");
Serial.print(counter.connect);
Serial.print("\t");
Serial.print(counter.ack_l);
Serial.print("\t");
Serial.print(counter.ack_h);
Serial.print("\t");
Serial.print(counter.unknown);
Serial.println("\n");
}
float Temp = DHT.getTemperature();
if (client.connect(server,80) && Temp > 1.0) {
String postStr = apiKey;
postStr +="&field1=";
postStr += String(Temp, 1); // Temperature (℃)
client.print("POST /update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Content-Length: ");
client.print(postStr.length());
client.print("\n\n");
client.print(postStr);
}
client.stop();
delay(3000); // Do not use delayMicrosenconds() (--> Soft WDT Error)
// ESP.deepSleep((recordPeriod - 5) * 1000000 * 1.05);
}
하지만, 위 소스로도 영하 온도 확인이 되지 않고 죽는 상황이 생깁니다. ㅠㅠ