태양광을 이용한 온습도 측정기 (Solar Powered WiFi Temperature and Humidity Station) 4부 - WEMOS(BMP/E280) + Blyink + Thingspeak
[embedded] - 태양광 충전 테스트(WEMOS)
일전에 3부로 마무리했던 온습도 측정기에 BMP280(BME280) 센서를 연결했는데
말이 BME280이지 사실은 BMP280 인건 안자랑...
[embedded/arduino] - 024. Arduino 아두이노 - bme280 / bmp280 센서모듈(Using bme280 / bmp 280 sensor module)
부품 조립이나 센서 확인등은 이전글을 확인해주시기 바랍니다
BME280과 WEMOS 연결은 위와같이 연결해주시면 됩니다
BME280 | WEMOS D1 Mini Pro |
SCL | D1 |
SDA | D2 |
현재는
온습도(DHT11 / DHT22) 보다는 BME280으로 변경한 상태로
(아직 BMP를 쓰지만... 주문한 센서도착시 변경만 하면됨..)
SolarWeatherStation 에 적용되 있습니다
bylink 예제와 esp8266 httpClient 예제 BME280 예제가 섞여있습니다
참고로 BMP280을 사용할 예정이면 BMP280 lib로 변경하셔야 합니다
아니면 링크를 참고해서 BME280 헤더파일을 수정하셔야 합니다
[embedded/arduino] - 024. Arduino 아두이노 - bme280 / bmp280 센서모듈(Using bme280 / bmp 280 sensor module)
Thingspeak과 Blynk를 사용한건 우선
제품을 제공해주신 분이 Thingspeak으로 웹으로보고 싶어했기도 하고...
참고한 instructables 예제가 blynk 이기 때문...
참고로 소스 수정하고 바로 올리는거라 따끈따끈 할수도...
#include <Wire.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <BlynkSimpleEsp8266.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25) // 아직 뭔지 모르겠음
Adafruit_BME280 bme280;
ESP8266WiFiMulti WiFiMulti;
unsigned long delayTime = 5 * 60 * 1000000; // 5min
const char ssid[] = "your WiFi SSID";
const char pass[] = "your WiFi password";
const char auth[] = "Blynk API KEY";
String thingspeakUrl = "http://api.thingspeak.com/update?api_key=";
String thingspeakApiKey = "Thingspeak API Key";
void setup() {
Serial.begin(9600);
Blynk.begin(auth, ssid, pass);
if(!bme280.begin(0x76)){
Serial.println("Device error!");
//while(1){} //고장난건지 센서오류인지 파악불가능으로 제거
}
while (Blynk.connect() == false) {
// Wait until connected
}
Blynk.notify("Hardware is just connected!");
Blynk.run();
}
void loop() {
String param = readDataAndBylinkSend(); // BME280 데이터를 읽어서 Blynk로 데이터 전송까지 함
sendThingspeak(param); // Thingspeak 에 데이터 전달 필요없다면 주석처리하면 됨
ESP.deepSleep(delayTime); //5min sleep
}
String readDataAndBylinkSend(){
float t = bme280.readTemperature();
float h = bme280.readHumidity();
float p = bme280.readPressure() / 100.0F;
int a = bme280.readAltitude(SEALEVELPRESSURE_HPA);
Serial.print(F("Temperature = "));
Serial.print(t);
Serial.println(" *C");
Blynk.virtualWrite(V0, t); // virtual pin 0
Serial.print(F("Humidity = "));
Serial.print(h);
Serial.println(" %");
Blynk.virtualWrite(V1, h); // virtual pin 1
Serial.print(F("Pressure = "));
Serial.print(p);
Serial.println(" Pa");
Blynk.virtualWrite(V2, p); // virtual pin 2
Serial.print(F("Approx altitude = "));
Serial.print(a); /* Adjusted to local forecast! */
Serial.println(" m");
Blynk.virtualWrite(V3, a); // virtual pin 3
Serial.println();
String param = "";
param += "&field1=" + String(t);
param += "&field2=" + String(h);
param += "&field3=" + String(p);
param += "&field4=" + String(a);
return param;
}
void sendThingspeak(String param){
WiFiClient client;
HTTPClient http;
if (http.begin(client, (thingspeakUrl + thingspeakApiKey + param))) { // HTTP
int httpCode = http.GET();
if (httpCode == HTTP_CODE_OK) {
Serial.println("send Data to Thingspeak");
} else {
Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
}
http.end();
} else {
Serial.printf("[HTTP} Unable to connect\n");
}
}
사실 sendThingspeak 함수를 만들어놨는데
http.begin(client, thingspeakUrl + thingspeakApiKey + param) 이부분만 있어도 된다
API 호출만으로 데이터를 보내기 때문이기도 하고
응답은 1아니면 0이 오는데
빈번한 호출일때 말고는 거의 1이 반환되고
thingspeak 메시지를 많이 소비할수록
유료로 전환되는시점이 앞당겨지는거라...
Thingspeak은 초반에만 무료이고 결론적으로는 유료
Blynk로 갈아탄것까진 좋았는데
위젯을 추가하기 위해선 Energy가 필요하니
충전을 할 수 밖에... 없는 구조인듯 하다
아직 많이 써보질 않았지만
데이터를 반출하기 위해선
SuperChart widget 를 사용해야하는듯 한데
매우 높은 에너지를 요구한다(900)
일반 위젯이 200 ~ 300인데 센서 1개에 매칭하고
수퍼챠트는 최대 4개까지 보여준다
thingspeak도 lib를 제공하는듯하지만
URL방식을 택한건 후에 RaspberryPi를 서버로 사용해서
센서데이터를 수집하려는 이유이기도 하다
NoSQL이 적당할것 같아 IBM Cloudant 계정이 있어 써보려고 했는데
먼가 많이 복잡해지고 배울게 많아지니 우선은 접어두기로 했다
무튼 급하게 소스를 수정했던 이유는
이미 BME280으로 셋팅해서 밖에 내놓은지가 몇일이 지났...
덕분에 변경된 소스로 4부를 작성했다..
폭우가 온 다음 새벽부터 데이터가 올라오질 않았는데
하필이면 타지에 있어 확인이 불가능했다
폭우로 인해 혹시라도 쇼트가 발생해서
WEMOS 보드가 고장난게 아닐까 하는 생각이...
보드가 나가면 PCB에서 WEMOS와 글루건을 제거해야한다..
결론적으로 보드는 무사했고
원인은 빗물로 인해 센서핀에 물이 들어가서
센서인식이 안되서 였을것 같다는 결론
예제에 있는걸 그대로 썻더니
SETUP 함수에 센서를 못찾으면 while(1); 을 실행하는데
슬립으로 안가고 방전될때까지 켜 있었던것 같다...
while을 무시하도록 수정하고
편의상 Blynk와 Thingspeak 을 함수로 분리했다
단점보다는 장점이 될것인게
센서 인식이 안되면 모든데이터가 0으로 찍히기 때문에
일단 보드가 살아있다는 이야기가 되니 외부에서도
WEMOS 걱정이 줄어들을 것 같네요
다음은 외부온도도는 그만하고 실내온도 측정을 위해
arduino Ethernet shield를 사용해 볼까 합니다
참고: https://www.instructables.com/id/Solar-Powered-WiFi-Weather-Station/
update esp8266(esp-01) firmware use to esptool on MacOS (0) | 2020.01.12 |
---|---|
태양광을 이용한 온습도 측정기 (Solar Powered WiFi Temperature and Humidity Station) 5부 - 고장난 BMP/E280 센서 교체 및 방수처리 (0) | 2019.09.11 |
태양광 충전 테스트(WEMOS) (0) | 2019.08.14 |
태양광을 이용한 온습도 측정기 (Solar Powered WiFi Temperature and Humidity Station) 3부 - WEMOS(DHT11) + Blynk App (0) | 2019.07.25 |
WEMOS(ESP8266) Source Upload using UART (0) | 2019.07.21 |
댓글 영역