#include <U8g2lib.h>
#include <DHTesp.h>
#include <ESP32Servo.h>
Servo Servo;
int ServoPos = 0;
int ServoSpeed = 0;
int ServoDirection = 0;
#define DHT_PIN 15
#define LDRPIN 32
#define GAMMA 0.7
#define RL10 50
const int pinR = 23;
const int pinG = 18;
const int pinB = 19;
int count = 0;
float lux;
U8X8_SSD1306_128X64_NONAME_HW_I2C display(U8X8_PIN_NONE);
DHTesp dht;
uint32_t StartTime;
uint32_t DataCaptureDelay;
uint32_t getStartTime() {
return millis() + DataCaptureDelay;
}
void drawBaseOLED() {
display.clearDisplay();
}
void drawUpdateOLED(float temp, float humi, float lux, int speed) {
display.clearLine(1);
display.drawString(1, 1, "Temp: ");
display.setCursor(7, 1);
display.print(temp);
display.drawString(13, 1, "\xb0");
display.drawString(14, 1, "C");
display.clearLine(2);
display.drawString(1, 2, "Humi: ");
display.setCursor(7, 2);
display.print(humi);
display.drawString(13, 2, "%");
display.clearLine(3);
display.drawString(1, 3, "Lux: ");
display.setCursor(7, 3);
display.print(lux);
display.clearLine(4);
display.drawString(1, 4, "Speed: ");
display.setCursor(7, 4);
display.print(speed);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
// 발광다이오드
pinMode(pinR, OUTPUT);
pinMode(pinG, OUTPUT);
pinMode(pinB, OUTPUT);
// dht
dht.setup(DHT_PIN, DHTesp::DHT22);
// oled
display.begin();
display.setPowerSave(0);
display.setFont(u8x8_font_pxplusibmcgathin_f);
drawBaseOLED();
// 광량
pinMode(LDRPIN, INPUT);
// default 1초
DataCaptureDelay = 1000;
StartTime = getStartTime();
// ServoMotor
Servo.attach(5);
Servo.write(ServoPos);
}
void loop() {
if (millis() > StartTime) {
count++;
TempAndHumidity data;
// 2초 --> 온습도
if (count % 2 == 0) {
data = dht.getTempAndHumidity();
if(isnan(data.temperature) || isnan(data.humidity)) {
Serial.println(F("Failed to read from DHT sensor!"));
return;
}
//data.temperature, data.humidity
}
// 3초 --> 광량
if (count % 3 == 0) {
int analogValue = analogRead(LDRPIN);
float voltage = analogValue / 4096. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
}
//LED
if (lux < 50) { // 파랑
digitalWrite(pinR, 1);
digitalWrite(pinG, 1);
digitalWrite(pinB, 0);
}
else if ((lux >= 50) && (lux < 2000)) { // 초록
digitalWrite(pinR, 1);
digitalWrite(pinG, 0);
digitalWrite(pinB, 1);
}
else { // 빨강
digitalWrite(pinR, 0);
digitalWrite(pinG, 1);
digitalWrite(pinB, 1);
}
// if (lux < 50) { // 파랑
// analogWrite(pinR, 255);
// analogWrite(pinG, 255);
// analogWrite(pinB, 0);
// }
// else if ((lux >= 50) && (lux < 2000)) { // 초록
// analogWrite(pinR, 255);
// analogWrite(pinG, 0);
// analogWrite(pinB, 255);
// }
// else { // 빨강
// analogWrite(pinR, 0);
// analogWrite(pinG, 255);
// analogWrite(pinB, 255);
// }
// ServoMotor
// 속도 제어
if (data.humidity <= 60) {
ServoSpeed = 0;
}
else if ((data.humidity > 60) && (data.humidity <= 85)) {
ServoSpeed = 5;
}
else {
ServoSpeed = 10;
}
if (ServoDirection == 0) {
ServoPos += ServoSpeed;
if (ServoPos >= 180) {
ServoPos = 180;
ServoDirection = 1;
}
}
else {
ServoPos -= ServoSpeed;
if (ServoPos <= 0) {
ServoPos = 0;
ServoDirection = 0;
}
}
Servo.write(ServoPos);
delay(15);
// OLED
if (count % 2 == 0) {
drawUpdateOLED(data.temperature, data.humidity, lux, ServoSpeed);
}
StartTime = getStartTime();
}
//delay(10); // this speeds up the simulation
}