Wednesday, June 6, 2018

Weather Station

온도, 습도, 기압을 측정하는 기상센서를 만들어 배란다쪽에 설치하였다.
배터리는 사용하지 않는 모토로라 휴대폰에서 가져온 것이고, 뒤쪽에 있어 보이지는 않지만, USB Recharger가 달려있어 충전이 가능하다. WIFI로는 ESP8266 WEMOS D1 MINI를 사용하였다. WEMOS에는 전원 regulator가 있어 3.7V인 Li 배터리 전원을 사용하는데 문제가 없었고, 내부적으로 3.3V로 변환하므로 BME/BMP280을 사용하는데도 문제가 없었다. 아주 편리한 녀석이다.
요즘 만들어보는 WIFI 프로젝트는 모두 OTA update를 지원하도록 하고 있다. 이 기상센서도 OTA update를 지원하도록 하였다.

USB를 연결하면 유선 전원으로 사용할 수 있지만, 지금은 배터리 모드로 동작시키고 있다. 배터리를 사용할 때는 항상 장치에 문제가 없는지 신경쓰인다.
이 장치는 1분에 한번씩 ThingSpeak에 그 결과값을 송신하고 있고, 나는 휴대폰에서 그 값을 관찰하고 있다. 이 장치를 통해 확인하고 싶은것은, 온도, 습도, 기압을 사용하여 날씨의 변화, 특히 비가 오는 날을 예측할 수 있는지 상관관계 데이터를 얻는 것이다.

20180507_223245.jpg

자정이 다 되가는 지금 잠깐 측정결과를 보니 아래 그림과 같다.  습도와 기압이 서서히 올라가고 있다.  새벽이 다가오니 온도는 내려갈 것이고, 습도는 올라가는것이 맞을것 같다.
근데 기압은 왜 올라가지..?   생각해보니 공기가 차가워져서 내려오므로 기압이 올라가는것이 맞다. ㅋ

tph

/*
Temperature/Air Pressure/Humidity Sensor
SUPPORTS OTA UPDATE
LAST UPDATE: 2018-05-07
*/
#include <Math.h>
#include <Wire.h>
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "ThingSpeak.h"
#include <Wire.h>
#include "SparkFunBME280.h"
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
WiFiClient clientThingSpeak;
BME280 mySensor;
static char ssid[] = "olleh_WiFi_E160";
static char pass[] = "-------------";
static unsigned long myChannelNumber = --------;
static const char * myWriteAPIKey = "------------";
static unsigned long previousMillis = 0;
static unsigned long rebootMillis = 0;
/********************************************************************************************************
Main Functions
*/
void setup()
{
Serial.begin(115200);
pinMode(LED_BUILTIN, OUTPUT);
Wire.begin();
Wire.setClock(400000); //Increase to fast I2C speed!
if (mySensor.beginI2C() == false) //Begin communication over I2C
{
Serial.println("The sensor did not respond. Please check wiring.");
while (1); //Freeze
}
// Connect to wifi
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.println("Temperature & Pressure & Humidity");
ThingSpeak.begin(clientThingSpeak);
mySensor.setReferencePressure(100300);
mySensor.setFilter(16);
mySensor.setMode(MODE_FORCED);
// OTA setup
ArduinoOTA.setHostname("TPHSensor");
ArduinoOTA.setPort(8266);
ArduinoOTA.setPassword((const char *)"5357");
ArduinoOTA.onStart([]()
{
indicator(10, 100, 100);
});
ArduinoOTA.onEnd([]()
{
indicator(10, 100, 100);
});
ArduinoOTA.onError([](ota_error_t error)
{
(void)error;
ESP.restart();
});
ArduinoOTA.begin();
rebootMillis = millis();
}
void loop()
{
ArduinoOTA.handle();
unsigned long currentMillis = millis();
// Restart every 15 minutes...
// I've been experienced that the system is halted sometimes for unknown reason.
if (currentMillis - rebootMillis >= (1000 * 60 * 15))
{
ESP.restart();
return;
}
float humidity = mySensor.readFloatHumidity();
float pressure = mySensor.readFloatPressure() * 0.01;
float temp = mySensor.readTempC();
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print(" Pressure(hPa): ");
Serial.print(pressure);
Serial.print(" Temp(C): ");
Serial.println(temp);
bool thingspeak_ready = (currentMillis - previousMillis >= (1000 * 60));
if (thingspeak_ready)
{
previousMillis = currentMillis;
// Don't update to ThingSpeak until the duration get to 60 secs.
if (thingspeak_ready)
{
// Indicates that ThingSpeak is updating...
digitalWrite(LED_BUILTIN, LOW);
// Update ThingSpeak
// ThingSpeak will only accept the updates every 15 seconds.
ThingSpeak.setField(1, temp);
ThingSpeak.setField(2, humidity);
ThingSpeak.setField(3, pressure);
ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
}
}
indicator(1, 100, 1000);
}
void indicator(int n, int d1, int d2)
{
pinMode(LED_BUILTIN, OUTPUT);
for (int k = 0; k < n; k++)
{
digitalWrite(LED_BUILTIN, LOW);
delay(d1);
digitalWrite(LED_BUILTIN, HIGH);
delay(d2);
yield();
}
}

No comments:

Post a Comment