#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT_Async.h"
#define DHT_SENSOR_TYPE DHT_TYPE_22
static const int DHT_SENSOR_PIN = 13;
DHT_Async dht_sensor(DHT_SENSOR_PIN, DHT_SENSOR_TYPE);
const uint8_t cols = 16;
const uint8_t rows = 2;
LiquidCrystal_I2C lcd0(0x27, cols, rows);
LiquidCrystal_I2C lcd1(0x28, cols, rows);
const uint8_t lightPin = 2;
const float GAMMA = 0.7;
const float RL10 = 50;
/*
* Initialize the serial port.
*/
void setup() {
Wire.begin();
Serial.begin(115200);
lcd0.begin(cols, rows);
lcd0.backlight();
lcd1.begin(cols, rows);
lcd1.backlight();
pinMode(lightPin, INPUT);
}
/*
* Poll for a measurement, keeping the state machine alive. Returns
* true if a measurement is available.
*/
static bool measure_environment(float *temperature, float *humidity) {
static unsigned long measurement_timestamp = millis();
/* Measure once every four seconds. */
if (millis() - measurement_timestamp > 1000ul) {
if (dht_sensor.measure(temperature, humidity)) {
measurement_timestamp = millis();
return (true);
}
}
return (false);
}
/*
* Main program loop.
*/
void loop() {
int analogValue = analogRead(lightPin);
float voltage = analogValue / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
lcd1.setCursor(0, 0);
lcd1.print(voltage, 1);
lcd1.print("V");
lcd1.setCursor(0,1);
lcd1.print(lux);
lcd1.print(" lux");
float temperature;
float humidity;
/* Measure temperature and humidity. If the functions returns
true, then a measurement is available. */
if (measure_environment(&temperature, &humidity)) {
Serial.print("T = ");
Serial.print(temperature, 1);
Serial.print(" deg. C, H = ");
Serial.print(humidity, 1);
Serial.println("%");
// print message
lcd0.setCursor(0, 0);
lcd0.print(temperature, 1);
lcd0.print(" deg. C");
lcd0.setCursor(0,1);
lcd0.print(humidity, 1);
lcd0.print("%");
}
delay(2000);
lcd1.clear();
}