#include <DHT.h>
#define DHTPIN 8
#define DHTTYPE DHT22
#define DATA_PIN 9
#define LATCH_PIN 10
#define CLOCK_PIN 11
#define NUM_SHIFT_REGS 3
DHT dht(DHTPIN, DHTTYPE);
const byte l[] = {6, 7};
const byte b[] = {2, 3, 4, 5};
float suhu_a = 0;
float lemb_a = 0;
const uint8_t angka[] = {
//abcdefgh
0b00000011, // 0
0b00000011, // 0
0b10011111, // 1
0b00100101, // 2
0b00001101, // 3
0b10011001, // 4
0b01001001, // 5
0b01000001, // 6
0b00011111, // 7
0b00000001, // 8
0b00001001, // 9
};
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(DATA_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(l[0], OUTPUT);
pinMode(l[1], OUTPUT);
for (byte i = 0; i < 4; i++)
pinMode(b[i], OUTPUT);
matikan7Seg();
bersihkan();
Serial.println("Nama : La Ode Muh. Adam Safitra");
Serial.println("NIM : 21650122");
delay(2000);
}
void loop() {
// Membaca suhu dan kelembaban dari sensor DHT11
float humidity = dht.readHumidity();
float suhu = dht.readTemperature();
// Menampilkan kelembaban di Seven Segment
tampilAngka(humidity);
// Menampilkan suhu dan kelembaban di Serial monitor
cetakSuhu(suhu, humidity);
// Menghidupkan LED biru dan buzzer 1 jika suhu di bawah 10°C
if (suhu < 10) {
digitalWrite(l[1], LOW);
digitalWrite(l[0], HIGH);
tone(b[0], 1000);
delay(250);
noTone(b[0]);
}
// Menghidupkan LED merah dan buzzer 4 jika suhu di atas 25°C
if (suhu > 25) {
digitalWrite(l[0], LOW);
delay(200);
digitalWrite(l[1], HIGH);
tone(b[3], 294);
delay(250);
noTone(b[3]);
} else {
noTone(b[3]);
}
// Menghidupkan buzzer 2 jika kelembaban di atas 70%
if (humidity > 70) {
tone(b[1], 1200);
} else {
noTone(b[1]);
}
// Menghidupkan buzzer 3 dan 4 secara bergantian
// jika suhu di atas 30°C dan kelembaban di bawah 50%
if (suhu > 30 && humidity < 50) {
while (
(suhu = dht.readTemperature()) > 30 &&
(humidity = dht.readHumidity()) < 50
) {
cetakSuhu(suhu, humidity);
tone(b[2], 1000);
delay(300);
noTone(b[2]);
delay(100);
tone(b[3], 500);
delay(300);
noTone(b[3]);
delay(100);
}
} else {
noTone(b[2]);
noTone(b[3]);
}
}
void cetakSuhu(float suhu, float lemb) {
if ((suhu != suhu_a) || (lemb != lemb_a)) {
suhu_a = suhu;
lemb_a = lemb;
Serial.print("Suhu: ");
Serial.print(suhu);
Serial.print(" °C , Kelembaban udara: ");
Serial.print(lemb);
Serial.println("%");
}
}
void bersihkan() {
for (int i = 0; i < 10; i++)
Serial.println();
}
void tampilAngka(float num) {
char n_[3];
if (num < 100.0)
dtostrf(num, 3, 1, n_);
else
dtostrf(num, 3, 0, n_);
byte nn_ = String(n_).length();
matikan7Seg();
for (byte i = 0; i < nn_; i++) {
byte angka_ = angka[n_[i] - '0'];
if ((nn_ >= i+1) && (n_[i+1] == '.')) {
angka_ &= 0b11111110;
i++;
}
shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, angka_);
}
digitalWrite(LATCH_PIN, HIGH);
digitalWrite(LATCH_PIN, LOW);
}
void matikan7Seg() {
for (byte i = 0; i < NUM_SHIFT_REGS; i++)
shiftOut(DATA_PIN, CLOCK_PIN, LSBFIRST, 0b11111111);
digitalWrite(LATCH_PIN, HIGH);
digitalWrite(LATCH_PIN, LOW);
}