사물인터넷(ThingSpeak)

수분센서 esp32 calibration

coding art 2021. 4. 14. 18:32
728x90

Capacitive Moisture  센서를 사용하여 식물을 키우는 화분 토양의 수분을 측정해 보자. 

Esp32 보드를 사용하면 아날로그 디지털 변환 성능이 12비트로 업그레이드 되어

analogRead( ) 명령에 의해 0~4095까지의 범위 측정이 가능하다.

Capacitive Moisture  센서를 공기중에 건조한 상태로 두게되면 4095를 카르키게 되며

반면에 센서를 물속에 넣게되면 1900 근방의 값을 출력하게 된다.

아울러 4095 에서 1900 언저리까지 도달하게 되는 반응 시간이 샘플링 타임이 될 것이다.

세밀하게 측정해 보면 이 Capacitive 센서의 반응 시간은 4분임을 알 수 있다.

그 보다 짧은 샘플링 타임은 정확한 값이 아니기 때문에 특별한 의미를 가지지 못함에 유의하자.

 

센서의 출력 특성이 확인되었으면 1900 영역의 하한 값과 4095 영역의 상한 값을 사용하여 온도,

습도와 같이 ThingSpeak 그래프의 100% 기준으로 정규화(Normalization) 를 하자.

즉 이때에 ThingSpeak 그래프 영역을 재정의 하도록 한다.

센서를 물에 담그었을 경우 0%, 화분의 수분이 바짝 말랐을 때를 100% 로 두자. 즉 화분이

건조해져서 특정 Threshold 값을 넘기게 되면 디지털 핀을 사용하여 릴레이와 연결된

급수 펌프를 일정 시간 ON 하도록 한다. 

건조되었을 때를 100% 로 하는 이유는 인공지능 신경망 관점에서 Threshold 값을 넘길 경우 

신경망을 통해 출력을 하게되기 때문이다.

 

 

 

//Moisturesensor_esp32_01

#include "ThingSpeak.h"

#include <WiFi.h>

 

char ssid[] = "droidan1234"; // your network SSID (name)

char pass[] = "dddddddddd"; // your network password

 

WiFiClient client;

 

unsigned long myChannelNumber = 1213935;

const char * myWriteAPIKey = "5F01CRTZXJ5X35JR";

 

int sensor = 33;

int hg = 4095;

int lw = 1967;

unsigned long sampling_time =10000;//최소 5분이 적절

 

void setup() {

Serial.begin(115200); //Initialize serial

WiFi.mode(WIFI_STA);

ThingSpeak.begin(client); // Initialize ThingSpeak

}

 

 

void loop() {

int err,xsoil;

float soil;

// Connect or reconnect to WiFi

if(WiFi.status() != WL_CONNECTED){

Serial.print("Attempting to connect to SSID: ");

while(WiFi.status() != WL_CONNECTED){

WiFi.begin(ssid,pass);

Serial.print(".");

delay(5000);

}

Serial.println("\nConnected.");

}

 

xsoil = analogRead(sensor);

if( xsoil < lw ) xsoil = lw;

if( xsoil > hg ) xsoil = hg;

soil = 100.0*(xsoil-lw)/(hg - lw);

Serial.print(xsoil,0);

Serial.println();

 

ThingSpeak.setField(1, soil);

int x = ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);

delay(sampling_time);

}